Imported Upstream version 2.1.2 26/58026/1 upstream/2.1.2
authorDongHun Kwak <dh0128.kwak@samsung.com>
Wed, 27 Jan 2016 01:47:25 +0000 (10:47 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Wed, 27 Jan 2016 01:47:52 +0000 (10:47 +0900)
Change-Id: Ia36f5862c3fcaa1f053ad69ed961e1fb9043e20b
Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
1085 files changed:
CHANGES-1.6.txt [new file with mode: 0644]
CHANGES-1.7.txt [new file with mode: 0644]
CHANGES-2.0.txt [new file with mode: 0644]
CHANGES-IPPTOOL.txt
CHANGES.txt
CREDITS.txt
INSTALL.txt
IPPTOOL.txt
LICENSE.txt
Makedefs.in
Makefile
README.txt
backend/Dependencies
backend/Makefile
backend/backend-private.h
backend/dnssd.c
backend/ieee1284.c
backend/ipp.c
backend/lpd.c
backend/network.c
backend/org.cups.usb-quirks
backend/runloop.c
backend/snmp-supplies.c
backend/snmp.c
backend/socket.c
backend/test1284.c
backend/testbackend.c
backend/testsupplies.c
backend/usb-darwin.c
backend/usb-libusb.c
backend/usb-unix.c
backend/usb.c
berkeley/Dependencies
berkeley/Makefile
berkeley/lpc.c
berkeley/lpq.c
berkeley/lpr.c
berkeley/lprm.c
cgi-bin/Dependencies
cgi-bin/Makefile
cgi-bin/admin.c
cgi-bin/cgi-private.h
cgi-bin/cgi.h
cgi-bin/classes.c
cgi-bin/help-index.c
cgi-bin/help-index.h
cgi-bin/help.c
cgi-bin/html.c
cgi-bin/ipp-var.c
cgi-bin/jobs.c
cgi-bin/makedocset.c
cgi-bin/printers.c
cgi-bin/search.c
cgi-bin/template.c
cgi-bin/testcgi.c
cgi-bin/testhi.c
cgi-bin/testtemplate.c
cgi-bin/var.c
cgi-bin/websearch.c [deleted file]
conf/Makefile
conf/cups-files.conf.in
conf/cupsd.conf.in
conf/mime.convs.in
conf/mime.types
conf/snmp.conf.in
config-scripts/cups-common.m4
config-scripts/cups-compiler.m4
config-scripts/cups-defaults.m4
config-scripts/cups-directories.m4
config-scripts/cups-dnssd.m4
config-scripts/cups-gssapi.m4
config-scripts/cups-largefile.m4
config-scripts/cups-launchd.m4 [deleted file]
config-scripts/cups-libtool.m4
config-scripts/cups-manpages.m4
config-scripts/cups-network.m4
config-scripts/cups-opsys.m4
config-scripts/cups-pam.m4
config-scripts/cups-poll.m4
config-scripts/cups-scripting.m4
config-scripts/cups-sharedlibs.m4
config-scripts/cups-ssl.m4
config-scripts/cups-startup.m4 [new file with mode: 0644]
config-scripts/cups-threads.m4
config.h.in
configure
configure.ac [moved from configure.in with 65% similarity]
cups-config.in
cups/Dependencies
cups/Makefile
cups/adminutil.c
cups/adminutil.h
cups/api-filter.header
cups/api-filter.shtml
cups/array-private.h
cups/array.c
cups/array.h
cups/attr.c
cups/auth.c
cups/backchannel.c
cups/backend.c
cups/backend.h
cups/conflicts.c
cups/cups-private.h
cups/cups.h
cups/custom.c
cups/debug-private.h
cups/debug.c
cups/dest-job.c
cups/dest-localization.c
cups/dest-options.c
cups/dest.c
cups/dir.c
cups/dir.h
cups/emit.c
cups/encode.c
cups/file-private.h
cups/file.c
cups/file.h
cups/getdevices.c
cups/getifaddrs.c
cups/getputfile.c
cups/globals.c
cups/http-addr.c
cups/http-addrlist.c
cups/http-private.h
cups/http-support.c
cups/http.c
cups/http.h
cups/ipp-private.h
cups/ipp-support.c
cups/ipp.c
cups/ipp.h
cups/langprintf.c
cups/language-private.h
cups/language.c
cups/language.h
cups/libcups2.def
cups/libcups_s.exp [deleted file]
cups/localize.c
cups/mark.c
cups/md5-private.h
cups/md5.c
cups/md5passwd.c
cups/notify.c
cups/options.c
cups/page.c
cups/ppd-cache.c
cups/ppd-private.h
cups/ppd.c
cups/ppd.h
cups/pwg-media.c
cups/pwg-private.h
cups/pwg.h [new file with mode: 0644]
cups/raster-private.h
cups/raster.h
cups/request.c
cups/sidechannel.c
cups/sidechannel.h
cups/snmp-private.h
cups/snmp.c
cups/snprintf.c
cups/sspi-private.h [deleted file]
cups/sspi.c [deleted file]
cups/string-private.h
cups/string.c
cups/tempfile.c
cups/test.ppd
cups/testadmin.c
cups/testarray.c
cups/testcache.c [new file with mode: 0644]
cups/testconflicts.c
cups/testcups.c
cups/testdest.c [new file with mode: 0644]
cups/testfile.c
cups/testhttp.c
cups/testi18n.c
cups/testipp.c
cups/testlang.c
cups/testoptions.c
cups/testppd.c
cups/testpwg.c
cups/testsnmp.c
cups/thread-private.h
cups/thread.c
cups/tls-darwin.c [new file with mode: 0644]
cups/tls-gnutls.c [new file with mode: 0644]
cups/tls-sspi.c [new file with mode: 0644]
cups/tls.c [new file with mode: 0644]
cups/tlscheck.c [new file with mode: 0644]
cups/transcode.c
cups/transcode.h
cups/usersys.c
cups/util.c
cups/versioning.h
data/Makefile
data/classified [deleted file]
data/confidential [deleted file]
data/epson.h
data/hp.h
data/label.h
data/secret [deleted file]
data/standard [deleted file]
data/testprint.in [deleted file]
data/topsecret [deleted file]
data/unclassified [deleted file]
desktop/Makefile
doc/Makefile
doc/apple-touch-icon.opacity [new file with mode: 0644]
doc/apple-touch-icon.png [new file with mode: 0644]
doc/ca/index.html.in [deleted file]
doc/cs/index.html.in [deleted file]
doc/cups-printable.css
doc/cups.css
doc/de/index.html.in [new file with mode: 0644]
doc/es/index.html.in
doc/fr/index.html.in [deleted file]
doc/help/accounting.html
doc/help/api-array.html
doc/help/api-cgi.html
doc/help/api-cups.html
doc/help/api-filedir.html
doc/help/api-filter.html
doc/help/api-httpipp.html
doc/help/api-mime.html
doc/help/api-overview.html
doc/help/api-ppd.html
doc/help/api-ppdc.html
doc/help/api-raster.html
doc/help/cgi.html
doc/help/glossary.html
doc/help/kerberos.html
doc/help/license.html
doc/help/man-backend.html [new file with mode: 0644]
doc/help/man-cancel.html [new file with mode: 0644]
doc/help/man-classes.conf.html [new file with mode: 0644]
doc/help/man-client.conf.html [new file with mode: 0644]
doc/help/man-cups-config.html [new file with mode: 0644]
doc/help/man-cups-files.conf.html [new file with mode: 0644]
doc/help/man-cups-lpd.html [new file with mode: 0644]
doc/help/man-cups-snmp.conf.html [new file with mode: 0644]
doc/help/man-cups-snmp.html [new file with mode: 0644]
doc/help/man-cups.html [new file with mode: 0644]
doc/help/man-cupsaccept.html [new file with mode: 0644]
doc/help/man-cupsaddsmb.html [new file with mode: 0644]
doc/help/man-cupsctl.html [new file with mode: 0644]
doc/help/man-cupsd-helper.html [new file with mode: 0644]
doc/help/man-cupsd-logs.html [new file with mode: 0644]
doc/help/man-cupsd.conf.html [new file with mode: 0644]
doc/help/man-cupsd.html [new file with mode: 0644]
doc/help/man-cupsenable.html [new file with mode: 0644]
doc/help/man-cupsfilter.html [new file with mode: 0644]
doc/help/man-cupstestdsc.html [new file with mode: 0644]
doc/help/man-cupstestppd.html [new file with mode: 0644]
doc/help/man-filter.html [new file with mode: 0644]
doc/help/man-ippfind.html [new file with mode: 0644]
doc/help/man-ipptool.html
doc/help/man-ipptoolfile.html
doc/help/man-lp.html [new file with mode: 0644]
doc/help/man-lpadmin.html [new file with mode: 0644]
doc/help/man-lpc.html [new file with mode: 0644]
doc/help/man-lpinfo.html [new file with mode: 0644]
doc/help/man-lpmove.html [new file with mode: 0644]
doc/help/man-lpoptions.html [new file with mode: 0644]
doc/help/man-lpq.html [new file with mode: 0644]
doc/help/man-lpr.html [new file with mode: 0644]
doc/help/man-lprm.html [new file with mode: 0644]
doc/help/man-lpstat.html [new file with mode: 0644]
doc/help/man-mailto.conf.html [new file with mode: 0644]
doc/help/man-mime.convs.html [new file with mode: 0644]
doc/help/man-mime.types.html [new file with mode: 0644]
doc/help/man-notifier.html [new file with mode: 0644]
doc/help/man-ppdc.html [new file with mode: 0644]
doc/help/man-ppdcfile.html [new file with mode: 0644]
doc/help/man-ppdhtml.html [new file with mode: 0644]
doc/help/man-ppdi.html [new file with mode: 0644]
doc/help/man-ppdmerge.html [new file with mode: 0644]
doc/help/man-ppdpo.html [new file with mode: 0644]
doc/help/man-printers.conf.html [new file with mode: 0644]
doc/help/man-subscriptions.conf.html [new file with mode: 0644]
doc/help/network.html
doc/help/overview.html
doc/help/policies.html
doc/help/postscript-driver.html
doc/help/ppd-compiler.html
doc/help/raster-driver.html
doc/help/ref-access_log.html [deleted file]
doc/help/ref-classes-conf.html [deleted file]
doc/help/ref-client-conf.html [deleted file]
doc/help/ref-cups-files-conf.html.in [deleted file]
doc/help/ref-cupsd-conf.html.in [deleted file]
doc/help/ref-error_log.html [deleted file]
doc/help/ref-mailto-conf.html [deleted file]
doc/help/ref-page_log.html [deleted file]
doc/help/ref-printers-conf.html [deleted file]
doc/help/ref-snmp-conf.html [deleted file]
doc/help/ref-subscriptions-conf.html [deleted file]
doc/help/security.html
doc/help/spec-browsing.html [deleted file]
doc/help/spec-cmp.html
doc/help/spec-design.html
doc/help/spec-ipp.html
doc/help/spec-pdf.html
doc/help/spec-ppd.html
doc/help/standard.html.in [deleted file]
doc/help/whatsnew.html [deleted file]
doc/images/generic.png [new file with mode: 0644]
doc/index.html.in
doc/ja/index.html.in
doc/ru/index.html.in
examples/Makefile
examples/ppdx.c
examples/ppdx.h
examples/testppdx.c
filter/Dependencies
filter/Makefile
filter/commandtops.c
filter/common.c
filter/common.h
filter/error.c
filter/gziptoany.c
filter/interpret.c
filter/pstops.c
filter/raster.c
filter/rasterbench.c
filter/rastertoepson.c
filter/rastertohp.c
filter/rastertolabel.c
filter/rastertopwg.c
filter/spec-ppd.shtml
filter/testraster.c
install-sh
locale/Dependencies
locale/Makefile
locale/checkpo.c
locale/cups.header
locale/cups.pot
locale/cups.strings
locale/cups_ca.po
locale/cups_cs.po
locale/cups_de.po [new file with mode: 0644]
locale/cups_es.po
locale/cups_fr.po
locale/cups_it.po [new file with mode: 0644]
locale/cups_ja.po
locale/cups_ru.po
locale/po2strings.c
locale/strings2po.c
locale/translate.c [deleted file]
man/Makefile
man/backend.man
man/cancel.man
man/classes.conf.man
man/client.conf.man.in
man/cups-config.man
man/cups-deviced.man.in [deleted file]
man/cups-driverd.man.in [deleted file]
man/cups-files.conf.man.in
man/cups-lpd.man.in
man/cups-snmp.conf.man
man/cups-snmp.man.in
man/cups.man [new file with mode: 0644]
man/cupsaccept.man
man/cupsaddsmb.man.in
man/cupsctl.man
man/cupsd-helper.man [new file with mode: 0644]
man/cupsd-logs.man [new file with mode: 0644]
man/cupsd.conf.man.in
man/cupsd.man.in
man/cupsenable.man
man/cupsfilter.man
man/cupstestdsc.man
man/cupstestppd.man
man/filter.man
man/ippfind.man [new file with mode: 0644]
man/ipptool.man
man/ipptoolfile.man
man/lp.man
man/lpadmin.man
man/lpc.man
man/lpinfo.man
man/lpmove.man
man/lpoptions.man.in
man/lppasswd.man [deleted file]
man/lpq.man
man/lpr.man
man/lprm.man
man/lpstat.man
man/mailto.conf.man
man/mantohtml.c
man/mime.convs.man
man/mime.types.man
man/notifier.man
man/ppdc.man
man/ppdcfile.man
man/ppdhtml.man
man/ppdi.man
man/ppdmerge.man
man/ppdpo.man
man/printers.conf.man
man/subscriptions.conf.man
monitor/Dependencies
monitor/Makefile
monitor/bcp.c
monitor/tbcp.c
notifier/Dependencies
notifier/Makefile
notifier/dbus.c
notifier/mailto.c
notifier/rss.c
notifier/testnotify.c
packaging/cups.list.in
packaging/cups.spec
packaging/cups.spec.in
ppdc/Dependencies
ppdc/Makefile
ppdc/genstrings.cxx
ppdc/ppdc-array.cxx
ppdc/ppdc-attr.cxx
ppdc/ppdc-catalog.cxx
ppdc/ppdc-choice.cxx
ppdc/ppdc-constraint.cxx
ppdc/ppdc-driver.cxx
ppdc/ppdc-file.cxx
ppdc/ppdc-filter.cxx
ppdc/ppdc-font.cxx
ppdc/ppdc-group.cxx
ppdc/ppdc-import.cxx
ppdc/ppdc-mediasize.cxx
ppdc/ppdc-message.cxx
ppdc/ppdc-option.cxx
ppdc/ppdc-profile.cxx
ppdc/ppdc-shared.cxx
ppdc/ppdc-source.cxx
ppdc/ppdc-string.cxx
ppdc/ppdc-variable.cxx
ppdc/ppdc.cxx
ppdc/ppdhtml.cxx
ppdc/ppdi.cxx
ppdc/ppdmerge.cxx
ppdc/ppdpo.cxx
ppdc/sample.drv
ppdc/testcatalog.cxx
scheduler/Dependencies
scheduler/Makefile
scheduler/auth.c
scheduler/auth.h
scheduler/banners.c
scheduler/banners.h
scheduler/cert.c
scheduler/cert.h
scheduler/classes.c
scheduler/classes.h
scheduler/client.c
scheduler/client.h
scheduler/colorman.c
scheduler/colorman.h
scheduler/conf.c
scheduler/conf.h
scheduler/cups-deviced.c
scheduler/cups-driverd.cxx
scheduler/cups-exec.c
scheduler/cups-lpd.c
scheduler/cups.sh.in
scheduler/cups.xml.in
scheduler/cupsd.h
scheduler/cupsfilter.c
scheduler/dirsvc.c
scheduler/dirsvc.h
scheduler/env.c
scheduler/file.c
scheduler/filter.c
scheduler/ipp.c
scheduler/job.c
scheduler/job.h
scheduler/listen.c
scheduler/log.c
scheduler/main.c
scheduler/mime-private.h
scheduler/mime.c
scheduler/mime.h
scheduler/network.c
scheduler/network.h
scheduler/org.cups.cups-lpd.plist.in
scheduler/org.cups.cups-lpd.socket [new file with mode: 0644]
scheduler/org.cups.cups-lpdAT.service.in [new file with mode: 0644]
scheduler/org.cups.cupsd.path.in [new file with mode: 0644]
scheduler/org.cups.cupsd.plist
scheduler/org.cups.cupsd.service.in [new file with mode: 0644]
scheduler/org.cups.cupsd.socket.in [new file with mode: 0644]
scheduler/policy.c
scheduler/policy.h
scheduler/printers.c
scheduler/printers.h
scheduler/process.c
scheduler/quotas.c
scheduler/select.c
scheduler/server.c
scheduler/statbuf.c
scheduler/statbuf.h
scheduler/subscriptions.c
scheduler/subscriptions.h
scheduler/sysman.c
scheduler/sysman.h
scheduler/testlpd.c
scheduler/testmime.c
scheduler/testspeed.c
scheduler/testsub.c
scheduler/tls-darwin.c [deleted file]
scheduler/tls-gnutls.c [deleted file]
scheduler/tls-openssl.c [deleted file]
scheduler/tls.c [deleted file]
scheduler/type.c
scheduler/util.c
scheduler/util.h
systemv/Dependencies
systemv/Makefile
systemv/cancel.c
systemv/cupsaccept.c
systemv/cupsaddsmb.c
systemv/cupsctl.c
systemv/cupstestdsc.c
systemv/cupstestppd.c
systemv/lp.c
systemv/lpadmin.c
systemv/lpinfo.c
systemv/lpmove.c
systemv/lpoptions.c
systemv/lppasswd.c [deleted file]
systemv/lpstat.c
templates/Makefile
templates/add-class.tmpl
templates/add-printer.tmpl
templates/admin.tmpl
templates/ca/add-class.tmpl [deleted file]
templates/ca/add-printer.tmpl [deleted file]
templates/ca/add-rss-subscription.tmpl [deleted file]
templates/ca/admin.tmpl [deleted file]
templates/ca/choose-model.tmpl [deleted file]
templates/ca/choose-serial.tmpl [deleted file]
templates/ca/choose-uri.tmpl [deleted file]
templates/ca/class-added.tmpl [deleted file]
templates/ca/class-confirm.tmpl [deleted file]
templates/ca/class-deleted.tmpl [deleted file]
templates/ca/class-jobs-header.tmpl [deleted file]
templates/ca/class-modified.tmpl [deleted file]
templates/ca/class.tmpl [deleted file]
templates/ca/classes-header.tmpl [deleted file]
templates/ca/command.tmpl [deleted file]
templates/ca/edit-config.tmpl [deleted file]
templates/ca/error-op.tmpl [deleted file]
templates/ca/header.tmpl.in [deleted file]
templates/ca/help-header.tmpl [deleted file]
templates/ca/help-printable.tmpl [deleted file]
templates/ca/help-trailer.tmpl [deleted file]
templates/ca/job-cancel.tmpl [deleted file]
templates/ca/job-hold.tmpl [deleted file]
templates/ca/job-move.tmpl [deleted file]
templates/ca/job-moved.tmpl [deleted file]
templates/ca/job-release.tmpl [deleted file]
templates/ca/job-restart.tmpl [deleted file]
templates/ca/jobs-header.tmpl [deleted file]
templates/ca/modify-class.tmpl [deleted file]
templates/ca/modify-printer.tmpl [deleted file]
templates/ca/norestart.tmpl [deleted file]
templates/ca/option-boolean.tmpl [deleted file]
templates/ca/option-conflict.tmpl [deleted file]
templates/ca/option-header.tmpl [deleted file]
templates/ca/option-pickmany.tmpl [deleted file]
templates/ca/option-pickone.tmpl [deleted file]
templates/ca/option-trailer.tmpl [deleted file]
templates/ca/printer-accept.tmpl [deleted file]
templates/ca/printer-added.tmpl [deleted file]
templates/ca/printer-configured.tmpl [deleted file]
templates/ca/printer-default.tmpl [deleted file]
templates/ca/printer-deleted.tmpl [deleted file]
templates/ca/printer-jobs-header.tmpl [deleted file]
templates/ca/printer-modified.tmpl [deleted file]
templates/ca/printer-purge.tmpl [deleted file]
templates/ca/printer-reject.tmpl [deleted file]
templates/ca/printer-start.tmpl [deleted file]
templates/ca/printer-stop.tmpl [deleted file]
templates/ca/printer.tmpl [deleted file]
templates/ca/printers-header.tmpl [deleted file]
templates/ca/printers.tmpl [deleted file]
templates/ca/restart.tmpl [deleted file]
templates/ca/samba-export.tmpl [deleted file]
templates/ca/samba-exported.tmpl [deleted file]
templates/ca/set-printer-options-header.tmpl [deleted file]
templates/ca/set-printer-options-trailer.tmpl [deleted file]
templates/ca/subscription-added.tmpl [deleted file]
templates/ca/subscription-canceled.tmpl [deleted file]
templates/ca/test-page.tmpl [deleted file]
templates/ca/trailer.tmpl [deleted file]
templates/choose-device.tmpl
templates/choose-make.tmpl
templates/choose-model.tmpl
templates/choose-serial.tmpl
templates/choose-uri.tmpl
templates/class-added.tmpl
templates/class-confirm.tmpl
templates/class-deleted.tmpl
templates/class-jobs-header.tmpl
templates/class-modified.tmpl
templates/class.tmpl
templates/command.tmpl
templates/cs/admin.tmpl [deleted file]
templates/cs/choose-device.tmpl [deleted file]
templates/cs/choose-make.tmpl [deleted file]
templates/cs/choose-serial.tmpl [deleted file]
templates/cs/class-added.tmpl [deleted file]
templates/cs/class-deleted.tmpl [deleted file]
templates/cs/class-jobs-header.tmpl [deleted file]
templates/cs/class-modified.tmpl [deleted file]
templates/cs/class.tmpl [deleted file]
templates/cs/classes-header.tmpl [deleted file]
templates/cs/classes.tmpl [deleted file]
templates/cs/command.tmpl [deleted file]
templates/cs/error-op.tmpl [deleted file]
templates/cs/error.tmpl [deleted file]
templates/cs/header.tmpl.in [deleted file]
templates/cs/help-header.tmpl [deleted file]
templates/cs/help-printable.tmpl [deleted file]
templates/cs/help-trailer.tmpl [deleted file]
templates/cs/job-cancel.tmpl [deleted file]
templates/cs/job-hold.tmpl [deleted file]
templates/cs/job-moved.tmpl [deleted file]
templates/cs/job-release.tmpl [deleted file]
templates/cs/job-restart.tmpl [deleted file]
templates/cs/jobs-header.tmpl [deleted file]
templates/cs/jobs.tmpl [deleted file]
templates/cs/list-available-printers.tmpl [deleted file]
templates/cs/norestart.tmpl [deleted file]
templates/cs/option-boolean.tmpl [deleted file]
templates/cs/option-conflict.tmpl [deleted file]
templates/cs/option-header.tmpl [deleted file]
templates/cs/option-pickmany.tmpl [deleted file]
templates/cs/option-trailer.tmpl [deleted file]
templates/cs/pager.tmpl [deleted file]
templates/cs/printer-accept.tmpl [deleted file]
templates/cs/printer-added.tmpl [deleted file]
templates/cs/printer-configured.tmpl [deleted file]
templates/cs/printer-confirm.tmpl [deleted file]
templates/cs/printer-default.tmpl [deleted file]
templates/cs/printer-deleted.tmpl [deleted file]
templates/cs/printer-jobs-header.tmpl [deleted file]
templates/cs/printer-modified.tmpl [deleted file]
templates/cs/printer-purge.tmpl [deleted file]
templates/cs/printer-reject.tmpl [deleted file]
templates/cs/printer-start.tmpl [deleted file]
templates/cs/printer-stop.tmpl [deleted file]
templates/cs/printer.tmpl [deleted file]
templates/cs/printers-header.tmpl [deleted file]
templates/cs/printers.tmpl [deleted file]
templates/cs/restart.tmpl [deleted file]
templates/cs/samba-export.tmpl [deleted file]
templates/cs/samba-exported.tmpl [deleted file]
templates/cs/search.tmpl [deleted file]
templates/cs/set-printer-options-trailer.tmpl [deleted file]
templates/cs/subscription-added.tmpl [deleted file]
templates/cs/subscription-canceled.tmpl [deleted file]
templates/cs/test-page.tmpl [deleted file]
templates/cs/trailer.tmpl [deleted file]
templates/cs/users.tmpl [deleted file]
templates/de/add-class.tmpl [moved from templates/cs/add-class.tmpl with 56% similarity]
templates/de/add-printer.tmpl [moved from templates/cs/add-printer.tmpl with 67% similarity]
templates/de/add-rss-subscription.tmpl [moved from templates/cs/add-rss-subscription.tmpl with 55% similarity]
templates/de/admin.tmpl [new file with mode: 0644]
templates/de/choose-device.tmpl [moved from templates/ca/choose-device.tmpl with 58% similarity]
templates/de/choose-make.tmpl [moved from templates/ca/choose-make.tmpl with 72% similarity]
templates/de/choose-model.tmpl [moved from templates/cs/choose-model.tmpl with 63% similarity]
templates/de/choose-serial.tmpl [new file with mode: 0644]
templates/de/choose-uri.tmpl [moved from templates/cs/choose-uri.tmpl with 68% similarity]
templates/de/class-added.tmpl [new file with mode: 0644]
templates/de/class-confirm.tmpl [moved from templates/cs/class-confirm.tmpl with 55% similarity]
templates/de/class-deleted.tmpl [new file with mode: 0644]
templates/de/class-jobs-header.tmpl [new file with mode: 0644]
templates/de/class-modified.tmpl [new file with mode: 0644]
templates/de/class.tmpl [new file with mode: 0644]
templates/de/classes-header.tmpl [new file with mode: 0644]
templates/de/classes.tmpl [moved from templates/ca/classes.tmpl with 50% similarity]
templates/de/command.tmpl [new file with mode: 0644]
templates/de/edit-config.tmpl [moved from templates/cs/edit-config.tmpl with 64% similarity]
templates/de/error-op.tmpl [new file with mode: 0644]
templates/de/error.tmpl [moved from templates/ca/error.tmpl with 58% similarity]
templates/de/header.tmpl.in [new file with mode: 0644]
templates/de/help-header.tmpl [new file with mode: 0644]
templates/de/help-printable.tmpl [moved from templates/fr/help-printable.tmpl with 100% similarity]
templates/de/help-trailer.tmpl [new file with mode: 0644]
templates/de/job-cancel.tmpl [new file with mode: 0644]
templates/de/job-hold.tmpl [new file with mode: 0644]
templates/de/job-move.tmpl [moved from templates/cs/job-move.tmpl with 66% similarity]
templates/de/job-moved.tmpl [new file with mode: 0644]
templates/de/job-release.tmpl [new file with mode: 0644]
templates/de/job-restart.tmpl [new file with mode: 0644]
templates/de/jobs-header.tmpl [new file with mode: 0644]
templates/de/jobs.tmpl [moved from templates/ca/jobs.tmpl with 63% similarity]
templates/de/list-available-printers.tmpl [moved from templates/ca/list-available-printers.tmpl with 75% similarity]
templates/de/modify-class.tmpl [moved from templates/cs/modify-class.tmpl with 73% similarity]
templates/de/modify-printer.tmpl [moved from templates/cs/modify-printer.tmpl with 71% similarity]
templates/de/norestart.tmpl [new file with mode: 0644]
templates/de/option-boolean.tmpl [moved from templates/fr/option-boolean.tmpl with 100% similarity]
templates/de/option-conflict.tmpl [new file with mode: 0644]
templates/de/option-header.tmpl [moved from templates/fr/option-header.tmpl with 100% similarity]
templates/de/option-pickmany.tmpl [moved from templates/fr/option-pickmany.tmpl with 100% similarity]
templates/de/option-pickone.tmpl [moved from templates/cs/option-pickone.tmpl with 61% similarity]
templates/de/option-trailer.tmpl [new file with mode: 0644]
templates/de/pager.tmpl [moved from templates/ca/pager.tmpl with 67% similarity]
templates/de/printer-accept.tmpl [new file with mode: 0644]
templates/de/printer-added.tmpl [new file with mode: 0644]
templates/de/printer-cancel-jobs.tmpl [new file with mode: 0644]
templates/de/printer-configured.tmpl [new file with mode: 0644]
templates/de/printer-confirm.tmpl [moved from templates/ca/printer-confirm.tmpl with 50% similarity]
templates/de/printer-default.tmpl [new file with mode: 0644]
templates/de/printer-deleted.tmpl [new file with mode: 0644]
templates/de/printer-jobs-header.tmpl [new file with mode: 0644]
templates/de/printer-modified.tmpl [new file with mode: 0644]
templates/de/printer-reject.tmpl [new file with mode: 0644]
templates/de/printer-start.tmpl [new file with mode: 0644]
templates/de/printer-stop.tmpl [new file with mode: 0644]
templates/de/printer.tmpl [new file with mode: 0644]
templates/de/printers-header.tmpl [new file with mode: 0644]
templates/de/printers.tmpl [new file with mode: 0644]
templates/de/restart.tmpl [new file with mode: 0644]
templates/de/samba-export.tmpl [new file with mode: 0644]
templates/de/samba-exported.tmpl [new file with mode: 0644]
templates/de/search.tmpl [moved from templates/ca/search.tmpl with 60% similarity]
templates/de/set-printer-options-header.tmpl [moved from templates/cs/set-printer-options-header.tmpl with 84% similarity]
templates/de/set-printer-options-trailer.tmpl [moved from templates/fr/set-printer-options-trailer.tmpl with 98% similarity]
templates/de/subscription-added.tmpl [new file with mode: 0644]
templates/de/subscription-canceled.tmpl [new file with mode: 0644]
templates/de/test-page.tmpl [new file with mode: 0644]
templates/de/trailer.tmpl [new file with mode: 0644]
templates/de/users.tmpl [moved from templates/ca/users.tmpl with 64% similarity]
templates/edit-config.tmpl
templates/error-op.tmpl
templates/error.tmpl
templates/es/add-class.tmpl
templates/es/add-printer.tmpl
templates/es/admin.tmpl
templates/es/choose-device.tmpl
templates/es/choose-make.tmpl
templates/es/choose-model.tmpl
templates/es/choose-serial.tmpl
templates/es/choose-uri.tmpl
templates/es/class-added.tmpl
templates/es/class-confirm.tmpl
templates/es/class-deleted.tmpl
templates/es/class-jobs-header.tmpl
templates/es/class-modified.tmpl
templates/es/class.tmpl
templates/es/command.tmpl
templates/es/edit-config.tmpl
templates/es/error-op.tmpl
templates/es/error.tmpl
templates/es/header.tmpl.in
templates/es/help-header.tmpl
templates/es/help-trailer.tmpl
templates/es/job-cancel.tmpl
templates/es/job-hold.tmpl
templates/es/job-move.tmpl
templates/es/job-moved.tmpl
templates/es/job-release.tmpl
templates/es/job-restart.tmpl
templates/es/jobs-header.tmpl
templates/es/jobs.tmpl
templates/es/list-available-printers.tmpl
templates/es/modify-class.tmpl
templates/es/modify-printer.tmpl
templates/es/norestart.tmpl
templates/es/printer-accept.tmpl
templates/es/printer-added.tmpl
templates/es/printer-cancel-jobs.tmpl [new file with mode: 0644]
templates/es/printer-configured.tmpl
templates/es/printer-confirm.tmpl
templates/es/printer-default.tmpl
templates/es/printer-deleted.tmpl
templates/es/printer-jobs-header.tmpl
templates/es/printer-modified.tmpl
templates/es/printer-reject.tmpl
templates/es/printer-start.tmpl
templates/es/printer-stop.tmpl
templates/es/printer.tmpl
templates/es/restart.tmpl
templates/es/set-printer-options-header.tmpl
templates/es/set-printer-options-trailer.tmpl
templates/es/subscription-added.tmpl
templates/es/subscription-canceled.tmpl
templates/es/test-page.tmpl
templates/es/trailer.tmpl
templates/es/users.tmpl
templates/fr/add-class.tmpl [deleted file]
templates/fr/add-printer.tmpl [deleted file]
templates/fr/add-rss-subscription.tmpl [deleted file]
templates/fr/admin.tmpl [deleted file]
templates/fr/choose-device.tmpl [deleted file]
templates/fr/choose-make.tmpl [deleted file]
templates/fr/choose-model.tmpl [deleted file]
templates/fr/choose-serial.tmpl [deleted file]
templates/fr/choose-uri.tmpl [deleted file]
templates/fr/class-added.tmpl [deleted file]
templates/fr/class-confirm.tmpl [deleted file]
templates/fr/class-deleted.tmpl [deleted file]
templates/fr/class-jobs-header.tmpl [deleted file]
templates/fr/class-modified.tmpl [deleted file]
templates/fr/class.tmpl [deleted file]
templates/fr/classes-header.tmpl [deleted file]
templates/fr/classes.tmpl [deleted file]
templates/fr/command.tmpl [deleted file]
templates/fr/edit-config.tmpl [deleted file]
templates/fr/error-op.tmpl [deleted file]
templates/fr/error.tmpl [deleted file]
templates/fr/header.tmpl.in [deleted file]
templates/fr/help-header.tmpl [deleted file]
templates/fr/help-trailer.tmpl [deleted file]
templates/fr/job-cancel.tmpl [deleted file]
templates/fr/job-hold.tmpl [deleted file]
templates/fr/job-move.tmpl [deleted file]
templates/fr/job-moved.tmpl [deleted file]
templates/fr/job-release.tmpl [deleted file]
templates/fr/job-restart.tmpl [deleted file]
templates/fr/jobs-header.tmpl [deleted file]
templates/fr/jobs.tmpl [deleted file]
templates/fr/list-available-printers.tmpl [deleted file]
templates/fr/modify-class.tmpl [deleted file]
templates/fr/modify-printer.tmpl [deleted file]
templates/fr/norestart.tmpl [deleted file]
templates/fr/option-conflict.tmpl [deleted file]
templates/fr/option-pickone.tmpl [deleted file]
templates/fr/option-trailer.tmpl [deleted file]
templates/fr/pager.tmpl [deleted file]
templates/fr/printer-accept.tmpl [deleted file]
templates/fr/printer-added.tmpl [deleted file]
templates/fr/printer-configured.tmpl [deleted file]
templates/fr/printer-confirm.tmpl [deleted file]
templates/fr/printer-default.tmpl [deleted file]
templates/fr/printer-deleted.tmpl [deleted file]
templates/fr/printer-jobs-header.tmpl [deleted file]
templates/fr/printer-modified.tmpl [deleted file]
templates/fr/printer-purge.tmpl [deleted file]
templates/fr/printer-reject.tmpl [deleted file]
templates/fr/printer-start.tmpl [deleted file]
templates/fr/printer-stop.tmpl [deleted file]
templates/fr/printer.tmpl [deleted file]
templates/fr/printers-header.tmpl [deleted file]
templates/fr/printers.tmpl [deleted file]
templates/fr/restart.tmpl [deleted file]
templates/fr/samba-export.tmpl [deleted file]
templates/fr/samba-exported.tmpl [deleted file]
templates/fr/search.tmpl [deleted file]
templates/fr/set-printer-options-header.tmpl [deleted file]
templates/fr/subscription-added.tmpl [deleted file]
templates/fr/subscription-canceled.tmpl [deleted file]
templates/fr/test-page.tmpl [deleted file]
templates/fr/trailer.tmpl [deleted file]
templates/fr/users.tmpl [deleted file]
templates/header.tmpl.in
templates/help-header.tmpl
templates/help-trailer.tmpl
templates/ja/add-class.tmpl
templates/ja/add-printer.tmpl
templates/ja/admin.tmpl
templates/ja/choose-device.tmpl
templates/ja/choose-make.tmpl
templates/ja/choose-model.tmpl
templates/ja/choose-serial.tmpl
templates/ja/choose-uri.tmpl
templates/ja/class-added.tmpl
templates/ja/class-confirm.tmpl
templates/ja/class-deleted.tmpl
templates/ja/class-jobs-header.tmpl
templates/ja/class-modified.tmpl
templates/ja/class.tmpl
templates/ja/command.tmpl
templates/ja/edit-config.tmpl
templates/ja/error-op.tmpl
templates/ja/error.tmpl
templates/ja/header.tmpl.in
templates/ja/help-header.tmpl
templates/ja/help-trailer.tmpl
templates/ja/job-cancel.tmpl
templates/ja/job-hold.tmpl
templates/ja/job-move.tmpl
templates/ja/job-moved.tmpl
templates/ja/job-release.tmpl
templates/ja/job-restart.tmpl
templates/ja/jobs-header.tmpl
templates/ja/list-available-printers.tmpl
templates/ja/modify-class.tmpl
templates/ja/modify-printer.tmpl
templates/ja/norestart.tmpl
templates/ja/printer-accept.tmpl
templates/ja/printer-added.tmpl
templates/ja/printer-cancel-jobs.tmpl [new file with mode: 0644]
templates/ja/printer-configured.tmpl
templates/ja/printer-confirm.tmpl
templates/ja/printer-default.tmpl
templates/ja/printer-deleted.tmpl
templates/ja/printer-jobs-header.tmpl
templates/ja/printer-modified.tmpl
templates/ja/printer-purge.tmpl [deleted file]
templates/ja/printer-reject.tmpl
templates/ja/printer-start.tmpl
templates/ja/printer-stop.tmpl
templates/ja/printer.tmpl
templates/ja/restart.tmpl
templates/ja/set-printer-options-header.tmpl
templates/ja/set-printer-options-trailer.tmpl
templates/ja/subscription-added.tmpl
templates/ja/subscription-canceled.tmpl
templates/ja/test-page.tmpl
templates/ja/trailer.tmpl
templates/ja/users.tmpl
templates/job-cancel.tmpl
templates/job-hold.tmpl
templates/job-move.tmpl
templates/job-moved.tmpl
templates/job-release.tmpl
templates/job-restart.tmpl
templates/jobs-header.tmpl
templates/list-available-printers.tmpl
templates/modify-class.tmpl
templates/modify-printer.tmpl
templates/norestart.tmpl
templates/printer-accept.tmpl
templates/printer-added.tmpl
templates/printer-cancel-jobs.tmpl [new file with mode: 0644]
templates/printer-configured.tmpl
templates/printer-confirm.tmpl
templates/printer-default.tmpl
templates/printer-deleted.tmpl
templates/printer-jobs-header.tmpl
templates/printer-modified.tmpl
templates/printer-purge.tmpl [deleted file]
templates/printer-reject.tmpl
templates/printer-start.tmpl
templates/printer-stop.tmpl
templates/printer.tmpl
templates/restart.tmpl
templates/ru/add-class.tmpl
templates/ru/add-printer.tmpl
templates/ru/admin.tmpl
templates/ru/choose-device.tmpl
templates/ru/choose-make.tmpl
templates/ru/choose-model.tmpl
templates/ru/choose-serial.tmpl
templates/ru/choose-uri.tmpl
templates/ru/class-added.tmpl
templates/ru/class-confirm.tmpl
templates/ru/class-deleted.tmpl
templates/ru/class-jobs-header.tmpl
templates/ru/class-modified.tmpl
templates/ru/class.tmpl
templates/ru/classes.tmpl
templates/ru/command.tmpl
templates/ru/edit-config.tmpl
templates/ru/error-op.tmpl
templates/ru/error.tmpl
templates/ru/header.tmpl.in
templates/ru/help-header.tmpl
templates/ru/help-trailer.tmpl
templates/ru/job-cancel.tmpl
templates/ru/job-hold.tmpl
templates/ru/job-move.tmpl
templates/ru/job-moved.tmpl
templates/ru/job-release.tmpl
templates/ru/job-restart.tmpl
templates/ru/jobs-header.tmpl
templates/ru/list-available-printers.tmpl
templates/ru/modify-class.tmpl
templates/ru/modify-printer.tmpl
templates/ru/norestart.tmpl
templates/ru/option-trailer.tmpl
templates/ru/pager.tmpl
templates/ru/printer-accept.tmpl
templates/ru/printer-added.tmpl
templates/ru/printer-cancel-jobs.tmpl [new file with mode: 0644]
templates/ru/printer-configured.tmpl
templates/ru/printer-confirm.tmpl
templates/ru/printer-default.tmpl
templates/ru/printer-deleted.tmpl
templates/ru/printer-jobs-header.tmpl
templates/ru/printer-modified.tmpl
templates/ru/printer-purge.tmpl [deleted file]
templates/ru/printer-reject.tmpl
templates/ru/printer-start.tmpl
templates/ru/printer-stop.tmpl
templates/ru/printer.tmpl
templates/ru/printers.tmpl
templates/ru/restart.tmpl
templates/ru/search.tmpl
templates/ru/set-printer-options-header.tmpl
templates/ru/set-printer-options-trailer.tmpl
templates/ru/subscription-added.tmpl
templates/ru/subscription-canceled.tmpl
templates/ru/test-page.tmpl
templates/ru/trailer.tmpl
templates/ru/users.tmpl
templates/set-printer-options-header.tmpl
templates/set-printer-options-trailer.tmpl
templates/subscription-added.tmpl
templates/subscription-canceled.tmpl
templates/test-page.tmpl
templates/trailer.tmpl
templates/users.tmpl
test/4.1-requests.test
test/4.2-cups-printer-ops.test
test/4.3-job-ops.test
test/4.4-subscription-ops.test
test/5.1-lpadmin.sh
test/5.2-lpc.sh
test/5.3-lpq.sh
test/5.4-lpstat.sh
test/5.5-lp.sh
test/5.6-lpr.sh
test/5.7-lprm.sh
test/5.8-cancel.sh
test/5.9-lpinfo.sh
test/Dependencies
test/Makefile
test/cancel-current-job.test
test/create-printer-subscription.test
test/everywhere/bonjour-tests.sh [new file with mode: 0755]
test/everywhere/document-format-tests.sh [new file with mode: 0755]
test/everywhere/document-format-tests.test [new file with mode: 0644]
test/everywhere/ipp-tests.sh [new file with mode: 0755]
test/everywhere/ipp-tests.test [new file with mode: 0644]
test/fax-job.test [new file with mode: 0644]
test/get-completed-jobs.test
test/get-job-template-attributes.test [new file with mode: 0644]
test/get-jobs.test
test/get-notifications.test [new file with mode: 0644]
test/get-printer-attributes-2.0.test
test/get-printer-description-attributes.test [new file with mode: 0644]
test/identify-printer-display.test [new file with mode: 0644]
test/identify-printer-multiple.test [new file with mode: 0644]
test/identify-printer.test [new file with mode: 0644]
test/ipp-1.1.test
test/ipp-2.0.test
test/ipp-2.1.test
test/ipp-2.2.test
test/ipp-everywhere.test [new file with mode: 0644]
test/ippdiscover.c [new file with mode: 0644]
test/ippfind.c [new file with mode: 0644]
test/ippinfra.c [new file with mode: 0644]
test/ippinfra.man [new file with mode: 0644]
test/ippproxy.c [new file with mode: 0644]
test/ippproxy.man [new file with mode: 0644]
test/ippserver.c
test/ippserver.man [new file with mode: 0644]
test/ipptool.c
test/make-ippeverywhere-print-tests.sh [new file with mode: 0755]
test/onepage-a4-300-black-1.pwg.gz [new file with mode: 0644]
test/onepage-letter-300-black-1.pwg.gz [new file with mode: 0644]
test/print-job-and-wait.test [new file with mode: 0644]
test/print-job-deflate.test [new file with mode: 0644]
test/print-job-gzip.test [new file with mode: 0644]
test/print-job-password.test [new file with mode: 0644]
test/printer.opacity
test/printer.png
test/run-stp-tests.sh
test/str-header.html
test/test.convs [new file with mode: 0644]
test/testhp.ppd
test/testps.ppd
test/validate-job.test [new file with mode: 0644]
test/xmltotest.c
vc2005/cups.sln [deleted file]
vc2005/ipptool.vcproj [deleted file]
vc2005/libcups2.vcproj [deleted file]
vc2005/testfile.vcproj [deleted file]
vc2005/testhttp.vcproj [deleted file]
vcnet/README.txt [new file with mode: 0644]
vcnet/config.h
vcnet/cups.sln
vcnet/ippfind.vcproj [moved from vc2005/cupstestppd.vcproj with 74% similarity]
vcnet/ippserver.vcproj [moved from vc2005/libcupsimage2.vcproj with 55% similarity]
vcnet/ipptool-installer.vdproj
vcnet/libcups2-installer.vdproj
vcnet/libcups2.vcproj
vcnet/regex.vcproj
vcnet/regex/regcomp.c
vcnet/sw-ippeveselfcert10.vdproj [new file with mode: 0644]
xcode/CUPS.xcodeproj/project.pbxproj
xcode/config.h

diff --git a/CHANGES-1.6.txt b/CHANGES-1.6.txt
new file mode 100644 (file)
index 0000000..23e1422
--- /dev/null
@@ -0,0 +1,244 @@
+CHANGES-1.6.txt
+---------------
+
+CHANGES IN CUPS V1.6.4
+
+       - Removed some duplicate size definitions for some ISO sizes that were
+         causing problems (<rdar://problem/14722721>)
+       - The IPP backend did not add the "last-document" attribute
+         (<rdar://problem/114660379>)
+       - Added a SyncOnClose directive to cups-files.conf to force cupsd to
+         call fsync before closing any configuration/state files it writes
+         (<rdar://problem/14523043>)
+       - Added USB quirk rule for Lexmark E238 (<rdar://problem/14493054>)
+       - Closed server connections were still not always detected
+         (<rdar://problem/14484313>)
+       - The libusb-based USB backend now loads its list of quirks from files
+         in /usr/share/cups/usb instead of using a hardcoded table
+         (<rdar://problem/14442769>)
+       - The scheduler did not properly register ICC color profiles with
+         colord (<rdar://problem/14455625>)
+
+
+CHANGES IN CUPS V1.6.3
+
+       - The configure script now prefers Clang over GCC.
+       - Fixed a compile problem on AIX (STR #4307)
+       - The default IPP version did not always get set before creating a new
+         IPP request message (<rdar://problem/14401718>)
+       - The lp, lpq, lpr, and lpstat now display an error message advising the
+         use of the /version=1.1 ServerName option (<rdar://problem/14290628>)
+       - Added documentation about the /version=1.1 option to ServerName in
+         client.conf (<rdar://problem/14216262>)
+       - httpStatus(HTTP_ERROR) did not return a useful error message
+         (<rdar://problem/14217326>)
+       - The lp, lpq, lpr, and lpstat commands incorrectly ignored the default
+         printer set in the lpoptions file (<rdar://problem/14216472>)
+       - Fixed a URI encoding issue for hostnames containing the ` (backquote)
+         character (<rdar://problem/14243133>)
+       - Added support for RFC 6874's IPv6 link local address format in URIs
+         (<rdar://problem/13979453>)
+       - The USB backend could crash on libusb-based systems if USB was
+         disabled in the BIOS (<rdar://problem/13875729>)
+       - Fixed a rounding error in the PWG media size mapping code
+         (<rdar://problem/13493241>)
+       - Fixed several ipptool test files that used old STATUS names.
+       - Kerberos credentials could get truncated when printing to a shared
+         printer.
+       - Printing using "ipps" URIs was not encrypted.
+       - Insecure ICC profiles prevented installation of user profiles for a
+         printer on OS X.
+       - Added more USB quirks for the libusb-based backend (STR #4311,
+         <rdar://problem/13736470>)
+       - The Russian web interface templates were broken (STR #4310)
+       - The scheduler no longer tries to do Kerberos authentication over the
+         loopback interface.
+       - The IPP backend could fail to pause a job for authentication
+         (STR #4298)
+       - Fixed a regression on the handling of auth keys on OS X if the
+         cups-files.conf was not present or did not contain a SystemAuthKey
+         value.
+       - The scheduler incorrectly did a reverse lookup of the server address
+         when HostNameLookups was turned off (STR #4302)
+       - The scheduler incorrectly computed the final content type value when
+         null filters were present.
+
+
+CHANGES IN CUPS V1.6.2
+
+       - Documentation fixes (STR #4229, STR #4239, STR #4234, STR #4248,
+         STR #4259)
+       - Security: All file, directory, user, and group settings are now stored
+         in a separate cups-files.conf configuration file that cannot be set
+         through the CUPS web interface or APIs (STR #4223)
+       - Added a Czech localization (STR #4201)
+       - Added a French localization (STR #4247)
+       - Added a Russian localization (STR #4228, STR #4285)
+       - Updated the Catalan localization (STR #4202)
+       - Local certificate authentication did not guard against an empty
+         certification file (STR #4293)
+       - The scheduler did not reject device URIs with spaces.
+       - Added USB quirk rule for Epson Stylus Photo 750 (STR #4286)
+       - The IPP backend could crash if the printer disconnects early
+         (STR #4284)
+       - cupsGetPPD did not work with statically-configured CUPS shared
+         queues (STR #4178)
+       - The scheduler did not support long MIME media types (STR #4270)
+       - The cupsfilter command did not set the CHARSET environment variable
+         for the text filters (STR #4273)
+       - The lp command did not show errors for unknown "--foo" (STR #4261)
+       - Bad IPP responses could crash ipptool (STR #4262)
+       - Updated USB quirk rules for Canon and Xerox printers (STR #4217,
+         STR #4263)
+       - Added USB blacklisting for printers that require a custom backend
+         (STR #4218)
+       - The PPD compiler did not correctly JCL options (STR #4115, STR #4203)
+       - The ipptool program now supports DEFINE-MATCH and DEFINE-NO-MATCH
+         predicates for STATUS directives.
+       - Fixed a problem with local Kerberos authentication (STR #4140)
+       - Coverity scan: fixed some minor issues (STR #4242)
+       - The scheduler did not remove color profiles after deleting a printer
+         (STR #4232, STR #4276)
+       - The CUPS library did not always detect a timed out connection to the
+         server which could cause temporary loss of printing from applications
+         (STR #4187)
+       - The ipptool program now supports variable substitution in OPERATION
+         and DELAY directives (STR #4175)
+       - The IPP backend now stops queues when the server configuration
+         prevents successful job submission (STR #4125)
+       - The XML output of ipptool contained empty dictionaries (STR #4136)
+       - The scheduler did not delete job control backup files (STR #4244)
+       - cupsGetPPD3 could return a local PPD instead of the correct remote
+         PPD.
+       - The scheduler incorrectly advertised auth-info-required for local
+         queues needing local authentication (STR #4205)
+       - CUPS 1.6 clients using the ServerName directive in client.conf did not
+         work with CUPS 1.3.x or older servers (STR #4231, STR #4291)
+       - The SNMP backend now tries to work around broken printers that use a
+         newline to separate key/value pairs.
+       - The IPP backend did not send a cancel request to printers when a job
+         was canceled and the printer did not support Create-Job.
+       - Fixed EPM packaging files (STR #4199)
+       - OpenBSD build fix (STR #4195, STR #4196, STR #4197)
+       - The scheduler could crash when using Avahi (STR #4183, STR #4192,
+         STR #4200, STR #4213)
+       - The IPP backend could get stuck in an endless loop on certain network
+         errors (STR #4194)
+       - 32-bit builds failed on Debian (STR #4133)
+       - The scheduler no longer accepts or sends job description attributes.
+       - The IPP backend now works around some conformance issues for broken
+         printers (STR #4190)
+       - cupsBackendReport() now filters out all control characters from the
+         reported 1284 device IDs (STR #4124)
+       - The scheduler no longer allows job-name values that are not valid
+         network Unicode strings (STR #4072)
+       - The web interface did not preserve the order of classes, jobs, or
+         printers (STR #4170)
+       - The network backends now support disabling of SNMP supply level
+         queries via the "snmp" URI option (STR #4106)
+       - The IPP backend did not specify the compression used (STR #4181)
+       - ipptool did not support octetString values.
+       - The scheduler did not recognize dnssd: or ipps: URIs as Bonjour shared
+         queues (STR #4158)
+       - Applications could not get the PPD file for statically-configured
+         Bonjour-shared print queues (STR #4159)
+       - The cupsd.conf file included obsolete browsing directives (STR #4157)
+       - Fixed a USB backend compatibility issue on systems using libusb
+         (STR #4155, STR #4191)
+       - Some Bonjour features were not available on systems with Avahi
+         (STR #4156)
+       - CUPS now includes the port number in the Host: header for HTTP
+         requests.
+       - Fixed REPEAT-MATCH for STATUS and EXPECT - was incorrectly erroring
+         out.
+
+
+CHANGES IN CUPS V1.6.1
+
+       - Documentation fix (STR #4149)
+       - RPM packaging fixes (STR #4129, #4145)
+       - The Japanese and English web interface headers were swapped
+         (STR #4148)
+
+
+CHANGES IN CUPS V1.6.0
+
+       - Document changes (STR #4131)
+       - Added new Catalan (STR #4107) and Spanish (STR #4137) localizations.
+
+
+CHANGES IN CUPS V1.6rc1
+
+       - Added a new Japanese localization (STR #4122)
+       - The SNMP backend no longer exits if it is unable to obtain an IPv6
+         socket (STR #4109)
+       - The LPD backend incorrectly used "localhost" in the control file
+         instead of the current hostname.
+
+
+CHANGES IN CUPS V1.6b1
+
+       - Documentation updates (STR #3927, STR #3980, STR #4010, STR #4068)
+       - The scheduler now consolidates all PPD updates from filters at the
+         end of the job (STR #4075)
+       - CUPS now supports color management using colord (STR #3808)
+       - CUPS now supports Bonjour using Avahi (STR #3066)
+       - The PreserveJobFiles and PreserveJobHistory directives now support
+         specification of a time interval (STR #3143)
+       - PPD files can now be archived in (gzip'd) tar files to further reduce
+         the disk space used by PPD files (STR #3772)
+       - The network backends now deal with printers that report their levels
+         in percent but do not specify a maximum capacity of 100 (STR #3551)
+       - The network backends now report full/almost-full waste bins in
+         printers along with end-of-life for cleaning pads (STR #4017)
+       - Added a configure option to set the permissions of the installed
+         cupsd (STR #3459)
+       - Added a new WITH-ALL-VALUES directive to ipptool EXPECT predicates
+         (STR #3949)
+       - CUPS now supports a User directive in client.conf and the CUPS_USER
+         environment variable for overriding the default username (STR #3114)
+       - Now set the PJL USERNAME variable as needed (STR #3100)
+       - Added support for usernames and passwords longer than 32 characters
+         (STR #2856)
+       - Added a new MaxHoldTime directive to automatically cancel jobs that
+         have been held indefinitely after a specific number of seconds
+         (STR #2291)
+       - The LPD backend now uses the originating host name when it is not the
+         local system (STR #2053)
+       - CUPS now prefers the suffix "dpcm" when reporting resolution in dots-
+         per-centimeter (STR #4006)
+       - The configure script and build system no longer support building of
+         separate 32-bit and 64-bit libraries.
+       - The "brightness", "columns", "fitplot", "gamma", "hue",
+         "natural-scaling", "penwidth", "position", "ppi", "saturation", and
+         "scaling" options are not longer supported (STR #4010)
+       - The "page-bottom", "page-left", "page-right", "page-top",
+         "prettyprint", and "wrap" options have been deprecated (STR #4010)
+       - The scheduler now reports the standard "number-of-documents" attribute
+         instead of the CUPS-specific "document-count" attribute in
+         job objects.
+       - Added new destination connection and enumeration functions (STR #3924)
+       - Added new option, localization, and job submission functions that do
+         not depend on PPD files (STR #3925)
+       - Added a new MaxJobTime directive for cupsd that specifies the maximum
+         amount of time allowed for a job to complete before it is canceled.
+       - The default password callback now supports passwords up to 127
+         characters.
+       - The scheduler now supports a DefaultAuthType of "auto" to
+         automatically choose between Basic (username/password) and Negotiate
+         (Kerberos) authentication.
+       - cupsSideChannelSNMPGet/Walk now support OIDs and values up to 64k in
+         length.
+       - CUPS no longer supports automatic remote printers or implicit classes
+         via the CUPS, LDAP, or SLP protocols (STR #3922, STR #3923)
+       - The PPD APIs are now deprecated and will be removed in a future
+         version of CUPS (STR #3927)
+       - The default IPP version for requests is now 2.0 (STR #3929)
+       - The IPP APIs no longer expose the ipp_t or ipp_attribute_t structures
+         and instead provide accessor functions (STR #3928)
+       - The scheduler will no longer run programs with group write permission.
+       - The PHP module has been removed (STR #3932)
+       - The bannertops, commandtoescpx, commandtopclx, imagetops,
+         imagetoraster, pdftops, rastertoescpx, rastertopclx, and texttops
+         filters have been removed (STR #3930)
+       - The serial and parallel backends have been removed (STR 3935)
diff --git a/CHANGES-1.7.txt b/CHANGES-1.7.txt
new file mode 100644 (file)
index 0000000..d3438ff
--- /dev/null
@@ -0,0 +1,250 @@
+CHANGES-1.7.txt
+---------------
+
+CHANGES IN CUPS V1.7.5
+
+       - Security: Addressed some more situations where symlinked files would
+         be served by the web interface (STR #4455)
+       - The LPD backend did not work with some versions of glibc (STR #4452)
+       - CGI scripts did not work (STR #4454)
+       - The cupsd.conf man page did not list the ErrorPolicy directive
+         (STR #4457)
+       - Updated the Brazilian Portuguese translation (STR #4456)
+
+
+CHANGES IN CUPS V1.7.4
+
+       - Security: The web interface incorrectly served symlinked files and
+         files that were not world-readable, potentially leading to a
+         disclosure of information (STR #4450)
+       - The CUPS headers incorrectly needed libdispatch for blocks support
+         (STR #4397)
+       - CUPS did not compile when Avahi or mDNSResponder was not present
+         (STR #4402, STR #4424)
+       - The "snmp" option did not work with the network backends (STR #4422)
+       - The User directive in client.conf did not override the USER
+         environment variable (STR #4426)
+       - The web interface now properly shows a "Go" button for all text-based
+         browsers (STR #4425)
+       - The MaxJobTime directive now properly supports time values (STR #4434)
+       - The RPM spec file did not work due to the new Brazilian Portuguese
+         localization (STR #4436)
+       - Fixed an "IPP read error" issue (STR #4440)
+       - Fixed the --disable-libusb configure option (STR #4439)
+       - Fixed the debug output from the DNS-SD backend when using Avahi
+         (STR #4444)
+       - Fixed a bug in the CUPS_SC_GET_DEVICE_ID handling by the network
+         backends (STR #4447)
+       - Added USB quirk rule for Lexmark E230 (STR #4448)
+
+
+CHANGES IN CUPS V1.7.3
+
+       - Added Brazilian Portuguese translation (STR #4409)
+       - Fixed mapping of OutputBin values such as "Tray1"
+         (<rdar://problem/16685606>)
+       - Several ippGet* functions incorrectly returned -1 instead of 0 on
+         error.
+       - The cupsGetResponse function did not work properly with
+         CUPS_HTTP_DEFAULT (<rdar://problem/16762593>)
+       - The IPP backend did not abort a job when the printer did not validate
+         the supplied options (<rdar://problem/16836752>)
+       - Fixed an authentication race condition in cupsSendRequest (STR #4403)
+       - The scheduler did not add the "job-hold-until-specified" reason when
+         holding a job using the lp command (STR #4405)
+       - The configure script incorrectly added libgcrypt as a GNU TLS
+         dependency (STR #4399)
+       - cupsGetDestMediaCount did not work for CUPS_MEDIA_FLAGS DEFAULT
+         (STR #4414)
+       - Auto-typing of PWG Raster files did not work (STR #4417)
+       - IPP queues using hardcoded credentials would ask for credentials
+         (STR #4371)
+       - Dates in non-UTF-8 locales did not display correctly (STR #4388)
+       - The RPM spec file now looks for libusb-devel 1.0 or later.
+       - Fixed the "create-printer-subscription.test" file for IPPTOOL
+         (STR #4420)
+
+
+CHANGES IN CUPS V1.7.2
+
+       - Security: The scheduler now blocks URLs containing embedded HTML
+         (STR #4356)
+       - Documentation fixes (STR #3259, STR #4346, STR #4355)
+       - Fixed the Japanese localization (STR #4385)
+       - Added a German localization (STR #4363)
+       - The cupsfilter command incorrectly read the cupsd.conf file; it now
+         reads the cups-files.conf file instead.
+       - Fixed OS X builds with Xcode 5.x (<rdar://problem/15914959>)
+       - Fixed SSL support on Windows (STR #4358)
+       - Fixed documentation and naming of Create-Job/Printer-Subscriptions
+         operations (STR #4389)
+       - Phone numbers in fax jobs were not properly filtered for IPP FaxOut
+         (<rdar://problem/16351701>)
+       - Updated Linux "relro" support (STR #4349)
+       - Fixed a memory leak in the label printer driver (STR #4393)
+       - cupsEnumDests did not set the "is_default" field (STR #4332)
+       - cupsDoIORequest could miss the server status, causing failed lpadmin
+         and other administrative commands (STR #4386)
+       - cupsEnumDests didn't always call the callback function (STR #4380)
+       - "lp -i job-id -H hold" did not work (STR #nnn)
+       - CUPS didn't compile on older platforms (STR #4338)
+       - Several libcups files did not have the Apple license exception
+         notice (STR #4361)
+       - Fixed a D-BUS threading issue that caused the scheduler to crash
+         (STR #4347)
+       - The scheduler now automatically reconnects to Avahi as needed
+         (STR #4370, STR #4373)
+       - The scheduler did not handle GET requests for the log files properly
+         (STR #3265)
+       - The dnssd backend did not always report all discovered printers using
+         Avahi (STR #4365)
+       - The Zebra printer driver did not properly handle negative "label top"
+         values (STR #4354)
+       - The scheduler did not always update the MakeModel value in
+         printers.conf after updating the driver (STR #4264)
+       - The LPD mini daemon did not support print jobs larger than 2GB
+         (STR #4351)
+       - Fixed a bug in the status reading code when sending a compressed data
+         stream to an IPP printer/server (<rdar://problem/16019623>)
+       - The IPP backend might not include all job attributes in Validate-Job
+         operations (<rdar://problem/16025435>)
+       - Fixed some clang-reported issues (<rdar://problem/15936066>)
+
+
+CHANGES IN CUPS V1.7.1
+
+       - Security: the lppasswd program incorrectly used settings from
+         ~/.cups/client.conf (STR #4319)
+       - Auto debug logging was broken in 1.7.0 (<rdar://problem/15331639>)
+       - Some gzip'd PPD files could not be used (<rdar://problem/15386424>)
+       - Cleaned up some job logging in the scheduler
+         (<rdar://problem/15332672>)
+       - ATTR messages could cause string pool memory corruption in the
+         scheduler (<rdar://problem/15382819>)
+       - The RPM spec file did not list the build requirements; this was on
+         purpose, but now we are listing the Red Hat package names
+         (<rdar://problem/15375760>, STR #4322)
+       - Printing to a raw queue could result in corrupt output due to
+         opportunistic compression (<rdar://problem/15008524>)
+       - The GNU TLS support code triggered many compiler warnings due to the
+         use of old GNU TLS compatibility type names
+         (<rdar://problem/15392966>)
+       - The "make check" test suite did not work on Linux without the
+         cups-filters package installed (<rdar://problem/14292998>)
+       - Japanese PPDs using with the Shift-JIS encoding did not work
+         (<rdar://problem/15427759>)
+       - "tel:" URIs incorrectly had slashes (<rdar://problem/15418463>)
+       - The libusb-based USB backend incorrectly used write timeouts
+         (<rdar://problem/15564888>)
+       - Shared printers could become inaccessible after a few days on OS X
+         (<rdar://problem/15426838>)
+       - The IPP backend did not wait for a busy printer to become available
+         before attempting to print (<rdar://problem/15465667>)
+       - CUPS did not support "auto-monochrome" or "process-monochrome" for the
+         "print-color-mode" option (<rdar://problem/15482520>)
+       - Using "@IF(name)" in an Allow or Deny rule did not work (STR #4328)
+       - lpq and lpstat did not list jobs in the correct order when priorities
+         were specified (STR #4326)
+       - The D-BUS notifier did not remove its lockfile (STR #4314)
+       - CUPS incorrectly used the USER environment variable when the name did
+         not match the user ID (STR #4327)
+
+
+CHANGES IN CUPS V1.7.0
+
+       - Updated the Japanese localization.
+       - The lpadmin command did not send the PPD name from the "-m" option
+         (<rdar://problem/15264697>)
+       - Network backends now use the prtMarkerSuppliesClass property to
+         determine the direction of supply level values
+         (<rdar://problem/14302628>)
+       - The scheduler did not remove backup PPD files when a printer was
+         deleted (<rdar://problem/15065555>)
+       - The scheduler incorrectly responded to HEAD requests when the web
+         interface was disabled (<rdar://problem/15090332>)
+       - The scheduler did not respond using the hostname specified by the
+         client (<rdar://problem/14583574>)
+       - Fax queues did not work when shared via Bonjour
+         (<rdar://problem/14498310>)
+       - Error messages from the scheduler were not localized using the
+         language specified in the client's IPP request
+         (<rdar://problem/14128011>)
+       - Added an Italian localization (<rdar://problem/14481578>)
+       - Fixed a couple memory leaks in ippfind that were reported by Clang.
+       - Fixed a compile issue on 64-bit Linux with Clang - need to use the
+         -pie option instead of -Wl,-pie now (<rdar://problem/14480938>)
+       - The ippfind utility reported the wrong port numbers when compiled
+         against Avahi (<rdar://problem/14508324>)
+       - httpGetFd, httpGetFile, httpPutFd, and httpPutFile did not
+         automatically reconnect if the server closed the connecion after the
+         previous response.
+       - Fixed a compile error in libcups (<rdar://problem/14467141>)
+       - The scheduler incorrectly did not pass a FINAL_CONTENT_TYPE
+         environment variable to the filters or backend
+         (<rdar://problem/14355011>)
+       - The cups-exec helper program could fail randomly on OS X due to
+         sandbox violations when closing excess file descriptors
+         (<rdar://problem/14421943>)
+       - The scheduler incorrectly did not use the kqueue interface on OS X.
+
+
+CHANGES IN CUPS V1.7rc1
+
+       - Printer xxx-default values were not reported by Get-Printer-Attributes
+         or lpoptions (<rdar://problem/14401795>)
+       - Fixed deprecation warnings for many functions on OS X so they are tied
+         to the deployment version when building (<rdar://problem/14210079>)
+       - Fixed a build issue on ARM-based Linux systems - unable to validate
+         va_list arguments.
+       - Added a new ippfind tool for finding IPP printers and other Bonjour
+         services (<rdar://problem/13876199>)
+       - Fixed some issues with conversion of PWG media size names to
+         hundredths of millimeters (<rdar://problem/14065748>)
+       - The IPP backend could crash on OS X when printing to a Kerberized
+         printer (<rdar://problem/14040186>)
+       - The ipptool program now automatically extends timeouts when the
+         output buffer is filled (<rdar://problem/14016099>)
+       - The ipptool program now supports the --help and --version options.
+       - The ipptool program did not continue past include file errors by
+         default (<rdar://problem/13875803>)
+       - The ipptool program now supports FILE-ID and TEST-ID directives and
+         includes their values in its XML output (<rdar://problem/13876038>)
+       - The ipptool program now supports WITH-HOSTNAME, WITH-RESOURCE, and
+         WITH-SCHEME expect predicates to compare the corresponding URI
+         components (<rdar://problem/13876091>)
+
+
+CHANGES IN CUPS V1.7b1
+
+       - The configure script now supports a --with-rundir option to change
+         the transient run-time state directory from the default to other
+         locations like /run/cups (STR #4306)
+       - The scheduler now supports PPD lookups for classes (STR #4296)
+       - The cupsfilter program did not set the FINAL_CONTENT_TYPE
+         environment variable for filters.
+       - Added a new "-x" option to the cancel command (STR #4103)
+       - Made the PWG media handling APIs public (STR #4267)
+       - Implemented ready media support for the cupsGetDestMediaXxx APIs
+         (STR #4289)
+       - Added new cupsFindDestDefault, cupsFindDestReady, and
+         cupsFindDestSupported APIs (STR #4289)
+       - Added new cupsGetDestMediaByIndex, cupsGetDestMediaCount, and
+         cupsGetDestMediaDefault APIs (STR #4289)
+       - Added new ippGet/SetOctetString APIs for getting and setting an
+         octetString value (STR #4289)
+       - Added new ippCreateRequestedArray API for generating a array of
+         attributes from the requested-attributes attribute.
+       - The ipptool utility now supports compression, conditional tests based
+         on the presence of files, and new DEFINE predicates for STATUS.
+       - Added new IPP APIs for checking values (STR #4167)
+       - Added new IPP APis for adding and setting formatted strings.
+       - Added new HTTP APIs to support basic server functionality via libcups.
+       - The dnssd backend now generates a 1284 device ID as needed (STR #3702)
+       - CUPS now supports compressing and decompressing streamed data
+         (STR #4168)
+       - CUPS now supports higher-level PIN printing, external accounting
+         systems, and "print here" printing environments (STR #4169)
+       - IRIX is no longer a supported operating system (STR #4092)
+       - The PPD compiler now supports JCL options properly (STR #4115)
+       - The web interface now checks whether the web browser has cookies
+         enabled and displays a suitable error message (STR #4141)
diff --git a/CHANGES-2.0.txt b/CHANGES-2.0.txt
new file mode 100644 (file)
index 0000000..dc46f03
--- /dev/null
@@ -0,0 +1,215 @@
+CHANGES-2.0.txt
+---------------
+
+CHANGES IN CUPS V2.0.4
+
+       - Fixed a bug in cupsRasterWritePixels (STR #4650)
+       - Fixed redirection in the web interface (STR #4538)
+       - The IPP backend did not respond to side-channel requests (STR #4645)
+       - The scheduler did not start all pending jobs at once (STR #4646)
+       - The web search incorrectly searched time-at-xxx values (STR #4652)
+       - Fixed an RPM spec file issue (STR #4657)
+       - The scheduler incorrectly started jobs while canceling multiple jobs
+         (STR #4648)
+       - Fixed processing of server overrides without port numbers (STR #4675)
+       - Documentation changes (STR #4651, STR #4674)
+
+
+CHANGES IN CUPS V2.0.3
+
+       - Security: Fixed CERT VU #810572 exploiting the dynamic linker
+         (STR #4609)
+       - Security: The scheduler could hang with malformed gzip data
+         (STR #4602)
+       - Restored missing generic printer icon file (STR #4587)
+       - Fixed logging of configuration errors to show up as errors (STR #4582)
+       - Fixed potential buffer overflows in raster code and filters
+         (STR #4598, STR #4599, STR #4600, STR #4601)
+       - Fixed a gzip processing bug (#4602)
+       - Fixed <Limit> inside <Location> (STR #4575)
+       - Fixed lpadmin when both -m and -o are used (STR #4578)
+       - The web interface always showed support for 2-sided printing
+         (STR #4595)
+       - cupsRasterReadHeader did not fully validate the raster header
+         (STR #4596)
+       - The rastertopwg filter did not check for truncated input (STR #4597)
+       - The cups-lpd mini-daemon did not check for request parameters
+         (STR #4603)
+       - The scheduler could get caught in a busy loop (STR #4605)
+       - The sample Epson driver could crash (STR #4616)
+       - The IPP backend now correctly monitors jobs
+         (<rdar://problem/20495955>)
+       - The ppdhtml and ppdpo utilities crashed when the -D option was used
+         before a driver information file (STR #4627)
+       - ippfind incorrectly substituted "=port" for service_port.
+       - The IPP/1.1 test file did not handle the initial print job
+         completing early (STR #4576)
+       - Fixed a memory leak in cupsConnectDest (STR #4634)
+       - PWG Raster Format output contained invalid ImageBox values
+         (<rdar://problem/21144309>)
+       - Added Russian translation (STR #4577)
+       - Added German translation (STR #4635)
+
+
+CHANGES IN CUPS V2.0.2
+
+       - Security: cupsRasterReadPixels buffer overflow with invalid page
+         header and compressed raster data (STR #4551)
+       - Command-line programs were not localized on Mac OS X
+         (<rdar://problem/14546232>)
+       - The scheduler incorrectly cleared the MakeModel string in the
+         printers.conf file after a restart (<rdar://problem/16827518>)
+       - CUPS did not compile with older versions of GNU TLS (STR #4527)
+       - CUPS did not compile without Avahi or mDNSResponder (STR #4523)
+       - ippLength() did not return the correct length for IPP_TAG_CONST
+         string values.
+       - The scheduler incorrectly aborted jobs after a job was restarted
+         (<rdar://problem/19129387>)
+       - The cups-files.conf file contained the old ServerCertificate/Key
+         directives instead of ServerKeychain.
+       - Fixed builds when no SSL/TLS library is available, or when explicitly
+         disabled (STR #4531)
+       - Fixed an OpenBSD charset transcoding issue.
+       - Fixed USB printing on OpenBSD (STR #4525)
+       - The --without-xinetd configure option did not work (STR #4542)
+       - Backends needing to load OS X kernel extensions did not work
+         (<rdar://problem/19015679>)
+       - Mapping of PPD keywords to IPP keywords did not work if the PPD
+         keyword was already an IPP keyword (<rdar://problem/19121005>)
+       - cupsGetPPD* sent bad requests (STR #4567)
+       - ippserver used the wrong temporary directory on Windows (STR #4547)
+       - ippserver did not handle Bonjour registrations properly (STR #4548)
+       - The scheduler could crash during shutdown if Avahi was shutdown
+         first (STR #4550)
+       - Added a USB quirk rule for Intermec printers (STR #4553)
+       - The scheduler did not always log which configuration file had the
+         error (STR #4559)
+       - The ippfind and ipptool programs now correctly match hostnames with
+         trailing dots (STR #4563)
+       - The ipptool timeout option did not work (STR #4515)
+       - Fixed several issues with client.conf, CUPS_SERVER, and the "-h"
+         option of most commands (STR #4528)
+       - Another change for OpenBSD (STR #4526)
+       - Added Japanese localization (STR #4524)
+       - Documentation changes (STR #4569)
+
+
+CHANGES IN CUPS V2.0.1
+
+       - Security: SSLv3 is now disabled by default to protect against the
+         POODLE attack (STR #4476)
+       - Printer sharing did not work when systemd was being used (STR #4497)
+       - cupsGetPPD* would return a symlink to the PPD in /etc/cups/ppd even if
+         it was not readable by the user (STR #4500)
+       - The web interface now protects against frame "click-jacking" attacks
+         (STR #4492)
+       - Fixed a crash in ippAttributeString (<rdar://problem/17903871>)
+       - Fixed a crash in the scheduler on Linux/*BSD if colord was not running
+         (STR #4496)
+       - Fixed a random crash in the scheduler when not using systemd
+         (STR #4484)
+       - Added systemd support for cups-lpd (STR #4493)
+       - The scheduler did not honor the FatalErrors directive for mis-
+         configured Group and SystemGroup values (STR #4495)
+       - The network backends no longer report waste-receptacle conditions when
+         using SNMP (STR #4499)
+       - The IPP backend did not work with some configurations of Windows
+         (STR #4503)
+       - RPMs did not build (STR #4490)
+       - Added a USB quirk rule for the Brother HL-1250 (STR #4519)
+       - Fixed compiles on unsupported platforms (STR #4510)
+       - "cancel -a" did not cancel all jobs on all destinations (STR #4513)
+       - The web interface did not work on OpenBSD (STR #4496)
+
+
+CHANGES IN CUPS V2.0.0
+
+       - The scheduler did not preserve listener sockets from launchd or
+         systemd after a restart (<rdar://problem/18112848>)
+       - Added some USB quirk rules for the libusb-based USB backend
+         (STR #4482)
+       - Spanish localization update (STR #4487)
+       - Updated documentation for 2.0.0 release.
+
+
+CHANGES IN CUPS V2.0rc1
+
+       - Documentation updates (STR #4464)
+       - The scheduler now monitors the AC power status on OS X, allowing for
+         "sleep printing" when sharing printers (<rdar://problem/17325852>)
+       - The scheduler incorrectly called launch_activate_socket multiple times
+         on OS X (<rdar://problem/17523218>)
+       - The ippserver test program now passes the IPP Everywhere self-
+         certification tests (STR #4101)
+       - Relaxed the new OS X filter sandbox slightly (STR #4471,
+         <rdar://problem/17483959>)
+       - Dropped the old Epson Stylus Color/Photo sample drivers since they
+         don't work with any current printers and there are free alternatives
+         that produce much better output (<rdar://problem/18036889>)
+       - Log and configuration files that are not world-readable are again
+         accessible via the web interface (STR #4461)
+       - PPD files are now created using the permissions specified by the
+         ConfigFilePerm directive.
+       - Fixed RPM build issues (STR #4459)
+       - Fixed the spinner image and restart page when reconfiguring the
+         scheduler through the web interface (STR #4475)
+
+
+CHANGES IN CUPS V2.0b1
+
+       - Added a "--list-filters" option to the cupsfilter command (STR #4325)
+        - Added systemd support (STR #3917)
+       - Added support for re-sending a job as a raster file if a higher-level
+         format such as PDF fails (<rdar://problem/15583721>)
+       - Added support for regular expression matching in the MIME type rules
+         (<rdar://problem/11131245>)
+       - Added support for TLS certificate validation and policy enforcement
+         (STR #1616)
+       - Added support for simultaneous XML and test output from ipptool.
+       - Added support for PAUSE directive in ipptool test files.
+       - Added support for auto-typing of TIFF files by ipptool (STR #4418)
+       - The scheduler now returns completed jobs in the correct newest-to-
+         oldest order (STR #4396)
+       - The configure script now supports target-specific tools for pkg-config
+         and others (STR #4423)
+       - The ipptool program now supports EXPECT statements for collection
+         member attributes (<rdar://problem/15355218>)
+       - The ipptool program now supports collection attributes with multiple
+         values (<rdar://problem/15355124>)
+       - The sample drivers now include all of the installed localizations by
+         default (<rdar://problem/14756625>)
+       - Adopted Linux man page conventions and updated all man pages
+         (STR #4372, STR #4329)
+       - The scheduler now supports the "first-index" operation attribute for
+         the Get-Jobs operation (STR #2913)
+       - Changed the default AccessLogLevel and PageLogFormat to disable the
+         access_log and page_log files by default (<rdar://problem/16495000>)
+       - cupsRasterInterpretPPD now supports the Orientation header in order to
+         support long-edge feed raster printers (<rdar://problem/15837926>)
+       - The scheduler now allows run-as-root backends to have group read and
+         execute permissions (STR #2935)
+       - The ippFindAttribute and ippFindNextAttribute functions now support
+         hierarchical searches (STR #4395)
+       - Dropped OpenSSL support in favor of GNU TLS.
+       - Dropped "dark wake" support on OS X, which was preventing portables
+         from going to sleep when there was a stuck job. We now use a variation
+         of the CUPS 1.4 sleep support to do a cleaner sleep
+         (<rdar://problem/14323704>)
+       - Dropped support for AIX, HP-UX, and OSF/1 (aka Digital UNIX)
+       - Dropped lppasswd and support for Digest authentication in in the
+         scheduler (STR #4321)
+       - The cupsGetClasses, cupsGetPrinters, and cupsTempFile functions are no
+         longer supported.
+       - The scheduler now caches more job history data and limits the number
+         of completed jobs returned by Get-Jobs as needed in order to prevent a
+         denial-of-service on busy servers (STR #2913)
+       - The filter/backend sandbox on OS X now defaults to a more strict
+         whitelist (<rdar://problem/15939788>)
+       - Increased the default idle exit timeout to 60 seconds on OS X
+         (<rdar://problem/16041820>)
+       - Printer classes were not accessible on OS X
+         (<rdar://problem/16385643>)
+       - The scheduler now uses </DefaultPrinter> to close the default printer
+         definition in printers.conf (STR #4153)
+       - Canceling all jobs in the web interface now just cancels the jobs
+         (STR #1914)
index e69de29..c96addb 100644 (file)
@@ -0,0 +1,168 @@
+CHANGES-IPPTOOL.txt - 2015-05-15
+--------------------------------
+
+This file provides a list of changes to the ipptool binary distribution posted
+on CUPS.org.
+
+2014-05-15
+
+       - Added support for simultaneous XML and test output from ipptool.
+       - Added support for PAUSE directive in ipptool test files.
+
+
+2013-07-15
+
+       - New ippfind tool now included with ipptool.
+       - Added support for automatically extending the timeout when all of the
+         request data has not yet been written (all platforms but Windows
+         which does not support it...)
+       - Fixed several ipptool test files that used old STATUS names.
+
+
+2013-04-18
+
+       - Fixed some HTTP issues with authentication and compression.
+       - The IPP/1.1 test file did not allow for sufficient retries when
+         printing.
+       - The IPP/1.1 test file did not allow for empty printer-name values.
+       - The IPP Everywhere test file contained numerous errors.
+       - The color.jpg test file used a progressive mode instead of the
+         baseline JPEG mode.
+       - The IPP/1.1 test file referenced "color.jpeg" instead of "color.jpg".
+
+
+2013-01-31
+
+       - Added support for DEFINE-MATCH and DEFINE-NO-MATCH as STATUS
+         predicates.
+       - Added support for WITH-VALUE and resolution values.
+       - Added support for SKIP-IF-MISSING (skip test if file is missing)
+       - Added support for octetString values.
+       - Added support for document compression in Print-Job and Send-Document
+         requests.
+       - Fixed REPEAT-MATCH for STATUS and EXPECT - was incorrectly erroring
+         out.
+       - Fixed a bug where bad IPP responses would cause ipptool to crash.
+
+
+2012-02-28
+
+       - Changed behavior of WITH-VALUES "/regex/" to not require all values to
+         match.
+       - Added WITH-ALL-VALUES directive for EXPECT predicates that require all
+         values to match.
+       - Updated test files to use WITH-ALL-VALUES where necessary.
+       - Updated test files to use new ABNF for media names from PWG Media
+         Names 2.0.
+
+
+2012-02-06
+
+       - Fixed the packaging of ipptool on Windows (removed unnecessary DLLs)
+       - Fixed an crash in ipptool when mixing DISPLAY with -I and a failed
+         request.
+       - Added a Print-Job test file.
+       - Added a "setdebug" batch file for Windows
+       - Added support for a CUPS_DISABLE_ASYNC_CONNECT environment variable.
+
+
+2012-01-10
+
+       - Fixed an issue with the IPP/1.1 test file where the "waiting for job
+         completion" test did not work.
+       - The attribute groups out of order error was not shown for the
+         operation-attributes-tag group.
+
+
+2011-12-02
+
+       - Fixed a truncated XML output bug that would happen for certain errors.
+       - Fixed the order-of-groups tests.
+       - Fixed "WITH-VALUE >N" for rangeOfInteger attributes.
+       - The Windows installer was missing the get-printer-attributes.test
+         file.
+       - The Linux binaries are now compiled for all LSB 4.x-compliant Linux
+         distributions.
+       - The Linux binaries no longer support SSL or TLS.
+
+
+2011-10-05
+
+       - Fixed a crasher bug that showed up on Windows.
+       - The IPP/1.1 test would hang if the initial Print-Job test failed.
+       - Fixed a typo in the IPP/2.0 test.
+
+
+2011-10-03
+
+       - Using OF-TYPE with the "no-value" or "unknown" out-of-band value tags
+         now works without special WITH-VALUE strings.
+       - ipptool now shows an error when an attribute appears more than once
+         within the same attribute group.
+       - ipptool did not display attributes as specified by the DISPLAY
+         directive when a test error failed.
+       - Fixed one spot where DEFINE-VALUE was still treated as an error when
+         the EXPECT test failed.
+       - uriScheme values were not displayed properly.
+       - Updated the IPP/1.1 tests to properly validate support for
+         job-hold-until-default and job-hold-until-supported when the Hold-Job
+         operation is supported.
+       - Updated the IPP/1.1 tests to properly check for the various standard
+         media sizes for the printing tests.
+       - Updated the IPP/1.1 tests to accept "no-value" for media-default an
+         orientation-requested-default.
+       - Updated the IPP/1.1 tests to accept "unknown" for job-state.
+       - Updated the IPP/1.1 tests to not perform the bogus URI printing tests
+         unless the "document-uri" variable is defined.
+       - Updated the IPP/2.0 tests to properly validate media-col
+         "media-xxx-supported" attributes.
+       - Updated the IPP/2.2 tests to properly validate media-ready and
+         media-col-ready.
+
+
+2011-09-28
+
+       - Test output now includes a summary and overall score at the end.
+       - The MATCH-VALUE predicate now correctly deals with a failed EXPECT
+         condition.
+       - The IPP/1.1 test suite now looks for legacy media names and uses them
+         if the corresponding PWG standard names are not present.
+       - The IPP/1.1 test suite now tests the Print-Job+Release-Job when the
+         printer supports the job-hold-until attribute, Hold-Job operation, and
+         Release-Job operation.
+
+
+2011-09-21
+
+       - Fixes for HTTP chunking, timeout, and encryption issues reported by
+         various users.
+       - Greatly improved IPP tests with added IPP/2.2 tests.
+       - New test documents - 1-page and 4-page mixed A4/Letter PDF/PS and a
+         couple JPEGs.
+       - New REPEAT directives to programmatically repeat tests as needed.
+
+
+2011-08-16
+
+       - The Windows version no longer requires Visual Studio to be installed.
+       - The Windows version now supports SSL.
+       - Added "ipps" URI support.
+       - Added a new "-T" option.
+       - Added support for fractional seconds for the -i option and DELAY
+         directive.
+       - Added support for authentication.
+       - Added DEFINE-MATCH, DEFINE-NO-MATCH, DEFINE-VALUE, IF-NOT-DEFINED,
+         IGNORE-ERRORS, SKIP-IF-DEFINED, SKIP-IF-NOT-DEFINED,
+         SKIP-PREVIOUS-ERROR directives.
+       - WITH-VALUE now supports variable expansion.
+       - Updated the IPP/1.1 conformance test to skip the "my-jobs different
+         user" test if the printer URI contains a username.
+       - Updated the IPP conformance tests to validate media, media-default,
+         and media-supported values.
+       - No longer error out if a Printer returns a different version number in
+         the response when the request contains the version 0.0.
+
+
+2010-10-16
+
+       - Initial release of standalone binary.
index 35d38fb..566a4e3 100644 (file)
-CHANGES.txt - 1.6.4 - 2013-09-24
+CHANGES.txt - 2.1.2 - 2015-12-02
 --------------------------------
 
-CHANGES IN CUPS V1.6.4
+CHANGES IN CUPS V2.1.2
+
+       - Re-release of CUPS 2.1.1 as CUPS 2.1.2 due to error in tagging of the
+         2.1.1 release (pulled content from the 2.2.x tree instead)
+
+
+CHANGES IN CUPS V2.1.1
+
+       - Security hardening fixes (<rdar://problem/23131948>,
+         <rdar://problem/23132108>, <rdar://problem/23132353>,
+         <rdar://problem/23132803>, <rdar://problem/23133230>,
+         <rdar://problem/23133393>, <rdar://problem/23133466>,
+         <rdar://problem/23133833>, <rdar://problem/23133998>,
+         <rdar://problem/23134228>, <rdar://problem/23134299>,
+         <rdar://problem/23134356>, <rdar://problem/23134415>,
+         <rdar://problem/23134506>, <rdar://problem/23135066>,
+         <rdar://problem/23135122>, <rdar://problem/23135207>,
+         <rdar://problem/23144290>, <rdar://problem/23144358>,
+         <rdar://problem/23144461>)
+       - The cupsGetPPD* functions did not work with IPP printers (STR #4725)
+       - Some older HP LaserJet printers need a delayed close when printing
+         using the libusb-based USB backend (STR #4549)
+       - The libusb-based USB backend did not unload the kernel usblp module
+         if it was preventing the backend from accessing the printer
+         (STR #4707)
+       - Current Primera printers were incorrectly reported as Fargo printers
+         (STR #4708)
+       - The IPP backend did not always handle jobs getting canceled at the
+         printer (<rdar://problem/22716820>)
+       - Scheduler logging change (STR #4728)
+       - Added USB quirk for Canon MP530 (STR #4730)
+       - The scheduler did not deliver job notifications for jobs submitted to
+         classes (STR #4733)
+       - Changing the printer-is-shared value for a remote queue did not
+         produce an error (STR #4738)
+       - The IPP backend incorrectly included the job-password attribute in
+         Validate-Job requests (<rdar://problem/23531939>)
+       - Updated localizations (STR #4709)
+
+
+CHANGES IN CUPS V2.1.0
+
+       - Fixed more scheduler crash bugs in the new logging code (STR #4687,
+         STR #4690)
+       - The scheduler did not use the ConfigFilePerm setting when copying PPD
+         files or interface scripts attached to a request (STR #4703)
+       - Now support new Chinese locale IDs and their correct fallback locales
+         (<rdar://problem/22086642>, <rdar://problem/22130168>)
+       - "make check" incorrectly reported an expectation of 18 warning
+         messages when 8 were expected (STR #4684)
+       - The new PDF file type rule did not work (STR #4692)
+       - The scheduler did not update the jobs.cache file when job files were
+         expired (STR #4706)
+       - Fixed some configure script issues (STR #4694, STR #4695, STR #4698)
+       - Documentation updates (STR #4691, STR #4693)
+
+
+CHANGES IN CUPS V2.1rc1
+
+       - Added support for 3D printers (basic types only, no built-in filters)
+         based on PWG white paper.
+       - Fixed bugs in the new journald support (STR #4655, STR #4658,
+         STR #4661)
+       - Fixed domain socket support on Linux (STR #4679)
+       - Fixed signal handlers in the dnssd and usb backends (STR #4671)
+       - <Limit All> in <Policy> sections now applies to all operations when
+         used by itself (STR #4659)
+       - Configure script changes for systemd support (STR #4669)
+       - Updated autoconf sources to use newer form of AC_INIT (STR #4664)
+
+
+CHANGES IN CUPS V2.1b1
+
+       - Improved speed of ppdMarkDefaults for complex/large PPDs
+         (<rdar://problem/15146999>)
+       - The IPP backend now stops sending print data if the printer indicates
+         the job has been aborted or canceled (<rdar://problem/17837631>)
+       - The IPP backend now sends the job-pages-per-set attribute when
+         printing multiple copy jobs with finishings
+         (<rdar://problem/16792757>)
+       - The IPP backend now updates the cupsMandatory values when the printer
+         configuration changes (<rdar://problem/18126570>)
+       - No longer install banner files since third-party banner filters now
+         supply their own (STR #4518)
+       - Added support for EXPECT-ALL directive in ipptool test files
+         (STR #4469)
+       - Added support for WITH-VALUE-FROM predicate in ipptool test files
+         (STR #4470)
+       - The scheduler no longer listens on the loopback interface unless the
+         web interface or printer sharing are enabled
+         (<rdar://problem/9136448>)
+       - Added a PPD generator for IPP Everywhere printers (STR #4258)
+       - Now install "default" versions of more configuration files
+         (<rdar://problem/19024491>)
+       - The cupstestppd program did not handle "maxsize(nnn)" entries in
+         cupsFilter/cupsFilter2 values (<rdar://problem/18974858>)
+       - The scheduler now checks the return value of rename() calls
+         (STR #4589)
+       - The scheduler now validates ErrorPolicy values in config files
+         (STR #4591)
+       - Long cookies caused the web interface to stop working (STR #4619)
+       - Added SSLOptions values to allow Diffie-Hellman key exchange and
+         disable TLS/1.0 support.
+       - Updated the scheduler to support more IPP Everywhere attributes
+         (STR #4630)
+       - The scheduler now supports advanced ASL and journald logging when
+         "syslog" output is configured (STR #4474)
+       - The scheduler now supports logging to stderr when running in the
+         foreground (STR #4505)
 
-       - Removed some duplicate size definitions for some ISO sizes that were
-         causing problems (<rdar://problem/14722721>)
-       - The IPP backend did not add the "last-document" attribute
-         (<rdar://problem/114660379>)
-       - Added a SyncOnClose directive to cups-files.conf to force cupsd to
-         call fsync before closing any configuration/state files it writes
-         (<rdar://problem/14523043>)
-       - Added USB quirk rule for Lexmark E238 (<rdar://problem/14493054>)
-       - Closed server connections were still not always detected
-         (<rdar://problem/14484313>)
-       - The libusb-based USB backend now loads its list of quirks from files
-         in /usr/share/cups/usb instead of using a hardcoded table
-         (<rdar://problem/14442769>)
-       - The scheduler did not properly register ICC color profiles with
-         colord (<rdar://problem/14455625>)
-
-
-CHANGES IN CUPS V1.6.3
-
-       - The configure script now prefers Clang over GCC.
-       - Fixed a compile problem on AIX (STR #4307)
-       - The default IPP version did not always get set before creating a new
-         IPP request message (<rdar://problem/14401718>)
-       - The lp, lpq, lpr, and lpstat now display an error message advising the
-         use of the /version=1.1 ServerName option (<rdar://problem/14290628>)
-       - Added documentation about the /version=1.1 option to ServerName in
-         client.conf (<rdar://problem/14216262>)
-       - httpStatus(HTTP_ERROR) did not return a useful error message
-         (<rdar://problem/14217326>)
-       - The lp, lpq, lpr, and lpstat commands incorrectly ignored the default
-         printer set in the lpoptions file (<rdar://problem/14216472>)
-       - Fixed a URI encoding issue for hostnames containing the ` (backquote)
-         character (<rdar://problem/14243133>)
-       - Added support for RFC 6874's IPv6 link local address format in URIs
-         (<rdar://problem/13979453>)
-       - The USB backend could crash on libusb-based systems if USB was
-         disabled in the BIOS (<rdar://problem/13875729>)
-       - Fixed a rounding error in the PWG media size mapping code
-         (<rdar://problem/13493241>)
-       - Fixed several ipptool test files that used old STATUS names.
-       - Kerberos credentials could get truncated when printing to a shared
-         printer.
-       - Printing using "ipps" URIs was not encrypted.
-       - Insecure ICC profiles prevented installation of user profiles for a
-         printer on OS X.
-       - Added more USB quirks for the libusb-based backend (STR #4311,
-         <rdar://problem/13736470>)
-       - The Russian web interface templates were broken (STR #4310)
-       - The scheduler no longer tries to do Kerberos authentication over the
-         loopback interface.
-       - The IPP backend could fail to pause a job for authentication
-         (STR #4298)
-       - Fixed a regression on the handling of auth keys on OS X if the
-         cups-files.conf was not present or did not contain a SystemAuthKey
-         value.
-       - The scheduler incorrectly did a reverse lookup of the server address
-         when HostNameLookups was turned off (STR #4302)
-       - The scheduler incorrectly computed the final content type value when
-         null filters were present.
-
-
-CHANGES IN CUPS V1.6.2
-
-       - Documentation fixes (STR #4229, STR #4239, STR #4234, STR #4248,
-         STR #4259)
-       - Security: All file, directory, user, and group settings are now stored
-         in a separate cups-files.conf configuration file that cannot be set
-         through the CUPS web interface or APIs (STR #4223)
-       - Added a Czech localization (STR #4201)
-       - Added a French localization (STR #4247)
-       - Added a Russian localization (STR #4228, STR #4285)
-       - Updated the Catalan localization (STR #4202)
-       - Local certificate authentication did not guard against an empty
-         certification file (STR #4293)
-       - The scheduler did not reject device URIs with spaces.
-       - Added USB quirk rule for Epson Stylus Photo 750 (STR #4286)
-       - The IPP backend could crash if the printer disconnects early
-         (STR #4284)
-       - cupsGetPPD did not work with statically-configured CUPS shared
-         queues (STR #4178)
-       - The scheduler did not support long MIME media types (STR #4270)
-       - The cupsfilter command did not set the CHARSET environment variable
-         for the text filters (STR #4273)
-       - The lp command did not show errors for unknown "--foo" (STR #4261)
-       - Bad IPP responses could crash ipptool (STR #4262)
-       - Updated USB quirk rules for Canon and Xerox printers (STR #4217,
-         STR #4263)
-       - Added USB blacklisting for printers that require a custom backend
-         (STR #4218)
-       - The PPD compiler did not correctly JCL options (STR #4115, STR #4203)
-       - The ipptool program now supports DEFINE-MATCH and DEFINE-NO-MATCH
-         predicates for STATUS directives.
-       - Fixed a problem with local Kerberos authentication (STR #4140)
-       - Coverity scan: fixed some minor issues (STR #4242)
-       - The scheduler did not remove color profiles after deleting a printer
-         (STR #4232, STR #4276)
-       - The CUPS library did not always detect a timed out connection to the
-         server which could cause temporary loss of printing from applications
-         (STR #4187)
-       - The ipptool program now supports variable substitution in OPERATION
-         and DELAY directives (STR #4175)
-       - The IPP backend now stops queues when the server configuration
-         prevents successful job submission (STR #4125)
-       - The XML output of ipptool contained empty dictionaries (STR #4136)
-       - The scheduler did not delete job control backup files (STR #4244)
-       - cupsGetPPD3 could return a local PPD instead of the correct remote
-         PPD.
-       - The scheduler incorrectly advertised auth-info-required for local
-         queues needing local authentication (STR #4205)
-       - CUPS 1.6 clients using the ServerName directive in client.conf did not
-         work with CUPS 1.3.x or older servers (STR #4231, STR #4291)
-       - The SNMP backend now tries to work around broken printers that use a
-         newline to separate key/value pairs.
-       - The IPP backend did not send a cancel request to printers when a job
-         was canceled and the printer did not support Create-Job.
-       - Fixed EPM packaging files (STR #4199)
-       - OpenBSD build fix (STR #4195, STR #4196, STR #4197)
-       - The scheduler could crash when using Avahi (STR #4183, STR #4192,
-         STR #4200, STR #4213)
-       - The IPP backend could get stuck in an endless loop on certain network
-         errors (STR #4194)
-       - 32-bit builds failed on Debian (STR #4133)
-       - The scheduler no longer accepts or sends job description attributes.
-       - The IPP backend now works around some conformance issues for broken
-         printers (STR #4190)
-       - cupsBackendReport() now filters out all control characters from the
-         reported 1284 device IDs (STR #4124)
-       - The scheduler no longer allows job-name values that are not valid
-         network Unicode strings (STR #4072)
-       - The web interface did not preserve the order of classes, jobs, or
-         printers (STR #4170)
-       - The network backends now support disabling of SNMP supply level
-         queries via the "snmp" URI option (STR #4106)
-       - The IPP backend did not specify the compression used (STR #4181)
-       - ipptool did not support octetString values.
-       - The scheduler did not recognize dnssd: or ipps: URIs as Bonjour shared
-         queues (STR #4158)
-       - Applications could not get the PPD file for statically-configured
-         Bonjour-shared print queues (STR #4159)
-       - The cupsd.conf file included obsolete browsing directives (STR #4157)
-       - Fixed a USB backend compatibility issue on systems using libusb
-         (STR #4155, STR #4191)
-       - Some Bonjour features were not available on systems with Avahi
-         (STR #4156)
-       - CUPS now includes the port number in the Host: header for HTTP
-         requests.
-       - Fixed REPEAT-MATCH for STATUS and EXPECT - was incorrectly erroring
-         out.
-
-
-CHANGES IN CUPS V1.6.1
-
-       - Documentation fix (STR #4149)
-       - RPM packaging fixes (STR #4129, #4145)
-       - The Japanese and English web interface headers were swapped
-         (STR #4148)
-
-
-CHANGES IN CUPS V1.6.0
-
-       - Document changes (STR #4131)
-       - Added new Catalan (STR #4107) and Spanish (STR #4137) localizations.
-
-
-CHANGES IN CUPS V1.6rc1
-
-       - Added a new Japanese localization (STR #4122)
-       - The SNMP backend no longer exits if it is unable to obtain an IPv6
-         socket (STR #4109)
-       - The LPD backend incorrectly used "localhost" in the control file
-         instead of the current hostname.
-
-
-CHANGES IN CUPS V1.6b1
-
-       - Documentation updates (STR #3927, STR #3980, STR #4010, STR #4068)
-       - The scheduler now consolidates all PPD updates from filters at the
-         end of the job (STR #4075)
-       - CUPS now supports color management using colord (STR #3808)
-       - CUPS now supports Bonjour using Avahi (STR #3066)
-       - The PreserveJobFiles and PreserveJobHistory directives now support
-         specification of a time interval (STR #3143)
-       - PPD files can now be archived in (gzip'd) tar files to further reduce
-         the disk space used by PPD files (STR #3772)
-       - The network backends now deal with printers that report their levels
-         in percent but do not specify a maximum capacity of 100 (STR #3551)
-       - The network backends now report full/almost-full waste bins in
-         printers along with end-of-life for cleaning pads (STR #4017)
-       - Added a configure option to set the permissions of the installed
-         cupsd (STR #3459)
-       - Added a new WITH-ALL-VALUES directive to ipptool EXPECT predicates
-         (STR #3949)
-       - CUPS now supports a User directive in client.conf and the CUPS_USER
-         environment variable for overriding the default username (STR #3114)
-       - Now set the PJL USERNAME variable as needed (STR #3100)
-       - Added support for usernames and passwords longer than 32 characters
-         (STR #2856)
-       - Added a new MaxHoldTime directive to automatically cancel jobs that
-         have been held indefinitely after a specific number of seconds
-         (STR #2291)
-       - The LPD backend now uses the originating host name when it is not the
-         local system (STR #2053)
-       - CUPS now prefers the suffix "dpcm" when reporting resolution in dots-
-         per-centimeter (STR #4006)
-       - The configure script and build system no longer support building of
-         separate 32-bit and 64-bit libraries.
-       - The "brightness", "columns", "fitplot", "gamma", "hue",
-         "natural-scaling", "penwidth", "position", "ppi", "saturation", and
-         "scaling" options are not longer supported (STR #4010)
-       - The "page-bottom", "page-left", "page-right", "page-top",
-         "prettyprint", and "wrap" options have been deprecated (STR #4010)
-       - The scheduler now reports the standard "number-of-documents" attribute
-         instead of the CUPS-specific "document-count" attribute in
-         job objects.
-       - Added new destination connection and enumeration functions (STR #3924)
-       - Added new option, localization, and job submission functions that do
-         not depend on PPD files (STR #3925)
-       - Added a new MaxJobTime directive for cupsd that specifies the maximum
-         amount of time allowed for a job to complete before it is canceled.
-       - The default password callback now supports passwords up to 127
-         characters.
-       - The scheduler now supports a DefaultAuthType of "auto" to
-         automatically choose between Basic (username/password) and Negotiate
-         (Kerberos) authentication.
-       - cupsSideChannelSNMPGet/Walk now support OIDs and values up to 64k in
-         length.
-       - CUPS no longer supports automatic remote printers or implicit classes
-         via the CUPS, LDAP, or SLP protocols (STR #3922, STR #3923)
-       - The PPD APIs are now deprecated and will be removed in a future
-         version of CUPS (STR #3927)
-       - The default IPP version for requests is now 2.0 (STR #3929)
-       - The IPP APIs no longer expose the ipp_t or ipp_attribute_t structures
-         and instead provide accessor functions (STR #3928)
-       - The scheduler will no longer run programs with group write permission.
-       - The PHP module has been removed (STR #3932)
-       - The bannertops, commandtoescpx, commandtopclx, imagetops,
-         imagetoraster, pdftops, rastertoescpx, rastertopclx, and texttops
-         filters have been removed (STR #3930)
-       - The serial and parallel backends have been removed (STR 3935)
index b5721c4..d2a8ca5 100644 (file)
@@ -1,4 +1,4 @@
-CREDITS.txt - 2012-07-16
+CREDITS.txt - 2013-07-23
 ------------------------
 
 Few projects are completed by one person, and CUPS is no exception.  We'd
@@ -39,6 +39,7 @@ like to thank the following individuals for their contributions:
     Vincenzo Reale                 - Italian localization.
     Petter Reinholdtsen            - HP-UX compiler stuff.
     Juan Pablo González Riopedre   - Spanish localization.
+    Giovanni Scafora               - Italian localization.
     Opher Shachar                  - Hebrew localization.
     Stuart Stevens                 - HP JetDirect IPP information.
     Andrea Suatoni                 - IRIX desktop integration and testing.
index 1688a2b..762b888 100644 (file)
@@ -1,4 +1,4 @@
-INSTALL - CUPS v1.6.4 - 2013-09-24
+INSTALL - CUPS v2.1.2 - 2015-12-02
 ----------------------------------
 
 This file describes how to compile and install CUPS from source code. For more
@@ -29,18 +29,16 @@ BEFORE YOU BEGIN
     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 the JPEG, PNG, TIFF, and ZLIB libraries for
-    image support, the CDSA, GNU TLS, or OpenSSL libraries for encryption
-    support, the OpenLDAP and OpenSLP libraries for directory services support,
-    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.
+    Besides these tools you'll want ZLIB library for compression support, the
+    CDSA, GNU TLS, or OpenSSL libraries for encryption support, 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.
 
-    Also, please note that CUPS does not include the Ghostscript-based
-    PostScript filter needed by non-PostScript printers.  You *must* download
-    GPL Ghostscript separately from the CUPS web site if you want to print
-    PostScript files to non-PostScript printers on operating systems other than
-    OS X.
+    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 OS X.
 
 
 COMPILING THE SUBVERSION REPOSITORY CODE
@@ -100,6 +98,11 @@ CONFIGURATION
     and diagnose a variety of common problems - use the "--enable-unit-tests"
     configure option to run them at build time.
 
+    On OS X, 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
@@ -138,6 +141,10 @@ INSTALLING THE SOFTWARE
 
        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,
@@ -149,7 +156,7 @@ INSTALLING THE SOFTWARE
 
     The EPM software is available at:
 
-       http://www.epmhome.org/
+       http://www.msweet.org/
 
 
 CREATING BINARY DISTRIBUTIONS WITH EPM
@@ -167,17 +174,11 @@ CREATING BINARY DISTRIBUTIONS WITH EPM
     following:
 
        epm       - Builds a script + tarfile package
-       aix       - Builds an AIX package
        bsd       - Builds a *BSD package
        deb       - Builds a Debian package
-       depot     - Builds a HP-UX package (also swinstall)
-       inst      - Builds an IRIX package (also tardist)
        pkg       - Builds a Solaris package
        rpm       - Builds a RPM package
-       setld     - Build a Tru64 UNIX package
        slackware - Build a Slackware package
-       swinstall - Build a HP-UX package (also depot)
-       tardist   - Builds an IRIX package (also inst)
 
 
 GETTING DEBUG LOGGING FROM CUPS
@@ -199,10 +200,9 @@ GETTING DEBUG LOGGING FROM CUPS
 REPORTING PROBLEMS
 
     If you have problems, READ THE DOCUMENTATION FIRST!  If the documentation
-    does not solve your problems, please post a message on the "cups.general"
-    forum at:
+    does not solve your problems, please post a message on the users forum at:
 
-        http://www.cups.org/newsgroups.php
+        http://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
index 1d1fce7..2293a45 100644 (file)
@@ -1,4 +1,4 @@
-IPPTOOL.txt - 2012-02-06
+IPPTOOL.txt - 2013-07-15
 ------------------------
 
 See the file CHANGES-IPPTOOL.txt for a list of changes to this software.
@@ -6,14 +6,46 @@ See the file CHANGES-IPPTOOL.txt for a list of changes to this software.
 
 INTRODUCTION
 
-    CUPS includes a user program called ipptool that can be used to send
-    arbitrary IPP requests to a CUPS server or IPP printer.  This tool started
-    life as part of the CUPS automated test suite and has grown to support
-    complex conformance tests and a simple way to query printer, job, and
-    subscription attributes.
+    CUPS includes two user programs for IPP printers.  The first is called
+    ipptool and can be used to send arbitrary IPP requests to a CUPS server or
+    IPP printer.  This tool started life as part of the CUPS automated test
+    suite and has grown to support complex conformance tests and a simple way
+    to query printer, job, and subscription attributes.
 
+    The second program called ippfind that can be used to find IPP printers
+    that have registered themselves using Bonjour (DNS-SD, mDNS, and Zeroconf)
+    and run commands such as ipptool.
 
-BASIC USAGE
+
+READING THE DOCUMENTATION
+
+    Full documentation on the ipptool command can be found in the
+    "man-ipptool.html" and "man-ipptoolfile.html" files; the latter describes
+    the test file format supported by ipptool.
+
+    Full documentation on the ippfind command can be found in the
+    "man-ippfind.html" file.
+
+
+IPPFIND BASIC USAGE
+
+    The ippfind command can be used to discover IPP printers on your network.
+    For example, the following command prints the printer URI of registered IPP
+    printers:
+
+        ippfind
+
+    To find all color IPP printers, run:
+
+        ippfind --txt-color T
+
+    And to run the IPP Everywhere conformance test file on every registered IPP
+    printer, run the following command:
+
+        ippfind _ipp._tcp,_print --exec ipptool -t '{}' ipp-everywhere.test \;
+
+
+IPPTOOL BASIC USAGE
 
     The ipptool command requires a printer URI and one or more "test" files that
     describe the operations, attributes to display, and expected status and
@@ -54,19 +86,29 @@ STANDARD TEST FILES
                                             state change notifications
         get-completed-jobs.test             Shows a list of completed jobs
         get-jobs.test                       Shows a list of pending jobs
+        get-notifications.test              Shows events for an ippget
+                                           subscription.
         get-printer-attributes.test         Shows printer attributes
+        get-subscriptions.test              Shows a list of subscriptions
         ipp-1.1.test                        IPP/1.1 conformance test suite
         ipp-2.0.test                        IPP/2.0 conformance test suite
         ipp-2.1.test                        IPP/2.1 conformance test suite
         ipp-2.2.test                        IPP/2.2 conformance test suite
+        ipp-everywhere.test                 IPP Everywhere conformance test
+                                            suite
         print-job.test                      Prints a file
+        print-job-deflate.test              Prints a file, compressing with
+                                            deflate.
+        print-job-gzip.test                 Prints a file, compressing with gzip
+        validate-job.test                   Validates attributes for a job
+                                            submission.
 
 
 CONFORMANCE TESTS
 
-    We provide basic IPP conformance tests for IPP/1.1, IPP/2.0, IPP/2.1, and
-    IPP/2.2.  For a given printer URI, the following commands perform tests at
-    each level:
+    We provide basic IPP conformance tests for IPP/1.1, IPP/2.0, IPP/2.1,
+    IPP/2.2, and IPP Everywhere.  For a given printer URI, the following
+    commands perform tests at each level:
 
         ipptool -tf filename [options] -I printer-uri ipp-1.1.test
         ipptool -tf filename [options] -I -V 2.0 printer-uri ipp-2.0.test
@@ -104,6 +146,7 @@ CONFORMANCE TESTS
         -S           Test IPP over HTTPS (default for ipps: URIs)
         -T seconds   Set a timeout for responses in seconds
         -v           Be verbose, showing all attributes sent and received
+        -X           Produce XML (Apple plist) output
 
     The printer-uri must be a URI supported by the printer using the "ipp" or
     "ipps" scheme, for example:
@@ -112,7 +155,7 @@ CONFORMANCE TESTS
         ipps://192.168.0.1/ipp/print
 
     Print-by-reference (URL) printing can be tested by defining the document-uri
-    variable to a URL, for example:
+    variable as a URL, for example:
 
         ipptool -tf filename -d document-uri=url -I printer-uri ipp-1.1.test
 
@@ -128,37 +171,40 @@ CONFORMANCE TESTS
     printer.
 
 
-READING THE DOCUMENTATION
+IPP EVERYWHERE TESTING
+
+    The IPP Everywhere tests use sample PWG raster files available from:
 
-    The command usage is described in the ipptest(1) man page, while the file
-    format is described in the ipptestfile(5) man page.  Both are provided in
-    HTML format with the standalone releases of ipptool.
+        ftp://ftp.pwg.org/pub/pwg/ipp/examples
+
+    Extract the corresponding ZIP archives into the current directory before
+    running the ipp-everywhere.test file.  The test file will attempt to print
+    each PWG Raster file that is supported by the printer being tested - up to
+    372 pages including the 90 pages produced by the regular IPP test suite.
 
 
 GETTING SUPPORT AND OTHER RESOURCES
 
-    If you have problems, READ THE DOCUMENTATION FIRST!  We also provide many
+    If you have problems, READ THE DOCUMENTATION FIRST!  We also provide
     discussion forums which are available at:
 
-       http://www.cups.org/newsgroups.php
-
-    See the CUPS web site at "http://www.cups.org/" for other resources.
+       http://www.cups.org/
 
 
 REPORTING BUGS
 
-    If you believe you have discovered a bug in ipptool, please fill out the
-    bug form at:
+    If you believe you have discovered a bug in ippfind or ipptool, please fill
+    out the bug form at:
 
        http://www.cups.org/str.php
 
-    Be sure to identify the version of CUPS and ipptool (if you downloaded the
-    standalone version) you are using, the printer (if any) and firmware
-    version, and include any files that apply.
+    Be sure to identify the version of CUPS and ippfind/ipptool (if you
+    downloaded the standalone version) you are using, the printer (if any) and
+    firmware version, and include any files that apply.
 
-    If you downloaded the standalone version of ipptool, please also re-run the
-    test with debug logging enabled.  Run the following commands on Windows to
-    enable debug logging:
+    If you downloaded the standalone version of ippfind/ipptool, please also
+    re-run the command with debug logging enabled.  Run the following commands
+    on Windows to enable debug logging:
 
         setdebug.bat
 
@@ -167,14 +213,14 @@ REPORTING BUGS
        CUPS_DEBUG_LOG=ipptool.log; export CUPS_DEBUG_LOG
        CUPS_DEBUG_LEVEL=6; export CUPS_DEBUG_LEVEL
 
-    Then when you run the ipptool command a new "ipptool.log" file will be
-    created with detailed information - attach this file to the bug you file
-    as well.
+    Then when you run the ippfind or ipptool command a new "ipptool.log" file
+    will be created with detailed information - attach this file to the bug you
+    file as well.
 
 
 LEGAL STUFF
 
-    CUPS is Copyright 2007-2012 by Apple Inc.  CUPS and the CUPS logo are
+    CUPS is Copyright 2007-2013 by Apple Inc.  CUPS and the CUPS logo are
     trademarks of Apple Inc.
 
     The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
index 75c4a37..658ea1e 100644 (file)
@@ -1,6 +1,6 @@
                           CUPS License Agreement
 
-                     Copyright 2007-2012 by Apple Inc.
+                     Copyright 2007-2013 by Apple Inc.
                             1 Infinite Loop
                          Cupertino, CA 95014 USA
 
@@ -10,9 +10,9 @@
 INTRODUCTION
 
 CUPS(tm) is provided under the GNU General Public License ("GPL")
-and GNU Library General Public License ("LGPL"), Version 2, with
-exceptions for Apple operating systems and the OpenSSL toolkit. A
-copy of the exceptions and licenses follow this introduction.
+and GNU Library General Public License ("LGPL"), Version 2, with an
+exception for Apple operating systems. A copy of the exception and
+licenses follow this introduction.
 
 The GNU LGPL applies to the CUPS and CUPS Imaging libraries
 located in the "cups" and "filter" subdirectories of the CUPS
@@ -45,7 +45,7 @@ application, driver, or filter.
 LICENSE EXCEPTIONS
 
 In addition, as the copyright holder of CUPS, Apple Inc. grants
-the following special exceptions:
+the following special exception:
 
      1. Apple Operating System Development License Exception;
 
@@ -86,14 +86,8 @@ the following special exceptions:
             This file is subject to the Apple OS-Developed
             Software exception.
 
-     2. OpenSSL Toolkit License Exception;
-
-       a. Apple Inc. explicitly allows the compilation and
-          distribution of the CUPS software with the OpenSSL
-          Toolkit.
-
-No developer is required to provide these exceptions in a
-derived work.
+No developer is required to provide this exception in a derived
+work.
 
 
 KERBEROS SUPPORT CODE
index 9132440..3afef0a 100644 (file)
@@ -1,16 +1,16 @@
 #
-# "$Id: Makedefs.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makedefs.in 12519 2015-02-17 13:10:19Z msweet $"
 #
-#   Common makefile definitions for CUPS.
+# Common makefile definitions for CUPS.
 #
-#   Copyright 2007-2013 by Apple Inc.
-#   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products, all rights reserved.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 #
@@ -121,9 +121,9 @@ INSTALLXPC  =       @INSTALLXPC@
 #
 
 ALL_CFLAGS     =       -I.. -D_CUPS_SOURCE $(CFLAGS) $(SSLFLAGS) \
-                       @LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS)
+                       @LARGEFILE@ @PTHREAD_FLAGS@ $(ONDEMANDFLAGS) $(OPTIONS)
 ALL_CXXFLAGS   =       -I.. -D_CUPS_SOURCE $(CXXFLAGS) $(SSLFLAGS) \
-                       @LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS)
+                       @LARGEFILE@ @PTHREAD_FLAGS@ $(ONDEMANDFLAGS) $(OPTIONS)
 ARCHFLAGS      =       @ARCHFLAGS@
 ARFLAGS                =       @ARFLAGS@
 BACKLIBS       =       @BACKLIBS@
@@ -138,13 +138,16 @@ DNSSD_BACKEND     =       @DNSSD_BACKEND@
 DSOFLAGS       =       -L../cups @DSOFLAGS@
 DSOLIBS                =       @DSOLIBS@ $(COMMONLIBS)
 DNSSDLIBS      =       @DNSSDLIBS@
-LAUNCHDLIBS    =       @LAUNCHDLIBS@
+IPPFIND_BIN    =       @IPPFIND_BIN@
+IPPFIND_MAN    =       @IPPFIND_MAN@
 LDFLAGS                =       -L../cgi-bin -L../cups -L../filter -L../ppdc \
                        -L../scheduler @LDARCHFLAGS@ \
                        @LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM)
-LINKCUPS       =       @LINKCUPS@ $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(LIBZ)
+LINKCUPS       =       @LINKCUPS@ $(LIBGSSAPI) $(DNSSDLIBS) $(LIBZ)
 LINKCUPSIMAGE  =       @LINKCUPSIMAGE@
 LIBS           =       $(LINKCUPS) $(COMMONLIBS)
+ONDEMANDFLAGS  =       @ONDEMANDFLAGS@
+ONDEMANDLIBS   =       @ONDEMANDLIBS@
 OPTIM          =       @OPTIM@
 OPTIONS                =
 PAMLIBS                =       @PAMLIBS@
@@ -198,8 +201,6 @@ DATADIR             =       $(BUILDROOT)@CUPS_DATADIR@
 DOCDIR         =       $(BUILDROOT)@CUPS_DOCROOT@
 ICONDIR                =       @ICONDIR@
 INCLUDEDIR     =       $(BUILDROOT)$(includedir)
-INITDIR                =       @INITDIR@
-INITDDIR       =       @INITDDIR@
 LIBDIR         =       $(BUILDROOT)$(libdir)
 LOCALEDIR      =       $(BUILDROOT)@CUPS_LOCALEDIR@
 LOGDIR         =       $(BUILDROOT)@CUPS_LOGDIR@
@@ -214,10 +215,7 @@ REQUESTS   =       $(BUILDROOT)@CUPS_REQUESTS@
 SBINDIR                =       $(BUILDROOT)@sbindir@
 SERVERBIN      =       $(BUILDROOT)@CUPS_SERVERBIN@
 SERVERROOT     =       $(BUILDROOT)@CUPS_SERVERROOT@
-SMFMANIFESTDIR =       @SMFMANIFESTDIR@
 STATEDIR       =       $(BUILDROOT)@CUPS_STATEDIR@
-USBQUIRKS      =       @USBQUIRKS@
-XINETD         =       @XINETD@
 
 MAN1EXT                =       @MAN1EXT@
 MAN5EXT                =       @MAN5EXT@
@@ -228,8 +226,15 @@ MAN8DIR            =       @MAN8DIR@
 PAMDIR         =       @PAMDIR@
 PAMFILE                =       @PAMFILE@
 
-DEFAULT_LAUNCHD_CONF = @DEFAULT_LAUNCHD_CONF@
 DBUSDIR                =       @DBUSDIR@
+INITDIR                =       @INITDIR@
+INITDDIR       =       @INITDDIR@
+LAUNCHD_DIR    =       @LAUNCHD_DIR@
+SMFMANIFESTDIR =       @SMFMANIFESTDIR@
+SYSTEMD_DIR    =       @SYSTEMD_DIR@
+XINETD         =       @XINETD@
+
+USBQUIRKS      =       @USBQUIRKS@
 
 
 #
@@ -259,5 +264,5 @@ DBUSDIR             =       @DBUSDIR@
 
 
 #
-# End of "$Id: Makedefs.in 11173 2013-07-23 12:31:34Z msweet $"
+# End of "$Id: Makedefs.in 12519 2015-02-17 13:10:19Z msweet $"
 #
index 47495ce..94ce714 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,16 +1,16 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12414 2015-01-21 00:02:04Z msweet $"
 #
-#   Top-level Makefile for CUPS.
+# Top-level Makefile for CUPS.
 #
-#   Copyright 2007-2013 by Apple Inc.
-#   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products, all rights reserved.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 include Makedefs
@@ -98,24 +98,18 @@ clean:
 
 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) conf/cups-files.conf conf/cupsd.conf
-       $(RM) conf/mime.convs conf/pam.std conf/snmp.conf
-       $(RM) doc/help/ref-cups-files-conf.html doc/help/ref-cupsd-conf.html
-       $(RM) doc/help/standard.html doc/index.html
-       $(RM) man/client.conf.man
-       $(RM) man/cups-deviced.man man/cups-driverd.man
-       $(RM) man/cups-lpd.man man/cupsaddsmb.man man/cupsd.man
-       $(RM) man/cupsd.conf.man man/drv.man man/lpoptions.man
+       $(RM) data/testprint
+       $(RM) desktop/cups.desktop
+       $(RM) doc/index.html
+       $(RM) man/client.conf.man man/cups-files.conf.man man/cups-lpd.man man/cups-snmp.man man/cupsaddsmb.man man/cupsd.conf.man man/cupsd.man man/lpoptions.man
        $(RM) packaging/cups.list
-       $(RM) packaging/cups-desc.plist packaging/cups-info.plist
+       $(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) desktop/cups.desktop
-       $(RM) scheduler/cups.sh scheduler/cups-lpd.xinetd
-       $(RM) scheduler/org.cups.cups-lpd.plist scheduler/cups.xml
        -$(RM) doc/*/index.html
        -$(RM) templates/*/header.tmpl
-       -$(RM) -r autom4te*.cache clang cups/charmaps cups/locale driver/test
+       -$(RM) -r autom4te*.cache clang cups/charmaps cups/locale
 
 
 #
@@ -130,8 +124,11 @@ depend:
 
 
 #
-# Run the clang.llvm.org static code analysis tool on the C sources.
-# (at least checker-231 is required for scan-build to work this way)
+# Run the Clang static code analysis tool on the sources, available here:
+#
+#    http://clang-analyzer.llvm.org
+#
+# At least checker-231 is required.
 #
 
 .PHONY: clang clang-changes
@@ -143,6 +140,26 @@ clang-changes:
 
 
 #
+# 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...
 #
 
@@ -244,7 +261,7 @@ debugcheck: all unittests
 
 
 #
-# Create HTML documentation...
+# Create HTML documentation using Mini-XML's mxmldoc (http://www.msweet.org/)...
 #
 
 apihelp:
@@ -261,7 +278,7 @@ framedhelp:
 
 
 #
-# Create an Xcode docset...
+# Create an Xcode docset using Mini-XML's mxmldoc (http://www.msweet.org/)...
 #
 
 docset:        apihelp
@@ -297,12 +314,12 @@ sloc:
 
 
 #
-# Make software distributions using EPM (http://www.epmhome.org/)...
+# Make software distributions using EPM (http://www.msweet.org/)...
 #
 
 EPMFLAGS       =       -v --output-dir dist $(EPMARCH)
 
-aix bsd deb depot inst pkg setld slackware swinstall tardist:
+bsd deb pkg slackware:
        epm $(EPMFLAGS) -f $@ cups packaging/cups.list
 
 epm:
@@ -318,7 +335,6 @@ dist:       all
        case `uname` in \
                *BSD*) $(MAKE) $(MFLAGS) bsd;; \
                Darwin*) $(MAKE) $(MFLAGS) osx;; \
-               IRIX*) $(MAKE) $(MFLAGS) tardist;; \
                Linux*) test ! -x /usr/bin/rpm || $(MAKE) $(MFLAGS) rpm;; \
                SunOS*) $(MAKE) $(MFLAGS) pkg;; \
        esac
@@ -332,5 +348,5 @@ dist:       all
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12414 2015-01-21 00:02:04Z msweet $".
 #
index ecccc39..91a3c18 100644 (file)
@@ -1,4 +1,4 @@
-README - CUPS v1.6.4 - 2013-09-24
+README - CUPS v2.1.2 - 2015-12-02
 ---------------------------------
 
 Looking for compile instructions?  Read the file "INSTALL.txt" instead...
@@ -41,10 +41,10 @@ READING THE DOCUMENTATION
 
 GETTING SUPPORT AND OTHER RESOURCES
 
-    If you have problems, READ THE DOCUMENTATION FIRST!  We also provide many
-    discussion forums which are available at:
+    If you have problems, READ THE DOCUMENTATION FIRST!  We also provide two
+    mailing lists which are available at:
 
-       http://www.cups.org/newsgroups.php
+       http://www.cups.org/lists.php
 
     See the CUPS web site at "http://www.cups.org/" for other resources.
 
@@ -78,10 +78,6 @@ SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE
        -----------------------------  ------------------------------
        Dymo Label Printers            drv:///sample.drv/dymo.ppd
        Intellitech Intellibar         drv:///sample.drv/intelbar.ppd
-       EPSON Stylus Color Series      drv:///sample.drv/stcolor.ppd
-       EPSON Stylus Photo Series      drv:///sample.drv/stphoto.ppd
-       EPSON Stylus New Color Series  drv:///sample.drv/stcolor2.ppd
-       EPSON Stylus New Photo Series  drv:///sample.drv/stphoto2.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
@@ -113,11 +109,7 @@ SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE
         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.  The CUPS web site
-    provides links and drivers:
-
-        http://www.cups.org/ppd.php      PPD files
-       http://www.cups.org/links.php    Links to other drivers
+    exercise the full potential of the printers or CUPS.
 
 
 PRINTING FILES
@@ -134,8 +126,8 @@ PRINTING FILES
        lpr -o media=A4 -o resolution=600dpi filename
 
     CUPS recognizes many types of images files as well as PDF, PostScript,
-    HP-GL/2, and text files, so you can print those files directly rather than
-    through an application.
+    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:
@@ -143,19 +135,16 @@ PRINTING FILES
        lp -o raw filename
        lpr -l filename
 
-    This will prevent the filters from misinterpreting your print
-    file.
+    This will prevent the filters from misinterpreting your print file.
 
 
 LEGAL STUFF
 
-    CUPS is Copyright 2007-2013 by Apple Inc.  CUPS and the CUPS logo are
+    CUPS is Copyright 2007-2015 by Apple Inc.  CUPS and the CUPS logo are
     trademarks of Apple Inc.
 
     The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
 
-    This software is based in part on the work of the Independent JPEG Group.
-
     CUPS is provided under the terms of version 2 of the GNU General Public
     License and GNU Library General Public License. This program is distributed
     in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
index eeb231a..2d6e7eb 100644 (file)
@@ -1,70 +1,77 @@
 ipp.o: ipp.c backend-private.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h \
-  ../cups/array-private.h
-lpd.o: lpd.c ../cups/http-private.h ../config.h ../cups/http.h \
-  ../cups/versioning.h ../cups/array.h ../cups/md5-private.h \
-  ../cups/ipp-private.h ../cups/ipp.h backend-private.h \
-  ../cups/cups-private.h ../cups/string-private.h \
-  ../cups/debug-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+  ../cups/backend.h ../cups/sidechannel.h
+lpd.o: lpd.c ../cups/http-private.h ../config.h ../cups/language.h \
+  ../cups/array.h ../cups/versioning.h ../cups/http.h \
+  ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h \
+  backend-private.h ../cups/cups-private.h ../cups/string-private.h \
+  ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+  ../cups/backend.h ../cups/sidechannel.h
 dnssd.o: dnssd.c backend-private.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+  ../cups/backend.h ../cups/sidechannel.h
 snmp.o: snmp.c backend-private.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h
-socket.o: socket.c ../cups/http-private.h ../config.h ../cups/http.h \
-  ../cups/versioning.h ../cups/array.h ../cups/md5-private.h \
-  ../cups/ipp-private.h ../cups/ipp.h backend-private.h \
-  ../cups/cups-private.h ../cups/string-private.h \
-  ../cups/debug-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+  ../cups/backend.h ../cups/sidechannel.h
+socket.o: socket.c ../cups/http-private.h ../config.h ../cups/language.h \
+  ../cups/array.h ../cups/versioning.h ../cups/http.h \
+  ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h \
+  backend-private.h ../cups/cups-private.h ../cups/string-private.h \
+  ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+  ../cups/backend.h ../cups/sidechannel.h
 test1284.o: test1284.c ../cups/string-private.h ../config.h ieee1284.c \
   backend-private.h ../cups/cups-private.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+  ../cups/backend.h ../cups/sidechannel.h
 testbackend.o: testbackend.c ../cups/string-private.h ../config.h \
   ../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/language.h \
+  ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
   ../cups/sidechannel.h
 testsupplies.o: testsupplies.c backend-private.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+  ../cups/backend.h ../cups/sidechannel.h
 usb.o: usb.c backend-private.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/snmp-private.h ../cups/backend.h ../cups/sidechannel.h \
-  usb-darwin.c ../cups/file-private.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/snmp-private.h \
+  ../cups/backend.h ../cups/sidechannel.h usb-darwin.c \
+  ../cups/file-private.h
index ad0d5f6..61a2ce8 100644 (file)
@@ -1,9 +1,9 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 11859 2014-05-08 22:42:44Z msweet $"
 #
 #   Backend makefile for CUPS.
 #
-#   Copyright 2007-2013 by Apple Inc.
+#   Copyright 2007-2014 by Apple Inc.
 #   Copyright 1997-2007 by Easy Software Products, all rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -23,8 +23,8 @@ include ../Makedefs
 
 # RBACKENDS are installed mode 0700 so cupsd will run them as root...
 #
-# UBACKENDS are installed mode 0755 so cupsd will run them as an unprivileged
-# user...
+# UBACKENDS and ULBACKENDS are installed mode 0755 so cupsd will run them as
+# an unprivileged user...
 #
 # See http://www.cups.org/documentation.php/api-filter.html for more info...
 RBACKENDS =    \
@@ -33,7 +33,8 @@ RBACKENDS =   \
                $(DNSSD_BACKEND)
 UBACKENDS =    \
                snmp \
-               socket \
+               socket
+ULBACKENDS =   \
                usb
 UNITTESTS =    \
                test1284 \
@@ -42,7 +43,8 @@ UNITTESTS =   \
 TARGETS =      \
                libbackend.a \
                $(RBACKENDS) \
-               $(UBACKENDS)
+               $(UBACKENDS) \
+               $(ULBACKENDS)
 LIBOBJS        =       \
                ieee1284.o \
                network.o \
@@ -71,7 +73,7 @@ all:  $(TARGETS)
 # Make library targets...
 #
 
-libs:
+libs:  $(ULBACKENDS)
 
 
 #
@@ -139,8 +141,9 @@ install-exec:       $(INSTALLXPC)
        fi
        if test "x$(SYMROOT)" != "x"; then \
                $(INSTALL_DIR) $(SYMROOT); \
-               for file in $(TARGETS); do \
+               for file in $(RBACKENDS) $(UBACKENDS); do \
                        cp $$file $(SYMROOT); \
+                       dsymutil $(SYMROOT)/$$file; \
                done \
        fi
 
@@ -166,6 +169,18 @@ install-headers:
 #
 
 install-libs:
+       echo Installing backends in $(SERVERBIN)/backend
+       $(INSTALL_DIR) -m 755 $(SERVERBIN)/backend
+       for file in $(ULBACKENDS); do \
+               $(INSTALL_BIN) $$file $(SERVERBIN)/backend; \
+       done
+       if test "x$(SYMROOT)" != "x"; then \
+               $(INSTALL_DIR) $(SYMROOT); \
+               for file in $(ULBACKENDS); do \
+                       cp $$file $(SYMROOT); \
+                       dsymutil $(SYMROOT)/$$file; \
+               done \
+       fi
 
 
 #
@@ -178,7 +193,7 @@ uninstall:
                $(RM) $(SERVERBIN)/apple/$$file; \
        done
        -$(RMDIR) $(SERVERBIN)/apple
-       for file in $(RBACKENDS) $(UBACKENDS); do \
+       for file in $(RBACKENDS) $(UBACKENDS) $(ULBACKENDS); do \
                $(RM) $(SERVERBIN)/backend/$$file; \
        done
        for file in $(IPPALIASES); do \
@@ -300,5 +315,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 11859 2014-05-08 22:42:44Z msweet $".
 #
index 9b0eda8..2ad3d48 100644 (file)
@@ -1,18 +1,18 @@
 /*
- * "$Id: backend-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: backend-private.h 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Backend support definitions for CUPS.
+ * Backend support definitions for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_BACKEND_PRIVATE_H_
@@ -313,7 +313,7 @@ extern int          backendGetDeviceID(int fd, char *device_id,
                                           int uri_size);
 extern int             backendGetMakeModel(const char *device_id,
                                            char *make_model,
-                                           int make_model_size);
+                                           size_t make_model_size);
 extern int             backendNetworkSideCB(int print_fd, int device_fd,
                                             int snmp_fd, http_addr_t *addr,
                                             int use_bc);
@@ -334,5 +334,5 @@ extern int          backendWaitLoop(int snmp_fd, http_addr_t *addr,
 
 
 /*
- * End of "$Id: backend-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: backend-private.h 11558 2014-02-06 18:33:34Z msweet $".
  */
index 317b39f..c82877b 100644 (file)
@@ -1,33 +1,17 @@
 /*
- * "$Id: dnssd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dnssd.c 12970 2015-11-13 20:02:51Z msweet $"
  *
- *   DNS-SD discovery backend for CUPS.
+ * DNS-SD discovery backend for CUPS.
  *
- *   Copyright 2008-2012 by Apple Inc.
+ * Copyright 2008-2015 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()                 - Browse for printers.
- *   browse_callback()      - Browse devices.
- *   browse_local_callback() - Browse local devices.
- *   client_callback()       - Avahi client callback function.
- *   compare_devices()      - Compare two devices.
- *   exec_backend()         - Execute the backend that corresponds to the
- *                            resolved service name.
- *   device_type()          - Get DNS-SD type enumeration from string.
- *   get_device()           - Create or update a device.
- *   query_callback()       - Process query data.
- *   find_device()          - Find a device from its name and domain.
- *   sigterm_handler()      - Handle termination signals.
- *   unquote()              - Unquote a name string.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -77,7 +61,8 @@ typedef struct
                *domain,                /* Domain name */
                *fullName,              /* Full name */
                *make_and_model,        /* Make and model from TXT record */
-               *device_id;             /* 1284 device ID from TXT record */
+               *device_id,             /* 1284 device ID from TXT record */
+               *uuid;                  /* UUID from TXT record */
   cups_devtype_t type;                 /* Device registration type */
   int          priority,               /* Priority associated with type */
                cups_shared,            /* CUPS shared printer? */
@@ -95,6 +80,7 @@ static int            job_canceled = 0;
 static AvahiSimplePoll *simple_poll = NULL;
                                        /* Poll information */
 static int             got_data = 0;   /* Got data from poll? */
+static int             browsers = 0;   /* Number of running browsers */
 #endif /* HAVE_AVAHI */
 
 
@@ -137,7 +123,7 @@ static void         client_callback(AvahiClient *client,
 #endif /* HAVE_AVAHI */
 
 static int             compare_devices(cups_device_t *a, cups_device_t *b);
-static void            exec_backend(char **argv);
+static void            exec_backend(char **argv) __attribute__((noreturn));
 static cups_device_t   *get_device(cups_array_t *devices,
                                    const char *serviceName,
                                    const char *regtype,
@@ -332,7 +318,7 @@ main(int  argc,                             /* I - Number of command-line args */
   if ((simple_poll = avahi_simple_poll_new()) == NULL)
   {
     fputs("DEBUG: Unable to create Avahi simple poll object.\n", stderr);
-    return (1);
+    return (0);
   }
 
   avahi_simple_poll_set_func(simple_poll, poll_callback, NULL);
@@ -342,9 +328,10 @@ main(int  argc,                            /* I - Number of command-line args */
   if (!client)
   {
     fputs("DEBUG: Unable to create Avahi client.\n", stderr);
-    return (1);
+    return (0);
   }
 
+  browsers = 6;
   avahi_service_browser_new(client, AVAHI_IF_UNSPEC,
                            AVAHI_PROTO_UNSPEC,
                            "_fax-ipp._tcp", NULL, 0,
@@ -513,9 +500,15 @@ main(int  argc,                            /* I - Number of command-line args */
           {
            unquote(uriName, best->fullName, sizeof(uriName));
 
-           httpAssembleURI(HTTP_URI_CODING_ALL, device_uri, sizeof(device_uri),
-                           "dnssd", NULL, uriName, 0,
-                           best->cups_shared ? "/cups" : "/");
+            if (best->uuid)
+             httpAssembleURIf(HTTP_URI_CODING_ALL, device_uri,
+                              sizeof(device_uri), "dnssd", NULL, uriName, 0,
+                              best->cups_shared ? "/cups?uuid=%s" : "/?uuid=%s",
+                              best->uuid);
+           else
+             httpAssembleURI(HTTP_URI_CODING_ALL, device_uri,
+                             sizeof(device_uri), "dnssd", NULL, uriName, 0,
+                             best->cups_shared ? "/cups" : "/");
 
            cupsBackendReport("network", device_uri, best->make_and_model,
                              best->name, best->device_id, NULL);
@@ -546,9 +539,15 @@ main(int  argc,                            /* I - Number of command-line args */
       {
        unquote(uriName, best->fullName, sizeof(uriName));
 
-       httpAssembleURI(HTTP_URI_CODING_ALL, device_uri, sizeof(device_uri),
-                       "dnssd", NULL, uriName, 0,
-                       best->cups_shared ? "/cups" : "/");
+       if (best->uuid)
+         httpAssembleURIf(HTTP_URI_CODING_ALL, device_uri,
+                          sizeof(device_uri), "dnssd", NULL, uriName, 0,
+                          best->cups_shared ? "/cups?uuid=%s" : "/?uuid=%s",
+                          best->uuid);
+       else
+         httpAssembleURI(HTTP_URI_CODING_ALL, device_uri,
+                         sizeof(device_uri), "dnssd", NULL, uriName, 0,
+                         best->cups_shared ? "/cups" : "/");
 
        cupsBackendReport("network", device_uri, best->make_and_model,
                          best->name, best->device_id, NULL);
@@ -558,7 +557,11 @@ main(int  argc,                            /* I - Number of command-line args */
 
       fprintf(stderr, "DEBUG: sent=%d, count=%d\n", sent, count);
 
+#ifdef HAVE_AVAHI
+      if (sent == cupsArrayCount(devices) && browsers == 0)
+#else
       if (sent == cupsArrayCount(devices))
+#endif /* HAVE_AVAHI */
        break;
     }
   }
@@ -710,9 +713,12 @@ browse_callback(
        break;
 
     case AVAHI_BROWSER_REMOVE:
-    case AVAHI_BROWSER_ALL_FOR_NOW:
     case AVAHI_BROWSER_CACHE_EXHAUSTED:
         break;
+
+    case AVAHI_BROWSER_ALL_FOR_NOW:
+       browsers--;
+       break;
   }
 }
 
@@ -824,8 +830,8 @@ exec_backend(char **argv)           /* I - Command-line arguments */
  * 'device_type()' - Get DNS-SD type enumeration from string.
  */
 
-static int
-device_type(const char *regtype)
+static cups_devtype_t                  /* O - Device type */
+device_type(const char *regtype)       /* I - Service registration type */
 {
 #ifdef HAVE_AVAHI
   if (!strcmp(regtype, "_ipp._tcp"))
@@ -915,9 +921,6 @@ get_device(cups_array_t *devices,   /* I - Device array */
   * Yes, add the device...
   */
 
-  fprintf(stderr, "DEBUG: Found \"%s.%s%s\"...\n", serviceName, regtype,
-         replyDomain);
-
   device           = calloc(sizeof(cups_device_t), 1);
   device->name     = strdup(serviceName);
   device->domain   = strdup(replyDomain);
@@ -933,8 +936,7 @@ get_device(cups_array_t *devices,   /* I - Device array */
 #ifdef HAVE_DNSSD
   DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain);
 #else /* HAVE_AVAHI */
-  avahi_service_name_join(fullName, kDNSServiceMaxDomainName,
-                          serviceName, regtype, replyDomain);
+  avahi_service_name_join(fullName, kDNSServiceMaxDomainName, serviceName, regtype, replyDomain);
 #endif /* HAVE_DNSSD */
 
   device->fullName = strdup(fullName);
@@ -1031,6 +1033,7 @@ query_callback(
                value[256],             /* Value string */
                make_and_model[512],    /* Manufacturer and model */
                model[256],             /* Model */
+               pdl[256],               /* PDL */
                device_id[2048];        /* 1284 device ID */
 
 
@@ -1079,8 +1082,9 @@ query_callback(
 
   device_id[0]      = '\0';
   make_and_model[0] = '\0';
+  pdl[0]            = '\0';
 
-  strcpy(model, "Unknown");
+  strlcpy(model, "Unknown", sizeof(model));
 
   for (data = rdata, dataend = data + rdlen;
        data < dataend;
@@ -1100,7 +1104,7 @@ query_callback(
     datanext = data + datalen;
 
     for (ptr = key; data < datanext && *data != '='; data ++)
-      *ptr++ = *data;
+      *ptr++ = (char)*data;
     *ptr = '\0';
 
     if (data < datanext && *data == '=')
@@ -1108,7 +1112,7 @@ query_callback(
       data ++;
 
       if (data < datanext)
-       memcpy(value, data, datanext - data);
+       memcpy(value, data, (size_t)(datanext - data));
       value[datanext - data] = '\0';
 
       fprintf(stderr, "DEBUG2: query_callback: \"%s=%s\".\n",
@@ -1128,15 +1132,14 @@ query_callback(
       */
 
       ptr = device_id + strlen(device_id);
-      snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%s:%s;",
-              key + 4, value);
+      snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%s:%s;", key + 4, value);
     }
 
     if (!_cups_strcasecmp(key, "usb_MFG") || !_cups_strcasecmp(key, "usb_MANU") ||
        !_cups_strcasecmp(key, "usb_MANUFACTURER"))
-      strcpy(make_and_model, value);
+      strlcpy(make_and_model, value, sizeof(make_and_model));
     else if (!_cups_strcasecmp(key, "usb_MDL") || !_cups_strcasecmp(key, "usb_MODEL"))
-      strcpy(model, value);
+      strlcpy(model, value, sizeof(model));
     else if (!_cups_strcasecmp(key, "product") && !strstr(value, "Ghostscript"))
     {
       if (value[0] == '(')
@@ -1148,18 +1151,20 @@ query_callback(
        if ((ptr = value + strlen(value) - 1) > value && *ptr == ')')
          *ptr = '\0';
 
-       strcpy(model, value + 1);
+       strlcpy(model, value + 1, sizeof(model));
       }
       else
-       strcpy(model, value);
+       strlcpy(model, value, sizeof(model));
     }
     else if (!_cups_strcasecmp(key, "ty"))
     {
-      strcpy(model, value);
+      strlcpy(model, value, sizeof(model));
 
       if ((ptr = strchr(model, ',')) != NULL)
        *ptr = '\0';
     }
+    else if (!_cups_strcasecmp(key, "pdl"))
+      strlcpy(pdl, value, sizeof(pdl));
     else if (!_cups_strcasecmp(key, "priority"))
       device->priority = atoi(value);
     else if ((device->type == CUPS_DEVICE_IPP ||
@@ -1176,6 +1181,8 @@ query_callback(
       if (device->type == CUPS_DEVICE_PRINTER)
        device->sent = 1;
     }
+    else if (!_cups_strcasecmp(key, "UUID"))
+      device->uuid = strdup(value);
   }
 
   if (device->device_id)
@@ -1196,7 +1203,7 @@ query_callback(
       * Assume the first word is the make...
       */
 
-      memcpy(make_and_model, model, ptr - model);
+      memcpy(make_and_model, model, (size_t)(ptr - model));
       make_and_model[ptr - model] = '\0';
 
       snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s",
@@ -1204,6 +1211,45 @@ query_callback(
     }
   }
 
+  if (device_id[0] &&
+      !strstr(device_id, "CMD:") &&
+      !strstr(device_id, "COMMAND SET:") &&
+      (strstr(pdl, "application/pdf") ||
+       strstr(pdl, "application/postscript") ||
+       strstr(pdl, "application/vnd.hp-PCL") ||
+       strstr(pdl, "image/")))
+  {
+    value[0] = '\0';
+    if (strstr(pdl, "application/pdf"))
+      strlcat(value, ",PDF", sizeof(value));
+    if (strstr(pdl, "application/postscript"))
+      strlcat(value, ",PS", sizeof(value));
+    if (strstr(pdl, "application/vnd.hp-PCL"))
+      strlcat(value, ",PCL", sizeof(value));
+    for (ptr = strstr(pdl, "image/"); ptr; ptr = strstr(ptr, "image/"))
+    {
+      char *valptr = value + strlen(value);
+                                       /* Pointer into value */
+
+      if (valptr < (value + sizeof(value) - 1))
+        *valptr++ = ',';
+
+      ptr += 6;
+      while (isalnum(*ptr & 255) || *ptr == '-' || *ptr == '.')
+      {
+        if (isalnum(*ptr & 255) && valptr < (value + sizeof(value) - 1))
+          *valptr++ = (char)toupper(*ptr++ & 255);
+        else
+          break;
+      }
+
+      *valptr = '\0';
+    }
+
+    ptr = device_id + strlen(device_id);
+    snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "CMD:%s;", value + 1);
+  }
+
   if (device_id[0])
     device->device_id = strdup(device_id);
   else
@@ -1235,7 +1281,7 @@ sigterm_handler(int sig)          /* I - Signal number (unused) */
   (void)sig;
 
   if (job_canceled)
-    exit(CUPS_BACKEND_OK);
+    _exit(CUPS_BACKEND_OK);
   else
     job_canceled = 1;
 }
@@ -1276,5 +1322,5 @@ unquote(char       *dst,          /* I - Destination buffer */
 
 
 /*
- * End of "$Id: dnssd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dnssd.c 12970 2015-11-13 20:02:51Z msweet $".
  */
index b2d1c7d..a2fc623 100644 (file)
@@ -1,24 +1,18 @@
 /*
- * "$Id: ieee1284.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ieee1284.c 11594 2014-02-14 20:09:01Z msweet $"
  *
- *   IEEE-1284 support functions for CUPS.
+ * IEEE-1284 support functions for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   backendGetDeviceID()  - Get the IEEE-1284 device ID string and
- *                           corresponding URI.
- *   backendGetMakeModel() - Get the make and model string from the device ID.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -26,7 +20,6 @@
  */
 
 #include "backend-private.h"
-#include <cups/cups-private.h>
 
 
 /*
@@ -148,8 +141,7 @@ backendGetDeviceID(
                * Read the 1284 device ID...
                */
 
-               if ((length = read(devparportfd, device_id,
-                                  device_id_size - 1)) >= 2)
+               if ((length = read(devparportfd, device_id, (size_t)device_id_size - 1)) >= 2)
                {
                  device_id[length] = '\0';
                  got_id = 1;
@@ -178,8 +170,7 @@ backendGetDeviceID(
       * bytes.  The 1284 spec says the length is stored MSB first...
       */
 
-      length = (((unsigned)device_id[0] & 255) << 8) +
-              ((unsigned)device_id[1] & 255);
+      length = (int)((((unsigned)device_id[0] & 255) << 8) + ((unsigned)device_id[1] & 255));
 
      /*
       * Check to see if the length is larger than our buffer; first
@@ -188,8 +179,7 @@ backendGetDeviceID(
       */
 
       if (length > device_id_size || length < 14)
-       length = (((unsigned)device_id[1] & 255) << 8) +
-                ((unsigned)device_id[0] & 255);
+       length = (int)((((unsigned)device_id[1] & 255) << 8) + ((unsigned)device_id[0] & 255));
 
       if (length > device_id_size)
        length = device_id_size;
@@ -221,7 +211,7 @@ backendGetDeviceID(
 
        length -= 2;
 
-       memmove(device_id, device_id + 2, length);
+       memmove(device_id, device_id + 2, (size_t)length);
        device_id[length] = '\0';
       }
     }
@@ -287,7 +277,7 @@ backendGetDeviceID(
   */
 
   if (make_model)
-    backendGetMakeModel(device_id, make_model, make_model_size);
+    backendGetMakeModel(device_id, make_model, (size_t)make_model_size);
 
  /*
   * Then generate a device URI...
@@ -372,7 +362,7 @@ int                                 /* O - 0 on success, -1 on failure */
 backendGetMakeModel(
     const char *device_id,             /* O - 1284 device ID */
     char       *make_model,            /* O - Make/model */
-    int        make_model_size)                /* I - Size of buffer */
+    size_t     make_model_size)                /* I - Size of buffer */
 {
   int          num_values;             /* Number of keys and values */
   cups_option_t        *values;                /* Keys and values */
@@ -381,9 +371,7 @@ backendGetMakeModel(
                *des;                   /* Description string */
 
 
-  DEBUG_printf(("backendGetMakeModel(device_id=\"%s\", "
-                "make_model=%p, make_model_size=%d)\n", device_id,
-               make_model, make_model_size));
+  DEBUG_printf(("backendGetMakeModel(device_id=\"%s\", make_model=%p, make_model_size=" CUPS_LLFMT ")\n", device_id, make_model, CUPS_LLCAST make_model_size));
 
  /*
   * Range check input...
@@ -487,5 +475,5 @@ backendGetMakeModel(
 
 
 /*
- * End of "$Id: ieee1284.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ieee1284.c 11594 2014-02-14 20:09:01Z msweet $".
  */
index efd570a..69970a2 100644 (file)
@@ -1,34 +1,18 @@
 /*
- * "$Id: ipp.c 11221 2013-08-06 16:16:01Z msweet $"
+ * "$Id: ipp.c 12896 2015-10-09 13:15:22Z msweet $"
  *
- *   IPP backend for CUPS.
+ * IPP backend for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()                 - Send a file to the printer or server.
- *   cancel_job()           - Cancel a print job.
- *   check_printer_state()  - Check the printer state.
- *   compress_files()       - Compress print files.
- *   monitor_printer()      - Monitor the printer state.
- *   new_request()          - Create a new print creation or validation request.
- *   password_cb()          - Disable the password prompt for
- *                            cupsDoFileRequest().
- *   report_attr()          - Report an IPP attribute value.
- *   report_printer_state() - Report the printer state.
- *   run_as_user()          - Run the IPP backend as the printing user.
- *   timeout_cb()           - Handle HTTP timeouts.
- *   sigterm_handler()      - Handle 'terminate' signals that stop the backend.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -55,6 +39,18 @@ extern void  xpc_connection_set_target_uid(xpc_connection_t connection,
 
 
 /*
+ * Bits for job-state-reasons we care about...
+ */
+
+#define _CUPS_JSR_ACCOUNT_AUTHORIZATION_FAILED 0x01
+#define _CUPS_JSR_ACCOUNT_CLOSED               0x02
+#define _CUPS_JSR_ACCOUNT_INFO_NEEDED          0x04
+#define _CUPS_JSR_ACCOUNT_LIMIT_REACHED                0x08
+#define _CUPS_JSR_JOB_PASSWORD_WAIT            0x10
+#define _CUPS_JSR_JOB_RELEASE_WAIT             0x20
+
+
+/*
  * Types...
  */
 
@@ -67,6 +63,8 @@ typedef struct _cups_monitor_s                /**** Monitoring data ****/
   int                  port,           /* Port number */
                        version,        /* IPP version */
                        job_id,         /* Job ID for submitted job */
+                       job_reasons,    /* Job state reasons bits */
+                       create_job,     /* Support Create-Job? */
                        get_job_attrs;  /* Support Get-Job-Attributes? */
   const char           *job_name;      /* Job name for submitted job */
   http_encryption_t    encryption;     /* Use encryption? */
@@ -82,7 +80,7 @@ typedef struct _cups_monitor_s                /**** Monitoring data ****/
 static const char      *auth_info_required;
                                        /* New auth-info-required value */
 #if defined(HAVE_GSSAPI) && defined(HAVE_XPC)
-static int             child_pid = 0;  /* Child process ID */
+static pid_t           child_pid = 0;  /* Child process ID */
 #endif /* HAVE_GSSAPI && HAVE_XPC */
 static const char * const jattrs[] =   /* Job attributes we want */
 {
@@ -94,14 +92,19 @@ static const char * const jattrs[] =        /* Job attributes we want */
   "job-state",
   "job-state-reasons"
 };
-static int             job_canceled = 0;
+static int             job_canceled = 0,
                                        /* Job cancelled? */
+                       uri_credentials = 0;
+                                       /* Credentials supplied in URI? */
 static char            username[256] = "",
                                        /* Username for device URI */
                        *password = NULL;
                                        /* Password for device URI */
 static const char * const pattrs[] =   /* Printer attributes we want */
 {
+#ifdef HAVE_LIBZ
+  "compression-supported",
+#endif /* HAVE_LIBZ */
   "copies-supported",
   "cups-version",
   "document-format-supported",
@@ -115,9 +118,11 @@ static const char * const pattrs[] =       /* Printer attributes we want */
   "media-col-supported",
   "multiple-document-handling-supported",
   "operations-supported",
+  "print-color-mode-supported",
   "printer-alert",
   "printer-alert-description",
   "printer-is-accepting-jobs",
+  "printer-mandatory-job-attributes",
   "printer-state",
   "printer-state-message",
   "printer-state-reasons"
@@ -141,6 +146,8 @@ static cups_option_t        *attr_cache = NULL;
 static cups_array_t    *state_reasons; /* Array of printe-state-reasons keywords */
 static char            tmpfilename[1024] = "";
                                        /* Temporary spool file name */
+static char            mandatory_attrs[1024] = "";
+                                       /* cupsMandatory value */
 
 
 /*
@@ -153,20 +160,20 @@ static void               cancel_job(http_t *http, const char *uri, int id,
 static ipp_pstate_t    check_printer_state(http_t *http, const char *uri,
                                            const char *resource,
                                            const char *user, int version);
-#ifdef HAVE_LIBZ
-static void            compress_files(int num_files, char **files);
-#endif /* HAVE_LIBZ */
 static void            *monitor_printer(_cups_monitor_t *monitor);
 static ipp_t           *new_request(ipp_op_t op, int version, const char *uri,
                                     const char *user, const char *title,
                                     int num_options, cups_option_t *options,
                                     const char *compression, int copies,
                                     const char *format, _ppd_cache_t *pc,
+                                    ppd_file_t *ppd,
                                     ipp_attribute_t *media_col_sup,
-                                    ipp_attribute_t *doc_handling_sup);
+                                    ipp_attribute_t *doc_handling_sup,
+                                    ipp_attribute_t *print_color_mode_sup);
 static const char      *password_cb(const char *prompt, http_t *http,
                                     const char *method, const char *resource,
                                     int *user_data);
+static const char      *quote_string(const char *s, char *q, size_t qsize);
 static void            report_attr(ipp_attribute_t *attr);
 static void            report_printer_state(ipp_t *ipp);
 #if defined(HAVE_GSSAPI) && defined(HAVE_XPC)
@@ -230,25 +237,31 @@ main(int  argc,                           /* I - Number of command-line args */
                prev_delay;             /* Previous delay */
   const char   *compression;           /* Compression mode */
   int          waitjob,                /* Wait for job complete? */
+               waitjob_tries = 0,      /* Number of times we've waited */
                waitprinter;            /* Wait for printer ready? */
   _cups_monitor_t monitor;             /* Monitoring data */
   ipp_attribute_t *job_id_attr;                /* job-id attribute */
   int          job_id;                 /* job-id value */
   ipp_attribute_t *job_sheets;         /* job-media-sheets-completed */
   ipp_attribute_t *job_state;          /* job-state */
+#ifdef HAVE_LIBZ
+  ipp_attribute_t *compression_sup;    /* compression-supported */
+#endif /* HAVE_LIBZ */
   ipp_attribute_t *copies_sup;         /* copies-supported */
   ipp_attribute_t *cups_version;       /* cups-version */
   ipp_attribute_t *format_sup;         /* document-format-supported */
+  ipp_attribute_t *job_auth;           /* job-authorization-uri */
   ipp_attribute_t *media_col_sup;      /* media-col-supported */
   ipp_attribute_t *operations_sup;     /* operations-supported */
   ipp_attribute_t *doc_handling_sup;   /* multiple-document-handling-supported */
   ipp_attribute_t *printer_state;      /* printer-state attribute */
   ipp_attribute_t *printer_accepting;  /* printer-is-accepting-jobs */
+  ipp_attribute_t *print_color_mode_sup;/* Does printer support print-color-mode? */
   int          create_job = 0,         /* Does printer support Create-Job? */
                get_job_attrs = 0,      /* Does printer support Get-Job-Attributes? */
                send_document = 0,      /* Does printer support Send-Document? */
-               validate_job = 0;       /* Does printer support Validate-Job? */
-  int          copies,                 /* Number of copies for job */
+               validate_job = 0,       /* Does printer support Validate-Job? */
+               copies,                 /* Number of copies for job */
                copies_remaining;       /* Number of copies remaining */
   const char   *content_type,          /* CONTENT_TYPE environment variable */
                *final_content_type,    /* FINAL_CONTENT_TYPE environment var */
@@ -260,8 +273,8 @@ main(int  argc,                             /* I - Number of command-line args */
   struct sigaction action;             /* Actions for POSIX signals */
 #endif /* HAVE_SIGACTION && !HAVE_SIGSET */
   int          version;                /* IPP version */
-  ppd_file_t   *ppd;                   /* PPD file */
-  _ppd_cache_t *pc;                    /* PPD cache and mapping data */
+  ppd_file_t   *ppd = NULL;            /* PPD file */
+  _ppd_cache_t *pc = NULL;             /* PPD cache and mapping data */
   fd_set       input;                  /* Input set for select() */
 
 
@@ -334,7 +347,7 @@ main(int  argc,                             /* I - Number of command-line args */
   if ((auth_info_required = getenv("AUTH_INFO_REQUIRED")) == NULL)
     auth_info_required = "none";
 
-  state_reasons = _cupsArrayNewStrings(getenv("PRINTER_STATE_REASONS"));
+  state_reasons = _cupsArrayNewStrings(getenv("PRINTER_STATE_REASONS"), ',');
 
 #ifdef HAVE_GSSAPI
  /*
@@ -342,7 +355,8 @@ main(int  argc,                             /* I - Number of command-line args */
   * that way.
   */
 
-  if (!getuid() && (value = getenv("AUTH_UID")) != NULL)
+  if (!getuid() && (value = getenv("AUTH_UID")) != NULL &&
+      !getenv("AUTH_PASSWORD"))
   {
     uid_t      uid = (uid_t)atoi(value);
                                        /* User ID */
@@ -518,8 +532,8 @@ main(int  argc,                             /* I - Number of command-line args */
          */
 
          snmp_enabled = !value[0] || !_cups_strcasecmp(value, "on") ||
-                        _cups_strcasecmp(value, "yes") ||
-                        _cups_strcasecmp(value, "true");
+                        !_cups_strcasecmp(value, "yes") ||
+                        !_cups_strcasecmp(value, "true");
       }
       else if (!_cups_strcasecmp(name, "version"))
       {
@@ -546,6 +560,13 @@ main(int  argc,                            /* I - Number of command-line args */
         if (!_cups_strcasecmp(value, "true") || !_cups_strcasecmp(value, "yes") ||
            !_cups_strcasecmp(value, "on") || !_cups_strcasecmp(value, "gzip"))
          compression = "gzip";
+        else if (!_cups_strcasecmp(value, "deflate"))
+         compression = "deflate";
+        else if (!_cups_strcasecmp(value, "false") ||
+                 !_cups_strcasecmp(value, "no") ||
+                !_cups_strcasecmp(value, "off") ||
+                !_cups_strcasecmp(value, "none"))
+         compression = "none";
       }
 #endif /* HAVE_LIBZ */
       else if (!_cups_strcasecmp(name, "contimeout"))
@@ -596,11 +617,6 @@ main(int  argc,                            /* I - Number of command-line args */
     files        = argv + 6;
     send_options = 1;
 
-#ifdef HAVE_LIBZ
-    if (compression)
-      compress_files(num_files, files);
-#endif /* HAVE_LIBZ */
-
     fprintf(stderr, "DEBUG: %d files to send in job...\n", num_files);
   }
 
@@ -613,13 +629,14 @@ main(int  argc,                           /* I - Number of command-line args */
   if (username[0])
   {
    /*
-    * Use authenticaion information in the device URI...
+    * Use authentication information in the device URI...
     */
 
     if ((password = strchr(username, ':')) != NULL)
       *password++ = '\0';
 
     cupsSetUser(username);
+    uri_credentials = 1;
   }
   else
   {
@@ -665,9 +682,48 @@ main(int  argc,                            /* I - Number of command-line args */
       return (CUPS_BACKEND_OK);
   }
 
-  http = _httpCreate(hostname, port, addrlist, cupsEncryption(), AF_UNSPEC);
+  http = httpConnect2(hostname, port, addrlist, AF_UNSPEC, cupsEncryption(), 1,
+                      0, NULL);
   httpSetTimeout(http, 30.0, timeout_cb, NULL);
 
+  if (httpIsEncrypted(http))
+  {
+   /*
+    * Validate TLS credentials...
+    */
+
+    cups_array_t       *creds;         /* TLS credentials */
+    cups_array_t       *lcreds = NULL; /* Loaded credentials */
+    http_trust_t       trust;          /* Trust level */
+    static const char  *trusts[] = { NULL, "+cups-pki-invalid", "+cups-pki-changed", "+cups-pki-expired", NULL, "+cups-pki-unknown" };
+                                       /* Trust keywords */
+
+    if (!httpCopyCredentials(http, &creds))
+    {
+      trust = httpCredentialsGetTrust(creds, hostname);
+
+      update_reasons(NULL, "-cups-pki-invalid,cups-pki-changed,cups-pki-expired,cups-pki-unknown");
+      if (trusts[trust])
+      {
+        update_reasons(NULL, trusts[trust]);
+        return (CUPS_BACKEND_STOP);
+      }
+
+      if (httpLoadCredentials(NULL, &lcreds, hostname))
+      {
+       /*
+        * Could not load the credentials, let's save the ones we have so we
+        * can detect changes...
+        */
+
+        httpSaveCredentials(NULL, creds, hostname);
+      }
+
+      httpFreeCredentials(lcreds);
+      httpFreeCredentials(creds);
+    }
+  }
+
  /*
   * See if the printer supports SNMP...
   */
@@ -774,7 +830,7 @@ main(int  argc,                             /* I - Number of command-line args */
              break;
         }
 
-       sleep(delay);
+       sleep((unsigned)delay);
 
         delay = _cupsNextDelay(delay, &prev_delay);
       }
@@ -803,7 +859,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
   fprintf(stderr, "DEBUG: Connected to %s:%d...\n",
          httpAddrString(http->hostaddr, addrname, sizeof(addrname)),
-         _httpAddrPort(http->hostaddr));
+         httpAddrPort(http->hostaddr));
 
  /*
   * Build a URI for the printer and fill the standard IPP attributes for
@@ -819,13 +875,17 @@ main(int  argc,                           /* I - Number of command-line args */
   * copies...
   */
 
-  copies_sup       = NULL;
-  cups_version     = NULL;
-  format_sup       = NULL;
-  media_col_sup    = NULL;
-  supported        = NULL;
-  operations_sup   = NULL;
-  doc_handling_sup = NULL;
+#ifdef HAVE_LIBZ
+  compression_sup      = NULL;
+#endif /* HAVE_LIBZ */
+  copies_sup           = NULL;
+  cups_version         = NULL;
+  format_sup           = NULL;
+  media_col_sup        = NULL;
+  supported            = NULL;
+  operations_sup       = NULL;
+  doc_handling_sup     = NULL;
+  print_color_mode_sup = NULL;
 
   do
   {
@@ -840,9 +900,7 @@ main(int  argc,                             /* I - Number of command-line args */
     */
 
     request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
-    request->request.op.version[0] = version / 10;
-    request->request.op.version[1] = version % 10;
-
+    ippSetVersion(request, version / 10, version % 10);
     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
                 NULL, uri);
 
@@ -891,7 +949,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
         report_printer_state(supported);
 
-       sleep(delay);
+       sleep((unsigned)delay);
 
         delay = _cupsNextDelay(delay, &prev_delay);
       }
@@ -904,16 +962,18 @@ main(int  argc,                           /* I - Number of command-line args */
 
         if (version >= 20)
        {
-         _cupsLangPrintFilter(stderr, "INFO",
-                              _("The printer does not support IPP/%d.%d, trying "
-                                "IPP/%s."), version / 10, version % 10, "1.1");
+         _cupsLangPrintFilter(stderr, "INFO", _("Preparing to print."));
+         fprintf(stderr,
+                 "DEBUG: The printer does not support IPP/%d.%d, trying "
+                 "IPP/1.1.\n", version / 10, version % 10);
          version = 11;
        }
        else
        {
-         _cupsLangPrintFilter(stderr, "INFO",
-                              _("The printer does not support IPP/%d.%d, trying "
-                                "IPP/%s."), version / 10, version % 10, "1.0");
+         _cupsLangPrintFilter(stderr, "INFO", _("Preparing to print."));
+         fprintf(stderr,
+                 "DEBUG: The printer does not support IPP/%d.%d, trying "
+                 "IPP/1.0.\n", version / 10, version % 10);
          version = 10;
         }
 
@@ -922,8 +982,8 @@ main(int  argc,                             /* I - Number of command-line args */
       else if (ipp_status == IPP_NOT_FOUND)
       {
         _cupsLangPrintFilter(stderr, "ERROR",
-                            _("The printer URI is incorrect or no longer "
-                              "exists."));
+                            _("The printer configuration is incorrect or the "
+                              "printer no longer exists."));
 
        ippDelete(supported);
 
@@ -1003,12 +1063,13 @@ main(int  argc,                         /* I - Number of command-line args */
 
        report_printer_state(supported);
 
-       sleep(delay);
+       sleep((unsigned)delay);
 
        delay = _cupsNextDelay(delay, &prev_delay);
 
        ippDelete(supported);
-       supported = NULL;
+       supported  = NULL;
+       ipp_status = IPP_STATUS_ERROR_BUSY;
        continue;
       }
     }
@@ -1017,6 +1078,35 @@ main(int  argc,                          /* I - Number of command-line args */
     * Check for supported attributes...
     */
 
+#ifdef HAVE_LIBZ
+    if ((compression_sup = ippFindAttribute(supported, "compression-supported",
+                                            IPP_TAG_KEYWORD)) != NULL)
+    {
+     /*
+      * Check whether the requested compression is supported and/or default to
+      * compression if supported...
+      */
+
+      if (compression && !ippContainsString(compression_sup, compression))
+      {
+        fprintf(stderr, "DEBUG: Printer does not support the requested "
+                        "compression value \"%s\".\n", compression);
+        compression = NULL;
+      }
+      else if (!compression)
+      {
+        if (ippContainsString(compression_sup, "gzip"))
+          compression = "gzip";
+        else if (ippContainsString(compression_sup, "deflate"))
+          compression = "deflate";
+
+        if (compression)
+          fprintf(stderr, "DEBUG: Automatically using \"%s\" compression.\n",
+                  compression);
+      }
+    }
+#endif /* HAVE_LIBZ */
+
     if ((copies_sup = ippFindAttribute(supported, "copies-supported",
                                       IPP_TAG_RANGE)) != NULL)
     {
@@ -1055,6 +1145,8 @@ main(int  argc,                           /* I - Number of command-line args */
                media_col_sup->values[i].string.text);
     }
 
+    print_color_mode_sup = ippFindAttribute(supported, "print-color-mode-supported", IPP_TAG_KEYWORD);
+
     if ((operations_sup = ippFindAttribute(supported, "operations-supported",
                                           IPP_TAG_ENUM)) != NULL)
     {
@@ -1195,7 +1287,6 @@ main(int  argc,                           /* I - Number of command-line args */
   */
 
   options = NULL;
-  pc      = NULL;
 
   if (send_options)
   {
@@ -1207,10 +1298,16 @@ main(int  argc,                         /* I - Number of command-line args */
       * Load the PPD file and generate PWG attribute mapping information...
       */
 
+      ppd_attr_t *mandatory;           /* cupsMandatory value */
+
       ppd = ppdOpenFile(getenv("PPD"));
       pc  = _ppdCacheCreateWithPPD(ppd);
 
-      ppdClose(ppd);
+      ppdMarkDefaults(ppd);
+      cupsMarkOptions(ppd, num_options, options);
+
+      if ((mandatory = ppdFindAttr(ppd, "cupsMandatory", NULL)) != NULL)
+        strlcpy(mandatory_attrs, mandatory->value, sizeof(mandatory_attrs));
     }
   }
   else
@@ -1260,7 +1357,7 @@ main(int  argc,                           /* I - Number of command-line args */
 
     _cupsLangPrintFilter(stderr, "INFO", _("Copying print data."));
 
-    if ((compatsize = write(fd, buffer, bytes)) < 0)
+    if ((compatsize = write(fd, buffer, (size_t)bytes)) < 0)
     {
       perror("DEBUG: Unable to write temporary file");
       return (CUPS_BACKEND_FAILED);
@@ -1308,6 +1405,7 @@ main(int  argc,                           /* I - Number of command-line args */
   monitor.port          = port;
   monitor.version       = version;
   monitor.job_id        = 0;
+  monitor.create_job    = create_job;
   monitor.get_job_attrs = get_job_attrs;
   monitor.encryption    = cupsEncryption();
   monitor.job_state     = IPP_JOB_PENDING;
@@ -1334,28 +1432,43 @@ main(int  argc,                         /* I - Number of command-line args */
   {
     request = new_request(IPP_VALIDATE_JOB, version, uri, argv[2],
                           monitor.job_name, num_options, options, compression,
-                         copies_sup ? copies : 1, document_format, pc,
-                         media_col_sup, doc_handling_sup);
+                         copies_sup ? copies : 1, document_format, pc, ppd,
+                         media_col_sup, doc_handling_sup, print_color_mode_sup);
 
-    ippDelete(cupsDoRequest(http, request, resource));
+    response = cupsDoRequest(http, request, resource);
 
     ipp_status = cupsLastError();
 
     fprintf(stderr, "DEBUG: Validate-Job: %s (%s)\n",
             ippErrorString(ipp_status), cupsLastErrorString());
 
+    if ((job_auth = ippFindAttribute(response, "job-authorization-uri",
+                                    IPP_TAG_URI)) != NULL)
+      num_options = cupsAddOption("job-authorization-uri",
+                                  ippGetString(job_auth, 0, NULL), num_options,
+                                  &options);
+
+    ippDelete(response);
+
     if (job_canceled)
       break;
 
-    if (ipp_status == IPP_SERVICE_UNAVAILABLE || ipp_status == IPP_PRINTER_BUSY)
+    if (ipp_status == IPP_STATUS_ERROR_SERVICE_UNAVAILABLE ||
+        ipp_status == IPP_STATUS_ERROR_BUSY)
     {
       _cupsLangPrintFilter(stderr, "INFO", _("The printer is in use."));
       sleep(10);
     }
-    else if (ipp_status == IPP_DOCUMENT_FORMAT)
+    else if (ipp_status == IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED ||
+             ipp_status == IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES ||
+             ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED ||
+             ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED ||
+             ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED ||
+             ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
       goto cleanup;
-    else if (ipp_status == IPP_FORBIDDEN ||
-            ipp_status == IPP_AUTHENTICATION_CANCELED)
+    else if (ipp_status == IPP_STATUS_ERROR_FORBIDDEN ||
+             ipp_status == IPP_STATUS_ERROR_NOT_AUTHORIZED ||
+            ipp_status == IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED)
     {
       const char *www_auth = httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE);
                                        /* WWW-Authenticate field value */
@@ -1367,7 +1480,7 @@ main(int  argc,                           /* I - Number of command-line args */
 
       goto cleanup;
     }
-    else if (ipp_status == IPP_OPERATION_NOT_SUPPORTED)
+    else if (ipp_status == IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED)
     {
      /*
       * This is all too common...
@@ -1407,7 +1520,8 @@ main(int  argc,                           /* I - Number of command-line args */
                                                           IPP_PRINT_JOB,
                          version, uri, argv[2], monitor.job_name, num_options,
                          options, compression, copies_sup ? copies : 1,
-                         document_format, pc, media_col_sup, doc_handling_sup);
+                         document_format, pc, ppd, media_col_sup,
+                         doc_handling_sup, print_color_mode_sup);
 
    /*
     * Do the request...
@@ -1430,6 +1544,9 @@ main(int  argc,                           /* I - Number of command-line args */
       http_status = cupsSendRequest(http, request, resource, length);
       if (http_status == HTTP_CONTINUE && request->state == IPP_DATA)
       {
+       if (compression && strcmp(compression, "none"))
+         httpSetField(http, HTTP_FIELD_CONTENT_ENCODING, compression);
+
         if (num_files == 1)
         {
          if ((fd = open(files[0], O_RDONLY)) < 0)
@@ -1441,7 +1558,7 @@ main(int  argc,                           /* I - Number of command-line args */
        else
        {
          fd          = 0;
-         http_status = cupsWriteRequestData(http, buffer, bytes);
+         http_status = cupsWriteRequestData(http, buffer, (size_t)bytes);
         }
 
         while (http_status == HTTP_CONTINUE &&
@@ -1454,6 +1571,7 @@ main(int  argc,                           /* I - Number of command-line args */
           FD_ZERO(&input);
          FD_SET(fd, &input);
          FD_SET(snmp_fd, &input);
+         FD_SET(CUPS_SC_FD, &input);
 
           while (select(fd > snmp_fd ? fd + 1 : snmp_fd + 1, &input, NULL, NULL,
                        NULL) <= 0 && !job_canceled);
@@ -1467,7 +1585,8 @@ main(int  argc,                           /* I - Number of command-line args */
             {
              fprintf(stderr, "DEBUG: Read %d bytes...\n", (int)bytes);
 
-             if (cupsWriteRequestData(http, buffer, bytes) != HTTP_CONTINUE)
+             if ((http_status = cupsWriteRequestData(http, buffer, (size_t)bytes))
+                     != HTTP_CONTINUE)
                break;
            }
            else if (bytes == 0 || (errno != EINTR && errno != EAGAIN))
@@ -1475,6 +1594,10 @@ main(int  argc,                          /* I - Number of command-line args */
          }
        }
 
+       if (http_status == HTTP_ERROR)
+         fprintf(stderr, "DEBUG: Error writing document data for "
+                         "Print-Job: %s\n", strerror(httpError(http)));
+
         if (num_files == 1)
          close(fd);
       }
@@ -1496,9 +1619,9 @@ main(int  argc,                           /* I - Number of command-line args */
       if (job_canceled)
         break;
 
-      if (ipp_status == IPP_SERVICE_UNAVAILABLE ||
-          ipp_status == IPP_NOT_POSSIBLE ||
-         ipp_status == IPP_PRINTER_BUSY)
+      if (ipp_status == IPP_STATUS_ERROR_SERVICE_UNAVAILABLE ||
+          ipp_status == IPP_STATUS_ERROR_NOT_POSSIBLE ||
+         ipp_status == IPP_STATUS_ERROR_BUSY)
       {
        _cupsLangPrintFilter(stderr, "INFO", _("The printer is in use."));
        sleep(10);
@@ -1513,8 +1636,13 @@ main(int  argc,                          /* I - Number of command-line args */
          goto cleanup;
        }
       }
-      else if (ipp_status == IPP_ERROR_JOB_CANCELED ||
-               ipp_status == IPP_NOT_AUTHORIZED)
+      else if (ipp_status == IPP_STATUS_ERROR_JOB_CANCELED ||
+               ipp_status == IPP_STATUS_ERROR_NOT_AUTHORIZED ||
+               ipp_status == IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES ||
+              ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED ||
+              ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED ||
+              ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED ||
+              ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
         goto cleanup;
       else
       {
@@ -1523,10 +1651,10 @@ main(int  argc,                         /* I - Number of command-line args */
        */
 
         _cupsLangPrintFilter(stderr, "ERROR",
-                            _("Print file was not accepted."));
+                            _("Print job was not accepted."));
 
-        if (ipp_status == IPP_FORBIDDEN ||
-            ipp_status == IPP_AUTHENTICATION_CANCELED)
+        if (ipp_status == IPP_STATUS_ERROR_FORBIDDEN ||
+            ipp_status == IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED)
        {
          const char *www_auth = httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE);
                                        /* WWW-Authenticate field value */
@@ -1561,8 +1689,7 @@ main(int  argc,                           /* I - Number of command-line args */
     else if ((job_id_attr = ippFindAttribute(response, "job-id",
                                              IPP_TAG_INTEGER)) == NULL)
     {
-      _cupsLangPrintFilter(stderr, "INFO",
-                          _("Print file accepted - job ID unknown."));
+      fputs("DEBUG: Print job accepted - job ID unknown.\n", stderr);
       update_reasons(NULL, "+cups-ipp-conformance-failure-report,"
                           "cups-ipp-missing-job-id");
       job_id = 0;
@@ -1571,11 +1698,9 @@ main(int  argc,                          /* I - Number of command-line args */
     {
       password_tries = 0;
       monitor.job_id = job_id = job_id_attr->values[0].integer;
-      _cupsLangPrintFilter(stderr, "INFO",
-                           _("Print file accepted - job ID %d."), job_id);
+      fprintf(stderr, "DEBUG: Print job accepted - job ID %d.\n", job_id);
     }
 
-    fprintf(stderr, "DEBUG: job-id=%d\n", job_id);
     ippDelete(response);
 
     if (job_canceled)
@@ -1596,8 +1721,7 @@ main(int  argc,                           /* I - Number of command-line args */
        */
 
        request = ippNewRequest(IPP_SEND_DOCUMENT);
-       request->request.op.version[0] = version / 10;
-       request->request.op.version[1] = version % 10;
+       ippSetVersion(request, version / 10, version % 10);
 
        ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
                     NULL, uri);
@@ -1624,10 +1748,13 @@ main(int  argc,                         /* I - Number of command-line args */
        http_status = cupsSendRequest(http, request, resource, 0);
        if (http_status == HTTP_CONTINUE && request->state == IPP_DATA)
        {
+         if (compression && strcmp(compression, "none"))
+           httpSetField(http, HTTP_FIELD_CONTENT_ENCODING, compression);
+
          if (num_files == 0)
          {
            fd          = 0;
-           http_status = cupsWriteRequestData(http, buffer, bytes);
+           http_status = cupsWriteRequestData(http, buffer, (size_t)bytes);
          }
          else
          {
@@ -1646,7 +1773,7 @@ main(int  argc,                           /* I - Number of command-line args */
          while (!job_canceled && http_status == HTTP_CONTINUE &&
                 (bytes = read(fd, buffer, sizeof(buffer))) > 0)
          {
-           if ((http_status = cupsWriteRequestData(http, buffer, bytes))
+           if ((http_status = cupsWriteRequestData(http, buffer, (size_t)bytes))
                    != HTTP_CONTINUE)
              break;
            else
@@ -1663,13 +1790,17 @@ main(int  argc,                         /* I - Number of command-line args */
            close(fd);
        }
 
+        if (http_status == HTTP_ERROR)
+          fprintf(stderr, "DEBUG: Error writing document data for "
+                          "Send-Document: %s\n", strerror(httpError(http)));
+
        ippDelete(cupsGetResponse(http, resource));
        ippDelete(request);
 
        fprintf(stderr, "DEBUG: Send-Document: %s (%s)\n",
                ippErrorString(cupsLastError()), cupsLastErrorString());
 
-       if (cupsLastError() > IPP_OK_CONFLICT)
+       if (cupsLastError() > IPP_OK_CONFLICT && !job_canceled)
        {
          ipp_status = cupsLastError();
 
@@ -1687,11 +1818,28 @@ main(int  argc,                         /* I - Number of command-line args */
       }
     }
 
+    if (job_canceled)
+      break;
+
     if (ipp_status <= IPP_OK_CONFLICT && argc > 6)
     {
       fprintf(stderr, "PAGE: 1 %d\n", copies_sup ? atoi(argv[4]) : 1);
       copies_remaining --;
     }
+    else if ((ipp_status == IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR || ipp_status == IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE) &&
+             argc == 6 &&
+             document_format && strcmp(document_format, "image/pwg-raster") && strcmp(document_format, "image/urf"))
+    {
+     /*
+      * Need to reprocess the job as raster...
+      */
+
+      fputs("JOBSTATE: cups-retry-as-raster\n", stderr);
+      if (job_id > 0)
+       cancel_job(http, uri, job_id, resource, argv[2], version);
+
+      goto cleanup;
+    }
     else if (ipp_status == IPP_SERVICE_UNAVAILABLE ||
              ipp_status == IPP_NOT_POSSIBLE ||
             ipp_status == IPP_PRINTER_BUSY)
@@ -1713,6 +1861,10 @@ main(int  argc,                          /* I - Number of command-line args */
     else if (ipp_status == IPP_REQUEST_VALUE ||
              ipp_status == IPP_ERROR_JOB_CANCELED ||
              ipp_status == IPP_NOT_AUTHORIZED ||
+             ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED ||
+             ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED ||
+             ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED ||
+             ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED ||
              ipp_status == IPP_INTERNAL_ERROR)
     {
      /*
@@ -1722,7 +1874,7 @@ main(int  argc,                           /* I - Number of command-line args */
 
       goto cleanup;
     }
-    else if (ipp_status == IPP_UPGRADE_REQUIRED)
+    else if (ipp_status == IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED)
     {
      /*
       * Server is configured incorrectly; the policy for Create-Job and
@@ -1736,7 +1888,7 @@ main(int  argc,                           /* I - Number of command-line args */
       fputs("DEBUG: The policy for Create-Job and Send-Document must have the "
             "same authentication and encryption requirements.\n", stderr);
 
-      ipp_status = IPP_INTERNAL_ERROR;
+      ipp_status = IPP_STATUS_ERROR_INTERNAL;
 
       if (job_id > 0)
        cancel_job(http, uri, job_id, resource, argv[2], version);
@@ -1771,6 +1923,8 @@ main(int  argc,                           /* I - Number of command-line args */
     if (!job_id || !waitjob || !get_job_attrs)
       continue;
 
+    fputs("STATE: +cups-waiting-for-job-completed\n", stderr);
+
     _cupsLangPrintFilter(stderr, "INFO", _("Waiting for job to complete."));
 
     for (delay = _cupsNextDelay(0, &prev_delay); !job_canceled;)
@@ -1782,12 +1936,20 @@ main(int  argc,                         /* I - Number of command-line args */
       backendCheckSideChannel(snmp_fd, http->hostaddr);
 
      /*
+      * Check printer state...
+      */
+
+      check_printer_state(http, uri, resource, argv[2], version);
+
+      if (cupsLastError() <= IPP_OK_CONFLICT)
+        password_tries = 0;
+
+     /*
       * Build an IPP_GET_JOB_ATTRIBUTES request...
       */
 
       request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES);
-      request->request.op.version[0] = version / 10;
-      request->request.op.version[1] = version % 10;
+      ippSetVersion(request, version / 10, version % 10);
 
       ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
                   NULL, uri);
@@ -1839,6 +2001,17 @@ main(int  argc,                          /* I - Number of command-line args */
           ipp_status = IPP_OK;
           break;
        }
+       else if (ipp_status == IPP_INTERNAL_ERROR)
+       {
+         waitjob_tries ++;
+
+         if (waitjob_tries > 4)
+         {
+           ippDelete(response);
+           ipp_status = IPP_OK;
+           break;
+         }
+       }
       }
 
       if (response)
@@ -1857,12 +2030,8 @@ main(int  argc,                          /* I - Number of command-line args */
                           remote_job_states[job_state->values[0].integer -
                                             IPP_JOB_PENDING]);
 
-         if ((job_sheets = ippFindAttribute(response,
-                                            "job-media-sheets-completed",
-                                            IPP_TAG_INTEGER)) == NULL)
-           job_sheets = ippFindAttribute(response,
-                                         "job-impressions-completed",
-                                         IPP_TAG_INTEGER);
+         if ((job_sheets = ippFindAttribute(response, "job-impressions-completed", IPP_TAG_INTEGER)) == NULL)
+           job_sheets = ippFindAttribute(response, "job-media-sheets-completed", IPP_TAG_INTEGER);
 
          if (job_sheets)
            fprintf(stderr, "PAGE: total %d\n",
@@ -1897,14 +2066,11 @@ main(int  argc,                         /* I - Number of command-line args */
 
       ippDelete(response);
 
-      if (cupsLastError() <= IPP_OK_CONFLICT)
-        password_tries = 0;
-
      /*
       * Wait before polling again...
       */
 
-      sleep(delay);
+      sleep((unsigned)delay);
 
       delay = _cupsNextDelay(delay, &prev_delay);
     }
@@ -1915,8 +2081,13 @@ main(int  argc,                          /* I - Number of command-line args */
   */
 
   if (job_canceled > 0 && job_id > 0)
+  {
     cancel_job(http, uri, job_id, resource, argv[2], version);
 
+    if (cupsLastError() > IPP_OK_CONFLICT)
+      _cupsLangPrintFilter(stderr, "ERROR", _("Unable to cancel print job."));
+  }
+
  /*
   * Check the printer state and report it if necessary...
   */
@@ -1953,6 +2124,7 @@ main(int  argc,                           /* I - Number of command-line args */
 
   cupsFreeOptions(num_options, options);
   _ppdCacheDestroy(pc);
+  ppdClose(ppd);
 
   httpClose(http);
 
@@ -1965,14 +2137,6 @@ main(int  argc,                          /* I - Number of command-line args */
   if (tmpfilename[0])
     unlink(tmpfilename);
 
-#ifdef HAVE_LIBZ
-  if (compression)
-  {
-    for (i = 0; i < num_files; i ++)
-      unlink(files[i]);
-  }
-#endif /* HAVE_LIBZ */
-
  /*
   * Return the queue status...
   */
@@ -1982,14 +2146,29 @@ main(int  argc,                         /* I - Number of command-line args */
       ipp_status <= IPP_OK_CONFLICT)
     fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required);
 
+  if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED)
+    fputs("JOBSTATE: account-info-needed\n", stderr);
+  else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED)
+    fputs("JOBSTATE: account-closed\n", stderr);
+  else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED)
+    fputs("JOBSTATE: account-limit-reached\n", stderr);
+  else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
+    fputs("JOBSTATE: account-authorization-failed\n", stderr);
+
   if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN ||
       ipp_status == IPP_AUTHENTICATION_CANCELED)
     return (CUPS_BACKEND_AUTH_REQUIRED);
+  else if (ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED ||
+          ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED ||
+          ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED ||
+          ipp_status == IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED)
+    return (CUPS_BACKEND_HOLD);
   else if (ipp_status == IPP_INTERNAL_ERROR)
     return (CUPS_BACKEND_STOP);
   else if (ipp_status == IPP_CONFLICT)
     return (CUPS_BACKEND_FAILED);
   else if (ipp_status == IPP_REQUEST_VALUE ||
+          ipp_status == IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES ||
            ipp_status == IPP_DOCUMENT_FORMAT || job_canceled < 0)
   {
     if (ipp_status == IPP_REQUEST_VALUE)
@@ -1997,6 +2176,9 @@ main(int  argc,                           /* I - Number of command-line args */
     else if (ipp_status == IPP_DOCUMENT_FORMAT)
       _cupsLangPrintFilter(stderr, "ERROR",
                            _("Printer cannot print supplied content."));
+    else if (ipp_status == IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES)
+      _cupsLangPrintFilter(stderr, "ERROR",
+                           _("Printer cannot print with supplied options."));
     else
       _cupsLangPrintFilter(stderr, "ERROR", _("Print job canceled at printer."));
 
@@ -2027,8 +2209,7 @@ cancel_job(http_t     *http,              /* I - HTTP connection */
   _cupsLangPrintFilter(stderr, "INFO", _("Canceling print job."));
 
   request = ippNewRequest(IPP_CANCEL_JOB);
-  request->request.op.version[0] = version / 10;
-  request->request.op.version[1] = version % 10;
+  ippSetVersion(request, version / 10, version % 10);
 
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
                NULL, uri);
@@ -2043,9 +2224,6 @@ cancel_job(http_t     *http,              /* I - HTTP connection */
   */
 
   ippDelete(cupsDoRequest(http, request, resource));
-
-  if (cupsLastError() > IPP_OK_CONFLICT)
-    _cupsLangPrintFilter(stderr, "ERROR", _("Unable to cancel print job."));
 }
 
 
@@ -2073,8 +2251,7 @@ check_printer_state(
   */
 
   request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
-  request->request.op.version[0] = version / 10;
-  request->request.op.version[1] = version % 10;
+  ippSetVersion(request, version / 10, version % 10);
 
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
               NULL, uri);
@@ -2109,77 +2286,6 @@ check_printer_state(
 }
 
 
-#ifdef HAVE_LIBZ
-/*
- * 'compress_files()' - Compress print files.
- */
-
-static void
-compress_files(int  num_files,         /* I - Number of files */
-               char **files)           /* I - Files */
-{
-  int          i,                      /* Looping var */
-               fd;                     /* Temporary file descriptor */
-  ssize_t      bytes;                  /* Bytes read/written */
-  size_t       total;                  /* Total bytes read */
-  cups_file_t  *in,                    /* Input file */
-               *out;                   /* Output file */
-  struct stat  outinfo;                /* Output file information */
-  char         filename[1024],         /* Temporary filename */
-               buffer[32768];          /* Copy buffer */
-
-
-  fprintf(stderr, "DEBUG: Compressing %d job files...\n", num_files);
-  for (i = 0; i < num_files; i ++)
-  {
-    if ((fd = cupsTempFd(filename, sizeof(filename))) < 0)
-    {
-      _cupsLangPrintError("ERROR", _("Unable to create compressed print file"));
-      exit(CUPS_BACKEND_FAILED);
-    }
-
-    if ((out = cupsFileOpenFd(fd, "w9")) == NULL)
-    {
-      _cupsLangPrintError("ERROR", _("Unable to open compressed print file"));
-      exit(CUPS_BACKEND_FAILED);
-    }
-
-    if ((in = cupsFileOpen(files[i], "r")) == NULL)
-    {
-      _cupsLangPrintError("ERROR", _("Unable to open print file"));
-      cupsFileClose(out);
-      exit(CUPS_BACKEND_FAILED);
-    }
-
-    total = 0;
-    while ((bytes = cupsFileRead(in, buffer, sizeof(buffer))) > 0)
-      if (cupsFileWrite(out, buffer, bytes) < bytes)
-      {
-       _cupsLangPrintError("ERROR",
-                           _("Unable to generate compressed print file"));
-        cupsFileClose(in);
-        cupsFileClose(out);
-       exit(CUPS_BACKEND_FAILED);
-      }
-      else
-        total += bytes;
-
-    cupsFileClose(out);
-    cupsFileClose(in);
-
-    files[i] = strdup(filename);
-
-    if (!stat(filename, &outinfo))
-      fprintf(stderr,
-              "DEBUG: File %d compressed to %.1f%% of original size, "
-             CUPS_LLFMT " bytes...\n",
-              i + 1, 100.0 * outinfo.st_size / total,
-             CUPS_LLCAST outinfo.st_size);
-  }
-}
-#endif /* HAVE_LIBZ */
-
-
 /*
  * 'monitor_printer()' - Monitor the printer state.
  */
@@ -2206,11 +2312,12 @@ monitor_printer(
   * Make a copy of the printer connection...
   */
 
-  http = _httpCreate(monitor->hostname, monitor->port, NULL, monitor->encryption,
-                     AF_UNSPEC);
+  http = httpConnect2(monitor->hostname, monitor->port, NULL, AF_UNSPEC,
+                      monitor->encryption, 1, 0, NULL);
   httpSetTimeout(http, 30.0, timeout_cb, NULL);
   if (username[0])
     cupsSetUser(username);
+
   cupsSetPasswordCB2((cups_password_cb2_t)password_cb, &password_tries);
 
  /*
@@ -2219,6 +2326,8 @@ monitor_printer(
 
   delay = _cupsNextDelay(0, &prev_delay);
 
+  monitor->job_reasons = 0;
+
   while (monitor->job_state < IPP_JOB_CANCELED && !job_canceled)
   {
    /*
@@ -2238,6 +2347,15 @@ monitor_printer(
       if (cupsLastError() <= IPP_OK_CONFLICT)
         password_tries = 0;
 
+      if (monitor->job_id == 0 && monitor->create_job)
+      {
+       /*
+        * No job-id yet, so continue...
+       */
+
+        goto monitor_disconnect;
+      }
+
      /*
       * Check the status of the job itself...
       */
@@ -2245,8 +2363,7 @@ monitor_printer(
       job_op  = (monitor->job_id > 0 && monitor->get_job_attrs) ?
                     IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS;
       request = ippNewRequest(job_op);
-      request->request.op.version[0] = monitor->version / 10;
-      request->request.op.version[1] = monitor->version % 10;
+      ippSetVersion(request, monitor->version / 10, monitor->version % 10);
 
       ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
                   NULL, monitor->uri);
@@ -2308,7 +2425,7 @@ monitor_printer(
               job_name = attr->values[0].string.text;
             else if (!strcmp(attr->name, "job-state") &&
                     attr->value_tag == IPP_TAG_ENUM)
-              job_state = attr->values[0].integer;
+              job_state = (ipp_jstate_t)attr->values[0].integer;
             else if (!strcmp(attr->name, "job-originating-user-name") &&
                     (attr->value_tag == IPP_TAG_NAME ||
                      attr->value_tag == IPP_TAG_NAMELANG))
@@ -2330,9 +2447,67 @@ monitor_printer(
         }
       }
 
+      fprintf(stderr, "DEBUG: (monitor) job-state = %s\n",
+              ippEnumString("job-state", monitor->job_state));
+
+      if (!job_canceled &&
+          (monitor->job_state == IPP_JOB_CANCELED ||
+          monitor->job_state == IPP_JOB_ABORTED))
+      {
+       job_canceled = -1;
+       fprintf(stderr, "DEBUG: (monitor) job_canceled = -1\n");
+      }
+
+      if ((attr = ippFindAttribute(response, "job-state-reasons",
+                                   IPP_TAG_KEYWORD)) != NULL)
+      {
+        int    i, new_reasons = 0;     /* Looping var, new reasons */
+
+        for (i = 0; i < attr->num_values; i ++)
+        {
+          if (!strcmp(attr->values[i].string.text,
+                      "account-authorization-failed"))
+            new_reasons |= _CUPS_JSR_ACCOUNT_AUTHORIZATION_FAILED;
+          else if (!strcmp(attr->values[i].string.text, "account-closed"))
+            new_reasons |= _CUPS_JSR_ACCOUNT_CLOSED;
+          else if (!strcmp(attr->values[i].string.text, "account-info-needed"))
+            new_reasons |= _CUPS_JSR_ACCOUNT_INFO_NEEDED;
+          else if (!strcmp(attr->values[i].string.text,
+                           "account-limit-reached"))
+            new_reasons |= _CUPS_JSR_ACCOUNT_LIMIT_REACHED;
+          else if (!strcmp(attr->values[i].string.text, "job-password-wait"))
+            new_reasons |= _CUPS_JSR_JOB_PASSWORD_WAIT;
+          else if (!strcmp(attr->values[i].string.text, "job-release-wait"))
+            new_reasons |= _CUPS_JSR_JOB_RELEASE_WAIT;
+         if (!job_canceled &&
+             (!strncmp(attr->values[i].string.text, "job-canceled-", 13) || !strcmp(attr->values[i].string.text, "aborted-by-system")))
+            job_canceled = 1;
+        }
+
+        if (new_reasons != monitor->job_reasons)
+        {
+         if (new_reasons & _CUPS_JSR_ACCOUNT_AUTHORIZATION_FAILED)
+           fputs("JOBSTATE: account-authorization-failed\n", stderr);
+         else if (new_reasons & _CUPS_JSR_ACCOUNT_CLOSED)
+           fputs("JOBSTATE: account-closed\n", stderr);
+         else if (new_reasons & _CUPS_JSR_ACCOUNT_INFO_NEEDED)
+           fputs("JOBSTATE: account-info-needed\n", stderr);
+         else if (new_reasons & _CUPS_JSR_ACCOUNT_LIMIT_REACHED)
+           fputs("JOBSTATE: account-limit-reached\n", stderr);
+         else if (new_reasons & _CUPS_JSR_JOB_PASSWORD_WAIT)
+           fputs("JOBSTATE: job-password-wait\n", stderr);
+         else if (new_reasons & _CUPS_JSR_JOB_RELEASE_WAIT)
+           fputs("JOBSTATE: job-release-wait\n", stderr);
+         else
+           fputs("JOBSTATE: job-printing\n", stderr);
+
+         monitor->job_reasons = new_reasons;
+        }
+      }
+
       ippDelete(response);
 
-      fprintf(stderr, "DEBUG: (monitor) job-state=%s\n",
+      fprintf(stderr, "DEBUG: (monitor) job-state = %s\n",
               ippEnumString("job-state", monitor->job_state));
 
       if (!job_canceled &&
@@ -2344,6 +2519,8 @@ monitor_printer(
       * Disconnect from the printer - we'll reconnect on the next poll...
       */
 
+      monitor_disconnect:
+
       _httpDisconnect(http);
     }
 
@@ -2351,7 +2528,7 @@ monitor_printer(
     * Sleep for N seconds...
     */
 
-    sleep(delay);
+    sleep((unsigned)delay);
 
     delay = _cupsNextDelay(delay, &prev_delay);
   }
@@ -2361,10 +2538,20 @@ monitor_printer(
   */
 
   if (job_canceled > 0 && monitor->job_id > 0)
+  {
     if (!httpReconnect(http))
+    {
       cancel_job(http, monitor->uri, monitor->job_id, monitor->resource,
                  monitor->user, monitor->version);
 
+      if (cupsLastError() > IPP_OK_CONFLICT)
+      {
+       fprintf(stderr, "DEBUG: (monitor) cancel_job() = %s\n", cupsLastErrorString());
+       _cupsLangPrintFilter(stderr, "ERROR", _("Unable to cancel print job."));
+      }
+    }
+  }
+
  /*
   * Cleanup and return...
   */
@@ -2392,27 +2579,25 @@ new_request(
     int             copies,            /* I - copies value or 0 */
     const char      *format,           /* I - document-format value or NULL */
     _ppd_cache_t    *pc,               /* I - PPD cache and mapping data */
+    ppd_file_t      *ppd,              /* I - PPD file data */
     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 *doc_handling_sup,  /* I - multiple-document-handling-supported values */
+    ipp_attribute_t *print_color_mode_sup)
+                                       /* I - Printer supports print-color-mode */
 {
-  int          i;                      /* Looping var */
   ipp_t                *request;               /* Request data */
   const char   *keyword;               /* PWG keyword */
-  _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 */
+  ipp_tag_t    group;                  /* Current group */
+  ipp_attribute_t *attr;               /* Current attribute */
+  char         buffer[1024];           /* Value buffer */
 
 
  /*
   * Create the IPP request...
   */
 
-  request                        = ippNewRequest(op);
-  request->request.op.version[0] = version / 10;
-  request->request.op.version[1] = version % 10;
+  request = ippNewRequest(op);
+  ippSetVersion(request, version / 10, version % 10);
 
   fprintf(stderr, "DEBUG: %s IPP/%d.%d\n",
          ippOpString(request->request.op.operation_id),
@@ -2423,36 +2608,31 @@ new_request(
   * Add standard attributes...
   */
 
-  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
-              NULL, uri);
+  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
   fprintf(stderr, "DEBUG: printer-uri=\"%s\"\n", uri);
 
   if (user && *user)
   {
-    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
-                "requesting-user-name", NULL, user);
+    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, user);
     fprintf(stderr, "DEBUG: requesting-user-name=\"%s\"\n", user);
   }
 
   if (title && *title)
   {
-    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL,
-                title);
+    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, title);
     fprintf(stderr, "DEBUG: job-name=\"%s\"\n", title);
   }
 
   if (format && op != IPP_CREATE_JOB)
   {
-    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE,
-                "document-format", NULL, format);
+    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, format);
     fprintf(stderr, "DEBUG: document-format=\"%s\"\n", format);
   }
 
 #ifdef HAVE_LIBZ
-  if (compression && op != IPP_CREATE_JOB)
+  if (compression && op != IPP_OP_CREATE_JOB && op != IPP_OP_VALIDATE_JOB)
   {
-    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
-                "compression", NULL, compression);
+    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "compression", NULL, compression);
     fprintf(stderr, "DEBUG: compression=\"%s\"\n", compression);
   }
 #endif /* HAVE_LIBZ */
@@ -2465,198 +2645,13 @@ new_request(
   {
     if (pc)
     {
-      int      num_finishings = 0,     /* Number of finishing values */
-               finishings[10];         /* Finishing enum values */
-
      /*
       * Send standard IPP attributes...
       */
 
-      if ((keyword = cupsGetOption("PageSize", num_options, options)) == NULL)
-       keyword = cupsGetOption("media", num_options, options);
-
-      if ((size = _ppdCacheGetSize(pc, keyword)) != NULL)
-      {
-       /*
-        * Add a media-col value...
-       */
-
-       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);
-
-       media_col = ippNew();
-       ippAddCollection(media_col, IPP_TAG_ZERO, "media-size", media_size);
-
-       media_source = _ppdCacheGetSource(pc, cupsGetOption("InputSlot",
-                                                           num_options,
-                                                           options));
-       media_type   = _ppdCacheGetType(pc, cupsGetOption("MediaType",
-                                                         num_options,
-                                                         options));
-
-       for (i = 0; i < media_col_sup->num_values; i ++)
-       {
-         if (!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 (!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 (!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 (!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 (!strcmp(media_col_sup->values[i].string.text,
-                          "media-source") && media_source)
-           ippAddString(media_col, IPP_TAG_ZERO, IPP_TAG_KEYWORD,
-                        "media-source", NULL, media_source);
-         else if (!strcmp(media_col_sup->values[i].string.text,
-                          "media-type") && 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)
-       keyword = _ppdCacheGetBin(pc, cupsGetOption("OutputBin", num_options,
-                                                   options));
-
-      if (keyword)
-       ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-bin",
-                    NULL, keyword);
-
-      if ((keyword = cupsGetOption("output-mode", num_options,
-                                  options)) != NULL)
-       ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-mode",
-                    NULL, keyword);
-      else if ((keyword = cupsGetOption("ColorModel", num_options,
-                                       options)) != NULL)
-      {
-       if (!_cups_strcasecmp(keyword, "Gray"))
-         ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-mode",
-                              NULL, "monochrome");
-       else
-         ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-mode",
-                          NULL, "color");
-      }
-
-      if ((keyword = cupsGetOption("print-quality", num_options,
-                                  options)) != NULL)
-       ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality",
-                     atoi(keyword));
-      else if ((keyword = cupsGetOption("cupsPrintQuality", num_options,
-                                       options)) != NULL)
-      {
-       if (!_cups_strcasecmp(keyword, "draft"))
-         ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality",
-                       IPP_QUALITY_DRAFT);
-       else if (!_cups_strcasecmp(keyword, "normal"))
-         ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality",
-                       IPP_QUALITY_NORMAL);
-       else if (!_cups_strcasecmp(keyword, "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 &&
-               (keyword = cupsGetOption(pc->sides_option, num_options,
-                                       options)) != NULL)
-      {
-       if (!_cups_strcasecmp(keyword, pc->sides_1sided))
-         ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides",
-                      NULL, "one-sided");
-       else if (!_cups_strcasecmp(keyword, pc->sides_2sided_long))
-         ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides",
-                      NULL, "two-sided-long-edge");
-       if (!_cups_strcasecmp(keyword, pc->sides_2sided_short))
-         ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides",
-                      NULL, "two-sided-short-edge");
-      }
-
-      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;
-       }
-      }
+      fputs("DEBUG: Adding standard IPP operation/job attributes.\n", stderr);
 
-      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...
-      */
-
-      num_finishings = _ppdCacheGetFinishingValues(pc, num_options, options,
-                                                   (int)(sizeof(finishings) /
-                                                         sizeof(finishings[0])),
-                                                   finishings);
-      if (num_finishings > 0)
-       ippAddIntegers(request, IPP_TAG_JOB, IPP_TAG_ENUM, "finishings",
-                      num_finishings, finishings);
+      copies = _cupsConvertOptions(request, ppd, pc, media_col_sup, doc_handling_sup, print_color_mode_sup, user, format, copies, num_options, options);
 
      /*
       * Map FaxOut options...
@@ -2665,19 +2660,39 @@ new_request(
       if ((keyword = cupsGetOption("phone", num_options, options)) != NULL)
       {
        ipp_t   *destination;           /* destination collection */
-       char    tel_uri[1024];          /* tel: URI */
+       char    phone[1024],            /* Phone number string */
+               *ptr,                   /* Pointer into string */
+               tel_uri[1024];          /* tel: URI */
+        static const char * const allowed = "0123456789#*-+.()";
+                                       /* Allowed characters */
 
         destination = ippNew();
 
-        httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel",
-                        NULL, NULL, 0, keyword);
-        ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri",
-                     NULL, tel_uri);
+       /*
+        * Unescape and filter out spaces and other characters that are not
+        * allowed in a tel: URI.
+        */
+
+        _httpDecodeURI(phone, keyword, sizeof(phone));
+        for (ptr = phone; *ptr;)
+       {
+         if (!strchr(allowed, *ptr))
+           _cups_strcpy(ptr, ptr + 1);
+         else
+           ptr ++;
+        }
+
+        httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel", NULL, NULL, 0, phone);
+        ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri", NULL, tel_uri);
 
        if ((keyword = cupsGetOption("faxPrefix", num_options,
                                     options)) != NULL && *keyword)
-         ippAddString(destination, IPP_TAG_JOB, IPP_TAG_TEXT,
-                      "pre-dial-string", NULL, keyword);
+        {
+         char  predial[1024];          /* Pre-dial string */
+
+         _httpDecodeURI(predial, keyword, sizeof(predial));
+         ippAddString(destination, IPP_TAG_JOB, IPP_TAG_TEXT, "pre-dial-string", NULL, predial);
+       }
 
         ippAddCollection(request, IPP_TAG_JOB, "destination-uris", destination);
         ippDelete(destination);
@@ -2689,6 +2704,8 @@ new_request(
       * When talking to another CUPS server, send all options...
       */
 
+      fputs("DEBUG: Adding all operation/job attributes.\n", stderr);
+      cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION);
       cupsEncodeOptions2(request, num_options, options, IPP_TAG_JOB);
     }
 
@@ -2696,6 +2713,34 @@ new_request(
       ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "copies", copies);
   }
 
+  fprintf(stderr, "DEBUG: IPP/%d.%d %s #%d\n", version / 10, version % 10,
+          ippOpString(ippGetOperation(request)), ippGetRequestId(request));
+  for (group = IPP_TAG_ZERO, attr = ippFirstAttribute(request);
+       attr;
+       attr = ippNextAttribute(request))
+  {
+    const char *name = ippGetName(attr);
+
+    if (!name)
+    {
+      group = IPP_TAG_ZERO;
+      continue;
+    }
+
+    if (group != ippGetGroupTag(attr))
+    {
+      group = ippGetGroupTag(attr);
+      fprintf(stderr, "DEBUG: ---- %s ----\n", ippTagString(group));
+    }
+
+    ippAttributeString(attr, buffer, sizeof(buffer));
+    fprintf(stderr, "DEBUG: %s %s%s %s\n", name,
+            ippGetCount(attr) > 1 ? "1setOf " : "",
+            ippTagString(ippGetValueTag(attr)), buffer);
+  }
+
+  fprintf(stderr, "DEBUG: ---- %s ----\n", ippTagString(IPP_TAG_END));
+
   return (request);
 }
 
@@ -2711,6 +2756,9 @@ password_cb(const char *prompt,           /* I - Prompt (not used) */
             const char *resource,      /* I - Resource path (not used) */
             int        *password_tries)        /* I - Password tries */
 {
+  char def_username[HTTP_MAX_VALUE];   /* Default username */
+
+
   fprintf(stderr, "DEBUG: password_cb(prompt=\"%s\", http=%p, method=\"%s\", "
                   "resource=\"%s\", password_tries=%p(%d)), password=%p\n",
           prompt, http, method, resource, password_tries, *password_tries,
@@ -2720,16 +2768,31 @@ password_cb(const char *prompt,         /* I - Prompt (not used) */
   (void)method;
   (void)resource;
 
- /*
-  * Remember that we need to authenticate...
-  */
+  if (!uri_credentials)
+  {
+   /*
+    * Remember that we need to authenticate...
+    */
 
-  auth_info_required = "username,password";
+    auth_info_required = "username,password";
+
+    if (httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "username",
+                       def_username))
+    {
+      char     quoted[HTTP_MAX_VALUE * 2 + 4];
+                                         /* Quoted string */
+
+      fprintf(stderr, "ATTR: auth-info-default=%s,\n",
+             quote_string(def_username, quoted, sizeof(quoted)));
+    }
+  }
 
   if (password && *password && *password_tries < 3)
   {
     (*password_tries) ++;
 
+    cupsSetUser(username);
+
     return (password);
   }
   else
@@ -2744,6 +2807,56 @@ password_cb(const char *prompt,          /* I - Prompt (not used) */
 
 
 /*
+ * 'quote_string()' - Quote a string value.
+ */
+
+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);
+}
+
+
+/*
  * 'report_attr()' - Report an IPP attribute value.
  */
 
@@ -2752,8 +2865,7 @@ report_attr(ipp_attribute_t *attr)        /* I - Attribute */
 {
   int          i;                      /* Looping var */
   char         value[1024],            /* Value string */
-               *valptr,                /* Pointer into value string */
-               *attrptr;               /* Pointer into attribute value */
+               *valptr;                /* Pointer into value string */
   const char   *cached;                /* Cached attribute */
 
 
@@ -2772,31 +2884,15 @@ report_attr(ipp_attribute_t *attr)      /* I - Attribute */
     {
       case IPP_TAG_INTEGER :
       case IPP_TAG_ENUM :
-          snprintf(valptr, sizeof(value) - (valptr - value), "%d",
-                  attr->values[i].integer);
+          snprintf(valptr, sizeof(value) - (size_t)(valptr - value), "%d", attr->values[i].integer);
          valptr += strlen(valptr);
          break;
 
       case IPP_TAG_TEXT :
       case IPP_TAG_NAME :
       case IPP_TAG_KEYWORD :
-          *valptr++ = '\'';
-          *valptr++ = '\"';
-         for (attrptr = attr->values[i].string.text;
-              *attrptr && valptr < (value + sizeof(value) - 10);
-              attrptr ++)
-         {
-           if (*attrptr == '\\' || *attrptr == '\"' || *attrptr == '\'')
-           {
-             *valptr++ = '\\';
-             *valptr++ = '\\';
-             *valptr++ = '\\';
-           }
-
-           *valptr++ = *attrptr;
-         }
-          *valptr++ = '\"';
-          *valptr++ = '\'';
+          quote_string(attr->values[i].string.text, valptr, (size_t)(value + sizeof(value) - valptr));
+          valptr += strlen(valptr);
           break;
 
       default :
@@ -2837,6 +2933,7 @@ report_printer_state(ipp_t *ipp)  /* I - IPP response */
 {
   ipp_attribute_t      *pa,            /* printer-alert */
                        *pam,           /* printer-alert-message */
+                       *pmja,          /* printer-mandatory-job-attributes */
                        *psm,           /* printer-state-message */
                        *reasons,       /* printer-state-reasons */
                        *marker;        /* marker-* attributes */
@@ -2857,6 +2954,26 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
                               IPP_TAG_TEXT)) != NULL)
     report_attr(pam);
 
+  if ((pmja = ippFindAttribute(ipp, "printer-mandatory-job-attributes", IPP_TAG_KEYWORD)) != NULL)
+  {
+    int        i,                              /* Looping var */
+       count = ippGetCount(pmja);      /* Number of values */
+
+    for (i = 0, valptr = value; i < count; i ++, valptr += strlen(valptr))
+    {
+      if (i)
+        snprintf(valptr, sizeof(value) - (size_t)(valptr - value), " %s", ippGetString(pmja, i, NULL));
+      else
+        strlcpy(value, ippGetString(pmja, i, NULL), sizeof(value));
+    }
+
+    if (strcmp(value, mandatory_attrs))
+    {
+      strlcpy(mandatory_attrs, value, sizeof(mandatory_attrs));
+      fprintf(stderr, "PPD: cupsMandatory=\"%s\"\n", value);
+    }
+  }
+
   if ((psm = ippFindAttribute(ipp, "printer-state-message",
                               IPP_TAG_TEXT)) != NULL)
   {
@@ -3046,12 +3163,12 @@ run_as_user(char       *argv[],         /* I - Command-line arguments */
 
   if (response)
   {
-    child_pid = xpc_dictionary_get_int64(response, "child-pid");
+    child_pid = (pid_t)xpc_dictionary_get_int64(response, "child-pid");
 
     xpc_release(response);
 
     if (child_pid)
-      fprintf(stderr, "DEBUG: Child PID=%d.\n", child_pid);
+      fprintf(stderr, "DEBUG: Child PID=%d.\n", (int)child_pid);
     else
     {
       _cupsLangPrintFilter(stderr, "ERROR",
@@ -3097,7 +3214,7 @@ run_as_user(char       *argv[],           /* I - Command-line arguments */
 
   if (response)
   {
-    status = xpc_dictionary_get_int64(response, "status");
+    status = (int)xpc_dictionary_get_int64(response, "status");
 
     if (status == SIGTERM || status == SIGKILL || status == SIGPIPE)
     {
@@ -3125,7 +3242,6 @@ run_as_user(char       *argv[],           /* I - Command-line arguments */
 
   if (conn)
   {
-    xpc_connection_suspend(conn);
     xpc_connection_cancel(conn);
     xpc_release(conn);
   }
@@ -3160,7 +3276,7 @@ sigterm_handler(int sig)          /* I - Signal */
     * Flag that the job should be canceled...
     */
 
-    write(2, "DEBUG: job_canceled = 1.\n", 25);
+    write(2, "DEBUG: sigterm_handler: job_canceled = 1.\n", 25);
 
     job_canceled = 1;
     return;
@@ -3247,7 +3363,7 @@ update_reasons(ipp_attribute_t *attr,     /* I - printer-state-reasons or NULL */
     else
       op = '\0';
 
-    new_reasons = _cupsArrayNewStrings(s);
+    new_reasons = _cupsArrayNewStrings(s, ',');
   }
   else
     return;
@@ -3297,8 +3413,7 @@ update_reasons(ipp_attribute_t *attr,     /* I - printer-state-reasons or NULL */
               temp = (char *)cupsArrayNext(state_reasons))
            if (!strncmp(temp, "cups-remote-", 12))
            {
-             snprintf(remptr, sizeof(rem) - (remptr - rem), "%s%s", remprefix,
-                      temp);
+             snprintf(remptr, sizeof(rem) - (size_t)(remptr - rem), "%s%s", remprefix, temp);
              remptr    += strlen(remptr);
              remprefix = ",";
 
@@ -3311,8 +3426,7 @@ update_reasons(ipp_attribute_t *attr,     /* I - printer-state-reasons or NULL */
 
         cupsArrayAdd(state_reasons, reason);
 
-        snprintf(addptr, sizeof(add) - (addptr - add), "%s%s", addprefix,
-                reason);
+        snprintf(addptr, sizeof(add) - (size_t)(addptr - add), "%s%s", addprefix, reason);
        addptr    += strlen(addptr);
        addprefix = ",";
       }
@@ -3330,8 +3444,7 @@ update_reasons(ipp_attribute_t *attr,     /* I - printer-state-reasons or NULL */
     {
       if (cupsArrayFind(state_reasons, reason))
       {
-       snprintf(remptr, sizeof(rem) - (remptr - rem), "%s%s", remprefix,
-                reason);
+       snprintf(remptr, sizeof(rem) - (size_t)(remptr - rem), "%s%s", remprefix, reason);
        remptr    += strlen(remptr);
        remprefix = ",";
 
@@ -3351,8 +3464,7 @@ update_reasons(ipp_attribute_t *attr,     /* I - printer-state-reasons or NULL */
     {
       if (strncmp(reason, "cups-", 5) && !cupsArrayFind(new_reasons, reason))
       {
-       snprintf(remptr, sizeof(rem) - (remptr - rem), "%s%s", remprefix,
-                reason);
+       snprintf(remptr, sizeof(rem) - (size_t)(remptr - rem), "%s%s", remprefix, reason);
        remptr    += strlen(remptr);
        remprefix = ",";
 
@@ -3368,8 +3480,7 @@ update_reasons(ipp_attribute_t *attr,     /* I - printer-state-reasons or NULL */
       {
         cupsArrayAdd(state_reasons, reason);
 
-        snprintf(addptr, sizeof(add) - (addptr - add), "%s%s", addprefix,
-                reason);
+        snprintf(addptr, sizeof(add) - (size_t)(addptr - add), "%s%s", addprefix, reason);
        addptr    += strlen(addptr);
        addprefix = ",";
       }
@@ -3391,5 +3502,5 @@ update_reasons(ipp_attribute_t *attr,     /* I - printer-state-reasons or NULL */
 }
 
 /*
- * End of "$Id: ipp.c 11221 2013-08-06 16:16:01Z msweet $".
+ * End of "$Id: ipp.c 12896 2015-10-09 13:15:22Z msweet $".
  */
index 8436f99..33e8408 100644 (file)
@@ -1,27 +1,18 @@
 /*
- * "$Id: lpd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpd.c 12024 2014-07-15 12:58:39Z msweet $"
  *
- *   Line Printer Daemon backend for CUPS.
+ * Line Printer Daemon backend for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2013 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()            - Send a file to the printer or server.
- *   lpd_command()     - Send an LPR command sequence and wait for a reply.
- *   lpd_queue()       - Queue a file using the Line Printer Daemon protocol.
- *   lpd_write()       - Write a buffer of data to an LPD server.
- *   rresvport_af()    - A simple implementation of rresvport_af().
- *   sigterm_handler() - Handle 'terminate' signals that stop the backend.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -93,7 +84,7 @@ static int    lpd_queue(const char *hostname, http_addrlist_t *addrlist,
                          int copies, int banner, int format, int order,
                          int reserve, int manual_copies, int timeout,
                          int contimeout, const char *orighost);
-static int     lpd_write(int lpd_fd, char *buffer, int length);
+static ssize_t lpd_write(int lpd_fd, char *buffer, size_t length);
 #ifndef HAVE_RRESVPORT_AF
 static int     rresvport_af(int *port, int family);
 #endif /* !HAVE_RRESVPORT_AF */
@@ -393,8 +384,8 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
          */
 
          snmp_enabled = !value[0] || !_cups_strcasecmp(value, "on") ||
-                        _cups_strcasecmp(value, "yes") ||
-                        _cups_strcasecmp(value, "true");
+                        !_cups_strcasecmp(value, "yes") ||
+                        !_cups_strcasecmp(value, "true");
       }
       else if (!_cups_strcasecmp(name, "timeout"))
       {
@@ -481,7 +472,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
     _cupsLangPrintFilter(stderr, "INFO", _("Copying print data."));
 
     if (bytes > 0)
-      write(fd, buffer, bytes);
+      write(fd, buffer, (size_t)bytes);
 
     backendRunLoop(-1, fd, snmp_fd, &(addrlist->addr), 0, 0,
                   backendNetworkSideCB);
@@ -592,7 +583,7 @@ lpd_command(int  fd,                /* I - Socket connection to LPD host */
 {
   va_list      ap;             /* Argument pointer */
   char         buf[1024];      /* Output buffer */
-  int          bytes;          /* Number of bytes to output */
+  ssize_t      bytes;          /* Number of bytes to output */
   char         status;         /* Status from command */
 
 
@@ -617,9 +608,9 @@ lpd_command(int  fd,                /* I - Socket connection to LPD host */
   * Send the command...
   */
 
-  fprintf(stderr, "DEBUG: Sending command string (%d bytes)...\n", bytes);
+  fprintf(stderr, "DEBUG: Sending command string (" CUPS_LLFMT " bytes)...\n", CUPS_LLCAST bytes);
 
-  if (lpd_write(fd, buf, bytes) < bytes)
+  if (lpd_write(fd, buf, (size_t)bytes) < bytes)
   {
     perror("DEBUG: Unable to send LPD command");
     return (-1);
@@ -634,7 +625,7 @@ lpd_command(int  fd,                /* I - Socket connection to LPD host */
   if (recv(fd, &status, 1, 0) < 1)
   {
     _cupsLangPrintFilter(stderr, "WARNING", _("The printer did not respond."));
-    status = errno;
+    status = (char)errno;
   }
 
   fprintf(stderr, "DEBUG: lpd_command returning %d\n", status);
@@ -680,7 +671,7 @@ lpd_queue(const char      *hostname,        /* I - Host to connect to */
   int                  have_supplies;  /* Printer supports supply levels? */
   int                  copy;           /* Copies written */
   time_t               start_time;     /* Time of first connect */
-  size_t               nbytes;         /* Number of bytes written */
+  ssize_t              nbytes;         /* Number of bytes written */
   off_t                        tbytes;         /* Total bytes written */
   char                 buffer[32768];  /* Output buffer */
 #ifdef WIN32
@@ -707,7 +698,7 @@ lpd_queue(const char      *hostname,        /* I - Host to connect to */
     */
 
     fprintf(stderr, "DEBUG: Connecting to %s:%d for printer %s\n", hostname,
-            _httpAddrPort(&(addrlist->addr)), printer);
+            httpAddrPort(&(addrlist->addr)), printer);
     _cupsLangPrintFilter(stderr, "INFO", _("Connecting to printer."));
 
     for (lport = reserve == RESERVE_RFC1179 ? 732 : 1024, addr = addrlist,
@@ -782,7 +773,7 @@ lpd_queue(const char      *hostname,        /* I - Host to connect to */
        return (CUPS_BACKEND_FAILED);
       }
 
-      if (!connect(fd, &(addr->addr.addr), httpAddrLength(&(addr->addr))))
+      if (!connect(fd, &(addr->addr.addr), (socklen_t)httpAddrLength(&(addr->addr))))
        break;
 
       error = errno;
@@ -846,7 +837,7 @@ lpd_queue(const char      *hostname,        /* I - Host to connect to */
              break;
         }
 
-       sleep(delay);
+       sleep((unsigned)delay);
 
        if (delay < 30)
          delay += 5;
@@ -889,7 +880,7 @@ lpd_queue(const char      *hostname,        /* I - Host to connect to */
 
     fprintf(stderr, "DEBUG: Connected to %s:%d (local port %d)...\n",
            httpAddrString(&(addr->addr), addrname, sizeof(addrname)),
-           _httpAddrPort(&(addr->addr)), lport);
+           httpAddrPort(&(addr->addr)), lport);
 
    /*
     * See if the printer supports SNMP...
@@ -967,7 +958,7 @@ lpd_queue(const char      *hostname,        /* I - Host to connect to */
 
     if (banner)
     {
-      snprintf(cptr, sizeof(control) - (cptr - control),
+      snprintf(cptr, sizeof(control) - (size_t)(cptr - control),
                "C%.31s\n"      /* RFC 1179, Section 7.2 - class name <= 31 chars */
               "L%s\n",
                localhost, user);
@@ -976,13 +967,13 @@ lpd_queue(const char      *hostname,      /* I - Host to connect to */
 
     while (copies > 0)
     {
-      snprintf(cptr, sizeof(control) - (cptr - control), "%cdfA%03d%.15s\n",
+      snprintf(cptr, sizeof(control) - (size_t)(cptr - control), "%cdfA%03d%.15s\n",
                format, (int)getpid() % 1000, localhost);
       cptr   += strlen(cptr);
       copies --;
     }
 
-    snprintf(cptr, sizeof(control) - (cptr - control),
+    snprintf(cptr, sizeof(control) - (size_t)(cptr - control),
              "UdfA%03d%.15s\n"
             "N%.131s\n",       /* RFC 1179, Section 7.2 - sourcefile name <= 131 chars */
              (int)getpid() % 1000, localhost, title);
@@ -1012,9 +1003,9 @@ lpd_queue(const char      *hostname,      /* I - Host to connect to */
       fprintf(stderr, "DEBUG: Sending control file (%u bytes)\n",
              (unsigned)strlen(control));
 
-      if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
+      if ((size_t)lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
       {
-       status = errno;
+       status = (char)errno;
        perror("DEBUG: Unable to write control file");
 
       }
@@ -1024,7 +1015,7 @@ lpd_queue(const char      *hostname,      /* I - Host to connect to */
        {
          _cupsLangPrintFilter(stderr, "WARNING",
                               _("The printer did not respond."));
-         status = errno;
+         status = (char)errno;
        }
       }
 
@@ -1074,7 +1065,7 @@ lpd_queue(const char      *hostname,      /* I - Host to connect to */
                               _("Spooling job, %.0f%% complete."),
                               100.0 * tbytes / filestats.st_size);
 
-         if (lpd_write(fd, buffer, nbytes) < nbytes)
+         if (lpd_write(fd, buffer, (size_t)nbytes) < nbytes)
          {
            perror("DEBUG: Unable to send print file to printer");
             break;
@@ -1087,11 +1078,11 @@ lpd_queue(const char      *hostname,    /* I - Host to connect to */
       if (mode == MODE_STANDARD)
       {
        if (tbytes < filestats.st_size)
-         status = errno;
+         status = (char)errno;
        else if (lpd_write(fd, "", 1) < 1)
        {
          perror("DEBUG: Unable to send trailing nul to printer");
-         status = errno;
+         status = (char)errno;
        }
        else
        {
@@ -1145,9 +1136,9 @@ lpd_queue(const char      *hostname,      /* I - Host to connect to */
       fprintf(stderr, "DEBUG: Sending control file (%lu bytes)\n",
              (unsigned long)strlen(control));
 
-      if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
+      if ((size_t)lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
       {
-       status = errno;
+       status = (char)errno;
        perror("DEBUG: Unable to write control file");
       }
       else
@@ -1156,7 +1147,7 @@ lpd_queue(const char      *hostname,      /* I - Host to connect to */
        {
          _cupsLangPrintFilter(stderr, "WARNING",
                               _("The printer did not respond."));
-         status = errno;
+         status = (char)errno;
        }
       }
 
@@ -1169,6 +1160,8 @@ lpd_queue(const char      *hostname,      /* I - Host to connect to */
                             _("Control file sent successfully."));
     }
 
+    fputs("STATE: +cups-waiting-for-job-completed\n", stderr);
+
    /*
     * Collect the final supply levels as needed...
     */
@@ -1204,32 +1197,32 @@ lpd_queue(const char      *hostname,    /* I - Host to connect to */
  * 'lpd_write()' - Write a buffer of data to an LPD server.
  */
 
-static int                             /* O - Number of bytes written or -1 on error */
-lpd_write(int  lpd_fd,                 /* I - LPD socket */
-          char *buffer,                        /* I - Buffer to write */
-         int  length)                  /* I - Number of bytes to write */
+static ssize_t                         /* O - Number of bytes written or -1 on error */
+lpd_write(int     lpd_fd,              /* I - LPD socket */
+          char    *buffer,             /* I - Buffer to write */
+         size_t  length)               /* I - Number of bytes to write */
 {
-  int  bytes,                          /* Number of bytes written */
-       total;                          /* Total number of bytes written */
+  ssize_t      bytes,                  /* Number of bytes written */
+               total;                  /* Total number of bytes written */
 
 
   if (abort_job)
     return (-1);
 
   total = 0;
-  while ((bytes = send(lpd_fd, buffer, length - total, 0)) >= 0)
+  while ((bytes = send(lpd_fd, buffer, length - (size_t)total, 0)) >= 0)
   {
     total  += bytes;
     buffer += bytes;
 
-    if (total == length)
+    if ((size_t)total == length)
       break;
   }
 
   if (bytes < 0)
     return (-1);
   else
-    return (length);
+    return (total);
 }
 
 
@@ -1276,7 +1269,7 @@ rresvport_af(int *port,                   /* IO - Port number to bind to */
     * Try binding the port to the socket; return if all is OK...
     */
 
-    if (!bind(fd, (struct sockaddr *)&addr, sizeof(addr)))
+    if (!bind(fd, (struct sockaddr *)&addr, httpAddrLength(&addr)))
       return (fd);
 
    /*
@@ -1285,11 +1278,7 @@ rresvport_af(int *port,                  /* IO - Port number to bind to */
 
     if (errno != EADDRINUSE)
     {
-#  ifdef WIN32
-      closesocket(fd);
-#  else
-      close(fd);
-#  endif /* WIN32 */
+      httpAddrClose(NULL, fd);
 
       return (-1);
     }
@@ -1331,5 +1320,5 @@ sigterm_handler(int sig)          /* I - Signal */
 
 
 /*
- * End of "$Id: lpd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpd.c 12024 2014-07-15 12:58:39Z msweet $".
  */
index e66f49b..2cf5f72 100644 (file)
@@ -1,23 +1,18 @@
 /*
- * "$Id: network.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: network.c 12124 2014-08-28 15:37:22Z msweet $"
  *
- *   Common backend network APIs for CUPS.
+ * Common backend network APIs for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   backendCheckSideChannel() - Check the side-channel for pending requests.
- *   backendNetworkSideCB()    - Handle common network side-channel commands.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
 
 #include "backend-private.h"
 #include <limits.h>
-#ifdef __hpux
-#  include <sys/time.h>
-#else
-#  include <sys/select.h>
-#endif /* __hpux */
+#include <sys/select.h>
 
 
 /*
@@ -100,7 +91,7 @@ backendNetworkSideCB(
 
     case CUPS_SC_CMD_GET_BIDI :
        status  = CUPS_SC_STATUS_OK;
-        data[0] = use_bc;
+        data[0] = (char)use_bc;
         datalen = 1;
         break;
 
@@ -139,13 +130,13 @@ backendNetworkSideCB(
            for (dataptr = data + strlen(data) + 1;
                 count > 0 && dataptr < (data + sizeof(data) - 1);
                 count --, dataptr += strlen(dataptr))
-             strlcpy(dataptr, snmp_value, sizeof(data) - (dataptr - data));
+             strlcpy(dataptr, snmp_value, sizeof(data) - (size_t)(dataptr - data));
 
            fprintf(stderr, "DEBUG: Returning %s %s\n", data,
                    data + strlen(data) + 1);
 
            status  = CUPS_SC_STATUS_OK;
-           datalen = dataptr - data;
+           datalen = (int)(dataptr - data);
            break;
           }
 
@@ -168,7 +159,7 @@ backendNetworkSideCB(
           {
            if (_cupsSNMPRead(snmp_fd, &packet, 1.0))
            {
-             int       i;              /* Looping var */
+             size_t    i;              /* Looping var */
 
 
               if (!_cupsSNMPOIDToString(packet.object_name, data, sizeof(data)))
@@ -183,35 +174,31 @@ backendNetworkSideCB(
              switch (packet.object_type)
              {
                case CUPS_ASN1_BOOLEAN :
-                   snprintf(dataptr, sizeof(data) - (dataptr - data), "%d",
-                            packet.object_value.boolean);
+                   snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%d", packet.object_value.boolean);
                    datalen += (int)strlen(dataptr);
                    break;
 
                case CUPS_ASN1_INTEGER :
-                   snprintf(dataptr, sizeof(data) - (dataptr - data), "%d",
+                   snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%d",
                             packet.object_value.integer);
                    datalen += (int)strlen(dataptr);
                    break;
 
                case CUPS_ASN1_BIT_STRING :
                case CUPS_ASN1_OCTET_STRING :
-                   if (packet.object_value.string.num_bytes < 0)
-                     i = 0;
-                   else if (packet.object_value.string.num_bytes <
-                            (sizeof(data) - (dataptr - data)))
+                   if (packet.object_value.string.num_bytes < (sizeof(data) - (size_t)(dataptr - data)))
                      i = packet.object_value.string.num_bytes;
                    else
-                     i = (int)(sizeof(data) - (dataptr - data));
+                     i = sizeof(data) - (size_t)(dataptr - data);
 
                    memcpy(dataptr, packet.object_value.string.bytes, i);
 
-                    datalen += i;
+                    datalen += (int)i;
                    break;
 
                case CUPS_ASN1_OID :
                    _cupsSNMPOIDToString(packet.object_value.oid, dataptr,
-                                        sizeof(data) - (dataptr - data));
+                                        sizeof(data) - (size_t)(dataptr - data));
                    datalen += (int)strlen(dataptr);
                    break;
 
@@ -220,32 +207,27 @@ backendNetworkSideCB(
                         i < packet.object_value.string.num_bytes &&
                             dataptr < (data + sizeof(data) - 3);
                         i ++, dataptr += 2)
-                     sprintf(dataptr, "%02X",
-                             packet.object_value.string.bytes[i]);
+                     sprintf(dataptr, "%02X", packet.object_value.string.bytes[i]);
                    datalen += (int)strlen(dataptr);
                    break;
 
                 case CUPS_ASN1_COUNTER :
-                   snprintf(dataptr, sizeof(data) - (dataptr - data), "%d",
-                            packet.object_value.counter);
+                   snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%u", packet.object_value.counter);
                    datalen += (int)strlen(dataptr);
                    break;
 
                 case CUPS_ASN1_GAUGE :
-                   snprintf(dataptr, sizeof(data) - (dataptr - data), "%u",
-                            packet.object_value.gauge);
+                   snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%u", packet.object_value.gauge);
                    datalen += (int)strlen(dataptr);
                    break;
 
                 case CUPS_ASN1_TIMETICKS :
-                   snprintf(dataptr, sizeof(data) - (dataptr - data), "%u",
-                            packet.object_value.timeticks);
+                   snprintf(dataptr, sizeof(data) - (size_t)(dataptr - data), "%u", packet.object_value.timeticks);
                    datalen += (int)strlen(dataptr);
                    break;
 
                 default :
-                   fprintf(stderr, "DEBUG: Unknown OID value type %02X!\n",
-                           packet.object_type);
+                   fprintf(stderr, "DEBUG: Unknown OID value type %02X.\n", packet.object_type);
 
                case CUPS_ASN1_NULL_VALUE :
                    dataptr[0] = '\0';
@@ -268,6 +250,12 @@ backendNetworkSideCB(
        datalen = 0;
        break;
 
+    case CUPS_SC_CMD_GET_CONNECTED :
+       status  = CUPS_SC_STATUS_OK;
+        data[0] = device_fd != -1;
+        datalen = 1;
+        break;
+
     case CUPS_SC_CMD_GET_DEVICE_ID :
         if (snmp_fd >= 0)
        {
@@ -305,12 +293,6 @@ backendNetworkSideCB(
          break;
        }
 
-    case CUPS_SC_CMD_GET_CONNECTED :
-       status  = CUPS_SC_STATUS_OK;
-        data[0] = device_fd != -1;
-        datalen = 1;
-        break;
-
     default :
         status  = CUPS_SC_STATUS_NOT_IMPLEMENTED;
        datalen = 0;
@@ -322,5 +304,5 @@ backendNetworkSideCB(
 
 
 /*
- * End of "$Id: network.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: network.c 12124 2014-08-28 15:37:22Z msweet $".
  */
index 567d715..3eb98f6 100644 (file)
@@ -5,6 +5,7 @@
 # product ID (omit for all vendor products), and a list of known issues:
 #
 #   blacklist     The printer is not functional with the USB backend.
+#   delay-close   Delay close/reset of selected interface
 #   no-reattach   Do no re-attach usblp kernel module after printing.
 #   soft-reset    Do a soft reset after printing for cleanup.
 #   unidir        Only supported unidirectional I/O
@@ -84,6 +85,9 @@
 # Canon, Inc. MF4150 Printer, https://bugs.launchpad.net/bugs/1160638
 0x04a9 0x26a3 no-reattach
 
+# Brother Industries, Ltd HL-1250 Laser Printer, https://bugs.debian.org/712512
+0x04f9 0x0007 no-reattach
+
 # Brother Industries, Ltd HL-1430 Laser Printer, https://bugs.launchpad.net/bugs/1038695
 0x04f9 0x001a no-reattach
 
 
 # Lexmark E238 (<rdar://problem/14493054>)
 0x043d 0x00d7 no-reattach
+
+# Lexmark E238 (STR #4448)
+0x043d 0x009a no-reattach
+
+# Canon MX310 (STR #4482)
+0x04a9 0x1728 unidir
+
+# Canon MX320 (STR #4482)
+0x04A9 0x1736 unidir
+
+# All Intermec devices (STR #4553)
+0x067e no-reattach
+
+# HP LaserJet 1150 (STR #4549)
+0x03f0 0x0f17 delay-close
+
+# HP LaserJet 1300 (STR #4549)
+0x03f0 0x1017 delay-close
+0x03f0 0x1117 delay-close
+
+# HP LaserJet 1320 (STR #4549)
+0x03f0 0x1d17 delay-close
+
+# Canon, Inc. MP530 Printer
+0x04a9 0x1712 unidir
index 5a81a61..48b458a 100644 (file)
@@ -1,25 +1,18 @@
 /*
- * "$Id: runloop.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: runloop.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Common run loop APIs for CUPS backends.
+ * Common run loop APIs for CUPS backends.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   backendDrainOutput() - Drain pending print data to the device.
- *   backendRunLoop()     - Read and write print and back-channel data.
- *   backendWaitLoop()    - Wait for input from stdin while handling
- *                          side-channel queries.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
 
 #include "backend-private.h"
 #include <limits.h>
-#ifdef __hpux
-#  include <sys/time.h>
-#else
-#  include <sys/select.h>
-#endif /* __hpux */
+#include <sys/select.h>
 
 
 /*
@@ -113,7 +102,7 @@ backendDrainOutput(int print_fd,    /* I - Print file descriptor */
 
     for (print_ptr = print_buffer; print_bytes > 0;)
     {
-      if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0)
+      if ((bytes = write(device_fd, print_ptr, (size_t)print_bytes)) < 0)
       {
        /*
         * Write error - bail if we don't see an error we can retry...
@@ -293,7 +282,7 @@ backendRunLoop(
        fprintf(stderr,
                "DEBUG: Received " CUPS_LLFMT " bytes of back-channel data\n",
                CUPS_LLCAST bc_bytes);
-        cupsBackChannelWrite(bc_buffer, bc_bytes, 1.0);
+        cupsBackChannelWrite(bc_buffer, (size_t)bc_bytes, 1.0);
       }
       else if (bc_bytes < 0 && errno != EAGAIN && errno != EINTR)
       {
@@ -350,7 +339,7 @@ backendRunLoop(
 
     if (print_bytes && FD_ISSET(device_fd, &output))
     {
-      if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0)
+      if ((bytes = write(device_fd, print_ptr, (size_t)print_bytes)) < 0)
       {
        /*
         * Write error - bail if we don't see an error we can retry...
@@ -539,5 +528,5 @@ backendWaitLoop(
 
 
 /*
- * End of "$Id: runloop.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: runloop.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 41d4d75..38ef28e 100644 (file)
@@ -1,24 +1,17 @@
 /*
- * "$Id: snmp-supplies.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: snmp-supplies.c 12227 2014-10-21 13:42:04Z msweet $"
  *
- *   SNMP supplies functions for CUPS.
+ * SNMP supplies functions for CUPS.
  *
- *   Copyright 2008-2013 by Apple Inc.
+ * Copyright 2008-2014 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   backendSNMPSupplies()   - Get the current supplies for a device.
- *   backend_init_supplies() - Initialize the supplies list.
- *   backend_walk_cb()       - Interpret the supply value responses.
- *   utf16_to_utf8()         - Convert UTF-16 text to UTF-8.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -62,6 +55,7 @@ typedef struct                                /**** Printer supply data ****/
   char name[CUPS_SNMP_MAX_STRING],     /* Name of supply */
        color[8];                       /* Color: "#RRGGBB" or "none" */
   int  colorant,                       /* Colorant index */
+       sclass,                         /* Supply class */
        type,                           /* Supply type */
        max_capacity,                   /* Maximum capacity */
        level;                          /* Current level value */
@@ -148,6 +142,13 @@ static const int   prtMarkerSuppliesMaxCapacity[] =
                        (sizeof(prtMarkerSuppliesMaxCapacity) /
                         sizeof(prtMarkerSuppliesMaxCapacity[0]));
                                        /* Offset to supply index */
+static const int       prtMarkerSuppliesClass[] =
+                       { CUPS_OID_prtMarkerSuppliesClass, -1 },
+                                       /* Class OID */
+                       prtMarkerSuppliesClassOffset =
+                       (sizeof(prtMarkerSuppliesClass) /
+                        sizeof(prtMarkerSuppliesClass[0]));
+                                       /* Offset to supply index */
 static const int       prtMarkerSuppliesType[] =
                        { CUPS_OID_prtMarkerSuppliesType, -1 },
                                        /* Type OID */
@@ -257,6 +258,9 @@ backendSNMPSupplies(
       else
         percent = 50;
 
+      if (supplies[i].sclass == CUPS_TC_receptacleThatIsFilled)
+        percent = 100 - percent;
+
       if (percent <= 5)
       {
         switch (supplies[i].type)
@@ -293,6 +297,7 @@ backendSNMPSupplies(
               else
                 new_supply_state |= CUPS_OPC_NEAR_EOL;
               break;
+#if 0 /* Because no two vendors report waste containers the same, disable SNMP reporting of same */
           case CUPS_TC_wasteInk :
           case CUPS_TC_wastePaper :
           case CUPS_TC_wasteToner :
@@ -303,6 +308,7 @@ backendSNMPSupplies(
               else
                 new_supply_state |= CUPS_WASTE_ALMOST_FULL;
               break;
+#endif /* 0 */
           case CUPS_TC_cleanerUnit :
           case CUPS_TC_fuserCleaningPad :
               if (percent <= 1)
@@ -318,9 +324,9 @@ backendSNMPSupplies(
 
       if ((supplies[i].max_capacity > 0 || (quirks & CUPS_SNMP_CAPACITY)) &&
           supplies[i].level >= 0)
-        sprintf(ptr, "%d", percent);
+        snprintf(ptr, sizeof(value) - (size_t)(ptr - value), "%d", percent);
       else
-        strcpy(ptr, "-1");
+        strlcpy(ptr, "-1", sizeof(value) - (size_t)(ptr - value));
     }
 
     fprintf(stderr, "ATTR: marker-levels=%s\n", value);
@@ -458,34 +464,34 @@ backend_init_supplies(
                  "other",
                  "unknown",
                  "toner",
-                 "wasteToner",
+                 "waste-toner",
                  "ink",
-                 "inkCartridge",
-                 "inkRibbon",
-                 "wasteInk",
+                 "ink-cartridge",
+                 "ink-ribbon",
+                 "waste-ink",
                  "opc",
                  "developer",
-                 "fuserOil",
-                 "solidWax",
-                 "ribbonWax",
-                 "wasteWax",
+                 "fuser-oil",
+                 "solid-wax",
+                 "ribbon-wax",
+                 "waste-wax",
                  "fuser",
-                 "coronaWire",
-                 "fuserOilWick",
-                 "cleanerUnit",
-                 "fuserCleaningPad",
-                 "transferUnit",
-                 "tonerCartridge",
-                 "fuserOiler",
+                 "corona-wire",
+                 "fuser-oil-wick",
+                 "cleaner-unit",
+                 "fuser-cleaning-pad",
+                 "transfer-unit",
+                 "toner-cartridge",
+                 "fuser-oiler",
                  "water",
-                 "wasteWater",
-                 "glueWaterAdditive",
-                 "wastePaper",
-                 "bindingSupply",
-                 "bandingSupply",
-                 "stitchingWire",
-                 "shrinkWrap",
-                 "paperWrap",
+                 "waste-water",
+                 "glue-water-additive",
+                 "waste-paper",
+                 "binding-supply",
+                 "banding-supply",
+                 "stitching-wire",
+                 "shrink-wrap",
+                 "paper-wrap",
                  "staples",
                  "inserts",
                  "covers"
@@ -561,20 +567,20 @@ backend_init_supplies(
    /*
     * Yes, read the cache file:
     *
-    *     2 num_supplies charset
+    *     3 num_supplies charset
     *     device description
     *     supply structures...
     */
 
     if (cupsFileGets(cachefile, value, sizeof(value)))
     {
-      if (sscanf(value, "2 %d%d", &num_supplies, &charset) == 2 &&
+      if (sscanf(value, "3 %d%d", &num_supplies, &charset) == 2 &&
           num_supplies <= CUPS_MAX_SUPPLIES &&
           cupsFileGets(cachefile, value, sizeof(value)))
       {
         if (!strcmp(description, value))
          cupsFileRead(cachefile, (char *)supplies,
-                      num_supplies * sizeof(backend_supplies_t));
+                      (size_t)num_supplies * sizeof(backend_supplies_t));
         else
        {
          num_supplies = -1;
@@ -664,12 +670,12 @@ backend_init_supplies(
 
   if ((cachefile = cupsFileOpen(cachefilename, "w")) != NULL)
   {
-    cupsFilePrintf(cachefile, "2 %d %d\n", num_supplies, charset);
+    cupsFilePrintf(cachefile, "3 %d %d\n", num_supplies, charset);
     cupsFilePrintf(cachefile, "%s\n", description);
 
     if (num_supplies > 0)
       cupsFileWrite(cachefile, (char *)supplies,
-                    num_supplies * sizeof(backend_supplies_t));
+                    (size_t)num_supplies * sizeof(backend_supplies_t));
 
     cupsFileClose(cachefile);
   }
@@ -682,7 +688,7 @@ backend_init_supplies(
   */
 
   for (i = 0; i < num_supplies; i ++)
-    strcpy(supplies[i].color, "none");
+    strlcpy(supplies[i].color, "none", sizeof(supplies[i].color));
 
   _cupsSNMPWalk(snmp_fd, &current_addr, CUPS_SNMP_VERSION_1,
                 _cupsSNMPDefaultCommunity(), prtMarkerColorantValue,
@@ -697,7 +703,7 @@ backend_init_supplies(
     if (i)
       *ptr++ = ',';
 
-    strcpy(ptr, supplies[i].color);
+    strlcpy(ptr, supplies[i].color, sizeof(value) - (size_t)(ptr - value));
   }
 
   fprintf(stderr, "ATTR: marker-colors=%s\n", value);
@@ -745,9 +751,9 @@ backend_init_supplies(
     type = supplies[i].type;
 
     if (type < CUPS_TC_other || type > CUPS_TC_covers)
-      strcpy(ptr, "unknown");
+      strlcpy(ptr, "unknown", sizeof(value) - (size_t)(ptr - value));
     else
-      strcpy(ptr, types[type - CUPS_TC_other]);
+      strlcpy(ptr, types[type - CUPS_TC_other], sizeof(value) - (size_t)(ptr - value));
   }
 
   fprintf(stderr, "ATTR: marker-types=%s\n", value);
@@ -814,7 +820,7 @@ backend_walk_cb(cups_snmp_t *packet,        /* I - SNMP packet */
          if (!_cups_strcasecmp(colors[k][0],
                                (char *)packet->object_value.string.bytes))
          {
-           strcpy(supplies[j].color, colors[k][1]);
+           strlcpy(supplies[j].color, colors[k][1], sizeof(supplies[j].color));
            break;
          }
       }
@@ -969,6 +975,25 @@ backend_walk_cb(cups_snmp_t *packet,       /* I - SNMP packet */
         packet->object_value.integer > 0)
       supplies[i - 1].max_capacity = packet->object_value.integer;
   }
+  else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesClass))
+  {
+   /*
+    * Get marker class...
+    */
+
+    i = packet->object_name[prtMarkerSuppliesClassOffset];
+    if (i < 1 || i > CUPS_MAX_SUPPLIES ||
+        packet->object_type != CUPS_ASN1_INTEGER)
+      return;
+
+    fprintf(stderr, "DEBUG2: prtMarkerSuppliesClass.1.%d = %d\n", i,
+            packet->object_value.integer);
+
+    if (i > num_supplies)
+      num_supplies = i;
+
+    supplies[i - 1].sclass = packet->object_value.integer;
+  }
   else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesType))
   {
    /*
@@ -1032,9 +1057,9 @@ utf16_to_utf8(
   for (ptr = temp; srcsize >= 2;)
   {
     if (le)
-      ch = src[0] | (src[1] << 8);
+      ch = (cups_utf32_t)(src[0] | (src[1] << 8));
     else
-      ch = (src[0] << 8) | src[1];
+      ch = (cups_utf32_t)((src[0] << 8) | src[1]);
 
     src += 2;
     srcsize -= 2;
@@ -1045,13 +1070,13 @@ utf16_to_utf8(
       * Multi-word UTF-16 char...
       */
 
-      int lch;                 /* Lower word */
+      cups_utf32_t lch;                        /* Lower word */
 
 
       if (le)
-       lch = src[0] | (src[1] << 8);
+       lch = (cups_utf32_t)(src[0] | (src[1] << 8));
       else
-       lch = (src[0] << 8) | src[1];
+       lch = (cups_utf32_t)((src[0] << 8) | src[1]);
 
       if (lch >= 0xdc00 && lch <= 0xdfff)
       {
@@ -1068,10 +1093,10 @@ utf16_to_utf8(
 
   *ptr = '\0';
 
-  cupsUTF32ToUTF8(dst, temp, dstsize);
+  cupsUTF32ToUTF8(dst, temp, (int)dstsize);
 }
 
 
 /*
- * End of "$Id: snmp-supplies.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: snmp-supplies.c 12227 2014-10-21 13:42:04Z msweet $".
  */
index 2262095..d2dd1e0 100644 (file)
@@ -1,44 +1,18 @@
 /*
- * "$Id: snmp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: snmp.c 11594 2014-02-14 20:09:01Z msweet $"
  *
- *   SNMP discovery backend for CUPS.
+ * SNMP discovery backend for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()                    - Discover printers via SNMP.
- *   add_array()               - Add a string to an array.
- *   add_cache()               - Add a cached device...
- *   add_device_uri()          - Add a device URI to the cache.
- *   alarm_handler()           - Handle alarm signals...
- *   compare_cache()           - Compare two cache entries.
- *   debug_printf()            - Display some debugging information.
- *   fix_make_model()          - Fix common problems in the make-and-model
- *                               string.
- *   free_array()              - Free an array of strings.
- *   free_cache()              - Free the array of cached devices.
- *   get_interface_addresses() - Get the broadcast address(es) associated with
- *                               an interface.
- *   list_device()             - List a device we found...
- *   password_cb()             - Handle authentication requests.
- *   probe_device()            - Probe a device to discover whether it is a
- *                               printer.
- *   read_snmp_conf()          - Read the snmp.conf file.
- *   read_snmp_response()      - Read and parse a SNMP response...
- *   run_time()                - Return the total running time...
- *   scan_devices()            - Scan for devices using SNMP.
- *   try_connect()             - Try connecting on a port...
- *   update_cache()            - Update a cached device...
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -532,17 +506,16 @@ fix_make_model(
     make_model[0] = 'H';
     make_model[1] = 'P';
     make_model[2] = ' ';
-    strlcpy(make_model + 3, mmptr, make_model_size - 3);
+    strlcpy(make_model + 3, mmptr, (size_t)make_model_size - 3);
   }
   else if (!_cups_strncasecmp(old_make_model, "deskjet", 7))
-    snprintf(make_model, make_model_size, "HP DeskJet%s", old_make_model + 7);
+    snprintf(make_model, (size_t)make_model_size, "HP DeskJet%s", old_make_model + 7);
   else if (!_cups_strncasecmp(old_make_model, "officejet", 9))
-    snprintf(make_model, make_model_size, "HP OfficeJet%s", old_make_model + 9);
+    snprintf(make_model, (size_t)make_model_size, "HP OfficeJet%s", old_make_model + 9);
   else if (!_cups_strncasecmp(old_make_model, "stylus_pro_", 11))
-    snprintf(make_model, make_model_size, "EPSON Stylus Pro %s",
-             old_make_model + 11);
+    snprintf(make_model, (size_t)make_model_size, "EPSON Stylus Pro %s", old_make_model + 11);
   else
-    strlcpy(make_model, old_make_model, make_model_size);
+    strlcpy(make_model, old_make_model, (size_t)make_model_size);
 
   if ((mmptr = strstr(make_model, ", Inc.,")) != NULL)
   {
@@ -753,7 +726,7 @@ probe_device(snmp_cache_t *device)  /* I - Device */
            * Insert hostname/address...
            */
 
-           strlcpy(uriptr, device->addrname, sizeof(uri) - (uriptr - uri));
+           strlcpy(uriptr, device->addrname, sizeof(uri) - (size_t)(uriptr - uri));
            uriptr += strlen(uriptr);
            format += 2;
          }
@@ -1233,7 +1206,7 @@ scan_devices(int ipv4,                    /* I - SNMP IPv4 socket */
       for (addr = addrs; addr; addr = addr->next)
       {
 #ifdef AF_INET6
-        if (_httpAddrFamily(&(addr->addr)) == AF_INET6)
+        if (httpAddrFamily(&(addr->addr)) == AF_INET6)
          fd = ipv6;
        else
 #endif /* AF_INET6 */
@@ -1335,7 +1308,7 @@ try_connect(http_addr_t *addr,            /* I - Socket address */
   debug_printf("DEBUG: %.3f Trying %s://%s:%d...\n", run_time(),
                port == 515 ? "lpd" : "socket", addrname, port);
 
-  if ((fd = socket(_httpAddrFamily(addr), SOCK_STREAM, 0)) < 0)
+  if ((fd = socket(httpAddrFamily(addr), SOCK_STREAM, 0)) < 0)
   {
     fprintf(stderr, "ERROR: Unable to create socket: %s\n",
             strerror(errno));
@@ -1346,7 +1319,7 @@ try_connect(http_addr_t *addr,            /* I - Socket address */
 
   alarm(1);
 
-  status = connect(fd, (void *)addr, httpAddrLength(addr));
+  status = connect(fd, (void *)addr, (socklen_t)httpAddrLength(addr));
 
   close(fd);
   alarm(0);
@@ -1391,5 +1364,5 @@ update_cache(snmp_cache_t *device,        /* I - Device */
 
 
 /*
- * End of "$Id: snmp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: snmp.c 11594 2014-02-14 20:09:01Z msweet $".
  */
index 2ec83f2..11abd00 100644 (file)
@@ -1,23 +1,18 @@
 /*
- * "$Id: socket.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: socket.c 11907 2014-06-09 18:35:32Z msweet $"
  *
- *   AppSocket backend for CUPS.
+ * AppSocket backend for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()    - Send a file to the printer or server.
- *   wait_bc() - Wait for back-channel data...
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -46,7 +41,7 @@
  * Local functions...
  */
 
-static int     wait_bc(int device_fd, int secs);
+static ssize_t wait_bc(int device_fd, int secs);
 
 
 /*
@@ -73,10 +68,6 @@ main(int  argc,                              /* I - Number of command-line arguments (6 or 7) */
   int          print_fd;               /* Print file */
   int          copies;                 /* Number of copies to print */
   time_t       start_time;             /* Time of first connect */
-#ifdef __APPLE__
-  time_t       current_time,           /* Current time */
-               wait_time;              /* Time to wait before shutting down socket */
-#endif /* __APPLE__ */
   int          contimeout;             /* Connection timeout */
   int          waiteof;                /* Wait for end-of-file? */
   int          port;                   /* Port number */
@@ -254,8 +245,8 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
          */
 
          snmp_enabled = !value[0] || !_cups_strcasecmp(value, "on") ||
-                        _cups_strcasecmp(value, "yes") ||
-                        _cups_strcasecmp(value, "true");
+                        !_cups_strcasecmp(value, "yes") ||
+                        !_cups_strcasecmp(value, "true");
       }
       else if (!_cups_strcasecmp(name, "contimeout"))
       {
@@ -389,7 +380,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
              break;
         }
 
-       sleep(delay);
+       sleep((unsigned)delay);
 
        if (delay < 30)
          delay += 5;
@@ -410,7 +401,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
 
   fprintf(stderr, "DEBUG: Connected to %s:%d...\n",
          httpAddrString(&(addr->addr), addrname, sizeof(addrname)),
-         _httpAddrPort(&(addr->addr)));
+         httpAddrPort(&(addr->addr)));
 
  /*
   * Print everything...
@@ -419,7 +410,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
   tbytes = 0;
 
   if (bytes > 0)
-    tbytes += write(device_fd, buffer, bytes);
+    tbytes += write(device_fd, buffer, (size_t)bytes);
 
   while (copies > 0 && tbytes >= 0)
   {
@@ -438,16 +429,7 @@ main(int  argc,                            /* I - Number of command-line arguments (6 or 7) */
       _cupsLangPrintFilter(stderr, "INFO", _("Print file sent."));
   }
 
-#ifdef __APPLE__
- /*
-  * Wait up to 5 seconds to get any pending back-channel data...
-  */
-
-  wait_time = time(NULL) + 5;
-  while (wait_time >= time(&current_time))
-    if (wait_bc(device_fd, wait_time - current_time) <= 0)
-      break;
-#endif /* __APPLE__ */
+  fputs("STATE: +cups-waiting-for-job-completed\n", stderr);
 
   if (waiteof)
   {
@@ -494,7 +476,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
  * 'wait_bc()' - Wait for back-channel data...
  */
 
-static int                             /* O - # bytes read or -1 on error */
+static ssize_t                         /* O - # bytes read or -1 on error */
 wait_bc(int device_fd,                 /* I - Socket */
         int secs)                      /* I - Seconds to wait */
 {
@@ -524,7 +506,7 @@ wait_bc(int device_fd,                      /* I - Socket */
     {
       fprintf(stderr, "DEBUG: Received %d bytes of back-channel data\n",
              (int)bytes);
-      cupsBackChannelWrite(buffer, bytes, 1.0);
+      cupsBackChannelWrite(buffer, (size_t)bytes, 1.0);
     }
 
     return (bytes);
@@ -535,5 +517,5 @@ wait_bc(int device_fd,                      /* I - Socket */
 
 
 /*
- * End of "$Id: socket.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: socket.c 11907 2014-06-09 18:35:32Z msweet $".
  */
index 18861fd..3a32391 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: test1284.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: test1284.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   IEEE-1284 support functions test program for CUPS.
  *
@@ -80,5 +80,5 @@ main(int  argc,                               /* I - Number of command-line args */
 
 
 /*
- * End of "$Id: test1284.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: test1284.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 065c27a..b1f27e4 100644 (file)
@@ -1,25 +1,18 @@
 /*
- * "$Id: testbackend.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testbackend.c 11594 2014-02-14 20:09:01Z msweet $"
  *
- *   Backend test program for CUPS.
+ * Backend test program for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2005 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()            - Run the named backend.
- *   sigterm_handler() - Flag when we get SIGTERM.
- *   usage()           - Show usage information.
- *   walk_cb()         - Show results of cupsSideChannelSNMPWalk...
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -97,7 +90,7 @@ main(int  argc,                               /* I - Number of command-line args */
   if (getcwd(libpath, sizeof(libpath)) &&
       (ptr = strrchr(libpath, '/')) != NULL && !strcmp(ptr, "/backend"))
   {
-    strlcpy(ptr, "/cups", sizeof(libpath) - (ptr - libpath));
+    strlcpy(ptr, "/cups", sizeof(libpath) - (size_t)(ptr - libpath));
     if (!access(libpath, 0))
     {
 #ifdef __APPLE__
@@ -311,7 +304,7 @@ main(int  argc,                             /* I - Number of command-line args */
          */
 
          if ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), 0)) > 0)
-           write(2, buffer, bytes);
+           write(2, buffer, (size_t)bytes);
 
         /*
          * Throttle output to ~100hz...
@@ -339,7 +332,7 @@ main(int  argc,                             /* I - Number of command-line args */
        */
 
         while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), 5.0)) > 0)
-         write(2, buffer, bytes);
+         write(2, buffer, (size_t)bytes);
 
        exit(0);
       }
@@ -414,7 +407,7 @@ main(int  argc,                             /* I - Number of command-line args */
         while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer),
                                            timeout)) > 0)
        {
-         write(2, buffer, bytes);
+         write(2, buffer, (size_t)bytes);
          timeout = 5.0;
        }
        write(2, "\nDEBUG: END\n", 12);
@@ -667,10 +660,25 @@ walk_cb(const char *oid,          /* I - OID */
        int        datalen,             /* I - Length of data */
        void       *context)            /* I - Context (unused) */
 {
-  printf("CUPS_SC_CMD_SNMP_WALK %s, %d bytes (%s)\n", oid, datalen, data);
+  char temp[80];
+
+  (void)context;
+
+  if ((size_t)datalen > (sizeof(temp) - 1))
+  {
+    memcpy(temp, data, sizeof(temp) - 1);
+    temp[sizeof(temp) - 1] = '\0';
+  }
+  else
+  {
+    memcpy(temp, data, (size_t)datalen);
+    temp[datalen] = '\0';
+  }
+
+  printf("CUPS_SC_CMD_SNMP_WALK %s, %d bytes (%s)\n", oid, datalen, temp);
 }
 
 
 /*
- * End of "$Id: testbackend.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testbackend.c 11594 2014-02-14 20:09:01Z msweet $".
  */
index 0079ce3..0a300bc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: testsupplies.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testsupplies.c 3247 2011-05-12 06:22:31Z msweet $"
  *
  *   SNMP supplies test program for CUPS.
  *
@@ -79,5 +79,5 @@ main(int  argc,                               /* I - Number of command-line args */
 
 
 /*
- * End of "$Id: testsupplies.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testsupplies.c 3247 2011-05-12 06:22:31Z msweet $".
  */
index 6d7514d..285bccc 100644 (file)
@@ -1,75 +1,46 @@
 /*
-* "$Id: usb-darwin.c 11173 2013-07-23 12:31:34Z msweet $"
-*
-* Copyright 2005-2012 Apple Inc. All rights reserved.
-*
-* IMPORTANT:  This Apple software is supplied to you by Apple Computer,
-* Inc. ("Apple") in consideration of your agreement to the following
-* terms, and your use, installation, modification or redistribution of
-* this Apple software constitutes acceptance of these terms.  If you do
-* not agree with these terms, please do not use, install, modify or
-* redistribute this Apple software.
-*
-* In consideration of your agreement to abide by the following terms, and
-* subject to these terms, Apple grants you a personal, non-exclusive
-* license, under Apple's copyrights in this original Apple software (the
-* "Apple Software"), to use, reproduce, modify and redistribute the Apple
-* Software, with or without modifications, in source and/or binary forms;
-* provided that if you redistribute the Apple Software in its entirety and
-* without modifications, you must retain this notice and the following
-* text and disclaimers in all such redistributions of the Apple Software.
-* Neither the name, trademarks, service marks or logos of Apple Computer,
-* Inc. may be used to endorse or promote products derived from the Apple
-* Software without specific prior written permission from Apple.  Except
-* as expressly stated in this notice, no other rights or licenses, express
-* or implied, are granted by Apple herein, including but not limited to
-* any patent rights that may be infringed by your derivative works or by
-* other works in which the Apple Software may be incorporated.
-*
-* The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
-* MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
-* THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
-* FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
-* OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
-*
-* IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
-* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-* INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
-* MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
-* AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
-* STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
-* POSSIBILITY OF SUCH DAMAGE.
-*
-* Contents:
-*
- *   list_devices()       - List all USB devices.
- *   print_device()       - Print a file to a USB device.
- *   read_thread()        - Thread to read the backchannel data on.
- *   sidechannel_thread() - Handle side-channel requests.
- *   iterate_printers()   - Iterate over all the printers.
- *   device_added()       - Device added notifier.
- *   list_device_cb()     - list_device iterator callback.
- *   find_device_cb()     - print_device iterator callback.
- *   status_timer_cb()    - Status timer callback.
- *   copy_deviceinfo()    - Copy strings from the 1284 device ID.
- *   release_deviceinfo() - Release deviceinfo strings.
- *   load_classdriver()   - Load a classdriver.
- *   unload_classdriver() - Unload a classdriver.
- *   load_printerdriver() - Load vendor's classdriver.
- *   registry_open()      - Open a connection to the printer.
- *   registry_close()     - Close the connection to the printer.
- *   copy_deviceid()      - Copy the 1284 device id string.
- *   copy_devicestring()  - Copy the 1284 device id string.
- *   copy_value_for_key() - Copy value string associated with a key.
- *   cfstr_create_trim()  - Create CFString and trim whitespace characters.
- *   parse_options()      - Parse URI options.
- *   sigterm_handler()    - SIGTERM handler.
- *   next_line()          - Find the next line in a buffer.
- *   parse_pserror()      - Scan the backchannel data for postscript errors.
- *   soft_reset()         - Send a soft reset to the device.
- *   get_device_id()      - Return IEEE-1284 device ID.
-*/
+ * "$Id: usb-darwin.c 12928 2015-10-23 21:31:58Z msweet $"
+ *
+ * Copyright 2005-2015 Apple Inc. All rights reserved.
+ *
+ * IMPORTANT:  This Apple software is supplied to you by Apple Computer,
+ * Inc. ("Apple") in consideration of your agreement to the following
+ * terms, and your use, installation, modification or redistribution of
+ * this Apple software constitutes acceptance of these terms.  If you do
+ * not agree with these terms, please do not use, install, modify or
+ * redistribute this Apple software.
+ *
+ * In consideration of your agreement to abide by the following terms, and
+ * subject to these terms, Apple grants you a personal, non-exclusive
+ * license, under Apple's copyrights in this original Apple software (the
+ * "Apple Software"), to use, reproduce, modify and redistribute the Apple
+ * Software, with or without modifications, in source and/or binary forms;
+ * provided that if you redistribute the Apple Software in its entirety and
+ * without modifications, you must retain this notice and the following
+ * text and disclaimers in all such redistributions of the Apple Software.
+ * Neither the name, trademarks, service marks or logos of Apple Computer,
+ * Inc. may be used to endorse or promote products derived from the Apple
+ * Software without specific prior written permission from Apple.  Except
+ * as expressly stated in this notice, no other rights or licenses, express
+ * or implied, are granted by Apple herein, including but not limited to
+ * any patent rights that may be infringed by your derivative works or by
+ * other works in which the Apple Software may be incorporated.
+ *
+ * The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
+ * MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
+ * THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
+ * OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+ *
+ * IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
+ * MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
+ * AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
+ * STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
 
 /*
  * Include necessary headers.
 #include <CoreFoundation/CoreFoundation.h>
 #include <IOKit/usb/IOUSBLib.h>
 #include <IOKit/IOCFPlugIn.h>
-
+#include <libproc.h>
+#include <asl.h>
 #include <spawn.h>
 #include <pthread.h>
 
+/*
+ * Include necessary headers.
+ */
+
 extern char **environ;
 
 
@@ -119,7 +95,7 @@ extern char **environ;
 #define WAIT_SIDE_DELAY                        3
 #define DEFAULT_TIMEOUT                        5000L
 
-#define        USB_INTERFACE_KIND              CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID190)
+#define        USB_INTERFACE_KIND              CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID245)
 #define kUSBLanguageEnglish            0x409
 
 #define PRINTER_POLLING_INTERVAL       5                       /* seconds */
@@ -134,6 +110,26 @@ extern char **environ;
 #define kUSBGenericTOPrinterClassDriver        CFSTR("/System/Library/Printers/Libraries/USBGenericPrintingClass.plugin")
 #define kUSBPrinterClassDeviceNotOpen  -9664   /*kPMInvalidIOMContext*/
 
+#define CRSetCrashLogMessage(m) _crc_make_setter(message, m)
+#define _crc_make_setter(attr, arg) (gCRAnnotations.attr = (uint64_t)(unsigned long)(arg))
+#define CRASH_REPORTER_CLIENT_HIDDEN __attribute__((visibility("hidden")))
+#define CRASHREPORTER_ANNOTATIONS_VERSION 4
+#define CRASHREPORTER_ANNOTATIONS_SECTION "__crash_info"
+
+struct crashreporter_annotations_t {
+       uint64_t version;               // unsigned long
+       uint64_t message;               // char *
+       uint64_t signature_string;      // char *
+       uint64_t backtrace;             // char *
+       uint64_t message2;              // char *
+       uint64_t thread;                // uint64_t
+       uint64_t dialog_mode;           // unsigned int
+};
+
+CRASH_REPORTER_CLIENT_HIDDEN
+struct crashreporter_annotations_t gCRAnnotations
+       __attribute__((section("__DATA," CRASHREPORTER_ANNOTATIONS_SECTION)))
+       = { CRASHREPORTER_ANNOTATIONS_VERSION, 0, 0, 0, 0, 0, 0 };
 
 /*
  * Section 5.3 USB Printing Class spec
@@ -142,8 +138,9 @@ extern char **environ;
 #define kUSBPrintingProtocolNoOpen             0
 #define kUSBPrintingProtocolUnidirectional     1
 #define kUSBPrintingProtocolBidirectional      2
+#define kUSBPrintingProtocolIPP                        4
 
-typedef IOUSBInterfaceInterface190     **printer_interface_t;
+typedef IOUSBInterfaceInterface245     **printer_interface_t;
 
 typedef struct iodevice_request_s      /**** Device request ****/
 {
@@ -179,7 +176,7 @@ typedef struct classdriver_s                /**** g.classdriver context ****/
   UInt16               vendorID;               /* Vendor id */
   UInt16               productID;              /* Product id */
   printer_interface_t  interface;              /* identify the device to IOKit */
-  UInt8                        outpipe;                /* mandatory bulkOut pipe */
+  UInt8                        outpipe;                /* mandatory bulkOut pipe */
   UInt8                        inpipe;                 /* optional bulkIn pipe */
 
   /* general class requests */
@@ -206,7 +203,7 @@ typedef struct classdriver_s                /**** g.classdriver context ****/
 
 } classdriver_t;
 
-typedef Boolean (*iterator_callback_t)(void *refcon, io_service_t obj);
+typedef Boolean (*iterator_callback_t)(void *refcon, io_service_t obj, CFStringRef deviceIDString, UInt32 deviceLocation, UInt8 interfaceNum, UInt8 alternateSetting);
 
 typedef struct iterator_reference_s    /**** Iterator reference data */
 {
@@ -234,6 +231,7 @@ typedef struct globals_s
   CFStringRef          serial;
   UInt32               location;
   UInt8                        interfaceNum;
+  UInt8                        alternateSetting;
 
   CFRunLoopTimerRef    status_timer;
 
@@ -243,6 +241,7 @@ typedef struct globals_s
   ssize_t              debug_bytes;    /* Current bytes to read */
 #endif /* DEBUG_WRITES */
 
+  Boolean              use_generic_class_driver;
   Boolean              wait_eof;
   int                  drain_output;   /* Drain all pending output */
   int                  bidi_flag;      /* 0=unidirectional, 1=bidirectional */
@@ -259,14 +258,16 @@ typedef struct globals_s
  */
 
 globals_t g = { 0 };                   /* Globals */
+int Iterating = 0;                     /* Are we iterating the bus? */
 
 
 /*
  * Local functions...
  */
 
-static Boolean find_device_cb(void *refcon, io_service_t obj);
-static Boolean list_device_cb(void *refcon, io_service_t obj);
+static Boolean find_device_cb(void *refcon, io_service_t obj, CFStringRef deviceIDString, UInt32 deviceLocation, UInt8 interfaceNum, UInt8 alternateSetting);
+static Boolean list_device_cb(void *refcon, io_service_t obj, CFStringRef deviceIDString, UInt32 deviceLocation, UInt8 interfaceNum, UInt8 alternateSetting);
+
 static CFStringRef cfstr_create_trim(const char *cstr);
 static CFStringRef copy_value_for_key(CFStringRef deviceID, CFStringRef *keys);
 static kern_return_t load_classdriver(CFStringRef driverPath, printer_interface_t interface, classdriver_t ***printerDriver);
@@ -274,31 +275,40 @@ static kern_return_t load_printerdriver(CFStringRef *driverBundlePath);
 static kern_return_t registry_close(void);
 static kern_return_t registry_open(CFStringRef *driverBundlePath);
 static kern_return_t unload_classdriver(classdriver_t ***classdriver);
-static OSStatus copy_deviceid(classdriver_t **printer, CFStringRef *deviceID);
+
 static void *read_thread(void *reference);
 static void *sidechannel_thread(void *reference);
-static void copy_deviceinfo(CFStringRef deviceIDString, CFStringRef *make, CFStringRef *model, CFStringRef *serial);
-static void copy_devicestring(io_service_t usbInterface, CFStringRef *deviceID, UInt32 *deviceLocation, UInt8 *interfaceNum);
 static void device_added(void *userdata, io_iterator_t iterator);
 static void get_device_id(cups_sc_status_t *status, char *data, int *datalen);
 static void iterate_printers(iterator_callback_t callBack, void *userdata);
 static void parse_options(char *options, char *serial, int serial_size, UInt32 *location, Boolean *wait_eof);
-static void release_deviceinfo(CFStringRef *make, CFStringRef *model, CFStringRef *serial);
 static void setup_cfLanguage(void);
 static void soft_reset(void);
 static void status_timer_cb(CFRunLoopTimerRef timer, void *info);
+static void log_usb_class_driver(int is_64bit);
+#define IS_64BIT 1
+#define IS_NOT_64BIT 0
 
 #if defined(__i386__) || defined(__x86_64__)
 static pid_t   child_pid;              /* Child PID */
-static void run_legacy_backend(int argc, char *argv[], int fd);        /* Starts child backend process running as a ppc executable */
+static void run_legacy_backend(int argc, char *argv[], int fd) __attribute__((noreturn));      /* Starts child backend process running as a ppc executable */
 #endif /* __i386__ || __x86_64__ */
 static void sigterm_handler(int sig);  /* SIGTERM handler */
+static void sigquit_handler(int sig, siginfo_t *si, void *unused) __attribute__((noreturn));
 
 #ifdef PARSE_PS_ERRORS
 static const char *next_line (const char *buffer);
 static void parse_pserror (char *sockBuffer, int len);
 #endif /* PARSE_PS_ERRORS */
 
+static printer_interface_t usb_printer_interface_interface(io_service_t usbClass);
+static IOUSBDeviceInterface **usb_device_interface_for_device(io_service_t usbDevice);
+static CFStringRef copy_printer_interface_deviceid(printer_interface_t printer, UInt8 alternateSetting);
+static CFStringRef copy_printer_interface_indexed_description(printer_interface_t  printer, UInt8 index, UInt16 language);
+static CFStringRef deviceIDCopyManufacturer(CFStringRef deviceID);
+static CFStringRef deviceIDCopyModel(CFStringRef deviceID);
+static CFStringRef deviceIDCopySerialNumber(CFStringRef deviceID);
+
 #pragma mark -
 
 /*
@@ -344,11 +354,21 @@ print_device(const char *uri,             /* I - Device URI */
   struct timeval  *timeout,            /* Timeout pointer */
                  tv;                   /* Time value */
   struct timespec cond_timeout;                /* pthread condition timeout */
+  struct sigaction action;             /* Actions for POSIX signals */
 
 
   (void)uri;
 
  /*
+  * Catch SIGQUIT to determine who is sending it...
+  */
+
+  memset(&action, 0, sizeof(action));
+  action.sa_sigaction = sigquit_handler;
+  action.sa_flags = SA_SIGINFO;
+  sigaction(SIGQUIT, &action, NULL);
+
+ /*
   * See if the side-channel descriptor is valid...
   */
 
@@ -444,6 +464,11 @@ print_device(const char *uri,              /* I - Device URI */
       return (CUPS_BACKEND_STOP);
     }
 
+#ifdef __x86_64__
+    if (status == noErr && driverBundlePath != NULL && CFStringCompare(driverBundlePath, kUSBGenericTOPrinterClassDriver, 0) != kCFCompareEqualTo)
+      log_usb_class_driver(IS_64BIT);
+#endif /* __x86_64__ */
+
     if (driverBundlePath)
       CFRelease(driverBundlePath);
 
@@ -472,9 +497,6 @@ print_device(const char *uri,               /* I - Device URI */
 
   if (!print_fd)
   {
-    struct sigaction   action;         /* POSIX signal action */
-
-
     memset(&action, 0, sizeof(action));
 
     sigemptyset(&action.sa_mask);
@@ -679,12 +701,12 @@ print_device(const char *uri,             /* I - Device URI */
 
       if (g.print_bytes)
       {
-       bytes    = g.print_bytes;
+       bytes    = (UInt32)g.print_bytes;
        iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0);
 
        /*
        * Ignore timeout errors, but retain the number of bytes written to
-       * avoid sending duplicate data (<rdar://problem/6254911>)...
+       * avoid sending duplicate data...
        */
 
        if (iostatus == kIOUSBTransactionTimeout)
@@ -701,13 +723,13 @@ print_device(const char *uri,             /* I - Device URI */
        {
          fputs("DEBUG: Got USB pipe stalled during write\n", stderr);
 
-         bytes    = g.print_bytes;
+         bytes    = (UInt32)g.print_bytes;
          iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0);
        }
 
        /*
        * Retry a write after an aborted write since we probably just got
-       * SIGTERM (<rdar://problem/6860126>)...
+       * SIGTERM...
        */
 
        else if (iostatus == kIOReturnAborted)
@@ -721,7 +743,7 @@ print_device(const char *uri,               /* I - Device URI */
           sleep(5);
 #endif /* DEBUG_WRITES */
 
-         bytes    = g.print_bytes;
+         bytes    = (UInt32)g.print_bytes;
          iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0);
         }
 
@@ -760,6 +782,7 @@ print_device(const char *uri,               /* I - Device URI */
   }
 
   fprintf(stderr, "DEBUG: Sent %lld bytes...\n", (off_t)total_bytes);
+  fputs("STATE: +cups-waiting-for-job-completed\n", stderr);
 
  /*
   * Signal the side channel thread to exit...
@@ -935,6 +958,27 @@ static void *read_thread(void *reference)
 
   } while (g.wait_eof || !g.read_thread_stop); /* Abort from main thread tests error here */
 
+  /* Workaround for usb race condition. <rdar://problem/21882551> */
+  if (!g.wait_eof && g.use_generic_class_driver)
+  {
+     const char *pdl = getenv("FINAL_CONTENT_TYPE");
+     if (pdl && strcmp(pdl, "application/vnd.cups-postscript") == 0)
+     {
+       while (readstatus == kIOReturnSuccess && ((rbytes > 0 && readbuffer[rbytes-1] != 0x4) || rbytes == 0))
+       {
+         start = mach_absolute_time();
+
+         rbytes = sizeof(readbuffer);
+         readstatus = (*g.classdriver)->ReadPipe(g.classdriver, readbuffer, &rbytes);
+         if (readstatus == kIOReturnSuccess && rbytes > 0 && readbuffer[rbytes-1] == 0x4)
+           break;
+
+         /* Make sure this loop executes no more than once every 250 miliseconds... */
+         mach_wait_until(start + delay);
+       }
+     }
+  }
+
  /*
   * Let the main thread know that we have completed the read thread...
   */
@@ -1008,7 +1052,7 @@ sidechannel_thread(void *reference)
          fputs("DEBUG: CUPS_SC_CMD_GET_BIDI received from driver...\n",
                stderr);
 
-         data[0] = g.bidi_flag;
+         data[0] = (char)g.bidi_flag;
          cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0);
 
          fprintf(stderr,
@@ -1024,7 +1068,7 @@ sidechannel_thread(void *reference)
          get_device_id(&status, data, &datalen);
          cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, datalen, 1.0);
 
-          if (datalen < sizeof(data))
+          if ((size_t)datalen < sizeof(data))
            data[datalen] = '\0';
          else
            data[sizeof(data) - 1] = '\0';
@@ -1074,224 +1118,276 @@ sidechannel_thread(void *reference)
  * 'iterate_printers()' - Iterate over all the printers.
  */
 
-static void iterate_printers(iterator_callback_t callBack,
-                            void *userdata)
+static void iterate_printers(iterator_callback_t callBack, void *userdata)
 {
-  mach_port_t  masterPort = 0x0;
-  kern_return_t kr = IOMasterPort (bootstrap_port, &masterPort);
-
-  if (kr == kIOReturnSuccess && masterPort != 0x0)
-  {
-    io_iterator_t addIterator = 0x0;
+    Iterating = 1;
 
-    iterator_reference_t reference = { callBack, userdata, true };
-    IONotificationPortRef addNotification = IONotificationPortCreate(masterPort);
+    mach_port_t        masterPort = 0x0;
+    kern_return_t kr = IOMasterPort (bootstrap_port, &masterPort);
 
-    int klass = kUSBPrintingClass;
-    int subklass = kUSBPrintingSubclass;
-
-    CFNumberRef usb_klass = CFNumberCreate(NULL, kCFNumberIntType, &klass);
-    CFNumberRef usb_subklass = CFNumberCreate(NULL, kCFNumberIntType, &subklass);
-    CFMutableDictionaryRef usbPrinterMatchDictionary = IOServiceMatching(kIOUSBInterfaceClassName);
-
-    CFDictionaryAddValue(usbPrinterMatchDictionary, CFSTR("bInterfaceClass"), usb_klass);
-    CFDictionaryAddValue(usbPrinterMatchDictionary, CFSTR("bInterfaceSubClass"), usb_subklass);
-
-    CFRelease(usb_klass);
-    CFRelease(usb_subklass);
-
-    kr = IOServiceAddMatchingNotification(addNotification, kIOMatchedNotification, usbPrinterMatchDictionary, &device_added, &reference, &addIterator);
-    if (addIterator != 0x0)
+    if (kr == kIOReturnSuccess && masterPort != 0x0)
     {
-      device_added (&reference, addIterator);
-
-      if (reference.keepRunning)
-      {
-       CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(addNotification), kCFRunLoopDefaultMode);
-       CFRunLoopRun();
-      }
-      IOObjectRelease(addIterator);
+        iterator_reference_t reference = { callBack, userdata, true };
+
+        IONotificationPortRef addNotification = IONotificationPortCreate(masterPort);
+        io_iterator_t addIterator = IO_OBJECT_NULL;
+
+        kr = IOServiceAddMatchingNotification(addNotification, kIOFirstMatchNotification, IOServiceMatching(kIOUSBDeviceClassName),
+                                              &device_added, &reference, &addIterator);
+        if (kr == kIOReturnSuccess && addIterator != IO_OBJECT_NULL)
+        {
+            device_added(&reference, addIterator);
+            if (reference.keepRunning)
+            {
+                CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(addNotification), kCFRunLoopDefaultMode);
+                CFRunLoopRun();
+            }
+            IOObjectRelease(addIterator);
+        }
+        mach_port_deallocate(mach_task_self(), masterPort);
     }
-    mach_port_deallocate(mach_task_self(), masterPort);
-  }
+
+    Iterating = 0;
 }
 
 
 /*
  * 'device_added()' - Device added notifier.
  */
+#define IsPrintingInterface(c,s,p) ((c) == kUSBPrintingInterfaceClass && (s) == kUSBPrintingSubclass && (p) != kUSBPrintingProtocolIPP)
 
-static void device_added(void *userdata,
-                        io_iterator_t iterator)
+static void device_added(void *userdata, io_iterator_t iterator)
 {
-  iterator_reference_t *reference = userdata;
+    iterator_reference_t *reference = userdata;
+    io_service_t device;
 
-  io_service_t obj;
-  while (reference->keepRunning && (obj = IOIteratorNext(iterator)) != 0x0)
-  {
-    if (reference->callback != NULL)
-      reference->keepRunning = reference->callback(reference->userdata, obj);
+    while (reference->keepRunning && (device = IOIteratorNext(iterator)) != 0x0)
+    {
+        UInt32 locationID = 0;
+        IOUSBDeviceInterface **devIntf = NULL;
+        io_iterator_t intfIterator = IO_OBJECT_NULL;
+        io_object_t intf = IO_OBJECT_NULL;
+
+        devIntf = usb_device_interface_for_device(device);
+        if (devIntf == NULL)
+            goto device_added_done;
+
+        UInt16 vendorUniqueID;
+        if ((*devIntf)->GetDeviceVendor(devIntf, &vendorUniqueID) != kIOReturnSuccess || vendorUniqueID == kAppleVendorID || vendorUniqueID == 0x0A5C)
+            goto device_added_done;
+
+        if ((*devIntf)->GetLocationID(devIntf, &locationID) != kIOReturnSuccess)
+            goto device_added_done;
+
+        IOUSBFindInterfaceRequest req = { kIOUSBFindInterfaceDontCare, kIOUSBFindInterfaceDontCare, kIOUSBFindInterfaceDontCare, kIOUSBFindInterfaceDontCare };
+        if ((*devIntf)->CreateInterfaceIterator(devIntf, &req, &intfIterator) != kIOReturnSuccess)
+            goto device_added_done;
+
+        while (reference->keepRunning && (intf = IOIteratorNext(intfIterator)))
+        {
+            printer_interface_t printerIntf = usb_printer_interface_interface(intf);
+            if (printerIntf != NULL)
+            {
+                UInt8 intfClass = 0, intfSubclass = 0, intfProtocol = 0, intfNumber = 0;
+
+                (*printerIntf)->GetInterfaceClass(printerIntf, &intfClass);
+                (*printerIntf)->GetInterfaceSubClass(printerIntf, &intfSubclass);
+                (*printerIntf)->GetInterfaceProtocol(printerIntf, &intfProtocol);
+                (*printerIntf)->GetInterfaceNumber(printerIntf, &intfNumber);
+
+                if (IsPrintingInterface(intfClass, intfSubclass, intfProtocol))
+                {
+                    CFStringRef deviceIDString = copy_printer_interface_deviceid(printerIntf, 0);
+                    if (deviceIDString != NULL)
+                    {
+                        reference->keepRunning = reference->callback(userdata, intf, deviceIDString, locationID, intfNumber, 0);
+                        CFRelease(deviceIDString);
+                    }
+                }
+
+                IOUSBInterfaceDescriptor *intfDesc = NULL;
+                while (reference->keepRunning && (intfDesc = (IOUSBInterfaceDescriptor *)(*printerIntf)->FindNextAssociatedDescriptor(printerIntf, intfDesc, kUSBInterfaceDesc)))
+                {
+                    intfClass = intfDesc->bInterfaceClass;
+                    intfSubclass = intfDesc->bInterfaceSubClass;
+                    intfProtocol = intfDesc->bInterfaceProtocol;
+
+                    if ((IsPrintingInterface(intfClass, intfSubclass, intfProtocol)))
+                    {
+                        CFStringRef deviceIDString = copy_printer_interface_deviceid(printerIntf, intfDesc->bAlternateSetting);
+                        if (deviceIDString != NULL)
+                        {
+                            reference->keepRunning = reference->callback(userdata, intf, deviceIDString, locationID, intfNumber, intfDesc->bAlternateSetting);
+                            CFRelease(deviceIDString);
+                        }
+                    }
+                }
+                (*printerIntf)->Release(printerIntf);
+            }
+            IOObjectRelease(intf);
+        }
 
-    IOObjectRelease(obj);
-  }
+        device_added_done:
+            if (devIntf != NULL) (*devIntf)->Release(devIntf);
+            if (intfIterator != IO_OBJECT_NULL) IOObjectRelease(intfIterator);
 
-  /* One last call to the call back now that we are not longer have printers left to iterate...
-   */
-  if (reference->keepRunning)
-    reference->keepRunning = reference->callback(reference->userdata, 0x0);
+        IOObjectRelease(device);
+    }
 
-  if (!reference->keepRunning)
-    CFRunLoopStop(CFRunLoopGetCurrent());
-}
+    /* One last call to the call back now that we are not longer have printers left to iterate...
+     */
+    if (reference->keepRunning && reference->callback)
+        reference->keepRunning = reference->callback(reference->userdata, IO_OBJECT_NULL, NULL, 0, 0, 0);
 
+    if (!reference->keepRunning)
+        CFRunLoopStop(CFRunLoopGetCurrent());
+}
 
 /*
  * 'list_device_cb()' - list_device iterator callback.
  */
 
-static Boolean list_device_cb(void *refcon,
-                             io_service_t obj)
+static Boolean list_device_cb(void *refcon, io_service_t obj, CFStringRef deviceIDString, UInt32 deviceLocation, UInt8 interfaceNum, UInt8 alternateSetting)
 {
-  Boolean keepRunning = (obj != 0x0);
-
-
-  (void)refcon;
+    (void)refcon;
+    (void)interfaceNum;
+    (void)alternateSetting;
 
-  if (keepRunning)
-  {
-    CFStringRef deviceIDString = NULL;
-    UInt32 deviceLocation = 0;
-    UInt8      interfaceNum = 0;
-
-    copy_devicestring(obj, &deviceIDString, &deviceLocation, &interfaceNum);
-    if (deviceIDString != NULL)
+    if (obj != IO_OBJECT_NULL)
     {
-      CFStringRef make = NULL,  model = NULL, serial = NULL;
-      char uristr[1024], makestr[1024], modelstr[1024], serialstr[1024];
-      char optionsstr[1024], idstr[1024], make_modelstr[1024];
+        CFStringRef make = deviceIDCopyManufacturer(deviceIDString);
+        CFStringRef model = deviceIDCopyModel(deviceIDString);
+        CFStringRef serial = deviceIDCopySerialNumber(deviceIDString);
 
-      copy_deviceinfo(deviceIDString, &make, &model, &serial);
-      CFStringGetCString(deviceIDString, idstr, sizeof(idstr),
-                         kCFStringEncodingUTF8);
-      backendGetMakeModel(idstr, make_modelstr, sizeof(make_modelstr));
+        char uristr[1024], makestr[1024], modelstr[1024], serialstr[1024];
+        char optionsstr[1024], idstr[1024], make_modelstr[1024];
 
-      modelstr[0] = '/';
+        CFStringGetCString(deviceIDString, idstr, sizeof(idstr), kCFStringEncodingUTF8);
+        backendGetMakeModel(idstr, make_modelstr, sizeof(make_modelstr));
 
-      if (!make ||
-          !CFStringGetCString(make, makestr, sizeof(makestr),
-                             kCFStringEncodingUTF8))
-        strcpy(makestr, "Unknown");
+        modelstr[0] = '/';
 
-      if (!model ||
-          !CFStringGetCString(model, &modelstr[1], sizeof(modelstr)-1,
-                             kCFStringEncodingUTF8))
-        strcpy(modelstr + 1, "Printer");
+        if (make  == NULL || !CFStringGetCString(make, makestr, sizeof(makestr), kCFStringEncodingUTF8))
+            strlcpy(makestr, "Unknown", sizeof(makestr));
 
-      optionsstr[0] = '\0';
-      if (serial != NULL)
-      {
-        CFStringGetCString(serial, serialstr, sizeof(serialstr), kCFStringEncodingUTF8);
-       snprintf(optionsstr, sizeof(optionsstr), "?serial=%s", serialstr);
-      }
-      else if (deviceLocation != 0)
-       snprintf(optionsstr, sizeof(optionsstr), "?location=%x", (unsigned)deviceLocation);
+        if (model == NULL || !CFStringGetCString(model, &modelstr[1], sizeof(modelstr)-1, kCFStringEncodingUTF8))
+            strlcpy(modelstr + 1, "Printer", sizeof(modelstr) - 1);
 
-      httpAssembleURI(HTTP_URI_CODING_ALL, uristr, sizeof(uristr), "usb", NULL, makestr, 0, modelstr);
-      strlcat(uristr, optionsstr, sizeof(uristr));
+        optionsstr[0] = '\0';
+        if (serial != NULL && CFStringGetCString(serial, serialstr, sizeof(serialstr), kCFStringEncodingUTF8))
+            snprintf(optionsstr, sizeof(optionsstr), "?serial=%s", serialstr);
+        else if (deviceLocation != 0)
+            snprintf(optionsstr, sizeof(optionsstr), "?location=%x", (unsigned)deviceLocation);
 
-      cupsBackendReport("direct", uristr, make_modelstr, make_modelstr, idstr,
-                        NULL);
+        httpAssembleURI(HTTP_URI_CODING_ALL, uristr, sizeof(uristr), "usb", NULL, makestr, 0, modelstr);
+        strlcat(uristr, optionsstr, sizeof(uristr));
 
-      release_deviceinfo(&make, &model, &serial);
-      CFRelease(deviceIDString);
+        cupsBackendReport("direct", uristr, make_modelstr, make_modelstr, idstr,
+                          NULL);
+
+        if (make != NULL) CFRelease(make);
+        if (model != NULL) CFRelease(model);
+        if (serial != NULL) CFRelease(serial);
     }
-  }
 
-  return keepRunning;
+    return obj != IO_OBJECT_NULL;
 }
 
-
 /*
  * 'find_device_cb()' - print_device iterator callback.
  */
-
-static Boolean find_device_cb(void *refcon,
-                             io_service_t obj)
+static Boolean find_device_cb(void *refcon, io_service_t obj, CFStringRef deviceIDString, UInt32 deviceLocation, UInt8 interfaceNum, UInt8 alternateSetting)
 {
-  Boolean keepLooking = true;
+    Boolean keepLooking = true;
 
-  if (obj != 0x0)
-  {
-    CFStringRef idString = NULL;
-    UInt32 location = -1;
-    UInt8      interfaceNum = 0;
-
-    copy_devicestring(obj, &idString, &location, &interfaceNum);
-    if (idString != NULL)
+    if (obj != IO_OBJECT_NULL)
     {
-      CFStringRef make = NULL,  model = NULL, serial = NULL;
-
-      copy_deviceinfo(idString, &make, &model, &serial);
-      if (make && CFStringCompare(make, g.make, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
-      {
-       if (model && CFStringCompare(model, g.model, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
-       {
-         if (g.serial != NULL && CFStringGetLength(g.serial) > 0)
-         {
-           if (serial != NULL && CFStringCompare(serial, g.serial, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
-           {
-             IOObjectRetain(obj);
-             g.printer_obj = obj;
-             keepLooking = false;
-           }
-         }
-         else
-         {
-           if (g.printer_obj != 0)
-             IOObjectRelease(g.printer_obj);
-
-           g.printer_obj = obj;
-           IOObjectRetain(obj);
-
-           if (g.location == 0 || g.location == location)
-             keepLooking = false;
-         }
-         if ( !keepLooking )
-               g.interfaceNum = interfaceNum;
-       }
-      }
+        CFStringRef make = deviceIDCopyManufacturer(deviceIDString);
+        CFStringRef model = deviceIDCopyModel(deviceIDString);
+        CFStringRef serial = deviceIDCopySerialNumber(deviceIDString);
+
+        if (make && CFStringCompare(make, g.make, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
+        {
+            if (model && CFStringCompare(model, g.model, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
+            {
+                if (g.serial != NULL && CFStringGetLength(g.serial) > 0)
+                {
+                    if (serial != NULL && CFStringCompare(serial, g.serial, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
+                    {
+                        IOObjectRetain(obj);
+                        g.printer_obj = obj;
+                        g.location = deviceLocation;
+                        g.alternateSetting = alternateSetting;
+                        keepLooking = false;
+                    }
+                }
+                else
+                {
+                    if (g.printer_obj != 0)
+                        IOObjectRelease(g.printer_obj);
+
+                    g.alternateSetting = alternateSetting;
+                    g.printer_obj = obj;
+                    IOObjectRetain(obj);
+
+                    if (g.location == 0 || g.location == deviceLocation)
+                        keepLooking = false;
+                }
+
+                if ( !keepLooking )
+                    g.interfaceNum = interfaceNum;
+            }
+        }
 
-      release_deviceinfo(&make, &model, &serial);
-      CFRelease(idString);
+        if (make) CFRelease(make);
+        if (model) CFRelease(model);
+        if (serial) CFRelease(serial);
     }
-  }
-  else
-  {
-    keepLooking = (g.printer_obj == 0);
-    if (obj == 0x0 && keepLooking)
+    else
     {
-      CFRunLoopTimerContext context = { 0, refcon, NULL, NULL, NULL };
-      CFRunLoopTimerRef timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent() + 1.0, 10, 0x0, 0x0, status_timer_cb, &context);
-      if (timer != NULL)
-      {
-       CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopDefaultMode);
-       g.status_timer = timer;
-      }
+        keepLooking = (g.printer_obj == 0);
+        if (obj == IO_OBJECT_NULL && keepLooking)
+        {
+            CFRunLoopTimerContext context = { 0, refcon, NULL, NULL, NULL };
+            CFRunLoopTimerRef timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent() + 1.0, 10, 0x0, 0x0, status_timer_cb, &context);
+            if (timer != NULL)
+            {
+                CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopDefaultMode);
+                g.status_timer = timer;
+            }
+        }
     }
-  }
 
-  if (!keepLooking && g.status_timer != NULL)
-  {
-    fputs("STATE: -offline-report\n", stderr);
-    _cupsLangPrintFilter(stderr, "INFO", _("The printer is now online."));
-    CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), g.status_timer, kCFRunLoopDefaultMode);
-    CFRelease(g.status_timer);
-    g.status_timer = NULL;
-  }
+    if (!keepLooking && g.status_timer != NULL)
+    {
+        fputs("STATE: -offline-report\n", stderr);
+        _cupsLangPrintFilter(stderr, "INFO", _("The printer is now online."));
+        CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), g.status_timer, kCFRunLoopDefaultMode);
+        CFRelease(g.status_timer);
+        g.status_timer = NULL;
+    }
 
-  return keepLooking;
+    return keepLooking;
 }
 
+static CFStringRef deviceIDCopySerialNumber(CFStringRef deviceID)
+{
+    CFStringRef serialKeys[] = { CFSTR("SN:"),  CFSTR("SERN:"), NULL };
+
+    return copy_value_for_key(deviceID, serialKeys);
+}
+
+static CFStringRef deviceIDCopyModel(CFStringRef deviceID)
+{
+    CFStringRef modelKeys[] = { CFSTR("MDL:"), CFSTR("MODEL:"), NULL };
+    return copy_value_for_key(deviceID, modelKeys);
+}
+
+static CFStringRef deviceIDCopyManufacturer(CFStringRef deviceID)
+{
+    CFStringRef makeKeys[]   = { CFSTR("MFG:"), CFSTR("MANUFACTURER:"), NULL };
+    return copy_value_for_key(deviceID, makeKeys);
+}
 
 /*
  * 'status_timer_cb()' - Status timer callback.
@@ -1326,59 +1422,6 @@ static void status_timer_cb(CFRunLoopTimerRef timer,
 
 #pragma mark -
 /*
- * 'copy_deviceinfo()' - Copy strings from the 1284 device ID.
- */
-
-static void copy_deviceinfo(CFStringRef deviceIDString,
-                           CFStringRef *make,
-                           CFStringRef *model,
-                           CFStringRef *serial)
-{
-  CFStringRef modelKeys[]  = { CFSTR("MDL:"), CFSTR("MODEL:"), NULL };
-  CFStringRef makeKeys[]   = { CFSTR("MFG:"), CFSTR("MANUFACTURER:"), NULL };
-  CFStringRef serialKeys[] = { CFSTR("SN:"),  CFSTR("SERN:"), NULL };
-
-  if (make != NULL)
-    *make = copy_value_for_key(deviceIDString, makeKeys);
-
-  if (model != NULL)
-    *model = copy_value_for_key(deviceIDString, modelKeys);
-
-  if (serial != NULL)
-    *serial = copy_value_for_key(deviceIDString, serialKeys);
-}
-
-
-/*
- * 'release_deviceinfo()' - Release deviceinfo strings.
- */
-
-static void release_deviceinfo(CFStringRef *make,
-                              CFStringRef *model,
-                              CFStringRef *serial)
-{
-  if (make != NULL && *make != NULL)
-  {
-    CFRelease(*make);
-    *make = NULL;
-  }
-
-  if (model != NULL && *model != NULL)
-  {
-    CFRelease(*model);
-    *model = NULL;
-  }
-
-  if (serial != NULL && *serial != NULL)
-  {
-    CFRelease(*serial);
-    *serial = NULL;
-  }
-}
-
-
-#pragma mark -
-/*
  * 'load_classdriver()' - Load a classdriver.
  */
 
@@ -1402,7 +1445,7 @@ static kern_return_t load_classdriver(CFStringRef     driverPath,
 
   _cups_fc_result_t result = _cupsFileCheck(bundlestr,
                                             _CUPS_FILE_CHECK_DIRECTORY, 1,
-                                            _cupsFileCheckFilter, NULL);
+                                            Iterating ? NULL : _cupsFileCheckFilter, NULL);
 
   if (result && driverPath)
     return (load_classdriver(NULL, interface, printerDriver));
@@ -1498,6 +1541,7 @@ static kern_return_t load_printerdriver(CFStringRef *driverBundlePath)
     {
       *driverBundlePath = IORegistryEntryCreateCFProperty(g.printer_obj, kUSBClassDriverProperty, NULL, kNilOptions);
 
+      g.use_generic_class_driver = (*driverBundlePath == NULL || (CFStringCompare(*driverBundlePath, kUSBGenericTOPrinterClassDriver, 0x0) == kCFCompareEqualTo));
       kr = load_classdriver(*driverBundlePath, interface, &g.classdriver);
 
       if (kr != kIOReturnSuccess)
@@ -1508,6 +1552,301 @@ static kern_return_t load_printerdriver(CFStringRef *driverBundlePath)
   return kr;
 }
 
+static printer_interface_t usb_printer_interface_interface(io_service_t usbClass)
+{
+       printer_interface_t  intf = NULL;
+       IOCFPlugInInterface **plugin = NULL;
+       SInt32  score;
+       int kr = IOCreatePlugInInterfaceForService(usbClass, kIOUSBInterfaceUserClientTypeID, kIOCFPlugInInterfaceID, &plugin, &score);
+       if (kr == kIOReturnSuccess)
+       {
+               (*plugin)->QueryInterface(plugin, USB_INTERFACE_KIND, (LPVOID *)&intf);
+               IODestroyPlugInInterface(plugin);
+       }
+
+       return intf;
+}
+
+static IOUSBDeviceInterface **usb_device_interface_for_device(io_service_t usbDevice)
+{
+       IOUSBDeviceInterface ** intf = NULL;
+       IOCFPlugInInterface **plugin = NULL;
+       SInt32  score;
+
+       int kr = IOCreatePlugInInterfaceForService(usbDevice, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &plugin, &score);
+       if (kr == kIOReturnSuccess)
+       {
+               (*plugin)->QueryInterface(plugin, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), (LPVOID *)&intf);
+               IODestroyPlugInInterface(plugin);
+       }
+
+       return intf;
+}
+
+
+static CFStringRef copy_printer_interface_deviceid(printer_interface_t printer, UInt8 alternateSetting)
+{
+       // I have tried to make this function as neat as I can, but the possibility of needing to resend
+       // a request to get the entire string makes it hideous...
+       //
+       // We package the job of sending a request up into the block (^sendRequest), which takes the size
+       // it should allocate for the message buffer. It frees the current buffer if one is set and
+       // allocates one of the specified size, then performs the request. We can then easily retry by
+       // calling the block again if we fail to get the whole string the first time around.
+
+       #define kUSBPrintClassGetDeviceID           0
+       #define kDefaultNoDataTimeout               5000L
+       #define pack_device_id_wIndex(intf, alt)  ((UInt16)((((UInt16)(intf)) << 8) | ((UInt8)(alt))))
+
+       if (printer == NULL)
+                       return NULL;
+
+
+       IOReturn err        = kIOReturnError;
+       UInt8    configurationIndex     = 0;
+       UInt8    interfaceNumber        = 0;
+       size_t   bufferLength           = 256;
+       CFStringRef ret             = NULL;
+
+       if ((*printer)->GetConfigurationValue( printer, &configurationIndex) == kIOReturnSuccess &&
+                       (*printer)->GetInterfaceNumber( printer, &interfaceNumber) == kIOReturnSuccess)
+       {
+               __block IOUSBDevRequestTO       request;
+               IOReturn (^sendRequest)(size_t) = ^ (size_t size)
+               {
+                       if (request.pData)
+                       {
+                               free(request.pData);
+                               request.wLength = 0;
+                               request.pData = NULL;
+                       }
+
+                       IOReturn berr = kIOReturnError;
+                       char *buffer = malloc(size);
+                       if (buffer == NULL)
+                               return kIOReturnNoMemory;
+
+                       request.wLength = HostToUSBWord(size);
+                       request.pData = buffer;
+                       berr = (*printer)->ControlRequestTO(printer, (UInt8)0, &request);
+                       return berr;
+               };
+
+               /* This request takes the 0 based configuration index. IOKit returns a 1 based configuration index */
+               configurationIndex -= 1;
+
+               bzero(&request, sizeof(request));
+
+               request.bmRequestType           = USBmakebmRequestType(kUSBIn, kUSBClass, kUSBInterface);
+               request.bRequest                        = kUSBPrintClassGetDeviceID;
+               request.wValue                          = HostToUSBWord(configurationIndex);
+               request.wIndex                          = HostToUSBWord(pack_device_id_wIndex(interfaceNumber, alternateSetting));
+               request.noDataTimeout           = kDefaultNoDataTimeout;
+               request.completionTimeout       = 0; // Copying behavior from Generic Class Driver
+
+               err = sendRequest(bufferLength);
+
+               if (err == kIOReturnSuccess && request.wLenDone > 1)
+               {
+                       UInt16 actualLength = OSSwapBigToHostInt16(*((UInt16 *)request.pData));
+
+                       if (actualLength > 2 && actualLength <= bufferLength - 2)
+                       {
+                               ret = CFStringCreateWithBytes(NULL, (const UInt8 *) &request.pData[2], actualLength - 2, kCFStringEncodingUTF8, false);
+                       }
+                       else if (actualLength > 2) {
+                               err = sendRequest(actualLength);
+                               if (err == kIOReturnSuccess && request.wLenDone > 0)
+                               {
+                                       actualLength = OSSwapBigToHostInt16(*((UInt16 *)request.pData));
+                                       ret = CFStringCreateWithBytes(NULL, (const UInt8 *) &request.pData[2], actualLength - 2, kCFStringEncodingUTF8, false);
+                               }
+                       }
+               }
+
+               if (request.pData)
+                       free(request.pData);
+       }
+
+       CFStringRef manufacturer = deviceIDCopyManufacturer(ret);
+       CFStringRef model = deviceIDCopyModel(ret);
+       CFStringRef serial = deviceIDCopySerialNumber(ret);
+
+       if (manufacturer == NULL || serial == NULL || model == NULL)
+       {
+               IOUSBDevRequestTO               request;
+               IOUSBDeviceDescriptor   desc;
+
+               bzero(&request, sizeof(request));
+
+               request.bmRequestType = USBmakebmRequestType( kUSBIn,  kUSBStandard, kUSBDevice );
+               request.bRequest = kUSBRqGetDescriptor;
+               request.wValue = kUSBDeviceDesc << 8;
+               request.wIndex = 0;
+               request.wLength = sizeof(desc);
+               request.pData = &desc;
+               request.completionTimeout = 0;
+               request.noDataTimeout = 60L;
+
+               err = (*printer)->ControlRequestTO(printer, 0, &request);
+               if (err == kIOReturnSuccess)
+               {
+                       CFMutableStringRef extras = CFStringCreateMutable(NULL, 0);
+                       if (manufacturer == NULL)
+                       {
+                               manufacturer = copy_printer_interface_indexed_description(printer, desc.iManufacturer, kUSBLanguageEnglish);
+                               if (manufacturer && CFStringGetLength(manufacturer) > 0)
+                                       CFStringAppendFormat(extras, NULL, CFSTR("MFG:%@;"), manufacturer);
+                       }
+
+                       if (model == NULL)
+                       {
+                               model = copy_printer_interface_indexed_description(printer, desc.iProduct, kUSBLanguageEnglish);
+                               if (model && CFStringGetLength(model) > 0)
+                                       CFStringAppendFormat(extras, NULL, CFSTR("MDL:%@;"), model);
+                       }
+
+                       if (serial == NULL && desc.iSerialNumber != 0)
+                       {
+                               serial = copy_printer_interface_indexed_description(printer, desc.iSerialNumber, kUSBLanguageEnglish);
+                               if (serial && CFStringGetLength(serial) > 0)
+                                       CFStringAppendFormat(extras, NULL, CFSTR("SERN:%@;"), serial);
+                       }
+
+                       if (ret != NULL)
+                       {
+                               CFStringAppend(extras, ret);
+                               CFRelease(ret);
+
+                               ret = extras;
+                       }
+                       else
+                       {
+                               ret = extras;
+                       }
+               }
+       }
+
+       if (ret != NULL)
+       {
+       /* Remove special characters from the serial number */
+       CFRange range = (serial != NULL ? CFStringFind(serial, CFSTR("+"), 0) : CFRangeMake(0, 0));
+       if (range.length == 1)
+       {
+               range = CFStringFind(ret, serial, 0);
+
+               CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret);
+               CFRelease(ret);
+
+               ret = deviceIDString;
+               CFStringFindAndReplace(deviceIDString, CFSTR("+"), CFSTR(""), range, 0);
+       }
+       }
+
+       if (manufacturer != NULL)
+               CFRelease(manufacturer);
+
+       if (model != NULL)
+               CFRelease(model);
+
+       if (serial != NULL)
+               CFRelease(serial);
+
+       if (ret != NULL && CFStringGetLength(ret) == 0)
+       {
+               CFRelease(ret);
+               return NULL;
+       }
+
+       return ret;
+}
+
+static CFStringRef copy_printer_interface_indexed_description(printer_interface_t  printer, UInt8 index, UInt16 language)
+{
+       IOReturn err;
+       UInt8 description[256]; // Max possible descriptor length
+       IOUSBDevRequestTO       request;
+
+       bzero(description, 2);
+
+       request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
+       request.bRequest = kUSBRqGetDescriptor;
+       request.wValue = (kUSBStringDesc << 8) | index;
+       request.wIndex = language;
+       request.wLength = 2;
+       request.pData = &description;
+       request.completionTimeout = 0;
+       request.noDataTimeout = 60L;
+
+       err = (*printer)->ControlRequestTO(printer, 0, &request);
+       if (err != kIOReturnSuccess && err != kIOReturnOverrun)
+       {
+               bzero(description, request.wLength);
+
+               // Let's try again full length. Here's why:
+               //      On USB 2.0 controllers, we will not get an overrun error.  We just get a "babble" error
+               //      and no valid data.  So, if we ask for the max size, we will either get it, or we'll get an underrun.
+               //      It looks like we get it w/out an underrun
+
+               request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
+               request.bRequest = kUSBRqGetDescriptor;
+               request.wValue = (kUSBStringDesc << 8) | index;
+               request.wIndex = language;
+               request.wLength = sizeof description;
+               request.pData = &description;
+               request.completionTimeout = 0;
+               request.noDataTimeout = 60L;
+
+               err = (*printer)->ControlRequestTO(printer, 0, &request);
+               if (err != kIOReturnSuccess && err != kIOReturnUnderrun)
+                       return NULL;
+       }
+
+       unsigned int length = description[0];
+       if (length == 0)
+               return CFStringCreateWithCString(NULL, "", kCFStringEncodingUTF8);
+
+       if (description[1] != kUSBStringDesc)
+               return NULL;
+
+       request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
+       request.bRequest = kUSBRqGetDescriptor;
+       request.wValue = (kUSBStringDesc << 8) | index;
+       request.wIndex = language;
+
+       bzero(description, length);
+       request.wLength = (UInt16)length;
+       request.pData = &description;
+       request.completionTimeout = 0;
+       request.noDataTimeout = 60L;
+
+       err = (*printer)->ControlRequestTO(printer, 0, &request);
+       if (err != kIOReturnSuccess)
+               return NULL;
+
+       if (description[1] != kUSBStringDesc)
+               return NULL;
+
+       if ((description[0] & 1) != 0)
+               description[0] &= 0xfe;
+
+       char buffer[258] = {};
+       unsigned int maxLength = sizeof buffer;
+       if (description[0] > 1)
+       {
+               length = (description[0]-2)/2;
+
+               if (length > maxLength - 1)
+                       length = maxLength -1;
+
+               for (unsigned i = 0; i < length; i++)
+                       buffer[i] = (char) description[2*i+2];
+
+               buffer[length] = 0;
+       }
+
+       return CFStringCreateWithCString(NULL, buffer, kCFStringEncodingUTF8);
+}
 
 /*
  * 'registry_open()' - Open a connection to the printer.
@@ -1561,144 +1900,6 @@ static kern_return_t registry_close(void)
   return kIOReturnSuccess;
 }
 
-
-/*
- * 'copy_deviceid()' - Copy the 1284 device id string.
- */
-
-static OSStatus copy_deviceid(classdriver_t **classdriver,
-                             CFStringRef *deviceID)
-{
-  CFStringRef devID = NULL,
-
-  deviceMake = NULL,
-  deviceModel = NULL,
-  deviceSerial = NULL;
-
-  OSStatus err = (*classdriver)->GetDeviceID(classdriver, &devID, DEFAULT_TIMEOUT);
-
-  copy_deviceinfo(devID, &deviceMake, &deviceModel, &deviceSerial);
-
-  if (deviceMake == NULL || deviceModel == NULL || deviceSerial == NULL)
-  {
-    IOUSBDeviceDescriptor      desc;
-    iodevice_request_t         request;
-
-    request.requestType = USBmakebmRequestType(kUSBIn,  kUSBStandard, kUSBDevice);
-    request.request = kUSBRqGetDescriptor;
-    request.value = (kUSBDeviceDesc << 8) | 0;
-    request.index = 0;
-    request.length = sizeof(desc);
-    request.buffer = &desc;
-    err = (*classdriver)->DeviceRequest(classdriver, &request, DEFAULT_TIMEOUT);
-    if (err == kIOReturnSuccess)
-    {
-      CFMutableStringRef newDevID = CFStringCreateMutable(NULL, 0);
-
-      if (deviceMake == NULL)
-      {
-       CFStringRef data = NULL;
-       err = (*classdriver)->GetString(classdriver, desc.iManufacturer, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data);
-       if (data != NULL)
-       {
-         CFStringAppendFormat(newDevID, NULL, CFSTR("MFG:%@;"), data);
-         CFRelease(data);
-       }
-      }
-
-      if (deviceModel == NULL)
-      {
-       CFStringRef data = NULL;
-       err = (*classdriver)->GetString(classdriver, desc.iProduct, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data);
-       if (data != NULL)
-       {
-         CFStringAppendFormat(newDevID, NULL, CFSTR("MDL:%@;"), data);
-         CFRelease(data);
-       }
-      }
-
-      if (deviceSerial == NULL && desc.iSerialNumber != 0)
-      {
-       CFStringRef data = NULL;
-       err = (*classdriver)->GetString(classdriver, desc.iSerialNumber, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data);
-       if (data != NULL)
-       {
-         CFStringAppendFormat(newDevID, NULL, CFSTR("SERN:%@;"), data);
-         CFRelease(data);
-       }
-      }
-
-      if (devID != NULL)
-      {
-       CFStringAppend(newDevID, devID);
-       CFRelease(devID);
-      }
-
-      *deviceID = newDevID;
-    }
-  }
-  else
-  {
-    *deviceID = devID;
-  }
-  release_deviceinfo(&deviceMake, &deviceModel, &deviceSerial);
-
-  return err;
-}
-
-
-/*
- * 'copy_devicestring()' - Copy the 1284 device id string.
- */
-
-static void copy_devicestring(io_service_t usbInterface,
-                             CFStringRef *deviceID,
-                             UInt32 *deviceLocation,
-                             UInt8     *interfaceNumber )
-{
-  IOCFPlugInInterface  **iodev = NULL;
-  SInt32               score;
-  kern_return_t                kr;
-  printer_interface_t  interface;
-  HRESULT              res;
-  classdriver_t        **klassDriver = NULL;
-  CFStringRef          driverBundlePath;
-
-  if ((kr = IOCreatePlugInInterfaceForService(usbInterface,
-                                        kIOUSBInterfaceUserClientTypeID,
-                                        kIOCFPlugInInterfaceID,
-                                        &iodev, &score)) == kIOReturnSuccess)
-  {
-    if ((res = (*iodev)->QueryInterface(iodev, USB_INTERFACE_KIND, (LPVOID *)
-                                       &interface)) == noErr)
-    {
-      (*interface)->GetLocationID(interface, deviceLocation);
-      (*interface)->GetInterfaceNumber(interface, interfaceNumber);
-
-      driverBundlePath = IORegistryEntryCreateCFProperty(usbInterface,
-                                                        kUSBClassDriverProperty,
-                                                        NULL, kNilOptions);
-
-      kr = load_classdriver(driverBundlePath, interface, &klassDriver);
-
-      if (kr != kIOReturnSuccess && driverBundlePath != NULL)
-       kr = load_classdriver(NULL, interface, &klassDriver);
-
-      if (kr == kIOReturnSuccess && klassDriver != NULL)
-         kr = copy_deviceid(klassDriver, deviceID);
-
-      unload_classdriver(&klassDriver);
-
-      if (driverBundlePath != NULL)
-       CFRelease(driverBundlePath);
-
-      /* (*interface)->Release(interface); */
-    }
-    IODestroyPlugInInterface(iodev);
-  }
-}
-
-
 #pragma mark -
 /*
  * 'copy_value_for_key()' - Copy value string associated with a key.
@@ -1849,7 +2050,7 @@ static void parse_options(char *options,
     else if (!_cups_strcasecmp(name, "serial"))
       strlcpy(serial, value, serial_size);
     else if (!_cups_strcasecmp(name, "location") && location)
-      *location = strtol(value, NULL, 16);
+      *location = (UInt32)strtoul(value, NULL, 16);
   }
 }
 
@@ -1912,6 +2113,7 @@ static void run_legacy_backend(int argc,
   char *my_argv[32];
   char *usb_legacy_status;
 
+
  /*
   * If we're running as x86_64 or i386 and couldn't load the class driver
   * (because it's ppc or i386), then try to re-exec ourselves in ppc or i386
@@ -1928,6 +2130,8 @@ static void run_legacy_backend(int argc,
 
   if (!usb_legacy_status)
   {
+    log_usb_class_driver(IS_NOT_64BIT);
+
    /*
     * Setup a SIGTERM handler then block it before forking...
     */
@@ -1995,7 +2199,7 @@ static void run_legacy_backend(int argc,
       cups_serverbin = CUPS_SERVERBIN;
     snprintf(usbpath, sizeof(usbpath), "%s/backend/usb", cups_serverbin);
 
-    for (i = 0; i < argc && i < (sizeof(my_argv) / sizeof(my_argv[0])) - 1; i ++)
+    for (i = 0; i < argc && i < (int)(sizeof(my_argv) / sizeof(my_argv[0])) - 1; i ++)
       my_argv[i] = argv[i];
 
     my_argv[i] = NULL;
@@ -2081,19 +2285,45 @@ sigterm_handler(int sig)                /* I - Signal */
     while (waitpid(child_pid, &status, 0) < 0 && errno == EINTR);
 
     if (WIFEXITED(status))
-      exit(WEXITSTATUS(status));
+      _exit(WEXITSTATUS(status));
     else if (status == SIGTERM || status == SIGKILL)
-      exit(0);
+      _exit(0);
     else
     {
-      fprintf(stderr, "DEBUG: Child crashed on signal %d\n", status);
-      exit(CUPS_BACKEND_STOP);
+      write(2, "DEBUG: Child crashed.\n", 22);
+      _exit(CUPS_BACKEND_STOP);
     }
   }
 #endif /* __i386__ || __x86_64__ */
 }
 
 
+/*
+ * 'sigquit_handler()' - SIGQUIT handler.
+ */
+
+static void sigquit_handler(int sig, siginfo_t *si, void *unused)
+{
+  char  *path;
+  char pathbuf[PROC_PIDPATHINFO_MAXSIZE];
+  static char msgbuf[256] = "";
+
+
+  (void)sig;
+  (void)unused;
+
+  if (proc_pidpath(si->si_pid, pathbuf, sizeof(pathbuf)) > 0 &&
+      (path = basename(pathbuf)) != NULL)
+    snprintf(msgbuf, sizeof(msgbuf), "SIGQUIT sent by %s(%d)", path, (int)si->si_pid);
+  else
+    snprintf(msgbuf, sizeof(msgbuf), "SIGQUIT sent by PID %d", (int)si->si_pid);
+
+  CRSetCrashLogMessage(msgbuf);
+
+  abort();
+}
+
+
 #ifdef PARSE_PS_ERRORS
 /*
  * 'next_line()' - Find the next line in a buffer.
@@ -2164,7 +2394,7 @@ static void parse_pserror(char *sockBuffer,
     }
 
     /* move everything over... */
-    strcpy(gErrorBuffer, pLineEnd);
+    strlcpy(gErrorBuffer, pLineEnd, sizeof(gErrorBuffer));
     gErrorBufferPtr = gErrorBuffer;
     pLineEnd = (char *)next_line((const char *)gErrorBuffer);
   }
@@ -2251,19 +2481,61 @@ static void get_device_id(cups_sc_status_t *status,
 {
   CFStringRef deviceIDString = NULL;
 
-  /* GetDeviceID */
-  copy_deviceid(g.classdriver, &deviceIDString);
+  if (g.printer_obj != IO_OBJECT_NULL)
+  {
+    printer_interface_t printerIntf = usb_printer_interface_interface(g.printer_obj);
+    if (printerIntf)
+    {
+      deviceIDString = copy_printer_interface_deviceid(printerIntf, g.alternateSetting);
+      (*printerIntf)->Release(printerIntf);
+    }
+  }
+
 
   if (deviceIDString)
   {
-    CFStringGetCString(deviceIDString, data, *datalen, kCFStringEncodingUTF8);
-    *datalen = strlen(data);
+    if (CFStringGetCString(deviceIDString, data, *datalen, kCFStringEncodingUTF8))
+      *datalen = (int)strlen(data);
+    else
+      *datalen = 0;
+
     CFRelease(deviceIDString);
   }
+  else
+  {
+    *datalen = 0;
+  }
+
   *status  = CUPS_SC_STATUS_OK;
 }
 
 
+static void
+log_usb_class_driver(int is_64bit)     /* I - Is the USB class driver 64-bit? */
+{
+ /*
+  * Report the usage of legacy USB class drivers to Apple if the user opts into providing
+  * feedback to Apple...
+  */
+
+  aslmsg aslm = asl_new(ASL_TYPE_MSG);
+  if (aslm)
+  {
+    ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
+    const char *make_model = ppd ? ppd->nickname : NULL;
+    ppd_attr_t *version = ppdFindAttr(ppd, "FileVersion", "");
+
+    asl_set(aslm, "com.apple.message.domain", "com.apple.printing.usb.64bit");
+    asl_set(aslm, "com.apple.message.result", is_64bit ? "yes" : "no");
+    asl_set(aslm, "com.apple.message.signature", make_model ? make_model : "Unknown");
+    asl_set(aslm, "com.apple.message.signature2", version ? version->value : "?.?");
+    asl_set(aslm, "com.apple.message.summarize", "YES");
+    asl_log(NULL, aslm, ASL_LEVEL_NOTICE, "");
+    asl_free(aslm);
+  }
+}
+
+
 /*
- * End of "$Id: usb-darwin.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: usb-darwin.c 12928 2015-10-23 21:31:58Z msweet $".
  */
index 8101006..ffb2fe9 100644 (file)
@@ -1,35 +1,15 @@
 /*
- * "$Id: usb-libusb.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: usb-libusb.c 12881 2015-09-15 21:20:02Z msweet $"
  *
- *   LIBUSB interface code for CUPS.
+ * LIBUSB interface code for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
+ * Copyright 2007-2015 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   list_devices()      - List the available printers.
- *   print_device()      - Print a file to a USB device.
- *   close_device()      - Close the connection to the USB printer.
- *   compare_quirks()    - Compare two quirks entries.
- *   find_device()       - Find or enumerate USB printers.
- *   find_quirks()       - Find the quirks for the given printer, if any.
- *   get_device_id()     - Get the IEEE-1284 device ID for the printer.
- *   list_cb()           - List USB printers for discovery.
- *   load_quirks()       - Load all quirks files in the /usr/share/cups/usb
- *                         directory.
- *   make_device_uri()   - Create a device URI for a USB printer.
- *   open_device()       - Open a connection to the USB printer.
- *   print_cb()          - Find a USB printer for printing.
- *   read_thread()       - Thread to read the backchannel data on.
- *   sidechannel_thread() - Handle side-channel requests.
- *   soft_reset()        - Send a soft reset to the device.
- *   soft_reset_printer() - Do the soft reset request specific to printers
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -123,6 +103,7 @@ typedef struct usb_globals_s                /* Global USB printer information */
 #define USB_QUIRK_USB_INIT     0x0010  /* Needs vendor USB init string */
 #define USB_QUIRK_VENDOR_CLASS 0x0020  /* Descriptor uses vendor-specific
                                           Class or SubClass */
+#define USB_QUIRK_DELAY_CLOSE  0x0040  /* Delay close */
 #define USB_QUIRK_WHITELIST    0x0000  /* no quirks */
 
 
@@ -496,7 +477,7 @@ print_device(const char *uri,               /* I - Device URI */
        iostatus = libusb_bulk_transfer(g.printer->handle,
                                        g.printer->write_endp,
                                        print_buffer, g.print_bytes,
-                                       &bytes, 60000);
+                                       &bytes, 0);
        /*
        * Ignore timeout errors, but retain the number of bytes written to
        * avoid sending duplicate data...
@@ -519,7 +500,7 @@ print_device(const char *uri,               /* I - Device URI */
          iostatus = libusb_bulk_transfer(g.printer->handle,
                                          g.printer->write_endp,
                                          print_buffer, g.print_bytes,
-                                         &bytes, 60000);
+                                         &bytes, 0);
        }
 
        /*
@@ -534,7 +515,7 @@ print_device(const char *uri,               /* I - Device URI */
          iostatus = libusb_bulk_transfer(g.printer->handle,
                                          g.printer->write_endp,
                                          print_buffer, g.print_bytes,
-                                         &bytes, 60000);
+                                         &bytes, 0);
         }
 
        if (iostatus)
@@ -661,6 +642,9 @@ print_device(const char *uri,               /* I - Device URI */
   * Close the connection and input file and general clean up...
   */
 
+  if (g.printer->quirks & USB_QUIRK_DELAY_CLOSE)
+    sleep(1);
+
   close_device(g.printer);
 
  /*
@@ -920,8 +904,8 @@ find_device(usb_cb_t   cb,          /* I - Callback function */
              fprintf(stderr, "DEBUG: Printer does not report class 7 and/or "
                      "subclass 1 but works as a printer anyway\n");
 
-           read_endp  = -1;
-           write_endp = -1;
+           read_endp  = 0xff;
+           write_endp = 0xff;
 
            for (endp = 0, endpptr = altptr->endpoint;
                 endp < altptr->bNumEndpoints;
@@ -935,7 +919,7 @@ find_device(usb_cb_t   cb,          /* I - Callback function */
                  write_endp = endp;
              }
 
-            if (write_endp >= 0)
+            if (write_endp != 0xff)
            {
             /*
              * Save the best match so far...
@@ -1085,8 +1069,7 @@ get_device_id(usb_printer_t *printer,     /* I - Printer */
   * bytes.  The 1284 spec says the length is stored MSB first...
   */
 
-  length = (((unsigned)buffer[0] & 255) << 8) |
-          ((unsigned)buffer[1] & 255);
+  length = (int)((((unsigned)buffer[0] & 255) << 8) | ((unsigned)buffer[1] & 255));
 
  /*
   * Check to see if the length is larger than our buffer or less than 14 bytes
@@ -1097,8 +1080,7 @@ get_device_id(usb_printer_t *printer,     /* I - Printer */
   */
 
   if (length > bufsize || length < 14)
-    length = (((unsigned)buffer[1] & 255) << 8) |
-            ((unsigned)buffer[0] & 255);
+    length = (int)((((unsigned)buffer[1] & 255) << 8) | ((unsigned)buffer[0] & 255));
 
   if (length > bufsize)
     length = bufsize;
@@ -1120,7 +1102,7 @@ get_device_id(usb_printer_t *printer,     /* I - Printer */
   * nul-terminate.
   */
 
-  memmove(buffer, buffer + 2, length);
+  memmove(buffer, buffer + 2, (size_t)length);
   buffer[length] = '\0';
 
   return (0);
@@ -1233,6 +1215,9 @@ load_quirks(void)
       if (strstr(line, " blacklist"))
         quirk->quirks |= USB_QUIRK_BLACKLIST;
 
+      if (strstr(line, " delay-close"))
+        quirk->quirks |= USB_QUIRK_DELAY_CLOSE;
+
       if (strstr(line, " no-reattach"))
         quirk->quirks |= USB_QUIRK_NO_REATTACH;
 
@@ -1473,9 +1458,14 @@ open_device(usb_printer_t *printer,      /* I - Printer */
   else
   {
     printer->usblp_attached = 0;
-    fprintf(stderr, "DEBUG: Failed to check whether %04x:%04x has the \"usblp\" kernel module attached\n",
-             devdesc.idVendor, devdesc.idProduct);
-    goto error;
+
+    if (errcode != LIBUSB_ERROR_NOT_SUPPORTED)
+    {
+      fprintf(stderr,
+              "DEBUG: Failed to check whether %04x:%04x has the \"usblp\" "
+              "kernel module attached\n", devdesc.idVendor, devdesc.idProduct);
+      goto error;
+    }
   }
 
  /*
@@ -1539,6 +1529,16 @@ open_device(usb_printer_t *printer,      /* I - Printer */
 
       goto error;
     }
+    else if ((errcode = libusb_detach_kernel_driver(printer->handle, printer->iface)) < 0)
+    {
+      fprintf(stderr,
+              "DEBUG: Failed to detach \"usblp\" module from %04x:%04x\n",
+              devdesc.idVendor, devdesc.idProduct);
+
+      goto error;
+    }
+
+    sleep (1);
   }
 
  /*
@@ -1734,7 +1734,7 @@ static void *read_thread(void *reference)
     {
       fprintf(stderr, "DEBUG: Read %d bytes of back-channel data...\n",
               (int)rbytes);
-      cupsBackChannelWrite((const char *)readbuffer, rbytes, 1.0);
+      cupsBackChannelWrite((const char *)readbuffer, (size_t)rbytes, 1.0);
     }
     else if (readstatus == LIBUSB_ERROR_TIMEOUT)
       fputs("DEBUG: Got USB transaction timeout during read.\n", stderr);
@@ -2021,6 +2021,6 @@ soft_reset_printer(
 
 
 /*
- * End of "$Id: usb-libusb.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: usb-libusb.c 12881 2015-09-15 21:20:02Z msweet $".
  */
 
index adcd254..813039d 100644 (file)
@@ -1,27 +1,20 @@
 /*
- * "$Id: usb-unix.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: usb-unix.c 12124 2014-08-28 15:37:22Z msweet $"
  *
- *   USB port backend for CUPS.
+ * USB port backend for CUPS.
  *
- *   This file is included from "usb.c" when compiled on UNIX/Linux.
+ * This file is included from "usb.c" when compiled on UNIX/Linux.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2013 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   print_device() - Print a file to a USB device.
- *   list_devices() - List all USB devices.
- *   open_device()  - Open a USB device...
- *   side_cb()      - Handle side-channel requests...
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -153,7 +146,7 @@ print_device(const char *uri,               /* I - Device URI */
 
   tcgetattr(device_fd, &opts);
 
-  opts.c_lflag &= ~(ICANON | ECHO | ISIG);     /* Raw mode */
+  opts.c_lflag &= ~(unsigned)(ICANON | ECHO | ISIG);   /* Raw mode */
 
   /**** No options supported yet ****/
 
@@ -257,7 +250,6 @@ list_devices(void)
 
     close(fd);
   }
-#elif defined(__sgi)
 #elif defined(__sun) && defined(ECPPIOC_GETDEVID)
   int  i;                      /* Looping var */
   int  fd;                     /* File descriptor */
@@ -286,8 +278,6 @@ list_devices(void)
       close(fd);
     }
   }
-#elif defined(__hpux)
-#elif defined(__osf)
 #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
   int   i;                      /* Looping var */
   char  device[255];            /* Device filename */
@@ -613,5 +603,5 @@ side_cb(int         print_fd,               /* I - Print file */
 
 
 /*
- * End of "$Id: usb-unix.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: usb-unix.c 12124 2014-08-28 15:37:22Z msweet $".
  */
index 914a4ac..3ccbc00 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: usb.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: usb.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   USB port backend for CUPS.
  *
@@ -260,5 +260,5 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
 
 
 /*
- * End of "$Id: usb.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: usb.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 46b71d9..76b1f2a 100644 (file)
@@ -1,25 +1,28 @@
 lpc.o: lpc.c ../cups/cups-private.h ../cups/string-private.h ../config.h \
-  ../cups/debug-private.h ../cups/versioning.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../cups/debug-private.h ../cups/versioning.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h
 lpq.o: lpq.c ../cups/cups-private.h ../cups/string-private.h ../config.h \
-  ../cups/debug-private.h ../cups/versioning.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../cups/debug-private.h ../cups/versioning.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h
 lpr.o: lpr.c ../cups/cups-private.h ../cups/string-private.h ../config.h \
-  ../cups/debug-private.h ../cups/versioning.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../cups/debug-private.h ../cups/versioning.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h
 lprm.o: lprm.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
index 8f208ae..6534f76 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 10996 2013-05-29 11:51:34Z msweet $"
 #
 #   Berkeley commands makefile for CUPS.
 #
@@ -88,6 +88,7 @@ install-exec:
                $(INSTALL_DIR) $(SYMROOT); \
                for file in $(TARGETS); do \
                        cp $$file $(SYMROOT); \
+                       dsymutil $(SYMROOT)/$$file; \
                done \
        fi
 
@@ -163,5 +164,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 10996 2013-05-29 11:51:34Z msweet $".
 #
index e402a78..72b0f71 100644 (file)
@@ -1,24 +1,16 @@
 /*
- * "$Id: lpc.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpc.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   "lpc" command for CUPS.
+ * "lpc" command for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()            - Parse options and commands.
- *   compare_strings() - Compare two command-line strings.
- *   do_command()      - Do an lpc command...
- *   show_help()       - Show help messages.
- *   show_status()     - Show printers.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -32,7 +24,7 @@
  * Local functions...
  */
 
-static int     compare_strings(const char *, const char *, int);
+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 *);
@@ -158,9 +150,9 @@ main(int  argc,                             /* I - Number of command-line arguments */
 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 */
-                int        tmin)       /* I - Minimum number of unique chars in option */
+                size_t     tmin)       /* I - Minimum number of unique chars in option */
 {
-  int  slen;                           /* Length of command-line string */
+  size_t       slen;                   /* Length of command-line string */
 
 
   slen = strlen(s);
@@ -446,5 +438,5 @@ show_status(http_t     *http,               /* I - HTTP connection to server */
 
 
 /*
- * End of "$Id: lpc.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpc.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index d3839d5..0cb9047 100644 (file)
@@ -1,27 +1,16 @@
 /*
- * "$Id: lpq.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpq.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   "lpq" command for CUPS.
+ * "lpq" command for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()         - Parse options and commands.
- *   show_jobs()    - Show jobs.
- *   show_printer() - Show printer status.
- *   usage()        - Show program usage.
- */
-
-/*
- * Include necessary headers...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -138,8 +127,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
             if ((named_dest = cupsGetNamedDest(http, dest, instance)) == NULL)
            {
-             if (cupsLastError() == IPP_BAD_REQUEST ||
-                 cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+             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]);
@@ -194,7 +183,6 @@ main(int  argc,                             /* I - Number of command-line arguments */
            httpClose(http);
 
            usage();
-           break;
       }
     }
     else if (isdigit(argv[i][0] & 255))
@@ -208,8 +196,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
   {
     if ((named_dest = cupsGetNamedDest(http, NULL, NULL)) == NULL)
     {
-      if (cupsLastError() == IPP_BAD_REQUEST ||
-          cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+      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."),
@@ -262,7 +250,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
     if (i && interval)
     {
       fflush(stdout);
-      sleep(interval);
+      sleep((unsigned)interval);
     }
     else
       break;
@@ -323,9 +311,6 @@ show_jobs(const char *command,              /* I - Command name */
   ipp_jstate_t jobstate;               /* job-state */
   int          jobid,                  /* job-id */
                jobsize,                /* job-k-octets */
-#ifdef __osf__
-               jobpriority,            /* job-priority */
-#endif /* __osf__ */
                jobcount,               /* Number of jobs */
                jobcopies,              /* Number of copies */
                rank;                   /* Rank of job */
@@ -448,9 +433,6 @@ show_jobs(const char *command,              /* I - Command name */
 
       jobid       = 0;
       jobsize     = 0;
-#ifdef __osf__
-      jobpriority = 50;
-#endif /* __osf__ */
       jobstate    = IPP_JOB_PENDING;
       jobname     = "unknown";
       jobuser     = "unknown";
@@ -467,12 +449,6 @@ show_jobs(const char *command,             /* I - Command name */
            attr->value_tag == IPP_TAG_INTEGER)
          jobsize = attr->values[0].integer;
 
-#ifdef __osf__
-        if (!strcmp(attr->name, "job-priority") &&
-           attr->value_tag == IPP_TAG_INTEGER)
-         jobpriority = attr->values[0].integer;
-#endif /* __osf__ */
-
         if (!strcmp(attr->name, "job-state") &&
            attr->value_tag == IPP_TAG_ENUM)
          jobstate = (ipp_jstate_t)attr->values[0].integer;
@@ -510,16 +486,9 @@ show_jobs(const char *command,             /* I - Command name */
       }
 
       if (!longstatus && jobcount == 0)
-#ifdef __osf__
-       _cupsLangPuts(stdout,
-                     /* TRANSLATORS: Pri is job priority. */
-                     _("Rank   Owner      Pri  Job        Files"
-                       "                       Total Size"));
-#else
        _cupsLangPuts(stdout,
                      _("Rank    Owner   Job     File(s)"
                        "                         Total Size"));
-#endif /* __osf__ */
 
       jobcount ++;
 
@@ -528,7 +497,7 @@ show_jobs(const char *command,              /* I - Command name */
       */
 
       if (jobstate == IPP_JOB_PROCESSING)
-       strcpy(rankstr, "active");
+       strlcpy(rankstr, "active", sizeof(rankstr));
       else
       {
        /*
@@ -560,16 +529,9 @@ show_jobs(const char *command,             /* I - Command name */
                        namestr, 1024.0 * jobsize);
       }
       else
-#ifdef __osf__
-        _cupsLangPrintf(stdout,
-                       _("%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"),
-                       rankstr, jobuser, jobpriority, jobid, jobname,
-                       1024.0 * jobsize);
-#else
         _cupsLangPrintf(stdout,
                        _("%-7s %-7.7s %-7d %-31.31s %.0f bytes"),
                        rankstr, jobuser, jobid, jobname, 1024.0 * jobsize);
-#endif /* __osf */
 
       if (attr == NULL)
         break;
@@ -679,5 +641,5 @@ usage(void)
 
 
 /*
- * End of "$Id: lpq.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpq.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 724a0c1..24242ca 100644 (file)
@@ -1,20 +1,16 @@
 /*
- * "$Id: lpr.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpr.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   "lpr" command for CUPS.
+ * "lpr" command for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main() - Parse options and send files for printing.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -227,8 +223,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
                                              dest->options[j].value,
                                              num_options, &options);
            }
-           else if (cupsLastError() == IPP_BAD_REQUEST ||
-                    cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+           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 "
@@ -330,8 +326,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
                                      dest->options[j].value,
                                      num_options, &options);
     }
-    else if (cupsLastError() == IPP_BAD_REQUEST ||
-            cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+    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 "
@@ -406,7 +402,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
     while (status == HTTP_CONTINUE &&
            (bytes = read(0, buffer, sizeof(buffer))) > 0)
-      status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, bytes);
+      status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, (size_t)bytes);
 
     if (status != HTTP_CONTINUE)
     {
@@ -436,5 +432,5 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: lpr.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpr.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 3427def..922bbbd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: lprm.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lprm.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   "lprm" command for CUPS.
  *
@@ -213,5 +213,5 @@ main(int  argc,                     /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: lprm.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lprm.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index ff16e48..66ffa01 100644 (file)
@@ -1,73 +1,72 @@
 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 help-index.h \
+  ../cups/array.h ../cups/language.h ../cups/pwg.h help-index.h \
   ../cups/debug-private.h ../cups/language-private.h ../cups/transcode.h \
   ../cups/string-private.h ../config.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 help-index.h ../cups/debug-private.h \
+  ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
   ../cups/language-private.h ../cups/transcode.h \
   ../cups/string-private.h ../config.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 help-index.h ../cups/debug-private.h \
+  ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
   ../cups/language-private.h ../cups/transcode.h \
   ../cups/string-private.h ../config.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 help-index.h ../cups/debug-private.h \
+  ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
   ../cups/language-private.h ../cups/transcode.h \
   ../cups/string-private.h ../config.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 help-index.h ../cups/debug-private.h \
+  ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
   ../cups/language-private.h ../cups/transcode.h \
   ../cups/string-private.h ../config.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 help-index.h ../cups/debug-private.h \
+  ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
   ../cups/language-private.h ../cups/transcode.h \
   ../cups/string-private.h ../config.h ../cups/ipp-private.h \
   ../cups/md5-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 help-index.h ../cups/debug-private.h \
+  ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
   ../cups/language-private.h ../cups/transcode.h \
   ../cups/string-private.h ../config.h ../cups/ipp-private.h \
   ../cups/adminutil.h ../cups/ppd.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 help-index.h ../cups/debug-private.h \
+  ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
   ../cups/language-private.h ../cups/transcode.h \
   ../cups/string-private.h ../config.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 help-index.h ../cups/debug-private.h \
+  ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
   ../cups/language-private.h ../cups/transcode.h \
   ../cups/string-private.h ../config.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 help-index.h ../cups/debug-private.h \
+  ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
   ../cups/language-private.h ../cups/transcode.h \
   ../cups/string-private.h ../config.h ../cups/ipp-private.h
-makedocset.o: makedocset.c cgi.h ../cups/cups.h ../cups/file.h \
-  ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/language.h help-index.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 ../cups/transcode.h \
+  ../cups/string-private.h ../config.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 help-index.h ../cups/debug-private.h \
+  ../cups/language.h ../cups/pwg.h help-index.h ../cups/debug-private.h \
   ../cups/language-private.h ../cups/transcode.h \
   ../cups/string-private.h ../config.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 help-index.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 help-index.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 help-index.h
-websearch.o: websearch.c cgi.h ../cups/cups.h ../cups/file.h \
-  ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/language.h help-index.h
+  ../cups/language.h ../cups/pwg.h help-index.h
index a3d5265..898fb7b 100644 (file)
@@ -1,16 +1,16 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12519 2015-02-17 13:10:19Z msweet $"
 #
-#   CGI makefile for CUPS.
+# CGI makefile for CUPS.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 1997-2006 by Easy Software Products.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2006 by Easy Software Products.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 include ../Makedefs
@@ -32,8 +32,7 @@ OBJS  =       \
                printers.o \
                testcgi.o \
                testhi.o \
-               testtemplate.o \
-               websearch.o
+               testtemplate.o
 CGIS   =       \
                admin.cgi \
                classes.cgi \
@@ -42,8 +41,7 @@ CGIS  =       \
                printers.cgi
 LIBTARGETS =   \
                libcupscgi.a \
-               $(LIBCUPSCGI) \
-               websearch
+               $(LIBCUPSCGI)
 
 UNITTARGETS =  \
                testcgi \
@@ -82,7 +80,7 @@ unittests:    $(UNITTARGETS)
 
 clean:
        $(RM) $(OBJS) $(TARGETS) $(UNITTARGETS) makedocset
-       $(RM) libcupscgi.so libcupscgi.sl libcupscgi.dylib
+       $(RM) libcupscgi.so libcupscgi.dylib
 
 
 #
@@ -120,6 +118,7 @@ install-exec:
                $(INSTALL_DIR) $(SYMROOT); \
                for file in $(CGIS); do \
                        cp $$file $(SYMROOT); \
+                       dsymutil $(SYMROOT)/$$file; \
                done \
        fi
 
@@ -143,7 +142,7 @@ install-libs: $(INSTALLSTATIC)
        echo Installing libraries in $(LIBDIR)...
        $(INSTALL_DIR) -m 755 $(LIBDIR)
        $(INSTALL_LIB) $(LIBCUPSCGI) $(LIBDIR)
-       if test $(LIBCUPSCGI) = "libcupscgi.so.1" -o $(LIBCUPSCGI) = "libcupscgi.sl.1"; then \
+       if test $(LIBCUPSCGI) = "libcupscgi.so.1"; then \
                $(RM) $(LIBDIR)/`basename $(LIBCUPSCGI) .1`; \
                $(LN) $(LIBCUPSCGI) $(LIBDIR)/`basename $(LIBCUPSCGI) .1`; \
        fi
@@ -154,6 +153,7 @@ install-libs: $(INSTALLSTATIC)
        if test "x$(SYMROOT)" != "x"; then \
                $(INSTALL_DIR) $(SYMROOT); \
                cp $(LIBCUPSCGI) $(SYMROOT); \
+               dsymutil $(SYMROOT)/$(LIBCUPSCGI); \
        fi
 
 installstatic:
@@ -175,9 +175,6 @@ uninstall:
        $(RM) $(LIBDIR)/libcupscgi.1.dylib
        $(RM) $(LIBDIR)/libcupscgi.a
        $(RM) $(LIBDIR)/libcupscgi.dylib
-       $(RM) $(LIBDIR)/libcupscgi_s.a
-       $(RM) $(LIBDIR)/libcupscgi.sl
-       $(RM) $(LIBDIR)/libcupscgi.sl.1
        $(RM) $(LIBDIR)/libcupscgi.so
        $(RM) $(LIBDIR)/libcupscgi.so.1
        -$(RMDIR) $(LIBDIR)
@@ -209,10 +206,10 @@ framedhelp:
 
 
 #
-# libcupscgi.so.1, libcupscgi.sl.1
+# libcupscgi.so.1
 #
 
-libcupscgi.so.1 libcupscgi.sl.1:       $(LIBOBJS)
+libcupscgi.so.1:       $(LIBOBJS)
        echo Linking $@...
        $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBS)
        $(RM) `basename $@ .1`
@@ -236,17 +233,6 @@ libcupscgi.1.dylib:        $(LIBOBJS) libcupscgi.exp
 
 
 #
-# libcupscgi_s.a
-#
-
-libcupscgi_s.a:        $(LIBOBJS)
-       echo Creating $@...
-       $(DSO) $(DSOFLAGS) -o libcupscgi_s.o $(LIBOBJS) $(LIBS)
-       $(RM) $@
-       $(AR) $(ARFLAGS) $@ libcupscgi_s.o
-
-
-#
 # libcupscgi.la
 #
 
@@ -360,17 +346,6 @@ testtemplate:      testtemplate.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC)
 
 
 #
-# websearch
-#
-
-websearch:     websearch.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC)
-       echo Linking $@...
-       $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ websearch.o libcupscgi.a \
-               ../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(SSLLIBS) $(DNSSDLIBS) \
-               $(LIBZ) $(LIBGSSAPI)
-
-
-#
 # Dependencies...
 #
 
@@ -378,5 +353,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12519 2015-02-17 13:10:19Z msweet $".
 #
index c30b590..29ae5c8 100644 (file)
@@ -1,37 +1,16 @@
 /*
- * "$Id: admin.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: admin.c 12516 2015-02-12 20:18:11Z msweet $"
  *
- *   Administration CGI for CUPS.
+ * Administration CGI for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()                    - Main entry for CGI.
- *   choose_device_cb()        - Add a device to the device selection page.
- *   do_add_rss_subscription() - Add a RSS subscription.
- *   do_am_class()             - Add or modify a class.
- *   do_am_printer()           - Add or modify a printer.
- *   do_cancel_subscription()  - Cancel a subscription.
- *   do_config_server()        - Configure server settings.
- *   do_delete_class()         - Delete a class.
- *   do_delete_printer()       - Delete a printer.
- *   do_export()               - Export printers to Samba.
- *   do_list_printers()        - List available printers.
- *   do_menu()                 - Show the main menu.
- *   do_set_allowed_users()    - Set the allowed/denied users for a queue.
- *   do_set_default()          - Set the server default printer/class.
- *   do_set_options()          - Configure the default options for a queue.
- *   do_set_sharing()          - Set printer-is-shared value.
- *   get_option_value()        - Return the value of an option.
- *   get_points()              - Get a value in points.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -39,6 +18,8 @@
  */
 
 #include "cgi-private.h"
+#include <cups/http-private.h>
+#include <cups/ppd-private.h>
 #include <cups/adminutil.h>
 #include <cups/ppd.h>
 #include <errno.h>
@@ -59,12 +40,7 @@ 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    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_add_rss_subscription(http_t *http);
 static void    do_am_class(http_t *http, int modify);
 static void    do_am_printer(http_t *http, int modify);
@@ -82,6 +58,7 @@ 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);
 
 
 /*
@@ -89,8 +66,7 @@ static double get_points(double number, const char *uval);
  */
 
 int                                    /* O - Exit status */
-main(int  argc,                                /* I - Number of command-line arguments */
-     char *argv[])                     /* I - Command-line arguments */
+main(void)
 {
   http_t       *http;                  /* Connection to the server */
   const char   *op;                    /* Operation name */
@@ -854,7 +830,8 @@ do_am_printer(http_t *http,         /* I - HTTP connection */
   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 */
+               *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 */
@@ -962,13 +939,13 @@ do_am_printer(http_t *http,               /* I - HTTP connection */
       else if (!_cups_strncasecmp(make, "laserjet", 8) ||
                !_cups_strncasecmp(make, "deskjet", 7) ||
                !_cups_strncasecmp(make, "designjet", 9))
-        strcpy(make, "HP");
+        strlcpy(make, "HP", sizeof(make));
       else if (!_cups_strncasecmp(make, "phaser", 6))
-        strcpy(make, "Xerox");
+        strlcpy(make, "Xerox", sizeof(make));
       else if (!_cups_strncasecmp(make, "stylus", 6))
-        strcpy(make, "Epson");
+        strlcpy(make, "Epson", sizeof(make));
       else
-        strcpy(make, "Generic");
+        strlcpy(make, "Generic", sizeof(make));
 
       if (!cgiGetVariable("CURRENT_MAKE"))
         cgiSetVariable("CURRENT_MAKE", make);
@@ -1172,7 +1149,7 @@ do_am_printer(http_t *http,               /* I - HTTP connection */
       char             filename[1024]; /* PPD filename */
       ppd_file_t       *ppd;           /* PPD information */
       char             buffer[1024];   /* Buffer */
-      int              bytes;          /* Number of bytes */
+      ssize_t          bytes;          /* Number of bytes */
       http_status_t    get_status;     /* Status of GET */
 
 
@@ -1194,7 +1171,7 @@ do_am_printer(http_t *http,               /* I - HTTP connection */
       else if ((fd = cupsTempFd(filename, sizeof(filename))) >= 0)
       {
        while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
-          write(fd, buffer, bytes);
+          write(fd, buffer, (size_t)bytes);
 
        close(fd);
 
@@ -1211,8 +1188,10 @@ do_am_printer(http_t *http,              /* I - HTTP connection */
        }
        else
        {
+         int linenum;                  /* Line number */
+
          fprintf(stderr, "ERROR: Unable to open PPD file %s: %s\n",
-                 filename, ppdErrorString(ppdLastError(&bytes)));
+                 filename, ppdErrorString(ppdLastError(&linenum)));
        }
       }
       else
@@ -1348,20 +1327,22 @@ do_am_printer(http_t *http,             /* I - HTTP connection */
     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"));
-
     if (!file)
     {
       var = cgiGetVariable("PPD_NAME");
-      if (strcmp(var, "__no_change__"))
-       ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "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));
 
    /*
@@ -1380,7 +1361,7 @@ do_am_printer(http_t *http,               /* I - HTTP connection */
       if ((uriptr = strchr(uri, '?')) == NULL)
         uriptr = uri + strlen(uri);
 
-      snprintf(uriptr, sizeof(uri) - (uriptr - 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"));
@@ -1404,6 +1385,11 @@ do_am_printer(http_t *http,              /* I - HTTP connection */
 
     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/"));
 
@@ -1881,7 +1867,7 @@ do_config_server(http_t *http)            /* I - HTTP connection */
         if ((end = strstr(start, "\n")) == NULL)
          end = start + strlen(start);
 
-      cupsFileWrite(temp, start, end - start);
+      cupsFileWrite(temp, start, (size_t)(end - start));
       cupsFilePutChar(temp, '\n');
 
       if (*end == '\r')
@@ -1917,7 +1903,7 @@ do_config_server(http_t *http)            /* I - HTTP connection */
     }
     else
     {
-      cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect");
+      cgiSetVariable("refresh_page", "5;URL=/admin/");
 
       cgiStartHTML(cgiText(_("Edit Configuration File")));
       cgiCopyTemplateLang("restart.tmpl");
@@ -2006,9 +1992,9 @@ do_config_server(http_t *http)            /* I - HTTP connection */
     * Allocate memory and load the file into a string buffer...
     */
 
-    if ((buffer = calloc(1, info.st_size + 1)) != NULL)
+    if ((buffer = calloc(1, (size_t)info.st_size + 1)) != NULL)
     {
-      cupsFileRead(cupsd, buffer, info.st_size);
+      cupsFileRead(cupsd, buffer, (size_t)info.st_size);
       cgiSetVariable("CUPSDCONF", buffer);
       free(buffer);
     }
@@ -2025,7 +2011,7 @@ do_config_server(http_t *http)            /* I - HTTP connection */
     if (!stat(filename, &info) && info.st_size < (1024 * 1024) &&
         (cupsd = cupsFileOpen(filename, "r")) != NULL)
     {
-      if ((buffer = calloc(1, 2 * info.st_size + 1)) != NULL)
+      if ((buffer = calloc(1, 2 * (size_t)info.st_size + 1)) != NULL)
       {
        bufend = buffer + 2 * info.st_size - 1;
 
@@ -2035,7 +2021,7 @@ do_config_server(http_t *http)            /* I - HTTP connection */
          if (ch == '\\' || ch == '\"')
          {
            *bufptr++ = '\\';
-           *bufptr++ = ch;
+           *bufptr++ = (char)ch;
          }
          else if (ch == '\n')
          {
@@ -2048,7 +2034,7 @@ do_config_server(http_t *http)            /* I - HTTP connection */
            *bufptr++ = 't';
          }
          else if (ch >= ' ')
-           *bufptr++ = ch;
+           *bufptr++ = (char)ch;
        }
 
        *bufptr = '\0';
@@ -3882,7 +3868,7 @@ do_set_sharing(http_t *http)              /* I - HTTP connection */
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
                NULL, uri);
 
-  ippAddBoolean(request, IPP_TAG_OPERATION, "printer-is-shared", atoi(shared));
+  ippAddBoolean(request, IPP_TAG_OPERATION, "printer-is-shared", (char)atoi(shared));
 
  /*
   * Do the request and get back a response...
@@ -4096,7 +4082,7 @@ get_option_value(
       if ((val = cgiGetVariable(keyword)) == NULL)
        return (NULL);
 
-      snprintf(bufptr, bufend - bufptr, "%s%s=", prefix, cparam->name);
+      snprintf(bufptr, (size_t)(bufend - bufptr), "%s%s=", prefix, cparam->name);
       bufptr += strlen(bufptr);
       prefix = " ";
 
@@ -4110,7 +4096,7 @@ get_option_value(
                number > cparam->maximum.custom_real)
              return (NULL);
 
-           snprintf(bufptr, bufend - bufptr, "%g", number);
+           snprintf(bufptr, (size_t)(bufend - bufptr), "%g", number);
            break;
 
        case PPD_CUSTOM_INT :
@@ -4120,7 +4106,7 @@ get_option_value(
                integer > cparam->maximum.custom_int)
              return (NULL);
 
-           snprintf(bufptr, bufend - bufptr, "%ld", integer);
+           snprintf(bufptr, (size_t)(bufend - bufptr), "%ld", integer);
            break;
 
        case PPD_CUSTOM_POINTS :
@@ -4138,7 +4124,7 @@ get_option_value(
                number_points > cparam->maximum.custom_points)
              return (NULL);
 
-           snprintf(bufptr, bufend - bufptr, "%g%s", number, uval);
+           snprintf(bufptr, (size_t)(bufend - bufptr), "%g%s", number, uval);
            break;
 
        case PPD_CUSTOM_PASSCODE :
@@ -4187,7 +4173,7 @@ get_option_value(
     if (bufptr == buffer || (bufend - bufptr) < 2)
       return (NULL);
 
-    strcpy(bufptr, "}");
+    memcpy(bufptr, "}", 2);
   }
 
   return (buffer);
@@ -4218,5 +4204,78 @@ get_points(double     number,            /* I - Original number */
 
 
 /*
- * End of "$Id: admin.c 11173 2013-07-23 12:31:34Z msweet $".
+ * '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 */
+
+
+ /*
+  * 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);
+  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);
+}
+
+
+/*
+ * End of "$Id: admin.c 12516 2015-02-12 20:18:11Z msweet $".
  */
index 348da08..c5d0eef 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cgi-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cgi-private.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Private CGI definitions for CUPS.
  *
@@ -32,5 +32,5 @@
 
 
 /*
- * End of "$Id: cgi-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cgi-private.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index 4d76a02..37732b5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cgi.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cgi.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   CGI support library definitions for CUPS.
  *
@@ -115,5 +115,5 @@ extern const char   *cgiText(const char *message);
 #endif /* !_CUPS_CGI_H_ */
 
 /*
- * End of "$Id: cgi.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cgi.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index 47bcedf..0af538b 100644 (file)
@@ -1,23 +1,16 @@
 /*
- * "$Id: classes.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: classes.c 11928 2014-06-13 00:08:32Z msweet $"
  *
- *   Class status CGI for CUPS.
+ * Class status CGI for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()             - Main entry for CGI.
- *   do_class_op()      - Do a class operation.
- *   show_all_classes() - Show all classes...
- *   show_class()       - Show a single class.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -42,8 +35,7 @@ static void   show_class(http_t *http, const char *printer);
  */
 
 int                                    /* O - Exit status */
-main(int  argc,                                /* I - Number of command-line arguments */
-     char *argv[])                     /* I - Command-line arguments */
+main(void)
 {
   const char   *pclass;                /* Class name */
   const char   *user;                  /* Username */
@@ -169,8 +161,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
       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, "purge-jobs"))
-      do_class_op(http, pclass, IPP_PURGE_JOBS, cgiText(_("Purge 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"))
@@ -286,8 +278,8 @@ do_class_op(http_t      *http,              /* I - HTTP connection */
       cgiCopyTemplateLang("printer-accept.tmpl");
     else if (op == CUPS_REJECT_JOBS)
       cgiCopyTemplateLang("printer-reject.tmpl");
-    else if (op == IPP_PURGE_JOBS)
-      cgiCopyTemplateLang("printer-purge.tmpl");
+    else if (op == IPP_OP_CANCEL_JOBS)
+      cgiCopyTemplateLang("printer-cancel-jobs.tmpl");
   }
 
   cgiEndHTML();
@@ -554,5 +546,5 @@ show_class(http_t     *http,                /* I - Connection to server */
 
 
 /*
- * End of "$Id: classes.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: classes.c 11928 2014-06-13 00:08:32Z msweet $".
  */
index 195c1f6..d467cb6 100644 (file)
@@ -1,34 +1,16 @@
 /*
- * "$Id: help-index.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: help-index.c 12644 2015-05-19 21:22:35Z msweet $"
  *
- *   Online help index routines for CUPS.
+ * Online help index routines for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   helpDeleteIndex()          - Delete an index, freeing all memory used.
- *   helpFindNode()             - Find a node in an index.
- *   helpLoadIndex()            - Load a help index from disk.
- *   helpSaveIndex()            - Save a help index to disk.
- *   helpSearchIndex()          - Search an index.
- *   help_add_word()            - Add a word to a node.
- *   help_compile_search()      - Convert a search string into a regular expression.
- *   help_delete_node()         - Free all memory used by a node.
- *   help_delete_word()         - Free all memory used by a word.
- *   help_load_directory()      - Load a directory of files into an index.
- *   help_load_file()           - Load a HTML files into an index.
- *   help_new_node()            - Create a new node and add it to an index.
- *   help_sort_nodes_by_name()  - Sort nodes by section, filename, and anchor.
- *   help_sort_nodes_by_score() - Sort nodes by score and text.
- *   help_sort_words()          - Sort words alphabetically.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -346,7 +328,7 @@ helpLoadIndex(const char *hifile,   /* I - Index filename */
            mtime = strtol(ptr, &ptr, 10);
 
          offset = strtoll(ptr, &ptr, 10);
-         length = strtoll(ptr, &ptr, 10);
+         length = (size_t)strtoll(ptr, &ptr, 10);
 
          while (isspace(*ptr & 255))
             ptr ++;
@@ -902,7 +884,7 @@ help_load_file(
 
 
   DEBUG_printf(("2help_load_file(hi=%p, filename=\"%s\", relative=\"%s\", "
-                "mtime=%ld)", hi, filename, relative, mtime));
+                "mtime=%ld)", hi, filename, relative, (long)mtime));
 
   if ((fp = cupsFileOpen(filename, "r")) == NULL)
     return (-1);
@@ -910,7 +892,7 @@ help_load_file(
   node   = NULL;
   offset = 0;
 
-  strcpy(section, "Other");
+  strlcpy(section, "Other", sizeof(section));
 
   while (cupsFileGets(fp, line, sizeof(line)))
   {
@@ -1019,14 +1001,14 @@ help_load_file(
 
         *ptr++ = ' ';
 
-        if (!cupsFileGets(fp, ptr, sizeof(line) - (ptr - line) - 1))
+        if (!cupsFileGets(fp, ptr, sizeof(line) - (size_t)(ptr - line) - 1))
          break;
       }
 
       *ptr = '\0';
 
       if (node)
-       node->length = offset - node->offset;
+       node->length = (size_t)(offset - node->offset);
 
       if (!*text)
       {
@@ -1179,9 +1161,9 @@ help_load_file(
 
        for (text = ptr, ptr ++; *ptr && isalnum(*ptr & 255); ptr ++);
 
-       wordlen = ptr - text;
+       wordlen = (int)(ptr - text);
 
-        memcpy(temp, text, wordlen);
+        memcpy(temp, text, (size_t)wordlen);
        temp[wordlen] = '\0';
 
         ptr --;
@@ -1206,7 +1188,7 @@ help_load_file(
   cupsFileClose(fp);
 
   if (node)
-    node->length = offset - node->offset;
+    node->length = (size_t)(offset - node->offset);
 
   return (0);
 }
@@ -1238,7 +1220,7 @@ help_new_node(const char   *filename,     /* I - Filename */
 
   n->filename = strdup(filename);
   n->anchor   = anchor ? strdup(anchor) : NULL;
-  n->section  = (section && *section) ? strdup(section) : NULL;
+  n->section  = *section ? strdup(section) : NULL;
   n->text     = strdup(text);
   n->mtime    = mtime;
   n->offset   = offset;
@@ -1324,5 +1306,5 @@ help_sort_words(help_word_t *w1,  /* I - Second word */
 
 
 /*
- * End of "$Id: help-index.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: help-index.c 12644 2015-05-19 21:22:35Z msweet $".
  */
index 4b03969..3618d60 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: help-index.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: help-index.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Online help index definitions for CUPS.
  *
@@ -83,5 +83,5 @@ extern help_index_t   *helpSearchIndex(help_index_t *hi, const char *query,
 #endif /* !_CUPS_HELP_INDEX_H_ */
 
 /*
- * End of "$Id: help-index.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: help-index.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index c8fc66e..75f70d9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: help.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: help.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Online help CGI for CUPS.
  *
@@ -393,5 +393,5 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: help.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: help.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index b721ee3..af58c88 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: html.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: html.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   HTML support functions for CUPS.
  *
@@ -235,5 +235,5 @@ cgi_null_passwd(const char *prompt) /* I - Prompt string (unused) */
 
 
 /*
- * End of "$Id: html.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: html.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index a1d7f38..1a08960 100644 (file)
@@ -1,31 +1,16 @@
 /*
- * "$Id: ipp-var.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ipp-var.c 12768 2015-06-30 16:13:38Z msweet $"
  *
- *   CGI <-> IPP variable routines for CUPS.
+ * CGI <-> IPP variable routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cgiGetAttributes()    - Get the list of attributes that are needed by the
- *                           template file.
- *   cgiGetIPPObjects()    - Get the objects in an IPP response.
- *   cgiMoveJobs()         - Move one or more jobs.
- *   cgiPrintCommand()     - Print a CUPS command job.
- *   cgiPrintTestPage()    - Print a test page.
- *   cgiRewriteURL()       - Rewrite a printer URI into a web browser URL...
- *   cgiSetIPPObjectVars() - Set CGI variables from an IPP object.
- *   cgiSetIPPVars()       - Set CGI variables from an IPP response.
- *   cgiShowIPPError()     - Show the last IPP error message.
- *   cgiShowJobs()         - Show print jobs.
- *   cgiText()             - Return localized text.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -65,7 +50,7 @@ cgiGetAttributes(ipp_t      *request, /* I - IPP request */
   {
     for (i = 0; lang[i] && i < 15; i ++)
       if (isalnum(lang[i] & 255))
-        locale[i] = tolower(lang[i]);
+        locale[i] = (char)tolower(lang[i]);
       else
         locale[i] = '_';
 
@@ -107,7 +92,7 @@ cgiGetAttributes(ipp_t      *request,        /* I - IPP request */
   while ((ch = getc(in)) != EOF)
     if (ch == '\\')
       getc(in);
-    else if (ch == '{' && num_attrs < (sizeof(attrs) / sizeof(attrs[0])))
+    else if (ch == '{' && num_attrs < (int)(sizeof(attrs) / sizeof(attrs[0])))
     {
      /*
       * Grab the name...
@@ -123,13 +108,13 @@ cgiGetAttributes(ipp_t      *request,     /* I - IPP request */
          if (ch == '_')
            *nameptr++ = '-';
          else
-            *nameptr++ = ch;
+            *nameptr++ = (char)ch;
        }
 
       *nameptr = '\0';
 
       if (!strncmp(name, "printer_state_history", 21))
-        strcpy(name, "printer_state_history");
+        strlcpy(name, "printer_state_history", sizeof(name));
 
      /*
       * Possibly add it to the list of attributes...
@@ -237,6 +222,9 @@ cgiGetIPPObjects(ipp_t *response,   /* I - IPP response */
              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 */
@@ -554,8 +542,8 @@ cgiPrintCommand(http_t     *http,   /* I - Connection to server */
   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 */
+  static const char * const job_attrs[] =/* Job attributes we want */
+               {
                  "job-state",
                  "job-printer-state-message"
                };
@@ -917,7 +905,7 @@ cgiRewriteURL(const char *uri,              /* I - Current URI */
       * Make URI relative to the current server...
       */
 
-      strlcpy(url, resource, urlsize);
+      strlcpy(url, resource, (size_t)urlsize);
     }
     else
     {
@@ -926,17 +914,13 @@ cgiRewriteURL(const char *uri,            /* I - Current URI */
       */
 
       if (userpass[0])
-       snprintf(url, urlsize, "%s://%s@%s:%d%s",
-                ishttps ? "https" : "http",
-                userpass, hostname, port, resource);
+       snprintf(url, (size_t)urlsize, "%s://%s@%s:%d%s", ishttps ? "https" : "http", userpass, hostname, port, resource);
       else
-       snprintf(url, urlsize, "%s://%s:%d%s",
-                ishttps ? "https" : "http",
-                hostname, port, resource);
+       snprintf(url, (size_t)urlsize, "%s://%s:%d%s", ishttps ? "https" : "http", hostname, port, resource);
     }
   }
   else
-    strlcpy(url, uri, urlsize);
+    strlcpy(url, uri, (size_t)urlsize);
 
   return (url);
 }
@@ -958,7 +942,6 @@ cgiSetIPPObjectVars(
                        *nameptr,       /* Pointer into name */
                        value[16384],   /* Value(s) */
                        *valptr;        /* Pointer into value */
-  struct tm            *date;          /* Date information */
 
 
   fprintf(stderr, "DEBUG2: cgiSetIPPObjectVars(obj=%p, prefix=\"%s\", "
@@ -1039,7 +1022,7 @@ cgiSetIPPObjectVars(
          *valptr++ = ' ';
         }
 
-        remaining = sizeof(value) - (valptr - value);
+        remaining = sizeof(value) - (size_t)(valptr - value);
 
         if (!strcmp(attr->values[i].string.text, "printer-stopped"))
          strlcpy(valptr, _("Printer Paused"), remaining);
@@ -1177,7 +1160,7 @@ cgiSetIPPObjectVars(
     for (i = 0; i < attr->num_values; i ++)
     {
       if (i)
-       strlcat(valptr, ", ", sizeof(value) - (valptr - value));
+       strlcat(valptr, ", ", sizeof(value) - (size_t)(valptr - value));
 
       valptr += strlen(valptr);
 
@@ -1186,36 +1169,28 @@ cgiSetIPPObjectVars(
        case IPP_TAG_INTEGER :
        case IPP_TAG_ENUM :
            if (strncmp(name, "time_at_", 8) == 0)
-           {
-             time_t    t;              /* Temporary time value */
-
-              t    = (time_t)attr->values[i].integer;
-             date = localtime(&t);
-
-             strftime(valptr, sizeof(value) - (valptr - value), "%c", date);
-           }
+             _cupsStrDate(valptr, sizeof(value) - (size_t)(valptr - value), (time_t)ippGetInteger(attr, i));
            else
-             snprintf(valptr, sizeof(value) - (valptr - value),
-                      "%d", attr->values[i].integer);
+             snprintf(valptr, sizeof(value) - (size_t)(valptr - value), "%d", ippGetInteger(attr, i));
            break;
 
        case IPP_TAG_BOOLEAN :
-           snprintf(valptr, sizeof(value) - (valptr - value),
+           snprintf(valptr, sizeof(value) - (size_t)(valptr - value),
                     "%d", attr->values[i].boolean);
            break;
 
        case IPP_TAG_NOVALUE :
-           strlcat(valptr, "novalue", sizeof(value) - (valptr - value));
+           strlcat(valptr, "novalue", sizeof(value) - (size_t)(valptr - value));
            break;
 
        case IPP_TAG_RANGE :
-           snprintf(valptr, sizeof(value) - (valptr - value),
+           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) - (valptr - value),
+           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 ?
@@ -1230,21 +1205,7 @@ cgiSetIPPObjectVars(
              * Rewrite URIs...
              */
 
-              if (!strcmp(name, "member_uris"))
-             {
-               char    url[1024];      /* URL for class member... */
-
-
-               cgiRewriteURL(attr->values[i].string.text, url,
-                             sizeof(url), NULL);
-
-                snprintf(valptr, sizeof(value) - (valptr - value),
-                        "<A HREF=\"%s\">%s</A>", url,
-                        strrchr(attr->values[i].string.text, '/') + 1);
-             }
-             else
-               cgiRewriteURL(attr->values[i].string.text, valptr,
-                             sizeof(value) - (valptr - value), NULL);
+             cgiRewriteURL(attr->values[i].string.text, valptr, (int)(sizeof(value) - (size_t)(valptr - value)), NULL);
               break;
             }
 
@@ -1256,7 +1217,7 @@ cgiSetIPPObjectVars(
        case IPP_TAG_LANGUAGE :
        case IPP_TAG_MIMETYPE :
            strlcat(valptr, attr->values[i].string.text,
-                   sizeof(value) - (valptr - value));
+                   sizeof(value) - (size_t)(valptr - value));
            break;
 
         case IPP_TAG_BEGIN_COLLECTION :
@@ -1589,5 +1550,5 @@ cgiText(const char *message)              /* I - Message */
 
 
 /*
- * End of "$Id: ipp-var.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ipp-var.c 12768 2015-06-30 16:13:38Z msweet $".
  */
index 95c8d1d..383532d 100644 (file)
@@ -1,21 +1,16 @@
 /*
- * "$Id: jobs.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: jobs.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Job status CGI for CUPS.
+ * Job status CGI for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()      - Main entry for CGI.
- *   do_job_op() - Do a job operation.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -37,8 +32,7 @@ static void   do_job_op(http_t *http, int job_id, ipp_op_t op);
  */
 
 int                                    /* O - Exit status */
-main(int  argc,                                /* I - Number of command-line arguments */
-     char *argv[])                     /* I - Command-line arguments */
+main(void)
 {
   http_t       *http;                  /* Connection to the server */
   const char   *op;                    /* Operation name */
@@ -182,7 +176,7 @@ do_job_op(http_t      *http,                /* I - HTTP connection */
     char       url[1024];              /* Encoded URL */
 
 
-    strcpy(url, "5;URL=");
+    strlcpy(url, "5;URL=", sizeof(url));
     cgiFormEncode(url + 6, getenv("HTTP_REFERER"), sizeof(url) - 6);
     cgiSetVariable("refresh_page", url);
   }
@@ -210,5 +204,5 @@ do_job_op(http_t      *http,                /* I - HTTP connection */
 
 
 /*
- * End of "$Id: jobs.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: jobs.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 079c59f..6be2797 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: makedocset.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: makedocset.c 3833 2012-05-23 22:51:18Z msweet $"
  *
  *   Xcode documentation set generator.
  *
@@ -482,5 +482,5 @@ write_nodes(const char   *path,             /* I - File to write */
 
 
 /*
- * End of "$Id: makedocset.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: makedocset.c 3833 2012-05-23 22:51:18Z msweet $".
  */
index f61d407..9cfd44c 100644 (file)
@@ -1,23 +1,16 @@
 /*
- * "$Id: printers.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: printers.c 11928 2014-06-13 00:08:32Z msweet $"
  *
- *   Printer status CGI for CUPS.
+ * Printer status CGI for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()              - Main entry for CGI.
- *   do_printer_op()     - Do a printer operation.
- *   show_all_printers() - Show all printers...
- *   show_printer()      - Show a single printer.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -43,8 +36,7 @@ static void   show_printer(http_t *http, const char *printer);
  */
 
 int                                    /* O - Exit status */
-main(int  argc,                                /* I - Number of command-line arguments */
-     char *argv[])                     /* I - Command-line arguments */
+main(void)
 {
   const char   *printer;               /* Printer name */
   const char   *user;                  /* Username */
@@ -172,8 +164,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
       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, "purge-jobs"))
-      do_printer_op(http, printer, IPP_PURGE_JOBS, cgiText(_("Purge 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")));
@@ -293,8 +285,8 @@ do_printer_op(http_t      *http,    /* I - HTTP connection */
       cgiCopyTemplateLang("printer-accept.tmpl");
     else if (op == CUPS_REJECT_JOBS)
       cgiCopyTemplateLang("printer-reject.tmpl");
-    else if (op == IPP_PURGE_JOBS)
-      cgiCopyTemplateLang("printer-purge.tmpl");
+    else if (op == IPP_OP_CANCEL_JOBS)
+      cgiCopyTemplateLang("printer-cancel-jobs.tmpl");
   }
 
   cgiEndHTML();
@@ -574,5 +566,5 @@ show_printer(http_t     *http,              /* I - Connection to server */
 
 
 /*
- * End of "$Id: printers.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: printers.c 11928 2014-06-13 00:08:32Z msweet $".
  */
index 8fd8221..9a93431 100644 (file)
@@ -1,22 +1,16 @@
 /*
- * "$Id: search.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: search.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Search routines for CUPS.
+ * Search routines for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cgiCompileSearch() - Compile a search string.
- *   cgiDoSearch()      - Do a search of some text.
- *   cgiFreeSearch()    - Free a compiled search context.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -38,12 +32,12 @@ cgiCompileSearch(const char *query) /* I - Query string */
   char         *s,                     /* Regular expression string */
                *sptr,                  /* Pointer into RE string */
                *sword;                 /* Pointer to start of word */
-  int          slen;                   /* Allocated size of RE string */
+  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 */
-  int          wlen;                   /* Word length */
+  size_t       wlen;                   /* Word length */
   char         *lword;                 /* Last word in query */
 
 
@@ -139,7 +133,7 @@ cgiCompileSearch(const char *query) /* I - Query string */
       for (qend = qptr + 1; *qend && !isspace(*qend); qend ++);
     }
 
-    wlen = qend - qptr;
+    wlen = (size_t)(qend - qptr);
 
    /*
     * Look for logic words: AND, OR
@@ -174,7 +168,7 @@ cgiCompileSearch(const char *query) /* I - Query string */
       * string + RE overhead...
       */
 
-      wlen = (sptr - s) + 2 * 4 * wlen + 2 * strlen(prefix) + 11;
+      wlen = (size_t)(sptr - s) + 2 * 4 * wlen + 2 * strlen(prefix) + 11;
       if (lword)
         wlen += strlen(lword);
 
@@ -208,7 +202,7 @@ cgiCompileSearch(const char *query) /* I - Query string */
       * Add the prefix string...
       */
 
-      strcpy(sptr, prefix);
+      memcpy(sptr, prefix, strlen(prefix) + 1);
       sptr += strlen(sptr);
 
      /*
@@ -249,16 +243,16 @@ cgiCompileSearch(const char *query)       /* I - Query string */
          return (NULL);
        }
 
-        strcpy(sptr, ".*|.*");
+        memcpy(sptr, ".*|.*", 6);
        sptr += 5;
 
-       strcpy(sptr, lword2);
+       memcpy(sptr, lword2, strlen(lword2) + 1);
        sptr += strlen(sptr);
 
-        strcpy(sptr, ".*");
+        memcpy(sptr, ".*", 3);
        sptr += 2;
 
-       strcpy(sptr, lword);
+       memcpy(sptr, lword, strlen(lword) + 1);
        sptr += strlen(sptr);
 
         free(lword);
@@ -287,7 +281,7 @@ cgiCompileSearch(const char *query) /* I - Query string */
     free(lword);
 
   if (sptr > s)
-    strcpy(sptr, ".*");
+    memcpy(sptr, ".*", 3);
   else
   {
    /*
@@ -377,5 +371,5 @@ cgiFreeSearch(void *search)         /* I - Search context */
 
 
 /*
- * End of "$Id: search.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: search.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 7c36c67..426e635 100644 (file)
@@ -1,27 +1,16 @@
 /*
- * "$Id: template.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: template.c 12700 2015-06-08 18:32:35Z msweet $"
  *
- *   CGI template function.
+ * CGI template function.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cgiCopyTemplateFile() - Copy a template file and replace all the
- *                           '{variable}' strings with the variable value.
- *   cgiCopyTemplateLang() - Copy a template file using a language...
- *   cgiGetTemplateDir()   - Get the templates directory...
- *   cgiSetServerVersion() - Set the server name and CUPS version...
- *   cgi_copy()            - Copy the template file, substituting as needed...
- *   cgi_puts()            - Put a string to the output file, quoting as
- *                           needed...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 #include "cgi-private.h"
@@ -266,7 +255,7 @@ cgi_copy(FILE *out,                 /* I - Output file */
         else if (s > name && ch == '?')
          break;
        else if (s < (name + sizeof(name) - 1))
-          *s++ = ch;
+          *s++ = (char)ch;
 
       *s = '\0';
 
@@ -443,7 +432,7 @@ cgi_copy(FILE *out,                 /* I - Output file */
       *   {name~refex?true:false}    Regex match
       */
 
-      op = ch;
+      op = (char)ch;
 
       if (ch == '?')
       {
@@ -486,7 +475,7 @@ cgi_copy(FILE *out,                 /* I - Output file */
            innerptr = innername;
            while ((ch = getc(in)) != EOF && ch != '}')
              if (innerptr < (innername + sizeof(innername) - 1))
-               *innerptr++ = ch;
+               *innerptr++ = (char)ch;
            *innerptr = '\0';
 
             if (innername[0] == '#')
@@ -498,26 +487,26 @@ cgi_copy(FILE *out,                       /* I - Output file */
              if ((innerval = cgiGetArray(innername, atoi(innerptr) - 1)) == NULL)
                *s = '\0';
              else
-               strlcpy(s, innerval, sizeof(compare) - (s - compare));
+               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) - (s - compare));
+               strlcpy(s, innerval, sizeof(compare) - (size_t)(s - compare));
             }
            else if ((innerval = cgiGetArray(innername, element)) == NULL)
-             snprintf(s, sizeof(compare) - (s - compare), "{%s}", innername);
+             snprintf(s, sizeof(compare) - (size_t)(s - compare), "{%s}", innername);
            else
-             strlcpy(s, innerval, sizeof(compare) - (s - compare));
+             strlcpy(s, innerval, sizeof(compare) - (size_t)(s - compare));
 
             s += strlen(s);
          }
           else if (ch == '\\')
-           *s++ = getc(in);
+           *s++ = (char)getc(in);
          else
-            *s++ = ch;
+            *s++ = (char)ch;
 
         *s = '\0';
 
@@ -553,7 +542,7 @@ cgi_copy(FILE *out,                 /* I - Output file */
              if (regcomp(&re, compare, REG_EXTENDED | REG_ICASE))
              {
                fprintf(stderr,
-                       "ERROR: Unable to compile regular expresion \"%s\"!\n",
+                       "ERROR: Unable to compile regular expression \"%s\"!\n",
                        compare);
                result = 0;
              }
@@ -659,39 +648,7 @@ cgi_puts(const char *s,                    /* I - String to output */
   while (*s)
   {
     if (*s == '<')
-    {
-     /*
-      * Pass <A HREF="url"> and </A>, otherwise quote it...
-      */
-
-      if (!_cups_strncasecmp(s, "<A HREF=\"", 9))
-      {
-        fputs("<A HREF=\"", out);
-       s += 9;
-
-       while (*s && *s != '\"')
-       {
-          if (*s == '&')
-            fputs("&amp;", out);
-         else
-           putc(*s, out);
-
-         s ++;
-       }
-
-        if (*s)
-         s ++;
-
-       fputs("\">", out);
-      }
-      else if (!_cups_strncasecmp(s, "</A>", 4))
-      {
-        fputs("</A>", out);
-       s += 3;
-      }
-      else
-        fputs("&lt;", out);
-    }
+      fputs("&lt;", out);
     else if (*s == '>')
       fputs("&gt;", out);
     else if (*s == '\"')
@@ -729,5 +686,5 @@ cgi_puturi(const char *s,           /* I - String to output */
 
 
 /*
- * End of "$Id: template.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: template.c 12700 2015-06-08 18:32:35Z msweet $".
  */
index e59986a..61d3296 100644 (file)
@@ -1,21 +1,16 @@
 /*
- * "$Id: testcgi.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testcgi.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   CGI test program for CUPS.
+ * CGI test program for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()       - Test the help index code.
- *   list_nodes() - List nodes in an array...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -30,8 +25,7 @@
  */
 
 int                                    /* O - Exit status */
-main(int  argc,                                /* I - Number of command-line arguments */
-     char *argv[])                     /* I - Command-line arguments */
+main(void)
 {
  /*
   * Test file upload/multi-part submissions...
@@ -71,5 +65,5 @@ main(int  argc,                               /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: testcgi.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testcgi.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index a257b70..9feed6b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: testhi.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testhi.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Help index test program for CUPS.
  *
@@ -109,5 +109,5 @@ list_nodes(const char   *title,             /* I - Title string */
 
 
 /*
- * End of "$Id: testhi.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testhi.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 979296e..c479b3a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: testtemplate.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testtemplate.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   CGI template test program for CUPS.
  *
@@ -99,5 +99,5 @@ main(int  argc,                               /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: testtemplate.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testtemplate.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index c124778..017de1e 100644 (file)
@@ -1,49 +1,20 @@
 /*
- * "$Id: var.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: var.c 12621 2015-05-06 21:32:18Z msweet $"
  *
- *   CGI form variable and array functions for CUPS.
+ * CGI form variable and array functions for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cgiCheckVariables()        - Check for the presence of "required"
- *                                variables.
- *   cgiClearVariables()        - Clear all form variables.
- *   cgiGetArray()              - Get an element from a form array.
- *   cgiGetCookie()             - Get a cookie value.
- *   cgiGetFile()               - Get the file (if any) that was submitted in
- *                                the form.
- *   cgiGetSize()               - Get the size of a form array value.
- *   cgiGetVariable()           - Get a CGI variable from the database.
- *   cgiInitialize()            - Initialize the CGI variable "database".
- *   cgiIsPOST()                - Determine whether this page was POSTed.
- *   cgiSetArray()              - Set array element N to the specified string.
- *   cgiSetCookie()             - Set a cookie value.
- *   cgiSetSize()               - Set the array size.
- *   cgiSetVariable()           - Set a CGI variable in the database.
- *   cgi_add_variable()         - Add a form variable.
- *   cgi_compare_variables()    - Compare two variables.
- *   cgi_find_variable()        - Find a variable.
- *   cgi_initialize_cookies()   - Initialize cookies.
- *   cgi_initialize_get()       - Initialize form variables using the GET
- *                                method.
- *   cgi_initialize_multipart() - Initialize variables and file using the POST
- *                                method.
- *   cgi_initialize_post()      - Initialize variables using the POST method.
- *   cgi_initialize_string()    - Initialize form variables from a string.
- *   cgi_passwd()               - Catch authentication requests and notify the
- *                                server.
- *   cgi_set_sid()              - Set the CUPS session ID.
- *   cgi_sort_variables()       - Sort all form variables for faster lookup.
- *   cgi_unlink_file()          - Remove the uploaded form.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ */
+
+/*
+ * Include necessary headers...
  */
 
 /*#define DEBUG*/
@@ -417,7 +388,7 @@ cgiSetArray(const char *name,               /* I - Name of variable */
       const char **temp;               /* Temporary pointer */
 
       temp = (const char **)realloc((void *)(var->values),
-                                    sizeof(char *) * (element + 16));
+                                    sizeof(char *) * (size_t)(element + 16));
       if (!temp)
         return;
 
@@ -466,9 +437,9 @@ cgiSetCookie(const char *name,              /* I - Name */
     printf(" expires=%s;", httpGetDateString2(expires, date, sizeof(date)));
   }
   if (secure)
-    puts(" secure;");
+    puts(" httponly; secure;");
   else
-    putchar('\n');
+    puts(" httponly;");
 }
 
 
@@ -495,7 +466,7 @@ cgiSetSize(const char *name,                /* I - Name of variable */
     const char **temp;                 /* Temporary pointer */
 
     temp = (const char **)realloc((void *)(var->values),
-                                 sizeof(char *) * (size + 16));
+                                 sizeof(char *) * (size_t)(size + 16));
     if (!temp)
       return;
 
@@ -581,7 +552,7 @@ cgi_add_variable(const char *name,  /* I - Variable name */
     if (form_alloc == 0)
       temp_vars = malloc(sizeof(_cgi_var_t) * 16);
     else
-      temp_vars = realloc(form_vars, (form_alloc + 16) * sizeof(_cgi_var_t));
+      temp_vars = realloc(form_vars, (size_t)(form_alloc + 16) * sizeof(_cgi_var_t));
 
     if (!temp_vars)
       return;
@@ -592,7 +563,7 @@ cgi_add_variable(const char *name,  /* I - Variable name */
 
   var = form_vars + form_count;
 
-  if ((var->values = calloc(element + 1, sizeof(char *))) == NULL)
+  if ((var->values = calloc((size_t)element + 1, sizeof(char *))) == NULL)
     return;
 
   var->name            = _cupsStrAlloc(name);
@@ -632,7 +603,7 @@ cgi_find_variable(const char *name) /* I - Name of variable */
 
   key.name = name;
 
-  return ((_cgi_var_t *)bsearch(&key, form_vars, form_count, sizeof(_cgi_var_t),
+  return ((_cgi_var_t *)bsearch(&key, form_vars, (size_t)form_count, sizeof(_cgi_var_t),
                            (int (*)(const void *, const void *))cgi_compare_variables));
 }
 
@@ -655,6 +626,8 @@ cgi_initialize_cookies(void)
 
   while (*cookie)
   {
+    int        skip = 0;                       /* Skip this cookie? */
+
    /*
     * Skip leading whitespace...
     */
@@ -670,9 +643,14 @@ cgi_initialize_cookies(void)
 
     for (ptr = name; *cookie && *cookie != '=';)
       if (ptr < (name + sizeof(name) - 1))
+      {
         *ptr++ = *cookie++;
+      }
       else
-        break;
+      {
+        skip = 1;
+       cookie ++;
+      }
 
     if (*cookie != '=')
       break;
@@ -688,26 +666,38 @@ cgi_initialize_cookies(void)
     {
       for (cookie ++, ptr = value; *cookie && *cookie != '\"';)
         if (ptr < (value + sizeof(value) - 1))
+       {
          *ptr++ = *cookie++;
+       }
        else
-         break;
+       {
+         skip = 1;
+         cookie ++;
+       }
 
       if (*cookie == '\"')
         cookie ++;
+      else
+        skip = 1;
     }
     else
     {
       for (ptr = value; *cookie && *cookie != ';';)
         if (ptr < (value + sizeof(value) - 1))
+       {
          *ptr++ = *cookie++;
+       }
        else
-         break;
+       {
+         skip = 1;
+         cookie ++;
+       }
     }
 
     if (*cookie == ';')
       cookie ++;
     else if (*cookie)
-      break;
+      skip = 1;
 
     *ptr = '\0';
 
@@ -716,7 +706,7 @@ cgi_initialize_cookies(void)
     * "$"...
     */
 
-    if (name[0] != '$')
+    if (name[0] != '$' && !skip)
       num_cookies = cupsAddOption(name, value, num_cookies, &cookies);
   }
 }
@@ -769,8 +759,8 @@ cgi_initialize_multipart(
                *ptr,                   /* Pointer into name/filename */
                *end;                   /* End of buffer */
   int          ch,                     /* Character from file */
-               fd,                     /* Temporary file descriptor */
-               blen;                   /* Length of boundary string */
+               fd;                     /* Temporary file descriptor */
+  size_t       blen;                   /* Length of boundary string */
 
 
   DEBUG_printf(("cgi_initialize_multipart(boundary=\"%s\")\n", boundary));
@@ -835,22 +825,22 @@ cgi_initialize_multipart(
 
        while ((ch = getchar()) != EOF)
        {
-         *ptr++ = ch;
+         *ptr++ = (char)ch;
 
-          if ((ptr - line) >= blen && !memcmp(ptr - blen, bstring, blen))
+          if ((size_t)(ptr - line) >= blen && !memcmp(ptr - blen, bstring, blen))
          {
            ptr -= blen;
            break;
          }
 
-          if ((ptr - line - blen) >= 8192)
+          if ((ptr - line - (int)blen) >= 8192)
          {
           /*
            * Write out the first 8k of the buffer...
            */
 
            write(fd, line, 8192);
-           memmove(line, line + 8192, ptr - line - 8192);
+           memmove(line, line + 8192, (size_t)(ptr - line - 8192));
            ptr -= 8192;
          }
        }
@@ -860,7 +850,7 @@ cgi_initialize_multipart(
        */
 
        if (ptr > line)
-          write(fd, line, ptr - line);
+          write(fd, line, (size_t)(ptr - line));
 
        close(fd);
       }
@@ -877,9 +867,9 @@ cgi_initialize_multipart(
        while ((ch = getchar()) != EOF)
        {
          if (ptr < end)
-           *ptr++ = ch;
+           *ptr++ = (char)ch;
 
-          if ((ptr - line) >= blen && !memcmp(ptr - blen, bstring, blen))
+          if ((size_t)(ptr - line) >= blen && !memcmp(ptr - blen, bstring, blen))
          {
            ptr -= blen;
            break;
@@ -979,12 +969,12 @@ cgi_initialize_multipart(
 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 */
-  int  length,                         /* Length of input data */
-       nbytes,                         /* Number of bytes read this read() */
-       tbytes,                         /* Total number of bytes read */
-       status;                         /* Return status */
+  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 */
 
 
   DEBUG_puts("cgi_initialize_post: Initializing variables using POST method...");
@@ -1001,7 +991,7 @@ cgi_initialize_post(void)
   * Get the length of the input stream and allocate a buffer for it...
   */
 
-  length = atoi(content_length);
+  length = (size_t)strtol(content_length, NULL, 10);
   data   = malloc(length + 1);
 
   if (data == NULL)
@@ -1011,8 +1001,8 @@ cgi_initialize_post(void)
   * Read the data into the buffer...
   */
 
-  for (tbytes = 0; tbytes < length; tbytes += nbytes)
-    if ((nbytes = read(0, data + tbytes, length - tbytes)) < 0)
+  for (tbytes = 0; tbytes < length; tbytes += (size_t)nbytes)
+    if ((nbytes = read(0, data + tbytes, (size_t)(length - tbytes))) < 0)
     {
       if (errno != EAGAIN)
       {
@@ -1126,7 +1116,7 @@ cgi_initialize_string(const char *data)   /* I - Form data string */
               ch = *data - '0';
               if (ch > 9)
                ch -= 7;
-              *s = ch << 4;
+              *s = (char)(ch << 4);
 
               data ++;
               ch = *data - '0';
@@ -1264,7 +1254,7 @@ cgi_sort_variables(void)
   if (form_count < 2)
     return;
 
-  qsort(form_vars, form_count, sizeof(_cgi_var_t),
+  qsort(form_vars, (size_t)form_count, sizeof(_cgi_var_t),
         (int (*)(const void *, const void *))cgi_compare_variables);
 
 #ifdef DEBUG
@@ -1307,5 +1297,5 @@ cgi_unlink_file(void)
 
 
 /*
- * End of "$Id: var.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: var.c 12621 2015-05-06 21:32:18Z msweet $".
  */
diff --git a/cgi-bin/websearch.c b/cgi-bin/websearch.c
deleted file mode 100644 (file)
index 91ed4b1..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * "$Id: websearch.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- *   Web search program for www.cups.org.
- *
- *   Copyright 2007-2009 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Usage:
- *
- *   websearch directory "search string"
- *
- * Contents:
- *
- *   main()       - Search a directory of help files.
- *   list_nodes() - List matching nodes.
- */
-
-/*
- * Include necessary headers...
- */
-
-#include "cgi.h"
-
-
-/*
- * Local functions...
- */
-
-static void    list_nodes(help_index_t *hi, const char *title,
-                          cups_array_t *nodes);
-
-
-/*
- * '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 */
-{
-  help_index_t *hi,                    /* Help index */
-               *search;                /* Search index */
-  char         indexname[1024];        /* Name of index file */
-
-
-  if (argc != 3)
-  {
-    puts("Usage: websearch directory \"search terms\"");
-    return (1);
-  }
-
- /*
-  * Load the help index...
-  */
-
-  snprintf(indexname, sizeof(indexname), "%s/.index", argv[1]);
-  hi = helpLoadIndex(indexname, argv[1]);
-
- /*
-  * Do any searches...
-  */
-
-  search = helpSearchIndex(hi, argv[2], NULL, NULL);
-
-  if (search)
-    list_nodes(hi, argv[1], search->sorted);
-
- /*
-  * Return with no errors...
-  */
-
-  return (0);
-}
-
-
-/*
- * 'list_nodes()' - List nodes in an array...
- */
-
-static void
-list_nodes(help_index_t *hi,           /* I - Help index */
-           const char   *title,                /* I - Title string */
-          cups_array_t *nodes)         /* I - Nodes */
-{
-  help_node_t  *node,                  /* Current node */
-               *file;                  /* File node */
-
-
-  printf("%d\n", cupsArrayCount(nodes));
-  for (node = (help_node_t *)cupsArrayFirst(nodes);
-       node;
-       node = (help_node_t *)cupsArrayNext(nodes))
-  {
-    if (node->anchor)
-    {
-      file = helpFindNode(hi, node->filename, NULL);
-      printf("%d|%s#%s|%s|%s\n", node->score, node->filename, node->anchor,
-             node->text, file ? file->text : node->filename);
-    }
-    else
-      printf("%d|%s|%s|%s\n", node->score, node->filename, node->text,
-             node->text);
-  }
-}
-
-
-/*
- * End of "$Id: websearch.c 11173 2013-07-23 12:31:34Z msweet $".
- */
index 1235324..933d7d9 100644 (file)
@@ -1,9 +1,9 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12533 2015-02-27 12:30:26Z msweet $"
 #
 #   Configuration file makefile for CUPS.
 #
-#   Copyright 2007-2011 by Apple Inc.
+#   Copyright 2007-2015 by Apple Inc.
 #   Copyright 1993-2006 by Easy Software Products.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -76,8 +76,8 @@ install-data:
                else \
                        $(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT) ; \
                fi ; \
+               $(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT)/$$file.default; \
        done
-       $(INSTALL_CONFIG) -g $(CUPS_GROUP) cupsd.conf $(SERVERROOT)/cupsd.conf.default
        $(INSTALL_DIR) -m 755 $(DATADIR)/mime
        for file in $(REPLACE); do \
                if test -r $(DATADIR)/mime/$$file ; then \
@@ -139,5 +139,5 @@ uninstall:
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12533 2015-02-27 12:30:26Z msweet $".
 #
index d7e88b3..4a78ba6 100644 (file)
@@ -1,7 +1,5 @@
 #
-# "$Id: cups-files.conf.in 11221 2013-08-06 16:16:01Z msweet $"
-#
-# Sample file/directory/user/group configuration file for the CUPS scheduler.
+# File/directory/user/group configuration file for the CUPS scheduler.
 # See "man cups-files.conf" for a complete description of this file.
 #
 
@@ -17,6 +15,7 @@
 #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@
 
@@ -76,11 +75,8 @@ PageLog @CUPS_LOGDIR@/page_log
 # Location of helper programs...
 #ServerBin @CUPS_SERVERBIN@
 
-# SSL/TLS certificate for the scheduler...
-#ServerCertificate @CUPS_SERVERCERT@
-
-# SSL/TLS private key for the scheduler...
-#ServerKey @CUPS_SERVERKEY@
+# SSL/TLS keychain for the scheduler...
+#ServerKeychain @CUPS_SERVERKEYCHAIN@
 
 # Location of other configuration files...
 #ServerRoot @CUPS_SERVERROOT@
@@ -95,7 +91,3 @@ PageLog @CUPS_LOGDIR@/page_log
 # scheduler startup and cannot be one of the standard (public) temporary
 # directory locations for security reasons...
 #TempDir @CUPS_REQUESTS@/tmp
-
-#
-# End of "$Id: cups-files.conf.in 11221 2013-08-06 16:16:01Z msweet $".
-#
index 9fe0365..2fd0de0 100644 (file)
@@ -1,13 +1,12 @@
 #
-# "$Id: cupsd.conf.in 11173 2013-07-23 12:31:34Z msweet $"
-#
-# Sample configuration file for the CUPS scheduler.  See "man cupsd.conf" for a
+# 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@
@@ -40,6 +39,13 @@ WebInterface @CUPS_WEBIF@
   Order allow,deny
 </Location>
 
+# Restrict access to log files...
+<Location /admin/log>
+  AuthType Default
+  Require user @SYSTEM
+  Order allow,deny
+</Location>
+
 # Set the default printer/job policies...
 <Policy default>
   # Job/subscription privacy...
@@ -128,7 +134,3 @@ WebInterface @CUPS_WEBIF@
     Order deny,allow
   </Limit>
 </Policy>
-
-#
-# End of "$Id: cupsd.conf.in 11173 2013-07-23 12:31:34Z msweet $".
-#
index d6bebf8..0685b19 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: mime.convs.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: mime.convs.in 11025 2013-06-07 01:00:33Z msweet $"
 #
 #   DO NOT EDIT THIS FILE, AS IT IS OVERWRITTEN WHEN YOU INSTALL NEW
 #   VERSIONS OF CUPS.  Instead, create a "local.convs" file that
@@ -59,5 +59,5 @@ application/vnd.cups-raster   image/pwg-raster                100     rastertopwg
 @DEFAULT_RAW_PRINTING@application/octet-stream application/vnd.cups-raw        0       -
 
 #
-# End of "$Id: mime.convs.in 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: mime.convs.in 11025 2013-06-07 01:00:33Z msweet $".
 #
index 217d75b..dcb0771 100644 (file)
@@ -1,20 +1,20 @@
 #
 # "$Id: mime.types 7670 2008-06-17 22:42:08Z mike $"
 #
-#   Base MIME types file for CUPS.
+# 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.
+# 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-2011 by Apple Inc.
-#   Copyright 1997-2007 by Easy Software Products.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 ########################################################################
@@ -37,6 +37,7 @@
 #                                       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
@@ -70,7 +71,7 @@
 #
 
 #application/msword            doc string(0,<D0CF11E0A1B11AE1>)
-application/pdf                        pdf string(0,%PDF)
+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") \
@@ -80,6 +81,13 @@ application/postscript               ai eps ps string(0,%!) string(0,<04>%!) \
                                 (contains(0,4096,<0a>%!) + \
                                  !contains(0,4096,"ENTER LANGUAGE")))
 
+application/g-code             gcode
+application/sla                        stl string(0,"solid ") + contains(0,4096,"facet") + contains(0,4096,"vertex")
+application/vnd.makerbot-s3g   x3g
+model/amf                      amf
+model/vnd.collada+xml          dae
+
+
 ########################################################################
 #
 # Image files...
@@ -92,7 +100,7 @@ image/jpeg                   jpeg jpg jpe string(0,<FFD8FF>) +\
                                 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(100)
+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
@@ -123,7 +131,7 @@ 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) + \
+                               printable(0,1024) + ! css + \
                                (string(0,/*) string(0,//)
                                 string(0,#include) contains(0,1024,<0a>#include) \
                                 string(0,#define) contains(0,1024,<0a>#define))
@@ -152,7 +160,7 @@ application/vnd.cups-pdf
 application/vnd.cups-postscript
 application/vnd.cups-ppd       ppd string(0,"*PPD-Adobe:")
 application/vnd.cups-raster    string(0,"RaSt") string(0,"tSaR") \
-                               string(0,"RaS2") string(0,"2SaR") \
+                               (string(0,"RaS2") + !string(4,PwgRaster<00>)) string(0,"2SaR") \
                                string(0,"RaS3") string(0,"3SaR")
 application/vnd.cups-raw       (string(0,<1B>E) + !string(2,<1B>%0B)) \
                                string(0,<1B>@) \
index 5d7d52c..23a5bab 100644 (file)
@@ -1,13 +1,7 @@
 #
-# "$Id: snmp.conf.in 11173 2013-07-23 12:31:34Z msweet $"
-#
-#   Sample SNMP configuration file for CUPS.  See "man cups-snmp.conf" for a
-#   complete description of this file.
+# SNMP configuration file for CUPS.  See "man cups-snmp.conf" for a complete
+# description of this file.
 #
 
 @CUPS_SNMP_ADDRESS@
 @CUPS_SNMP_COMMUNITY@
-
-#
-# End of "$Id: snmp.conf.in 11173 2013-07-23 12:31:34Z msweet $".
-#
index 06e675a..38a7af6 100644 (file)
@@ -1,30 +1,38 @@
 dnl
-dnl "$Id: cups-common.m4 8781 2009-08-28 17:34:54Z mike $"
+dnl "$Id: cups-common.m4 12852 2015-08-28 13:29:21Z msweet $"
 dnl
-dnl   Common configuration stuff for CUPS.
+dnl Common configuration stuff for CUPS.
 dnl
-dnl   Copyright 2007-2013 by Apple Inc.
-dnl   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2015 by Apple Inc.
+dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
 dnl
-dnl   These coded instructions, statements, and computer programs are the
-dnl   property of Apple Inc. and are protected by Federal copyright
-dnl   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl   which should have been included with this file.  If this file is
-dnl   file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file.  If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
 dnl
 
-dnl We need at least autoconf 2.60...
-AC_PREREQ(2.60)
-
 dnl Set the name of the config header file...
 AC_CONFIG_HEADER(config.h)
 
 dnl Version number information...
-CUPS_VERSION=1.6.4
-CUPS_REVISION=
-#if test -z "$CUPS_REVISION" -a -d .svn; then
-#      CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`"
-#fi
+CUPS_VERSION=2.1.2
+
+case "$CUPS_VERSION" in
+       *svn)
+               if test -z "$CUPS_REVISION" -a -d .svn; then
+                       CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`"
+               else
+                       CUPS_REVISION=""
+               fi
+               ;;
+
+       *)
+               CUPS_REVISION=""
+               ;;
+esac
+
 CUPS_BUILD="cups-$CUPS_VERSION"
 
 AC_ARG_WITH(cups_build, [  --with-cups-build       set "cups-config --build" string ],
@@ -33,8 +41,8 @@ AC_ARG_WITH(cups_build, [  --with-cups-build       set "cups-config --build" str
 AC_SUBST(CUPS_VERSION)
 AC_SUBST(CUPS_REVISION)
 AC_SUBST(CUPS_BUILD)
-AC_DEFINE_UNQUOTED(CUPS_SVERSION, "CUPS v$CUPS_VERSION$CUPS_REVISION")
-AC_DEFINE_UNQUOTED(CUPS_MINIMAL, "CUPS/$CUPS_VERSION$CUPS_REVISION")
+AC_DEFINE_UNQUOTED(CUPS_SVERSION, "AC_PACKAGE_NAME v$CUPS_VERSION$CUPS_REVISION")
+AC_DEFINE_UNQUOTED(CUPS_MINIMAL, "AC_PACKAGE_NAME/$CUPS_VERSION$CUPS_REVISION")
 
 dnl Default compiler flags...
 CFLAGS="${CFLAGS:=}"
@@ -89,7 +97,7 @@ fi
 AC_SUBST(INSTALLSTATIC)
 
 dnl Check for pkg-config, which is used for some other tests later on...
-AC_PATH_PROG(PKGCONFIG, pkg-config)
+AC_PATH_TOOL(PKGCONFIG, pkg-config)
 
 dnl Check for libraries...
 AC_SEARCH_LIBS(abs, m, AC_DEFINE(HAVE_ABS))
@@ -134,11 +142,10 @@ AC_CHECK_HEADER(stdint.h,AC_DEFINE(HAVE_STDINT_H))
 AC_CHECK_HEADER(string.h,AC_DEFINE(HAVE_STRING_H))
 AC_CHECK_HEADER(strings.h,AC_DEFINE(HAVE_STRINGS_H))
 AC_CHECK_HEADER(bstring.h,AC_DEFINE(HAVE_BSTRING_H))
-AC_CHECK_HEADER(usersec.h,AC_DEFINE(HAVE_USERSEC_H))
 AC_CHECK_HEADER(sys/ioctl.h,AC_DEFINE(HAVE_SYS_IOCTL_H))
 AC_CHECK_HEADER(sys/param.h,AC_DEFINE(HAVE_SYS_PARAM_H))
 AC_CHECK_HEADER(sys/ucred.h,AC_DEFINE(HAVE_SYS_UCRED_H))
-AC_CHECK_HEADER(scsi/sg.h,AC_DEFINE(HAVE_SCSI_SG_H))
+AC_CHECK_HEADER(asl.h,AC_DEFINE(HAVE_ASL_H))
 
 dnl Checks for iconv.h and iconv_open
 AC_CHECK_HEADER(iconv.h,
@@ -147,6 +154,9 @@ AC_CHECK_HEADER(iconv.h,
        AC_SEARCH_LIBS(iconv_open,iconv,
                AC_DEFINE(HAVE_ICONV_H)
                SAVELIBS="$SAVELIBS $LIBS")
+       AC_SEARCH_LIBS(libiconv_open,iconv,
+               AC_DEFINE(HAVE_ICONV_H)
+               SAVELIBS="$SAVELIBS $LIBS")
        LIBS="$SAVELIBS")
 
 dnl Checks for Mini-XML (www.minixml.org)...
@@ -202,6 +212,9 @@ AC_CHECK_FUNCS(sigaction)
 dnl Checks for wait functions.
 AC_CHECK_FUNCS(waitpid wait3)
 
+dnl Check for posix_spawn
+AC_CHECK_FUNCS(posix_spawn)
+
 dnl See if the tm structure has the tm_gmtoff member...
 AC_MSG_CHECKING(for tm_gmtoff member in tm structure)
 AC_TRY_COMPILE([#include <time.h>],[struct tm t;
@@ -230,7 +243,7 @@ AC_SUBST(LIBUSB)
 AC_SUBST(USBQUIRKS)
 
 if test "x$PKGCONFIG" != x; then
-       if test x$enable_libusb = xyes -o $uname != Darwin; then
+       if test x$enable_libusb != xno -a $uname != Darwin; then
                AC_MSG_CHECKING(for libusb-1.0)
                if $PKGCONFIG --exists libusb-1.0; then
                        AC_MSG_RESULT(yes)
@@ -240,6 +253,9 @@ if test "x$PKGCONFIG" != x; then
                        USBQUIRKS="\$(DATADIR)/usb"
                else
                        AC_MSG_RESULT(no)
+                       if test x$enable_libusb = xyes; then
+                               AC_MSG_ERROR(libusb required for --enable-libusb.)
+                       fi
                fi
        fi
 elif test x$enable_libusb = xyes; then
@@ -267,6 +283,7 @@ AC_CHECK_HEADER(zlib.h,
        AC_DEFINE(HAVE_LIBZ)
        LIBZ="-lz"
        LIBS="$LIBS -lz"
+       AC_CHECK_LIB(z, inflateCopy, AC_DEFINE(HAVE_INFLATECOPY))
        if test "x$GZIP" != z; then
                INSTALL_GZIP="-z"
        fi))
@@ -302,20 +319,15 @@ fi
 LIBS="$SAVELIBS"
 
 dnl Check for DBUS support
-if test -d /etc/dbus-1; then
-       DBUSDIR="/etc/dbus-1"
-else
-       DBUSDIR=""
-fi
-
-AC_ARG_ENABLE(dbus, [  --enable-dbus           build with DBUS support])
+AC_ARG_ENABLE(dbus, [  --disable-dbus           build without DBUS support])
 AC_ARG_WITH(dbusdir, [  --with-dbusdir          set DBUS configuration directory ],
        DBUSDIR="$withval")
 
+DBUSDIR=""
 DBUS_NOTIFIER=""
 DBUS_NOTIFIERLIBS=""
 
-if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x; then
+if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x -a "x$uname" != xDarwin; then
        AC_MSG_CHECKING(for DBUS)
        if $PKGCONFIG --exists dbus-1; then
                AC_MSG_RESULT(yes)
@@ -328,7 +340,12 @@ if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x; then
                LIBS="$LIBS $DBUS_NOTIFIERLIBS"
                AC_CHECK_FUNC(dbus_message_iter_init_append,
                              AC_DEFINE(HAVE_DBUS_MESSAGE_ITER_INIT_APPEND))
+               AC_CHECK_FUNC(dbus_threads_init,
+                             AC_DEFINE(HAVE_DBUS_THREADS_INIT))
                LIBS="$SAVELIBS"
+               if test -d /etc/dbus-1; then
+                       DBUSDIR="/etc/dbus-1"
+               fi
        else
                AC_MSG_RESULT(no)
        fi
@@ -355,7 +372,6 @@ case $uname in
                AC_CHECK_HEADER(CoreFoundation/CoreFoundation.h,AC_DEFINE(HAVE_COREFOUNDATION_H))
                AC_CHECK_HEADER(CoreFoundation/CFPriv.h,AC_DEFINE(HAVE_CFPRIV_H))
                AC_CHECK_HEADER(CoreFoundation/CFBundlePriv.h,AC_DEFINE(HAVE_CFBUNDLEPRIV_H))
-               AC_CHECK_HEADER(IOKit/pwr_mgt/IOPMLibPrivate.h,AC_DEFINE(HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H))
 
                dnl Check for dynamic store function...
                AC_CHECK_FUNCS(SCDynamicStoreCopyComputerName)
@@ -365,9 +381,6 @@ case $uname in
                AC_CHECK_HEADER(membershipPriv.h,AC_DEFINE(HAVE_MEMBERSHIPPRIV_H))
                AC_CHECK_FUNCS(mbr_uid_to_uuid)
 
-                dnl Check for the vproc_transaction_begin/end stuff...
-               AC_CHECK_FUNCS(vproc_transaction_begin)
-
                dnl Need <dlfcn.h> header...
                AC_CHECK_HEADER(dlfcn.h,AC_DEFINE(HAVE_DLFCN_H))
 
@@ -461,5 +474,5 @@ esac
 AC_SUBST(BUILDDIRS)
 
 dnl
-dnl End of "$Id: cups-common.m4 8781 2009-08-28 17:34:54Z mike $".
+dnl End of "$Id: cups-common.m4 12852 2015-08-28 13:29:21Z msweet $".
 dnl
index 4286895..b911877 100644 (file)
@@ -1,16 +1,16 @@
 dnl
-dnl "$Id: cups-compiler.m4 7871 2008-08-27 21:12:43Z mike $"
+dnl "$Id: cups-compiler.m4 12742 2015-06-23 14:48:53Z msweet $"
 dnl
-dnl   Compiler stuff for CUPS.
+dnl Compiler stuff for CUPS.
 dnl
-dnl   Copyright 2007-2012 by Apple Inc.
-dnl   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2014 by Apple Inc.
+dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
 dnl
-dnl   These coded instructions, statements, and computer programs are the
-dnl   property of Apple Inc. and are protected by Federal copyright
-dnl   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl   which should have been included with this file.  If this file is
-dnl   file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file.  If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
 dnl
 
 dnl Clear the debugging and non-shared library options unless the user asks
@@ -103,57 +103,89 @@ if test -n "$GCC"; then
        fi
 
        # Generate position-independent code as needed...
-       if test $PICFLAG = 1 -a $uname != AIX; then
+       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.
-       AC_MSG_CHECKING(if GCC supports -fstack-protector)
+       AC_MSG_CHECKING(whether compiler supports -fstack-protector)
        OLDCFLAGS="$CFLAGS"
        CFLAGS="$CFLAGS -fstack-protector"
        AC_TRY_LINK(,,
-               OPTIM="$OPTIM -fstack-protector"
+               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
                AC_MSG_RESULT(yes),
                AC_MSG_RESULT(no))
        CFLAGS="$OLDCFLAGS"
 
-       # 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.
-       AC_MSG_CHECKING(if GCC supports -fPIE)
-       OLDCFLAGS="$CFLAGS"
-       CFLAGS="$CFLAGS -fPIE"
-       AC_TRY_COMPILE(,,
-               [case "$CC" in
-                       *clang)
-                               PIEFLAGS="-fPIE -Wl,-pie"
+       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...
+               AC_MSG_CHECKING(whether compiler supports -fPIE)
+               OLDCFLAGS="$CFLAGS"
+               case "$uname" in
+                       Darwin*)
+                               CFLAGS="$CFLAGS -fPIE -Wl,-pie"
+                               AC_TRY_COMPILE(,,[
+                                       PIEFLAGS="-fPIE -Wl,-pie"
+                                       AC_MSG_RESULT(yes)],
+                                       AC_MSG_RESULT(no))
                                ;;
+
                        *)
-                               PIEFLAGS="-fPIE -pie"
+                               CFLAGS="$CFLAGS -fPIE -pie"
+                               AC_TRY_COMPILE(,,[
+                                       PIEFLAGS="-fPIE -pie"
+                                       AC_MSG_RESULT(yes)],
+                                       AC_MSG_RESULT(no))
                                ;;
                esac
-               AC_MSG_RESULT(yes)],
-               AC_MSG_RESULT(no))
-       CFLAGS="$OLDCFLAGS"
+               CFLAGS="$OLDCFLAGS"
+       fi
 
        if test "x$with_optim" = x; then
                # Add useful warning options for tracking down problems...
                OPTIM="-Wall -Wno-format-y2k -Wunused $OPTIM"
 
+               AC_MSG_CHECKING(whether compiler supports -Wno-unused-result)
+               OLDCFLAGS="$CFLAGS"
+               CFLAGS="$CFLAGS -Werror -Wno-unused-result"
+               AC_TRY_COMPILE(,,
+                       [OPTIM="$OPTIM -Wno-unused-result"
+                       AC_MSG_RESULT(yes)],
+                       AC_MSG_RESULT(no))
+               CFLAGS="$OLDCFLAGS"
+
+               AC_MSG_CHECKING(whether compiler supports -Wsign-conversion)
+               OLDCFLAGS="$CFLAGS"
+               CFLAGS="$CFLAGS -Werror -Wsign-conversion"
+               AC_TRY_COMPILE(,,
+                       [OPTIM="$OPTIM -Wsign-conversion"
+                       AC_MSG_RESULT(yes)],
+                       AC_MSG_RESULT(no))
+               CFLAGS="$OLDCFLAGS"
+
+               AC_MSG_CHECKING(whether compiler supports -Wno-tautological-compare)
+               OLDCFLAGS="$CFLAGS"
+               CFLAGS="$CFLAGS -Werror -Wno-tautological-compare"
+               AC_TRY_COMPILE(,,
+                       [OPTIM="$OPTIM -Wno-tautological-compare"
+                       AC_MSG_RESULT(yes)],
+                       AC_MSG_RESULT(no))
+               CFLAGS="$OLDCFLAGS"
+
                # Additional warning options for development testing...
                if test -d .svn; then
-                       OPTIM="-Wshadow -Werror $OPTIM"
-               else
-                       AC_MSG_CHECKING(if GCC supports -Wno-tautological-compare)
-                       OLDCFLAGS="$CFLAGS"
-                       CFLAGS="$CFLAGS -Werror -Wno-tautological-compare"
-                       AC_TRY_COMPILE(,,
-                               [OPTIM="$OPTIM -Wno-tautological-compare"
-                               AC_MSG_RESULT(yes)],
-                               AC_MSG_RESULT(no))
-                       CFLAGS="$OLDCFLAGS"
+                       OPTIM="-Werror $OPTIM"
                fi
        fi
 
@@ -171,60 +203,13 @@ if test -n "$GCC"; then
                        # 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"
+                               RELROFLAGS="-Wl,-z,relro,-z,now"
                        fi
                        ;;
        esac
 else
        # Add vendor-specific compiler options...
        case $uname in
-               AIX*)
-                       if test -z "$OPTIM"; then
-                               if test "x$with_optim" = x; then
-                                       OPTIM="-O2 -qmaxmem=6000"
-                               else
-                                       OPTIM="$with_optim $OPTIM"
-                               fi
-                       fi
-                       ;;
-               HP-UX*)
-                       if test -z "$OPTIM"; then
-                               if test "x$with_optim" = x; then
-                                       OPTIM="+O2"
-                               else
-                                       OPTIM="$with_optim $OPTIM"
-                               fi
-                       fi
-
-                       CFLAGS="-Ae $CFLAGS"
-
-                       if test $PICFLAG = 1; then
-                               OPTIM="+z $OPTIM"
-                       fi
-                       ;;
-               IRIX)
-                       if test -z "$OPTIM"; then
-                               if test "x$with_optim" = x; then
-                                       OPTIM="-O2"
-                               else
-                                       OPTIM="$with_optim $OPTIM"
-                               fi
-                       fi
-
-                       if test "x$with_optim" = x; then
-                               OPTIM="-fullwarn -woff 1183,1209,1349,1506,3201 $OPTIM"
-                       fi
-                       ;;
-               OSF*)
-                       # Tru64 UNIX aka Digital UNIX aka OSF/1
-                       if test -z "$OPTIM"; then
-                               if test "x$with_optim" = x; then
-                                       OPTIM="-O"
-                               else
-                                       OPTIM="$with_optim"
-                               fi
-                       fi
-                       ;;
                SunOS*)
                        # Solaris
                        if test -z "$OPTIM"; then
@@ -239,26 +224,12 @@ else
                                OPTIM="-KPIC $OPTIM"
                        fi
                        ;;
-               UNIX_SVR*)
-                       # UnixWare
-                       if test -z "$OPTIM"; then
-                               if test "x$with_optim" = x; then
-                                       OPTIM="-O"
-                               else
-                                       OPTIM="$with_optim $OPTIM"
-                               fi
-                       fi
-
-                       if test $PICFLAG = 1; then
-                               OPTIM="-KPIC $OPTIM"
-                       fi
-                       ;;
                *)
                        # Running some other operating system; inform the user they
                        # should contribute the necessary options to
                        # cups-support@cups.org...
                        echo "Building CUPS with default compiler optimizations; contact"
-                       echo "cups-bugs@cups.org with uname and compiler options needed"
+                       echo "cups-devel@cups.org with uname and compiler options needed"
                        echo "for your platform, or set the CFLAGS and LDFLAGS environment"
                        echo "variables before running configure."
                        ;;
@@ -267,33 +238,13 @@ fi
 
 # Add general compiler options per platform...
 case $uname in
-       HP-UX*)
-               # HP-UX 10.20 (at least) needs this definition to get the
-               # h_errno global...
-               OPTIM="$OPTIM -D_XOPEN_SOURCE_EXTENDED"
-
-               # HP-UX 11.00 (at least) needs this definition to get the
-               # u_short type used by the IP headers...
-               OPTIM="$OPTIM -D_INCLUDE_HPUX_SOURCE"
-
-               # HP-UX 11.23 (at least) needs this definition to get the
-               # IPv6 header to work...
-               OPTIM="$OPTIM -D_HPUX_SOURCE"
-               ;;
-
        Linux*)
                # glibc 2.8 and higher breaks peer credentials unless you
                # define _GNU_SOURCE...
                OPTIM="$OPTIM -D_GNU_SOURCE"
                ;;
-
-       OSF*)
-               # Tru64 UNIX aka Digital UNIX aka OSF/1 need to be told
-               # to be POSIX-compliant...
-               OPTIM="$OPTIM -D_XOPEN_SOURCE=500 -D_XOPEN_SOURCE_EXTENDED -D_OSF_SOURCE"
-               ;;
 esac
 
 dnl
-dnl End of "$Id: cups-compiler.m4 7871 2008-08-27 21:12:43Z mike $".
+dnl End of "$Id: cups-compiler.m4 12742 2015-06-23 14:48:53Z msweet $".
 dnl
index 173cfea..432a927 100644 (file)
@@ -1,9 +1,9 @@
 dnl
-dnl "$Id: cups-defaults.m4 7959 2008-09-17 19:30:58Z mike $"
+dnl "$Id: cups-defaults.m4 12846 2015-08-26 18:26:22Z msweet $"
 dnl
 dnl   Default cupsd configuration settings for CUPS.
 dnl
-dnl   Copyright 2007-2012 by Apple Inc.
+dnl   Copyright 2007-2015 by Apple Inc.
 dnl   Copyright 2006-2007 by Easy Software Products, all rights reserved.
 dnl
 dnl   These coded instructions, statements, and computer programs are the
@@ -78,12 +78,21 @@ AC_SUBST(CUPS_LOG_LEVEL)
 AC_DEFINE_UNQUOTED(CUPS_DEFAULT_LOG_LEVEL, "$CUPS_LOG_LEVEL")
 
 dnl Default AccessLogLevel
-AC_ARG_WITH(access_log_level, [  --with-access-log-level set default AccessLogLevel value, default=actions],
+AC_ARG_WITH(access_log_level, [  --with-access-log-level set default AccessLogLevel value, default=none],
        CUPS_ACCESS_LOG_LEVEL="$withval",
-       CUPS_ACCESS_LOG_LEVEL="actions")
+       CUPS_ACCESS_LOG_LEVEL="none")
 AC_SUBST(CUPS_ACCESS_LOG_LEVEL)
 AC_DEFINE_UNQUOTED(CUPS_DEFAULT_ACCESS_LOG_LEVEL, "$CUPS_ACCESS_LOG_LEVEL")
 
+dnl Default PageLogFormat
+AC_ARG_ENABLE(page_logging, [  --enable-page-logging   enable page_log by default])
+if test "x$enable_page_logging" = xyes; then
+       CUPS_PAGE_LOG_FORMAT=""
+else
+       CUPS_PAGE_LOG_FORMAT="PageLogFormat"
+fi
+AC_SUBST(CUPS_PAGE_LOG_FORMAT)
+
 dnl Default Browsing
 AC_ARG_ENABLE(browsing, [  --disable-browsing      disable Browsing by default])
 if test "x$enable_browsing" = xno; then
@@ -400,5 +409,5 @@ AC_SUBST(CUPS_WEBIF)
 AC_DEFINE_UNQUOTED(CUPS_DEFAULT_WEBIF, $CUPS_DEFAULT_WEBIF)
 
 dnl
-dnl End of "$Id: cups-defaults.m4 7959 2008-09-17 19:30:58Z mike $".
+dnl End of "$Id: cups-defaults.m4 12846 2015-08-26 18:26:22Z msweet $".
 dnl
index fe6e01e..fa3369e 100644 (file)
@@ -1,16 +1,16 @@
 dnl
-dnl "$Id: cups-directories.m4 7799 2008-07-25 20:06:08Z mike $"
+dnl "$Id: cups-directories.m4 11717 2014-03-21 16:42:53Z msweet $"
 dnl
-dnl   Directory stuff for CUPS.
+dnl Directory stuff for CUPS.
 dnl
-dnl   Copyright 2007-2012 by Apple Inc.
-dnl   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2014 by Apple Inc.
+dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
 dnl
-dnl   These coded instructions, statements, and computer programs are the
-dnl   property of Apple Inc. and are protected by Federal copyright
-dnl   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl   which should have been included with this file.  If this file is
-dnl   file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file.  If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
 dnl
 
 AC_PREFIX_DEFAULT(/)
@@ -102,19 +102,11 @@ fi
 dnl Fix "libdir" variable...
 if test "$libdir" = "\${exec_prefix}/lib"; then
        case "$uname" in
-               IRIX*)
-                       libdir="$exec_prefix/lib32"
-                       ;;
                Linux*)
                        if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot; then
                                libdir="$exec_prefix/lib64"
                        fi
                        ;;
-               HP-UX*)
-                       if test -d /usr/lib/hpux32; then
-                               libdir="$exec_prefix/lib/hpux32"
-                       fi
-                       ;;
        esac
 fi
 
@@ -129,126 +121,6 @@ fi
 AC_SUBST(privateinclude)
 AC_SUBST(PRIVATEINCLUDE)
 
-dnl Setup init.d locations...
-AC_ARG_WITH(rcdir, [  --with-rcdir            set path for rc scripts],rcdir="$withval",rcdir="")
-AC_ARG_WITH(rclevels, [  --with-rclevels         set run levels for rc scripts],rclevels="$withval",rclevels="2 3 5")
-AC_ARG_WITH(rcstart, [  --with-rcstart          set start number for rc scripts],rcstart="$withval",rcstart="99")
-AC_ARG_WITH(rcstop, [  --with-rcstop           set stop number for rc scripts],rcstop="$withval",rcstop="00")
-AC_ARG_WITH(smfmanifestdir, [  --with-smfmanifestdir   set path for Solaris SMF manifest],smfmanifestdir="$withval",smfmanifestdir="")
-
-INITDIR=""
-INITDDIR=""
-RCLEVELS="$rclevels"
-RCSTART="$rcstart"
-RCSTOP="$rcstop"
-SMFMANIFESTDIR=""
-
-if test x$rcdir = x; then
-       case "$uname" in
-               AIX*)
-                       INITDIR="/etc/rc.d"
-                       ;;
-
-               Darwin*)
-                       # Darwin and MacOS X...
-                       if test -x /sbin/launchd; then
-                               INITDDIR="/System/Library/LaunchDaemons"
-                       else
-                               INITDDIR="/System/Library/StartupItems/PrintingServices"
-                       fi
-                       ;;
-
-               FreeBSD* | OpenBSD* | MirBSD* | ekkoBSD*)
-                       # FreeBSD and OpenBSD
-                       ;;
-
-               HP-UX*)
-                       INITDIR="/sbin"
-                       RCLEVELS="2"
-                       RCSTART="380"
-                       RCSTOP="620"
-                       ;;
-
-               IRIX*)
-                       # IRIX
-                       INITDIR="/etc"
-                       RCSTART="60"
-                       RCSTOP="25"
-                       ;;
-
-               Linux | GNU | GNU/k*BSD*)
-                       # Linux/HURD seems to choose an init.d directory at random...
-                       if test -d /sbin/init.d; then
-                               # SuSE
-                               INITDIR="/sbin/init.d"
-                       else
-                               if test -d /etc/init.d; then
-                                       # Others
-                                       INITDIR="/etc"
-                               else
-                                       # RedHat
-                                       INITDIR="/etc/rc.d"
-                               fi
-                       fi
-                       RCSTART="81"
-                       RCSTOP="36"
-                       ;;
-
-               NetBSD*)
-                       # NetBSD
-                       INITDDIR="/etc/rc.d"
-                       ;;
-
-               OSF1*)
-                       INITDIR="/sbin"
-                       ;;
-
-               SunOS*)
-                       # Solaris
-                       if test "x$smfmanifestdir" != x; then
-                               SMFMANIFESTDIR=$smfmanifestdir
-                       else
-                               INITDIR="/etc"
-                               RCSTART="81"
-                       fi
-                       ;;
-
-               *)
-                       INITDIR="/etc"
-                       ;;
-
-       esac
-elif test "x$rcdir" != xno; then
-       if test "x$rclevels" = x; then
-               INITDDIR="$rcdir"
-       else
-               INITDIR="$rcdir"
-       fi
-fi
-
-AC_SUBST(INITDIR)
-AC_SUBST(INITDDIR)
-AC_SUBST(RCLEVELS)
-AC_SUBST(RCSTART)
-AC_SUBST(RCSTOP)
-AC_SUBST(SMFMANIFESTDIR)
-
-dnl Xinetd support...
-AC_ARG_WITH(xinetd, [  --with-xinetd           set path for xinetd config files],XINETD="$withval",XINETD="")
-
-if test "x$XINETD" = x -a ! -x /sbin/launchd; then
-       for dir in /private/etc/xinetd.d /etc/xinetd.d /usr/local/etc/xinetd.d; do
-               if test -d $dir; then
-                       XINETD="$dir"
-                       break
-               fi
-       done
-elif test "x$XINETD" = xno; then
-       XINETD=""
-fi
-
-AC_SUBST(XINETD)
-
 dnl LPD sharing support...
 AC_ARG_WITH(lpdconfig, [  --with-lpdconfig        set URI for LPD config file],
        LPDCONFIG="$withval", LPDCONFIG="")
@@ -365,10 +237,6 @@ if test "$localedir" = "\${datarootdir}/locale"; then
                        CUPS_LOCALEDIR="$datarootdir/locale"
                        ;;
 
-               OSF1* | AIX*)
-                       CUPS_LOCALEDIR="$exec_prefix/lib/nls/msg"
-                       ;;
-
                *)
                        # This is the standard System V location...
                        CUPS_LOCALEDIR="$exec_prefix/lib/locale"
@@ -422,19 +290,20 @@ AC_DEFINE_UNQUOTED(CUPS_SERVERROOT, "$sysconfdir/cups")
 AC_SUBST(CUPS_SERVERROOT)
 
 # Transient run-time state
-case "$uname" in
-       Darwin*)
-               # Darwin (OS X)
-               CUPS_STATEDIR="$CUPS_SERVERROOT"
-               ;;
-       *)
-               # All others
-               CUPS_STATEDIR="$localstatedir/run/cups"
-               ;;
-esac
+AC_ARG_WITH(rundir, [  --with-rundir           set transient run-time state directory],CUPS_STATEDIR="$withval",[
+       case "$uname" in
+               Darwin*)
+                       # Darwin (OS X)
+                       CUPS_STATEDIR="$CUPS_SERVERROOT"
+                       ;;
+               *)
+                       # All others
+                       CUPS_STATEDIR="$localstatedir/run/cups"
+                       ;;
+       esac])
 AC_DEFINE_UNQUOTED(CUPS_STATEDIR, "$CUPS_STATEDIR")
 AC_SUBST(CUPS_STATEDIR)
 
 dnl
-dnl End of "$Id: cups-directories.m4 7799 2008-07-25 20:06:08Z mike $".
+dnl End of "$Id: cups-directories.m4 11717 2014-03-21 16:42:53Z msweet $".
 dnl
index 426637a..69e5d37 100644 (file)
@@ -1,9 +1,9 @@
 dnl
-dnl "$Id: cups-dnssd.m4 7890 2008-08-29 22:19:39Z mike $"
+dnl "$Id: cups-dnssd.m4 12845 2015-08-26 18:23:53Z msweet $"
 dnl
 dnl   DNS Service Discovery (aka Bonjour) stuff for CUPS.
 dnl
-dnl   Copyright 2007-2012 by Apple Inc.
+dnl   Copyright 2007-2015 by Apple Inc.
 dnl
 dnl   These coded instructions, statements, and computer programs are the
 dnl   property of Apple Inc. and are protected by Federal copyright
@@ -23,14 +23,18 @@ AC_ARG_WITH(dnssd-includes, [  --with-dnssd-includes   set directory for DNS Ser
 
 DNSSDLIBS=""
 DNSSD_BACKEND=""
+IPPFIND_BIN=""
+IPPFIND_MAN=""
 
-if test "x$PKGCONFIG" != x -a x$enable_avahi != xno; then
+if test "x$PKGCONFIG" != x -a x$enable_avahi != xno -a x$uname != xDarwin; then
        AC_MSG_CHECKING(for Avahi)
        if $PKGCONFIG --exists avahi-client; then
                AC_MSG_RESULT(yes)
                CFLAGS="$CFLAGS `$PKGCONFIG --cflags avahi-client`"
                DNSSDLIBS="`$PKGCONFIG --libs avahi-client`"
                DNSSD_BACKEND="dnssd"
+               IPPFIND_BIN="ippfind"
+               IPPFIND_MAN="ippfind.\$(MAN1EXT)"
                AC_DEFINE(HAVE_AVAHI)
        else
                AC_MSG_RESULT(no)
@@ -45,6 +49,8 @@ if test "x$DNSSD_BACKEND" = x -a x$enable_dnssd != xno; then
                                AC_DEFINE(HAVE_DNSSD)
                                DNSSDLIBS="-framework CoreFoundation -framework SystemConfiguration"
                                DNSSD_BACKEND="dnssd"
+                               IPPFIND_BIN="ippfind"
+                               IPPFIND_MAN="ippfind.\$(MAN1EXT)"
                                ;;
                        *)
                                # All others...
@@ -61,6 +67,8 @@ if test "x$DNSSD_BACKEND" = x -a x$enable_dnssd != xno; then
                                        AC_DEFINE(HAVE_DNSSD)
                                        DNSSDLIBS="-ldns_sd"
                                        DNSSD_BACKEND="dnssd",
+                                       IPPFIND_BIN="ippfind"
+                                       IPPFIND_MAN="ippfind.\$(MAN1EXT)"
                                        AC_MSG_RESULT(no))
                                LIBS="$SAVELIBS"
                                ;;
@@ -70,7 +78,9 @@ fi
 
 AC_SUBST(DNSSDLIBS)
 AC_SUBST(DNSSD_BACKEND)
+AC_SUBST(IPPFIND_BIN)
+AC_SUBST(IPPFIND_MAN)
 
 dnl
-dnl End of "$Id: cups-dnssd.m4 7890 2008-08-29 22:19:39Z mike $".
+dnl End of "$Id: cups-dnssd.m4 12845 2015-08-26 18:23:53Z msweet $".
 dnl
index d378bbf..616d96c 100644 (file)
@@ -1,9 +1,9 @@
 dnl
-dnl   "$Id$"
+dnl   "$Id: cups-gssapi.m4 11911 2014-06-10 13:54:53Z msweet $"
 dnl
 dnl   GSSAPI/Kerberos library detection for CUPS.
 dnl
-dnl   Copyright 2007-2012 by Apple Inc.
+dnl   Copyright 2007-2013 by Apple Inc.
 dnl   Copyright 2006-2007 by Easy Software Products.
 dnl
 dnl   This file contains Kerberos support code, copyright 2006 by
@@ -22,7 +22,7 @@ LIBGSSAPI=""
 AC_SUBST(LIBGSSAPI)
 
 if test x$enable_gssapi != xno; then
-       AC_PATH_PROG(KRB5CONFIG, krb5-config)
+       AC_PATH_TOOL(KRB5CONFIG, krb5-config)
        if test "x$KRB5CONFIG" != x; then
                case "$uname" in
                        Darwin)
@@ -71,38 +71,9 @@ if test x$enable_gssapi != xno; then
        if test "x$LIBGSSAPI" != x; then
                AC_CHECK_HEADER(krb5.h, AC_DEFINE(HAVE_KRB5_H))
                if test -d /System/Library/Frameworks/GSS.framework; then
-                       gssdir="/System/Library/Frameworks/GSS.framework"
-                       AC_MSG_CHECKING(for GSS/gssapi.h presence)
-                       if test -f $gssdir/Headers/gssapi.h; then
-                               AC_DEFINE(HAVE_GSS_GSSAPI_H)
-                               AC_MSG_RESULT(yes)
-                       else
-                               AC_MSG_RESULT(no)
-                       fi
-                       AC_MSG_CHECKING(for GSS/gssapi_generic.h presence)
-                       if test -f $gssdir/Headers/gssapi_generic.h; then
-                               AC_DEFINE(HAVE_GSSAPI_GENERIC_H)
-                               AC_MSG_RESULT(yes)
-                       else
-                               AC_MSG_RESULT(no)
-                       fi
-                       AC_MSG_CHECKING(for GSS/gssapi_spi.h presence)
-                       if test -f $gssdir/PrivateHeaders/gssapi_spi.h; then
-                               AC_MSG_RESULT(yes)
-                               AC_MSG_CHECKING(for GSS/gssapi_spi.h usability)
-                               if test -s $gssdir/PrivateHeaders/gssapi_spi.h; then
-                                       AC_MSG_RESULT(yes)
-                                       AC_DEFINE(HAVE_GSS_GSSAPI_SPI_H)
-                               else
-                                       AC_MSG_RESULT(no)
-                               fi
-                       else
-                               AC_MSG_RESULT(no)
-                               if test $uversion -ge 110 -a $uversion -lt 120; then
-                                       # Broken public headers in 10.7.x...
-                                       AC_MSG_ERROR(Run 'sudo mkdir -p $gssdir/PrivateHeaders' and 'sudo touch $gssdir/PrivateHeaders/gssapi_spi.h' to build CUPS.)
-                               fi
-                       fi
+                       AC_CHECK_HEADER(GSS/gssapi.h, AC_DEFINE(HAVE_GSS_GSSAPI_H))
+                       AC_CHECK_HEADER(GSS/gssapi_generic.h, AC_DEFINE(HAVE_GSS_GSSAPI_GENERIC_H))
+                       AC_CHECK_HEADER(GSS/gssapi_spi.h, AC_DEFINE(HAVE_GSS_GSSAPI_SPI_H))
                else
                        AC_CHECK_HEADER(gssapi.h, AC_DEFINE(HAVE_GSSAPI_H))
                        AC_CHECK_HEADER(gssapi/gssapi.h, AC_DEFINE(HAVE_GSSAPI_GSSAPI_H))
@@ -158,5 +129,5 @@ AC_SUBST(CUPS_DEFAULT_GSSSERVICENAME)
 AC_DEFINE_UNQUOTED(CUPS_DEFAULT_GSSSERVICENAME, "$CUPS_DEFAULT_GSSSERVICENAME")
 
 dnl
-dnl End of "$Id$".
+dnl End of "$Id: cups-gssapi.m4 11911 2014-06-10 13:54:53Z msweet $".
 dnl
index 8243de7..6be7b1f 100644 (file)
@@ -1,5 +1,5 @@
 dnl
-dnl "$Id: cups-largefile.m4 6649 2007-07-11 21:46:42Z mike $"
+dnl "$Id: cups-largefile.m4 11324 2013-10-04 03:11:42Z msweet $"
 dnl
 dnl   Large file support stuff for CUPS.
 dnl
@@ -48,5 +48,5 @@ fi
 AC_CHECK_FUNC(strtoll, AC_DEFINE(HAVE_STRTOLL))
 
 dnl
-dnl End of "$Id: cups-largefile.m4 6649 2007-07-11 21:46:42Z mike $".
+dnl End of "$Id: cups-largefile.m4 11324 2013-10-04 03:11:42Z msweet $".
 dnl
diff --git a/config-scripts/cups-launchd.m4 b/config-scripts/cups-launchd.m4
deleted file mode 100644 (file)
index 23a2295..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-dnl
-dnl "$Id: cups-launchd.m4 6649 2007-07-11 21:46:42Z mike $"
-dnl
-dnl   launchd stuff for CUPS.
-dnl
-dnl   Copyright 2007-2010 by Apple Inc.
-dnl   Copyright 1997-2005 by Easy Software Products, all rights reserved.
-dnl
-dnl   These coded instructions, statements, and computer programs are the
-dnl   property of Apple Inc. and are protected by Federal copyright
-dnl   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl   which should have been included with this file.  If this file is
-dnl   file is missing or damaged, see the license at "http://www.cups.org/".
-dnl
-
-
-AC_ARG_ENABLE(launchd, [  --disable-launchd       disable launchd support])
-
-DEFAULT_LAUNCHD_CONF=""
-LAUNCHDLIBS=""
-
-if test x$enable_launchd != xno; then
-       AC_CHECK_FUNC(launch_msg, AC_DEFINE(HAVE_LAUNCHD))
-       AC_CHECK_HEADER(launch.h, AC_DEFINE(HAVE_LAUNCH_H))
-
-       case "$uname" in
-               Darwin*)
-                       # Darwin, MacOS X
-                       DEFAULT_LAUNCHD_CONF="/System/Library/LaunchDaemons/org.cups.cupsd.plist"
-                       # liblaunch is already part of libSystem
-                       ;;
-               *)
-                       # All others; this test will need to be updated
-                       ;;
-       esac
-fi
-
-AC_SUBST(DEFAULT_LAUNCHD_CONF)
-AC_SUBST(LAUNCHDLIBS)
-
-dnl
-dnl End of "$Id: cups-launchd.m4 6649 2007-07-11 21:46:42Z mike $".
-dnl
index d6026b2..2dcaab3 100644 (file)
@@ -1,5 +1,5 @@
 dnl
-dnl "$Id: cups-libtool.m4 6649 2007-07-11 21:46:42Z mike $"
+dnl "$Id: cups-libtool.m4 11324 2013-10-04 03:11:42Z msweet $"
 dnl
 dnl   Libtool stuff for CUPS.
 dnl
@@ -35,5 +35,5 @@ if test x$LIBTOOL != x; then
 fi
 
 dnl
-dnl End of "$Id: cups-libtool.m4 6649 2007-07-11 21:46:42Z mike $".
+dnl End of "$Id: cups-libtool.m4 11324 2013-10-04 03:11:42Z msweet $".
 dnl
index 7420433..bd6b8d5 100644 (file)
@@ -1,16 +1,16 @@
 dnl
-dnl "$Id: cups-manpages.m4 6649 2007-07-11 21:46:42Z mike $"
+dnl "$Id: cups-manpages.m4 11342 2013-10-18 20:36:01Z msweet $"
 dnl
-dnl   Manpage stuff for CUPS.
+dnl Manpage stuff for CUPS.
 dnl
-dnl   Copyright 2007-2012 by Apple Inc.
-dnl   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2013 by Apple Inc.
+dnl Copyright 1997-2006 by Easy Software Products, all rights reserved.
 dnl
-dnl   These coded instructions, statements, and computer programs are the
-dnl   property of Apple Inc. and are protected by Federal copyright
-dnl   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl   which should have been included with this file.  If this file is
-dnl   file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file.  If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
 dnl
 
 dnl Fix "mandir" variable...
@@ -22,18 +22,12 @@ fi
 
 if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"; then
        case "$uname" in
-               Darwin* | Linux | GNU | *BSD* | AIX*)
-                       # Darwin, MacOS X, Linux, GNU HURD, *BSD, and AIX
+               Darwin* | Linux | GNU | *BSD*)
+                       # Darwin, MacOS X, Linux, GNU HURD, and *BSD
                        mandir="/usr/share/man"
                        AMANDIR="/usr/share/man"
                        PMANDIR="/usr/share/man"
                        ;;
-               IRIX)
-                       # SGI IRIX
-                       mandir="/usr/share/catman/u_man"
-                       AMANDIR="/usr/share/catman/a_man"
-                       PMANDIR="/usr/share/catman/p_man"
-                       ;;
                *)
                        # All others
                        mandir="/usr/man"
@@ -51,16 +45,8 @@ AC_SUBST(PMANDIR)
 
 dnl Setup manpage extensions...
 case "$uname" in
-       IRIX*)
-               # SGI IRIX
-               MAN1EXT=1
-               MAN5EXT=5
-               MAN7EXT=7
-               MAN8EXT=1m
-               MAN8DIR=1
-               ;;
-       SunOS* | HP-UX*)
-               # Solaris and HP-UX
+       SunOS*)
+               # Solaris
                MAN1EXT=1
                MAN5EXT=5
                MAN7EXT=7
@@ -92,5 +78,5 @@ AC_SUBST(MAN8EXT)
 AC_SUBST(MAN8DIR)
 
 dnl
-dnl End of "$Id: cups-manpages.m4 6649 2007-07-11 21:46:42Z mike $".
+dnl End of "$Id: cups-manpages.m4 11342 2013-10-18 20:36:01Z msweet $".
 dnl
index b97fb4a..e5b3405 100644 (file)
@@ -1,19 +1,24 @@
 dnl
-dnl "$Id: cups-network.m4 7918 2008-09-08 22:03:01Z mike $"
+dnl "$Id: cups-network.m4 12324 2014-12-09 20:28:39Z msweet $"
 dnl
-dnl   Networking stuff for CUPS.
+dnl Networking stuff for CUPS.
 dnl
-dnl   Copyright 2007-2011 by Apple Inc.
-dnl   Copyright 1997-2005 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2014 by Apple Inc.
+dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
 dnl
-dnl   These coded instructions, statements, and computer programs are the
-dnl   property of Apple Inc. and are protected by Federal copyright
-dnl   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl   which should have been included with this file.  If this file is
-dnl   file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file.  If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
 dnl
 
-AC_CHECK_HEADER(resolv.h,AC_DEFINE(HAVE_RESOLV_H))
+AC_CHECK_HEADER(resolv.h,AC_DEFINE(HAVE_RESOLV_H),,[
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>])
 AC_SEARCH_LIBS(socket, socket)
 AC_SEARCH_LIBS(gethostbyaddr, nsl)
 AC_SEARCH_LIBS(getifaddrs, nsl, AC_DEFINE(HAVE_GETIFADDRS))
@@ -66,9 +71,6 @@ fi
 AC_SUBST(CUPS_DEFAULT_DOMAINSOCKET)
 AC_SUBST(CUPS_LISTEN_DOMAINSOCKET)
 
-AC_CHECK_HEADERS(AppleTalk/at_proto.h,AC_DEFINE(HAVE_APPLETALK_AT_PROTO_H),,
-       [#include <netat/appletalk.h>])
-
 dnl
-dnl End of "$Id: cups-network.m4 7918 2008-09-08 22:03:01Z mike $".
+dnl End of "$Id: cups-network.m4 12324 2014-12-09 20:28:39Z msweet $".
 dnl
index 5b38975..755f9d7 100644 (file)
@@ -1,9 +1,9 @@
 dnl
-dnl "$Id: cups-opsys.m4 6649 2007-07-11 21:46:42Z mike $"
+dnl "$Id: cups-opsys.m4 11324 2013-10-04 03:11:42Z msweet $"
 dnl
 dnl   Operating system stuff for CUPS.
 dnl
-dnl   Copyright 2007-2011 by Apple Inc.
+dnl   Copyright 2007-2012 by Apple Inc.
 dnl   Copyright 1997-2006 by Easy Software Products, all rights reserved.
 dnl
 dnl   These coded instructions, statements, and computer programs are the
@@ -19,17 +19,21 @@ uversion=`uname -r | sed -e '1,$s/^[[^0-9]]*\([[0-9]]*\)\.\([[0-9]]*\).*/\1\2/'`
 uarch=`uname -m`
 
 case "$uname" in
+       Darwin*)
+               uname="Darwin"
+               if test $uversion -lt 120; then
+                       AC_MSG_ERROR([Sorry, this version of CUPS requires OS X 10.8 or higher.])
+               fi
+               ;;
+
        GNU* | GNU/*)
                uname="GNU"
                ;;
-       IRIX*)
-               uname="IRIX"
-               ;;
        Linux*)
                uname="Linux"
                ;;
 esac
 
 dnl
-dnl "$Id: cups-opsys.m4 6649 2007-07-11 21:46:42Z mike $"
+dnl "$Id: cups-opsys.m4 11324 2013-10-04 03:11:42Z msweet $"
 dnl
index 72bf32f..904a273 100644 (file)
@@ -1,26 +1,21 @@
 dnl
-dnl "$Id: cups-pam.m4 7960 2008-09-17 19:42:02Z mike $"
+dnl "$Id: cups-pam.m4 11342 2013-10-18 20:36:01Z msweet $"
 dnl
 dnl   PAM stuff for CUPS.
 dnl
-dnl   Copyright 2007-2012 by Apple Inc.
-dnl   Copyright 1997-2005 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2013 by Apple Inc.
+dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
 dnl
-dnl   These coded instructions, statements, and computer programs are the
-dnl   property of Apple Inc. and are protected by Federal copyright
-dnl   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl   which should have been included with this file.  If this file is
-dnl   file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file.  If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
 dnl
 
 AC_ARG_ENABLE(pam, [  --disable-pam           disable PAM support])
 AC_ARG_WITH(pam_module, [  --with-pam-module       specify the PAM module to use])
 
-dnl Don't use PAM with AIX...
-if test $uname = AIX; then
-       enable_pam=no
-fi
-
 PAMDIR=""
 PAMFILE="pam.std"
 PAMLIBS=""
@@ -98,5 +93,5 @@ AC_SUBST(PAMMOD)
 AC_SUBST(PAMMODAUTH)
 
 dnl
-dnl End of "$Id: cups-pam.m4 7960 2008-09-17 19:42:02Z mike $".
+dnl End of "$Id: cups-pam.m4 11342 2013-10-18 20:36:01Z msweet $".
 dnl
index 901068c..8774a2f 100644 (file)
@@ -1,5 +1,5 @@
 dnl
-dnl "$Id$"
+dnl "$Id: cups-poll.m4 11324 2013-10-04 03:11:42Z msweet $"
 dnl
 dnl   Select/poll stuff for CUPS.
 dnl
@@ -18,5 +18,5 @@ AC_CHECK_FUNC(epoll_create, AC_DEFINE(HAVE_EPOLL))
 AC_CHECK_FUNC(kqueue, AC_DEFINE(HAVE_KQUEUE))
 
 dnl
-dnl End of "$Id$".
+dnl End of "$Id: cups-poll.m4 11324 2013-10-04 03:11:42Z msweet $".
 dnl
index d4ed988..defaf09 100644 (file)
@@ -1,5 +1,5 @@
 dnl
-dnl "$Id: cups-scripting.m4 7915 2008-09-07 22:18:29Z mike $"
+dnl "$Id: cups-scripting.m4 11324 2013-10-04 03:11:42Z msweet $"
 dnl
 dnl   Scripting configuration stuff for CUPS.
 dnl
@@ -85,5 +85,5 @@ if test "x$CUPS_PYTHON" != x; then
 fi
 
 dnl
-dnl End of "$Id: cups-scripting.m4 7915 2008-09-07 22:18:29Z mike $".
+dnl End of "$Id: cups-scripting.m4 11324 2013-10-04 03:11:42Z msweet $".
 dnl
index 13dde4b..a8df14a 100644 (file)
@@ -1,16 +1,16 @@
 dnl
-dnl "$Id: cups-sharedlibs.m4 7630 2008-06-09 22:31:44Z mike $"
+dnl "$Id: cups-sharedlibs.m4 11342 2013-10-18 20:36:01Z msweet $"
 dnl
-dnl   Shared library support for CUPS.
+dnl Shared library support for CUPS.
 dnl
-dnl   Copyright 2007-2012 by Apple Inc.
-dnl   Copyright 1997-2005 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2013 by Apple Inc.
+dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
 dnl
-dnl   These coded instructions, statements, and computer programs are the
-dnl   property of Apple Inc. and are protected by Federal copyright
-dnl   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl   which should have been included with this file.  If this file is
-dnl   file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file.  If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
 dnl
 
 PICFLAG=1
@@ -34,51 +34,7 @@ if test x$enable_shared != xno; then
                        DSOXX="\$(CXX)"
                        DSOFLAGS="$DSOFLAGS -Wl,-h\`basename \$@\` -G \$(OPTIM)"
                        ;;
-               UNIX_S*)
-                       LIBCUPS="lib$cupsbase.so.2"
-                       LIBCUPSCGI="libcupscgi.so.1"
-                       LIBCUPSIMAGE="libcupsimage.so.2"
-                       LIBCUPSMIME="libcupsmime.so.1"
-                       LIBCUPSPPDC="libcupsppdc.so.1"
-                       DSO="\$(CC)"
-                       DSOXX="\$(CXX)"
-                       DSOFLAGS="$DSOFLAGS -Wl,-h,\`basename \$@\` -G \$(OPTIM)"
-                       ;;
-               HP-UX*)
-                       case "$uarch" in
-                               ia64)
-                                       LIBCUPS="lib$cupsbase.so.2"
-                                       LIBCUPSCGI="libcupscgi.so.1"
-                                       LIBCUPSIMAGE="libcupsimage.so.2"
-                                       LIBCUPSMIME="libcupsmime.so.1"
-                                       LIBCUPSPPDC="libcupsppdc.so.1"
-                                       DSO="\$(CC)"
-                                       DSOXX="\$(CXX)"
-                                       DSOFLAGS="$DSOFLAGS -Wl,-b,-z,+h,\`basename \$@\`"
-                                       ;;
-                               *)
-                                       LIBCUPS="lib$cupsbase.sl.2"
-                                       LIBCUPSCGI="libcupscgi.sl.1"
-                                       LIBCUPSIMAGE="libcupsimage.sl.2"
-                                       LIBCUPSMIME="libcupsmime.sl.1"
-                                       LIBCUPSPPDC="libcupsppdc.sl.1"
-                                       DSO="\$(LD)"
-                                       DSOXX="\$(LD)"
-                                       DSOFLAGS="$DSOFLAGS -b -z +h \`basename \$@\`"
-                                       ;;
-                       esac
-                       ;;
-               IRIX)
-                       LIBCUPS="lib$cupsbase.so.2"
-                       LIBCUPSCGI="libcupscgi.so.1"
-                       LIBCUPSIMAGE="libcupsimage.so.2"
-                       LIBCUPSMIME="libcupsmime.so.1"
-                       LIBCUPSPPDC="libcupsppdc.so.1"
-                       DSO="\$(CC)"
-                       DSOXX="\$(CXX)"
-                       DSOFLAGS="$DSOFLAGS -set_version,sgi2.6,-soname,\`basename \$@\` -shared \$(OPTIM)"
-                       ;;
-               OSF1* | Linux | GNU | *BSD*)
+               Linux | GNU | *BSD*)
                        LIBCUPS="lib$cupsbase.so.2"
                        LIBCUPSCGI="libcupscgi.so.1"
                        LIBCUPSIMAGE="libcupsimage.so.2"
@@ -98,17 +54,6 @@ if test x$enable_shared != xno; then
                        DSOXX="\$(CXX)"
                        DSOFLAGS="$DSOFLAGS -dynamiclib -single_module -lc"
                        ;;
-               AIX*)
-                       LIBCUPS="lib${cupsbase}_s.a"
-                       LIBCUPSBASE="${cupsbase}_s"
-                       LIBCUPSCGI="libcupscgi_s.a"
-                       LIBCUPSIMAGE="libcupsimage_s.a"
-                       LIBCUPSMIME="libcupsmime_s.a"
-                       LIBCUPSPPDC="libcupsppdc_s.a"
-                       DSO="\$(CC)"
-                       DSOXX="\$(CXX)"
-                       DSOFLAGS="$DSOFLAGS -Wl,-bexpall,-bM:SRE,-bnoentry,-blibpath:\$(libdir)"
-                       ;;
                *)
                        echo "Warning: shared libraries may not be supported.  Trying -shared"
                        echo "         option with compiler."
@@ -151,19 +96,11 @@ if test x$enable_shared = xno; then
        EXTLINKCUPS="-lcups"
        EXTLINKCUPSIMAGE="-lcupsimage"
 else
-       if test $uname = AIX; then
-               LINKCUPS="-l${cupsbase}_s"
-               LINKCUPSIMAGE="-lcupsimage_s"
-
-               EXTLINKCUPS="-lcups_s"
-               EXTLINKCUPSIMAGE="-lcupsimage_s"
-       else
-               LINKCUPS="-l${cupsbase}"
-               LINKCUPSIMAGE="-lcupsimage"
+       LINKCUPS="-l${cupsbase}"
+       LINKCUPSIMAGE="-lcupsimage"
 
-               EXTLINKCUPS="-lcups"
-               EXTLINKCUPSIMAGE="-lcupsimage"
-       fi
+       EXTLINKCUPS="-lcups"
+       EXTLINKCUPSIMAGE="-lcupsimage"
 fi
 
 AC_SUBST(EXTLINKCUPS)
@@ -186,19 +123,6 @@ if test "$DSO" != ":"; then
        # need this option, even when the library is installed in a
        # standard location...
        case $uname in
-                HP-UX*)
-                       # HP-UX needs the path, even for /usr/lib...
-                       case "$uarch" in
-                               ia64)
-                                       DSOFLAGS="-Wl,+s,+b,$libdir $DSOFLAGS"
-                                       ;;
-                               *)
-                                       DSOFLAGS="+s +b $libdir $DSOFLAGS"
-                                       ;;
-                       esac
-                       LDFLAGS="$LDFLAGS -Wl,+s,+b,$libdir"
-                       EXPORT_LDFLAGS="-Wl,+s,+b,$libdir"
-                       ;;
                 SunOS*)
                        # Solaris...
                        if test $exec_prefix != /usr; then
@@ -215,8 +139,8 @@ if test "$DSO" != ":"; then
                                EXPORT_LDFLAGS="-Wl,-R$libdir"
                        fi
                        ;;
-                IRIX | Linux | GNU)
-                        # IRIX, Linux, and HURD...
+                Linux | GNU)
+                        # Linux, and HURD...
                        if test $exec_prefix != /usr; then
                                DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS"
                                LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir"
@@ -234,5 +158,5 @@ AC_SUBST(IMGLIBS)
 AC_SUBST(EXPORT_LDFLAGS)
 
 dnl
-dnl End of "$Id: cups-sharedlibs.m4 7630 2008-06-09 22:31:44Z mike $".
+dnl End of "$Id: cups-sharedlibs.m4 11342 2013-10-18 20:36:01Z msweet $".
 dnl
index 03f7530..df0bd45 100644 (file)
@@ -1,34 +1,26 @@
 dnl
-dnl "$Id: cups-ssl.m4 7241 2008-01-22 22:34:52Z mike $"
+dnl "$Id: cups-ssl.m4 12645 2015-05-20 01:20:52Z msweet $"
 dnl
-dnl   OpenSSL/GNUTLS stuff for CUPS.
+dnl TLS stuff for CUPS.
 dnl
-dnl   Copyright 2007-2012 by Apple Inc.
-dnl   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2015 by Apple Inc.
+dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
 dnl
-dnl   These coded instructions, statements, and computer programs are the
-dnl   property of Apple Inc. and are protected by Federal copyright
-dnl   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl   which should have been included with this file.  If this file is
-dnl   file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file.  If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
 dnl
 
 AC_ARG_ENABLE(ssl, [  --disable-ssl           disable SSL/TLS support])
 AC_ARG_ENABLE(cdsassl, [  --enable-cdsassl        use CDSA for SSL/TLS support, default=first])
 AC_ARG_ENABLE(gnutls, [  --enable-gnutls         use GNU TLS for SSL/TLS support, default=second])
-AC_ARG_ENABLE(openssl, [  --enable-openssl        use OpenSSL for SSL/TLS support, default=third])
-AC_ARG_WITH(openssl-libs, [  --with-openssl-libs     set directory for OpenSSL library],
-    LDFLAGS="-L$withval $LDFLAGS"
-    DSOFLAGS="-L$withval $DSOFLAGS",)
-AC_ARG_WITH(openssl-includes, [  --with-openssl-includes set directory for OpenSSL includes],
-    CFLAGS="-I$withval $CFLAGS"
-    CPPFLAGS="-I$withval $CPPFLAGS",)
 
 SSLFLAGS=""
 SSLLIBS=""
 have_ssl=0
-CUPS_SERVERCERT=""
-CUPS_SERVERKEY=""
+CUPS_SERVERKEYCHAIN=""
 
 if test x$enable_ssl != xno; then
     dnl Look for CDSA...
@@ -38,7 +30,7 @@ if test x$enable_ssl != xno; then
                have_ssl=1
                AC_DEFINE(HAVE_SSL)
                AC_DEFINE(HAVE_CDSASSL)
-               CUPS_SERVERCERT="/Library/Keychains/System.keychain"
+               CUPS_SERVERKEYCHAIN="/Library/Keychains/System.keychain"
 
                dnl Check for the various security headers...
                AC_CHECK_HEADER(Security/SecureTransportPriv.h,
@@ -59,41 +51,19 @@ if test x$enable_ssl != xno; then
                AC_CHECK_HEADER(Security/SecIdentitySearchPriv.h,
                    AC_DEFINE(HAVE_SECIDENTITYSEARCHPRIV_H))
 
-               dnl Check for SecCertificateCopyData..
-               AC_MSG_CHECKING(for SecCertificateCopyData)
-               if test $uversion -ge 100; then
-                   AC_DEFINE(HAVE_SECCERTIFICATECOPYDATA)
-                   AC_MSG_RESULT(yes)
-               else
-                   AC_MSG_RESULT(no)
-               fi
+               AC_DEFINE(HAVE_CSSMERRORSTRING)
+               AC_DEFINE(HAVE_SECKEYCHAINOPEN)])
 
-               dnl Check for SecIdentitySearchCreateWithPolicy...
-               AC_MSG_CHECKING(for SecIdentitySearchCreateWithPolicy)
-               if test $uversion -ge 80; then
-                   AC_DEFINE(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY)
-                   AC_MSG_RESULT(yes)
-               else
-                   AC_MSG_RESULT(no)
+               if test $uversion -ge 150; then
+                       AC_DEFINE(HAVE_SSLSETENABLEDCIPHERS)
                fi
-
-               dnl Check for SecPolicyCreateSSL...
-               AC_MSG_CHECKING(for SecPolicyCreateSSL)
-               if test $uversion -ge 110; then
-                   AC_DEFINE(HAVE_SECPOLICYCREATESSL)
-                   AC_MSG_RESULT(yes)
-               else
-                   AC_MSG_RESULT(no)
-               fi])
-
-               AC_DEFINE(HAVE_CSSMERRORSTRING)
        fi
     fi
 
     dnl Then look for GNU TLS...
     if test $have_ssl = 0 -a "x$enable_gnutls" != "xno" -a "x$PKGCONFIG" != x; then
-       AC_PATH_PROG(LIBGNUTLSCONFIG,libgnutls-config)
-       AC_PATH_PROG(LIBGCRYPTCONFIG,libgcrypt-config)
+       AC_PATH_TOOL(LIBGNUTLSCONFIG,libgnutls-config)
+       AC_PATH_TOOL(LIBGCRYPTCONFIG,libgcrypt-config)
        if $PKGCONFIG --exists gnutls; then
            have_ssl=1
            SSLLIBS=`$PKGCONFIG --libs gnutls`
@@ -109,59 +79,14 @@ if test x$enable_ssl != xno; then
        fi
 
        if test $have_ssl = 1; then
-           CUPS_SERVERCERT="ssl/server.crt"
-           CUPS_SERVERKEY="ssl/server.key"
-
-            if $PKGCONFIG --exists gcrypt; then
-               SSLLIBS="$SSLLIBS `$PKGCONFIG --libs gcrypt`"
-               SSLFLAGS="$SSLFLAGS `$PKGCONFIG --cflags gcrypt`"
-           elif test "x$LIBGCRYPTCONFIG" != x; then
-               SSLLIBS="$SSLLIBS `$LIBGCRYPTCONFIG --libs`"
-               SSLFLAGS="$SSLFLAGS `$LIBGCRYPTCONFIG --cflags`"
-           fi
-       fi
-    fi
+           CUPS_SERVERKEYCHAIN="ssl"
 
-    dnl Check for the OpenSSL library last...
-    if test $have_ssl = 0 -a "x$enable_openssl" != "xno"; then
-       AC_CHECK_HEADER(openssl/ssl.h,[
-           dnl Save the current libraries so the crypto stuff isn't always
-           dnl included...
            SAVELIBS="$LIBS"
-
-           dnl Some ELF systems can't resolve all the symbols in libcrypto
-           dnl if libcrypto was linked against RSAREF, and fail to link the
-           dnl test program correctly, even though a correct installation
-           dnl of OpenSSL exists.  So we test the linking three times in
-           dnl case the RSAREF libraries are needed.
-
-           for libcrypto in \
-               "-lcrypto" \
-               "-lcrypto -lrsaref" \
-               "-lcrypto -lRSAglue -lrsaref"
-           do
-               AC_CHECK_LIB(ssl,SSL_new,
-                   [have_ssl=1
-                    SSLFLAGS="-DOPENSSL_DISABLE_OLD_DES_SUPPORT"
-                    SSLLIBS="-lssl $libcrypto"
-                    AC_DEFINE(HAVE_SSL)
-                    AC_DEFINE(HAVE_LIBSSL)],,
-                   $libcrypto)
-
-               if test "x${SSLLIBS}" != "x"; then
-                   break
-               fi
-           done
-
-           if test "x${SSLLIBS}" != "x"; then
-               CUPS_SERVERCERT="ssl/server.crt"
-               CUPS_SERVERKEY="ssl/server.key"
-
-               LIBS="$SAVELIBS $SSLLIBS"
-               AC_CHECK_FUNCS(SSL_set_tlsext_host_name)
-           fi
-
-           LIBS="$SAVELIBS"])
+           LIBS="$LIBS $SSLLIBS"
+           AC_CHECK_FUNC(gnutls_transport_set_pull_timeout_function, AC_DEFINE(HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION))
+           AC_CHECK_FUNC(gnutls_priority_set_direct, AC_DEFINE(HAVE_GNUTLS_PRIORITY_SET_DIRECT))
+           LIBS="$SAVELIBS"
+       fi
     fi
 fi
 
@@ -170,12 +95,11 @@ if test $have_ssl = 1; then
     AC_MSG_RESULT([    Using SSLLIBS="$SSLLIBS"])
     AC_MSG_RESULT([    Using SSLFLAGS="$SSLFLAGS"])
     IPPALIASES="http https ipps"
-elif test x$enable_cdsa = xyes -o x$enable_gnutls = xyes -o x$enable_openssl = xyes; then
+elif test x$enable_cdsa = xyes -o x$enable_gnutls = xyes; then
     AC_MSG_ERROR([Unable to enable SSL support.])
 fi
 
-AC_SUBST(CUPS_SERVERCERT)
-AC_SUBST(CUPS_SERVERKEY)
+AC_SUBST(CUPS_SERVERKEYCHAIN)
 AC_SUBST(IPPALIASES)
 AC_SUBST(SSLFLAGS)
 AC_SUBST(SSLLIBS)
@@ -184,5 +108,5 @@ EXPORT_SSLLIBS="$SSLLIBS"
 AC_SUBST(EXPORT_SSLLIBS)
 
 dnl
-dnl End of "$Id: cups-ssl.m4 7241 2008-01-22 22:34:52Z mike $".
+dnl End of "$Id: cups-ssl.m4 12645 2015-05-20 01:20:52Z msweet $".
 dnl
diff --git a/config-scripts/cups-startup.m4 b/config-scripts/cups-startup.m4
new file mode 100644 (file)
index 0000000..dfe4740
--- /dev/null
@@ -0,0 +1,192 @@
+dnl
+dnl "$Id: cups-startup.m4 12857 2015-08-31 15:00:45Z msweet $"
+dnl
+dnl Launch-on-demand/startup stuff for CUPS.
+dnl
+dnl Copyright 2007-2015 by Apple Inc.
+dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
+dnl
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file.  If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
+dnl
+
+ONDEMANDFLAGS=""
+ONDEMANDLIBS=""
+AC_SUBST(ONDEMANDFLAGS)
+AC_SUBST(ONDEMANDLIBS)
+
+dnl Launchd is used on OS X/Darwin...
+AC_ARG_ENABLE(launchd, [  --disable-launchd       disable launchd support])
+LAUNCHD_DIR=""
+AC_SUBST(LAUNCHD_DIR)
+
+if test x$enable_launchd != xno; then
+       AC_CHECK_FUNC(launch_msg, AC_DEFINE(HAVE_LAUNCHD))
+       if test $uversion -ge 140; then
+               AC_CHECK_FUNC(launch_activate_socket, [
+                       AC_DEFINE(HAVE_LAUNCHD)
+                       AC_DEFINE(HAVE_LAUNCH_ACTIVATE_SOCKET)])
+       fi
+       AC_CHECK_HEADER(launch.h, AC_DEFINE(HAVE_LAUNCH_H))
+
+       case "$uname" in
+               Darwin*)
+                       # Darwin, MacOS X
+                       LAUNCHD_DIR="/System/Library/LaunchDaemons"
+                       # liblaunch is already part of libSystem
+                       ;;
+               *)
+                       # All others; this test will need to be updated
+                       ;;
+       esac
+fi
+
+dnl Systemd is used on Linux...
+AC_ARG_ENABLE(systemd, [  --disable-systemd       disable systemd support])
+AC_ARG_WITH(systemd, [  --with-systemd          set directory for systemd service files],
+        SYSTEMD_DIR="$withval", SYSTEMD_DIR="")
+AC_SUBST(SYSTEMD_DIR)
+
+if test x$enable_systemd != xno; then
+       if test "x$PKGCONFIG" = x; then
+               if test x$enable_systemd = xyes; then
+                       AC_MSG_ERROR(Need pkg-config to enable systemd support.)
+                fi
+        else
+               have_systemd=no
+               AC_MSG_CHECKING(for libsystemd)
+                if $PKGCONFIG --exists libsystemd; then
+                        AC_MSG_RESULT(yes)
+                        have_systemd=yes
+                        ONDEMANDFLAGS=`$PKGCONFIG --cflags libsystemd`
+                        ONDEMANDLIBS=`$PKGCONFIG --libs libsystemd`
+               elif $PKGCONFIG --exists libsystemd-daemon; then
+                       AC_MSG_RESULT(yes - legacy)
+                        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
+                        AC_MSG_RESULT(no)
+                fi
+
+               if test $have_systemd = yes; then
+                        AC_DEFINE(HAVE_SYSTEMD)
+                       AC_CHECK_HEADER(systemd/sd-journal.h,AC_DEFINE(HAVE_SYSTEMD_SD_JOURNAL_H))
+                       if test "x$SYSTEMD_DIR" = x; then
+                               SYSTEMD_DIR="`$PKGCONFIG --variable=systemdsystemunitdir systemd`"
+                        fi
+                fi
+        fi
+fi
+
+dnl Solaris uses smf
+SMFMANIFESTDIR=""
+AC_SUBST(SMFMANIFESTDIR)
+AC_ARG_WITH(smfmanifestdir, [  --with-smfmanifestdir   set path for Solaris SMF manifest],SMFMANIFESTDIR="$withval")
+
+dnl Use init on other platforms...
+AC_ARG_WITH(rcdir, [  --with-rcdir            set path for rc scripts],rcdir="$withval",rcdir="")
+AC_ARG_WITH(rclevels, [  --with-rclevels         set run levels for rc scripts],rclevels="$withval",rclevels="2 3 5")
+AC_ARG_WITH(rcstart, [  --with-rcstart          set start number for rc scripts],rcstart="$withval",rcstart="")
+AC_ARG_WITH(rcstop, [  --with-rcstop           set stop number for rc scripts],rcstop="$withval",rcstop="")
+
+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 "$uname" in
+               Linux | GNU | GNU/k*BSD*)
+                       # Linux
+                        rcstart="81"
+                       ;;
+
+               SunOS*)
+                       # Solaris
+                        rcstart="81"
+                       ;;
+
+                *)
+                        # Others
+                        rcstart="99"
+                        ;;
+       esac
+fi
+
+if test "x$rcstop" = x; then
+       case "$uname" in
+               Linux | GNU | GNU/k*BSD*)
+                       # Linux
+                        rcstop="36"
+                       ;;
+
+                *)
+                        # Others
+                        rcstop="00"
+                        ;;
+       esac
+fi
+
+INITDIR=""
+INITDDIR=""
+RCLEVELS="$rclevels"
+RCSTART="$rcstart"
+RCSTOP="$rcstop"
+AC_SUBST(INITDIR)
+AC_SUBST(INITDDIR)
+AC_SUBST(RCLEVELS)
+AC_SUBST(RCSTART)
+AC_SUBST(RCSTOP)
+
+if test "x$rcdir" != xno; then
+       if test "x$rclevels" = x; then
+               INITDDIR="$rcdir"
+       else
+               INITDIR="$rcdir"
+       fi
+fi
+
+dnl Xinetd support...
+AC_ARG_WITH(xinetd, [  --with-xinetd           set path for xinetd config files],xinetd="$withval",xinetd="")
+XINETD=""
+AC_SUBST(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
+
+
+dnl
+dnl End of "$Id: cups-startup.m4 12857 2015-08-31 15:00:45Z msweet $".
+dnl
index b95c79f..9eaf63a 100644 (file)
@@ -1,5 +1,5 @@
 dnl
-dnl "$Id: cups-threads.m4 6649 2007-07-11 21:46:42Z mike $"
+dnl "$Id: cups-threads.m4 11324 2013-10-04 03:11:42Z msweet $"
 dnl
 dnl   Threading stuff for CUPS.
 dnl
@@ -50,5 +50,5 @@ fi
 AC_SUBST(PTHREAD_FLAGS)
 
 dnl
-dnl End of "$Id: cups-threads.m4 6649 2007-07-11 21:46:42Z mike $".
+dnl End of "$Id: cups-threads.m4 11324 2013-10-04 03:11:42Z msweet $".
 dnl
index edff532..15607ee 100644 (file)
@@ -1,16 +1,16 @@
 /*
- * "$Id: config.h.in 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: config.h.in 12687 2015-06-03 17:19:04Z msweet $"
  *
- *   Configuration file for CUPS.
+ * Configuration file for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 #ifndef _CUPS_CONFIG_H_
@@ -93,7 +93,7 @@
  * Default MaxCopies value...
  */
 
-#define CUPS_DEFAULT_MAX_COPIES        100
+#define CUPS_DEFAULT_MAX_COPIES        9999
 
 
 /*
 
 
 /*
- * Do we have various image libraries?
+ * Do we have posix_spawn?
+ */
+
+#undef HAVE_POSIX_SPAWN
+
+
+/*
+ * Do we have ZLIB?
  */
 
-#undef HAVE_LIBPNG
 #undef HAVE_LIBZ
-#undef HAVE_LIBJPEG
-#undef HAVE_LIBTIFF
+#undef HAVE_INFLATECOPY
 
 
 /*
  * Do we have PAM stuff?
  */
 
-#ifndef HAVE_LIBPAM
 #define HAVE_LIBPAM 0
-#endif /* !HAVE_LIBPAM */
-
 #undef HAVE_PAM_PAM_APPL_H
 #undef HAVE_PAM_SET_ITEM
 #undef HAVE_PAM_SETCRED
 
 
 /*
- * Do we have <scsi/sg.h>?
- */
-
-#undef HAVE_SCSI_SG_H
-
-
-/*
  * Use <stdint.h>?
  */
 
 
 
 /*
+ * Do we have the ASL functions?
+ */
+
+#undef HAVE_ASL_H
+
+
+/*
+ * Do we have the systemd journal functions?
+ */
+
+#undef HAVE_SYSTEMD_SD_JOURNAL_H
+
+
+/*
  * Do we have the (v)snprintf() functions?
  */
 
 
 #undef HAVE_CDSASSL
 #undef HAVE_GNUTLS
-#undef HAVE_LIBSSL
+#undef HAVE_SSPISSL
 #undef HAVE_SSL
 
 
 /*
- * Do we have the SSL_set_tlsext_host_name function?
+ * Do we have the gnutls_transport_set_pull_timeout_function function?
  */
 
-#undef HAVE_SSL_SET_TLSEXT_HOST_NAME
+#undef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION
+
+
+/*
+ * Do we have the gnutls_priority_set_direct function?
+ */
+
+#undef HAVE_GNUTLS_PRIORITY_SET_DIRECT
 
 
 /*
 
 
 /*
- * Do we have the SecCertificateCopyData function?
- */
-
-#undef HAVE_SECCERTIFICATECOPYDATA
-
-
-/*
- * Do we have the SecIdentitySearchCreateWithPolicy function?
+ * Do we have the cssmErrorString function?
  */
 
-#undef HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY
+#undef HAVE_CSSMERRORSTRING
 
 
 /*
- * Do we have the SecPolicyCreateSSL function?
+ * Do we have the SecGenerateSelfSignedCertificate function?
  */
 
-#undef HAVE_SECPOLICYCREATESSL
+#undef HAVE_SECGENERATESELFSIGNEDCERTIFICATE
 
 
 /*
- * Do we have the SecPolicyCreateSSL function?
+ * Do we have the SecKeychainOpen function?
  */
 
-#undef HAVE_SECPOLICYCREATESSL
+#undef HAVE_SECKEYCHAINOPEN
 
 
 /*
- * Do we have the cssmErrorString function?
+ * Do we have (a working) SSLSetEnabledCiphers function?
  */
 
-#undef HAVE_CSSMERRORSTRING
+#undef HAVE_SSLSETENABLEDCIPHERS
 
 
 /*
 
 
 /*
- * Do we have the AIX usersec.h header file?
- */
-
-#undef HAVE_USERSEC_H
-
-
-/*
  * Do we have pthread support?
  */
 
 
 #undef HAVE_LAUNCH_H
 #undef HAVE_LAUNCHD
+#undef HAVE_LAUNCH_ACTIVATE_SOCKET
+
+
+/*
+ * Do we have systemd support?
+ */
+
+#undef HAVE_SYSTEMD
 
 
 /*
 
 
 /*
- * Do we have Darwin's IOKit private headers?
- */
-
-#undef HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H
-
-
-/*
  * Do we have DBUS?
  */
 
 #undef HAVE_DBUS
 #undef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND
+#undef HAVE_DBUS_THREADS_INIT
 
 
 /*
 
 #ifdef HAVE_ARC4RANDOM
 #  define CUPS_RAND() arc4random()
-#  define CUPS_SRAND(v) arc4random_stir()
+#  define CUPS_SRAND(v)
 #elif defined(HAVE_RANDOM)
 #  define CUPS_RAND() random()
 #  define CUPS_SRAND(v) srandom(v)
 
 
 /*
- * Do we have vproc_transaction_begin/end?
- */
-
-#undef HAVE_VPROC_TRANSACTION_BEGIN
-
-
-/*
  * Do we have libusb?
  */
 
@@ -743,5 +740,5 @@ static __inline int _cups_abs(int i) { return (i < 0 ? -i : i); }
 #endif /* !_CUPS_CONFIG_H_ */
 
 /*
- * End of "$Id: config.h.in 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: config.h.in 12687 2015-06-03 17:19:04Z msweet $".
  */
index 8582cb8..4170ff3 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,8 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68.
+# Generated by GNU Autoconf 2.68 for CUPS 2.1.2.
+#
+# Report bugs to <https://www.cups.org/str.php>.
 #
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -236,7 +238,8 @@ fi
     $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 about your system,
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: https://www.cups.org/str.php 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."
@@ -555,14 +558,13 @@ MFLAGS=
 MAKEFLAGS=
 
 # Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
-PACKAGE_URL=
-
-ac_unique_file="cups/cups.h"
+PACKAGE_NAME='CUPS'
+PACKAGE_TARNAME='cups'
+PACKAGE_VERSION='2.1.2'
+PACKAGE_STRING='CUPS 2.1.2'
+PACKAGE_BUGREPORT='https://www.cups.org/str.php'
+PACKAGE_URL='https://www.cups.org/'
+
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
@@ -625,6 +627,7 @@ 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
@@ -633,8 +636,19 @@ CUPS_CUPSD_FILE_PERM
 CUPS_CONFIG_FILE_PERM
 CUPS_BUNDLEDIR
 LANGUAGES
-LAUNCHDLIBS
-DEFAULT_LAUNCHD_CONF
+XINETD
+RCSTOP
+RCSTART
+RCLEVELS
+INITDDIR
+INITDIR
+SMFMANIFESTDIR
+SYSTEMD_DIR
+LAUNCHD_DIR
+ONDEMANDLIBS
+ONDEMANDFLAGS
+IPPFIND_MAN
+IPPFIND_BIN
 DNSSD_BACKEND
 DNSSDLIBS
 LARGEFILE
@@ -647,8 +661,7 @@ EXPORT_SSLLIBS
 SSLLIBS
 SSLFLAGS
 IPPALIASES
-CUPS_SERVERKEY
-CUPS_SERVERCERT
+CUPS_SERVERKEYCHAIN
 LIBGCRYPTCONFIG
 LIBGNUTLSCONFIG
 PTHREAD_FLAGS
@@ -703,13 +716,6 @@ MENUDIR
 ICONDIR
 CUPS_DATADIR
 CUPS_CACHEDIR
-XINETD
-SMFMANIFESTDIR
-RCSTOP
-RCSTART
-RCLEVELS
-INITDDIR
-INITDIR
 PRIVATEINCLUDE
 privateinclude
 BUILDDIRS
@@ -816,12 +822,6 @@ with_adminkey
 with_operkey
 with_components
 with_privateinclude
-with_rcdir
-with_rclevels
-with_rcstart
-with_rcstop
-with_smfmanifestdir
-with_xinetd
 with_lpdconfig
 with_smbconfig
 with_cachedir
@@ -830,6 +830,7 @@ with_menudir
 with_docdir
 with_fontpath
 with_logdir
+with_rundir
 enable_shared
 enable_libtool_unsupported
 with_optim
@@ -847,9 +848,6 @@ enable_threads
 enable_ssl
 enable_cdsassl
 enable_gnutls
-enable_openssl
-with_openssl_libs
-with_openssl_includes
 enable_pam
 with_pam_module
 enable_largefile
@@ -858,6 +856,14 @@ enable_dnssd
 with_dnssd_libs
 with_dnssd_includes
 enable_launchd
+enable_systemd
+with_systemd
+with_smfmanifestdir
+with_rcdir
+with_rclevels
+with_rcstart
+with_rcstop
+with_xinetd
 with_languages
 with_bundledir
 with_config_file_perm
@@ -866,6 +872,7 @@ 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
@@ -938,7 +945,7 @@ sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE}'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
 infodir='${datarootdir}/info'
 htmldir='${docdir}'
 dvidir='${docdir}'
@@ -1440,7 +1447,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures this package to adapt to many kinds of systems.
+\`configure' configures CUPS 2.1.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1488,7 +1495,7 @@ Fine tuning of the installation directories:
   --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/PACKAGE]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/cups]
   --htmldir=DIR           html documentation [DOCDIR]
   --dvidir=DIR            dvi documentation [DOCDIR]
   --pdfdir=DIR            pdf documentation [DOCDIR]
@@ -1500,7 +1507,9 @@ _ACEOF
 fi
 
 if test -n "$ac_init_help"; then
-
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of CUPS 2.1.2:";;
+   esac
   cat <<\_ACEOF
 
 Optional Features:
@@ -1513,7 +1522,7 @@ Optional Features:
   --enable-libusb         use libusb for USB printing
   --enable-tcp-wrappers   use libwrap for TCP wrappers support
   --enable-acl            build with POSIX ACL support
-  --enable-dbus           build with DBUS support
+  --disable-dbus           build without DBUS support
   --disable-shared        do not create shared libraries
   --enable-libtool-unsupported
                           build with libtool (UNSUPPORTED!)
@@ -1527,12 +1536,13 @@ Optional Features:
   --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
-  --enable-openssl        use OpenSSL for SSL/TLS support, default=third
   --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-page-logging   enable page_log by default
   --disable-browsing      disable Browsing by default
   --disable-default-shared
                          disable DefaultShared by default
@@ -1550,12 +1560,6 @@ Optional Packages:
                            - "all" (default) builds everything
                            - "core" builds libcups and ipptool
   --with-privateinclude   set path for private include files, default=none
-  --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-smfmanifestdir   set path for Solaris SMF manifest
-  --with-xinetd           set path for xinetd config files
   --with-lpdconfig        set URI for LPD config file
   --with-smbconfig        set URI for Samba config file
   --with-cachedir         set path for cache files
@@ -1564,16 +1568,22 @@ Optional Packages:
   --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-openssl-libs     set directory for OpenSSL library
-  --with-openssl-includes set directory for OpenSSL includes
   --with-pam-module       specify 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 OS X localization bundle directory
   --with-config-file-perm set default ConfigFilePerm value, default=0640
@@ -1581,7 +1591,7 @@ Optional Packages:
   --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=actions
+  --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
@@ -1613,7 +1623,8 @@ Some influential environment variables:
 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 the package provider.
+Report bugs to <https://www.cups.org/str.php>.
+CUPS home page: <https://www.cups.org/>.
 _ACEOF
 ac_status=$?
 fi
@@ -1676,7 +1687,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-configure
+CUPS configure 2.1.2
 generated by GNU Autoconf 2.68
 
 Copyright (C) 2010 Free Software Foundation, Inc.
@@ -1961,6 +1972,10 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
 $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://www.cups.org/str.php ##
+## ------------------------------------------- ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
@@ -2136,7 +2151,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by $as_me, which was
+It was created by CUPS $as_me 2.1.2, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   $ $0 $@
@@ -2491,12 +2506,16 @@ uversion=`uname -r | sed -e '1,$s/^[^0-9]*\([0-9]*\)\.\([0-9]*\).*/\1\2/'`
 uarch=`uname -m`
 
 case "$uname" in
+       Darwin*)
+               uname="Darwin"
+               if test $uversion -lt 120; then
+                       as_fn_error $? "Sorry, this version of CUPS requires OS X 10.8 or higher." "$LINENO" 5
+               fi
+               ;;
+
        GNU* | GNU/*)
                uname="GNU"
                ;;
-       IRIX*)
-               uname="IRIX"
-               ;;
        Linux*)
                uname="Linux"
                ;;
@@ -2504,16 +2523,25 @@ esac
 
 
 
+ac_config_headers="$ac_config_headers config.h"
 
 
-ac_config_headers="$ac_config_headers config.h"
+CUPS_VERSION=2.1.2
 
+case "$CUPS_VERSION" in
+       *svn)
+               if test -z "$CUPS_REVISION" -a -d .svn; then
+                       CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[a-zA-Z]*//g'`"
+               else
+                       CUPS_REVISION=""
+               fi
+               ;;
+
+       *)
+               CUPS_REVISION=""
+               ;;
+esac
 
-CUPS_VERSION=1.6.4
-CUPS_REVISION=
-#if test -z "$CUPS_REVISION" -a -d .svn; then
-#      CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`"
-#fi
 CUPS_BUILD="cups-$CUPS_VERSION"
 
 
@@ -4101,8 +4129,9 @@ fi
 
 
 
-# Extract the first word of "pkg-config", so it can be a program name with args.
-set dummy pkg-config; ac_word=$2
+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 :
@@ -4141,6 +4170,63 @@ $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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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
@@ -4821,13 +4907,6 @@ if test "x$ac_cv_header_bstring_h" = xyes; then :
 fi
 
 
-ac_fn_c_check_header_mongrel "$LINENO" "usersec.h" "ac_cv_header_usersec_h" "$ac_includes_default"
-if test "x$ac_cv_header_usersec_h" = xyes; then :
-  $as_echo "#define HAVE_USERSEC_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
@@ -4849,9 +4928,9 @@ if test "x$ac_cv_header_sys_ucred_h" = xyes; then :
 fi
 
 
-ac_fn_c_check_header_mongrel "$LINENO" "scsi/sg.h" "ac_cv_header_scsi_sg_h" "$ac_includes_default"
-if test "x$ac_cv_header_scsi_sg_h" = xyes; then :
-  $as_echo "#define HAVE_SCSI_SG_H 1" >>confdefs.h
+ac_fn_c_check_header_mongrel "$LINENO" "asl.h" "ac_cv_header_asl_h" "$ac_includes_default"
+if test "x$ac_cv_header_asl_h" = xyes; then :
+  $as_echo "#define HAVE_ASL_H 1" >>confdefs.h
 
 fi
 
@@ -4919,6 +4998,64 @@ if test "$ac_res" != no; then :
                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
 
@@ -5156,6 +5293,18 @@ 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
+
+
 { $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
@@ -5230,7 +5379,7 @@ USBQUIRKS=""
 
 
 if test "x$PKGCONFIG" != x; then
-       if test x$enable_libusb = xyes -o $uname != Darwin; then
+       if test x$enable_libusb != xno -a $uname != 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
@@ -5244,6 +5393,9 @@ $as_echo "yes" >&6; }
                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
@@ -5355,6 +5507,47 @@ if test "x$ac_cv_lib_z_gzgets" = xyes; then :
 
        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$GZIP" != z; then
                INSTALL_GZIP="-z"
        fi
@@ -5451,12 +5644,6 @@ fi
 fi
 LIBS="$SAVELIBS"
 
-if test -d /etc/dbus-1; then
-       DBUSDIR="/etc/dbus-1"
-else
-       DBUSDIR=""
-fi
-
 # Check whether --enable-dbus was given.
 if test "${enable_dbus+set}" = set; then :
   enableval=$enable_dbus;
@@ -5469,10 +5656,11 @@ if test "${with_dbusdir+set}" = set; then :
 fi
 
 
+DBUSDIR=""
 DBUS_NOTIFIER=""
 DBUS_NOTIFIERLIBS=""
 
-if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x; then
+if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x -a "x$uname" != 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
@@ -5492,7 +5680,16 @@ if test "x$ac_cv_func_dbus_message_iter_init_append" = xyes; then :
 
 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; then
+                       DBUSDIR="/etc/dbus-1"
+               fi
        else
                { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
@@ -5542,13 +5739,6 @@ if test "x$ac_cv_header_CoreFoundation_CFBundlePriv_h" = xyes; then :
 fi
 
 
-               ac_fn_c_check_header_mongrel "$LINENO" "IOKit/pwr_mgt/IOPMLibPrivate.h" "ac_cv_header_IOKit_pwr_mgt_IOPMLibPrivate_h" "$ac_includes_default"
-if test "x$ac_cv_header_IOKit_pwr_mgt_IOPMLibPrivate_h" = xyes; then :
-  $as_echo "#define HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H 1" >>confdefs.h
-
-fi
-
-
 
                                for ac_func in SCDynamicStoreCopyComputerName
 do :
@@ -5588,18 +5778,6 @@ fi
 done
 
 
-                               for ac_func in vproc_transaction_begin
-do :
-  ac_fn_c_check_func "$LINENO" "vproc_transaction_begin" "ac_cv_func_vproc_transaction_begin"
-if test "x$ac_cv_func_vproc_transaction_begin" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_VPROC_TRANSACTION_BEGIN 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
@@ -5843,19 +6021,11 @@ fi
 
 if test "$libdir" = "\${exec_prefix}/lib"; then
        case "$uname" in
-               IRIX*)
-                       libdir="$exec_prefix/lib32"
-                       ;;
                Linux*)
                        if test -d /usr/lib64 -a ! -d /usr/lib64/fakeroot; then
                                libdir="$exec_prefix/lib64"
                        fi
                        ;;
-               HP-UX*)
-                       if test -d /usr/lib/hpux32; then
-                               libdir="$exec_prefix/lib/hpux32"
-                       fi
-                       ;;
        esac
 fi
 
 
 
 
-# Check whether --with-rcdir was given.
-if test "${with_rcdir+set}" = set; then :
-  withval=$with_rcdir; rcdir="$withval"
+# Check whether --with-lpdconfig was given.
+if test "${with_lpdconfig+set}" = set; then :
+  withval=$with_lpdconfig; LPDCONFIG="$withval"
 else
-  rcdir=""
+  LPDCONFIG=""
 fi
 
 
-# Check whether --with-rclevels was given.
-if test "${with_rclevels+set}" = set; then :
-  withval=$with_rclevels; rclevels="$withval"
-else
-  rclevels="2 3 5"
+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
 
-# Check whether --with-rcstart was given.
-if test "${with_rcstart+set}" = set; then :
-  withval=$with_rcstart; rcstart="$withval"
 else
-  rcstart="99"
-fi
-
+       cat >>confdefs.h <<_ACEOF
+#define CUPS_DEFAULT_LPD_CONFIG "$LPDCONFIG"
+_ACEOF
 
-# Check whether --with-rcstop was given.
-if test "${with_rcstop+set}" = set; then :
-  withval=$with_rcstop; rcstop="$withval"
-else
-  rcstop="00"
 fi
 
 
-# Check whether --with-smfmanifestdir was given.
-if test "${with_smfmanifestdir+set}" = set; then :
-  withval=$with_smfmanifestdir; smfmanifestdir="$withval"
+# Check whether --with-smbconfig was given.
+if test "${with_smbconfig+set}" = set; then :
+  withval=$with_smbconfig; SMBCONFIG="$withval"
 else
-  smfmanifestdir=""
-fi
-
-
-INITDIR=""
-INITDDIR=""
-RCLEVELS="$rclevels"
-RCSTART="$rcstart"
-RCSTOP="$rcstop"
-SMFMANIFESTDIR=""
-
-if test x$rcdir = x; then
-       case "$uname" in
-               AIX*)
-                       INITDIR="/etc/rc.d"
-                       ;;
-
-               Darwin*)
-                       # Darwin and MacOS X...
-                       if test -x /sbin/launchd; then
-                               INITDDIR="/System/Library/LaunchDaemons"
-                       else
-                               INITDDIR="/System/Library/StartupItems/PrintingServices"
-                       fi
-                       ;;
-
-               FreeBSD* | OpenBSD* | MirBSD* | ekkoBSD*)
-                       # FreeBSD and OpenBSD
-                       ;;
-
-               HP-UX*)
-                       INITDIR="/sbin"
-                       RCLEVELS="2"
-                       RCSTART="380"
-                       RCSTOP="620"
-                       ;;
-
-               IRIX*)
-                       # IRIX
-                       INITDIR="/etc"
-                       RCSTART="60"
-                       RCSTOP="25"
-                       ;;
-
-               Linux | GNU | GNU/k*BSD*)
-                       # Linux/HURD seems to choose an init.d directory at random...
-                       if test -d /sbin/init.d; then
-                               # SuSE
-                               INITDIR="/sbin/init.d"
-                       else
-                               if test -d /etc/init.d; then
-                                       # Others
-                                       INITDIR="/etc"
-                               else
-                                       # RedHat
-                                       INITDIR="/etc/rc.d"
-                               fi
-                       fi
-                       RCSTART="81"
-                       RCSTOP="36"
-                       ;;
-
-               NetBSD*)
-                       # NetBSD
-                       INITDDIR="/etc/rc.d"
-                       ;;
-
-               OSF1*)
-                       INITDIR="/sbin"
-                       ;;
-
-               SunOS*)
-                       # Solaris
-                       if test "x$smfmanifestdir" != x; then
-                               SMFMANIFESTDIR=$smfmanifestdir
-                       else
-                               INITDIR="/etc"
-                               RCSTART="81"
-                       fi
-                       ;;
-
-               *)
-                       INITDIR="/etc"
-                       ;;
-
-       esac
-elif 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
-
-
-if test "x$XINETD" = x -a ! -x /sbin/launchd; then
-       for dir in /private/etc/xinetd.d /etc/xinetd.d /usr/local/etc/xinetd.d; do
-               if test -d $dir; then
-                       XINETD="$dir"
-                       break
-               fi
-       done
-elif test "x$XINETD" = xno; then
-       XINETD=""
-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=""
+  SMBCONFIG=""
 fi
 
 
@@ -6220,10 +6230,6 @@ if test "$localedir" = "\${datarootdir}/locale"; then
                        CUPS_LOCALEDIR="$datarootdir/locale"
                        ;;
 
-               OSF1* | AIX*)
-                       CUPS_LOCALEDIR="$exec_prefix/lib/nls/msg"
-                       ;;
-
                *)
                        # This is the standard System V location...
                        CUPS_LOCALEDIR="$exec_prefix/lib/locale"
@@ -6302,16 +6308,24 @@ _ACEOF
 
 
 # Transient run-time state
-case "$uname" in
-       Darwin*)
-               # Darwin (OS X)
-               CUPS_STATEDIR="$CUPS_SERVERROOT"
-               ;;
-       *)
-               # All others
-               CUPS_STATEDIR="$localstatedir/run/cups"
-               ;;
-esac
+
+# Check whether --with-rundir was given.
+if test "${with_rundir+set}" = set; then :
+  withval=$with_rundir; CUPS_STATEDIR="$withval"
+else
+
+       case "$uname" in
+               Darwin*)
+                       # Darwin (OS X)
+                       CUPS_STATEDIR="$CUPS_SERVERROOT"
+                       ;;
+               *)
+                       # All others
+                       CUPS_STATEDIR="$localstatedir/run/cups"
+                       ;;
+       esac
+fi
+
 cat >>confdefs.h <<_ACEOF
 #define CUPS_STATEDIR "$CUPS_STATEDIR"
 _ACEOF
@@ -6328,18 +6342,12 @@ fi
 
 if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"; then
        case "$uname" in
-               Darwin* | Linux | GNU | *BSD* | AIX*)
-                       # Darwin, MacOS X, Linux, GNU HURD, *BSD, and AIX
+               Darwin* | Linux | GNU | *BSD*)
+                       # Darwin, MacOS X, Linux, GNU HURD, and *BSD
                        mandir="/usr/share/man"
                        AMANDIR="/usr/share/man"
                        PMANDIR="/usr/share/man"
                        ;;
-               IRIX)
-                       # SGI IRIX
-                       mandir="/usr/share/catman/u_man"
-                       AMANDIR="/usr/share/catman/a_man"
-                       PMANDIR="/usr/share/catman/p_man"
-                       ;;
                *)
                        # All others
                        mandir="/usr/man"
@@ -6356,16 +6364,8 @@ fi
 
 
 case "$uname" in
-       IRIX*)
-               # SGI IRIX
-               MAN1EXT=1
-               MAN5EXT=5
-               MAN7EXT=7
-               MAN8EXT=1m
-               MAN8DIR=1
-               ;;
-       SunOS* | HP-UX*)
-               # Solaris and HP-UX
+       SunOS*)
+               # Solaris
                MAN1EXT=1
                MAN5EXT=5
                MAN7EXT=7
@@ -6424,51 +6424,7 @@ if test x$enable_shared != xno; then
                        DSOXX="\$(CXX)"
                        DSOFLAGS="$DSOFLAGS -Wl,-h\`basename \$@\` -G \$(OPTIM)"
                        ;;
-               UNIX_S*)
-                       LIBCUPS="lib$cupsbase.so.2"
-                       LIBCUPSCGI="libcupscgi.so.1"
-                       LIBCUPSIMAGE="libcupsimage.so.2"
-                       LIBCUPSMIME="libcupsmime.so.1"
-                       LIBCUPSPPDC="libcupsppdc.so.1"
-                       DSO="\$(CC)"
-                       DSOXX="\$(CXX)"
-                       DSOFLAGS="$DSOFLAGS -Wl,-h,\`basename \$@\` -G \$(OPTIM)"
-                       ;;
-               HP-UX*)
-                       case "$uarch" in
-                               ia64)
-                                       LIBCUPS="lib$cupsbase.so.2"
-                                       LIBCUPSCGI="libcupscgi.so.1"
-                                       LIBCUPSIMAGE="libcupsimage.so.2"
-                                       LIBCUPSMIME="libcupsmime.so.1"
-                                       LIBCUPSPPDC="libcupsppdc.so.1"
-                                       DSO="\$(CC)"
-                                       DSOXX="\$(CXX)"
-                                       DSOFLAGS="$DSOFLAGS -Wl,-b,-z,+h,\`basename \$@\`"
-                                       ;;
-                               *)
-                                       LIBCUPS="lib$cupsbase.sl.2"
-                                       LIBCUPSCGI="libcupscgi.sl.1"
-                                       LIBCUPSIMAGE="libcupsimage.sl.2"
-                                       LIBCUPSMIME="libcupsmime.sl.1"
-                                       LIBCUPSPPDC="libcupsppdc.sl.1"
-                                       DSO="\$(LD)"
-                                       DSOXX="\$(LD)"
-                                       DSOFLAGS="$DSOFLAGS -b -z +h \`basename \$@\`"
-                                       ;;
-                       esac
-                       ;;
-               IRIX)
-                       LIBCUPS="lib$cupsbase.so.2"
-                       LIBCUPSCGI="libcupscgi.so.1"
-                       LIBCUPSIMAGE="libcupsimage.so.2"
-                       LIBCUPSMIME="libcupsmime.so.1"
-                       LIBCUPSPPDC="libcupsppdc.so.1"
-                       DSO="\$(CC)"
-                       DSOXX="\$(CXX)"
-                       DSOFLAGS="$DSOFLAGS -set_version,sgi2.6,-soname,\`basename \$@\` -shared \$(OPTIM)"
-                       ;;
-               OSF1* | Linux | GNU | *BSD*)
+               Linux | GNU | *BSD*)
                        LIBCUPS="lib$cupsbase.so.2"
                        LIBCUPSCGI="libcupscgi.so.1"
                        LIBCUPSIMAGE="libcupsimage.so.2"
@@ -6488,17 +6444,6 @@ if test x$enable_shared != xno; then
                        DSOXX="\$(CXX)"
                        DSOFLAGS="$DSOFLAGS -dynamiclib -single_module -lc"
                        ;;
-               AIX*)
-                       LIBCUPS="lib${cupsbase}_s.a"
-                       LIBCUPSBASE="${cupsbase}_s"
-                       LIBCUPSCGI="libcupscgi_s.a"
-                       LIBCUPSIMAGE="libcupsimage_s.a"
-                       LIBCUPSMIME="libcupsmime_s.a"
-                       LIBCUPSPPDC="libcupsppdc_s.a"
-                       DSO="\$(CC)"
-                       DSOXX="\$(CXX)"
-                       DSOFLAGS="$DSOFLAGS -Wl,-bexpall,-bM:SRE,-bnoentry,-blibpath:\$(libdir)"
-                       ;;
                *)
                        echo "Warning: shared libraries may not be supported.  Trying -shared"
                        echo "         option with compiler."
@@ -6541,19 +6486,11 @@ if test x$enable_shared = xno; then
        EXTLINKCUPS="-lcups"
        EXTLINKCUPSIMAGE="-lcupsimage"
 else
-       if test $uname = AIX; then
-               LINKCUPS="-l${cupsbase}_s"
-               LINKCUPSIMAGE="-lcupsimage_s"
+       LINKCUPS="-l${cupsbase}"
+       LINKCUPSIMAGE="-lcupsimage"
 
-               EXTLINKCUPS="-lcups_s"
-               EXTLINKCUPSIMAGE="-lcupsimage_s"
-       else
-               LINKCUPS="-l${cupsbase}"
-               LINKCUPSIMAGE="-lcupsimage"
-
-               EXTLINKCUPS="-lcups"
-               EXTLINKCUPSIMAGE="-lcupsimage"
-       fi
+       EXTLINKCUPS="-lcups"
+       EXTLINKCUPSIMAGE="-lcupsimage"
 fi
 
 
@@ -6575,19 +6512,6 @@ if test "$DSO" != ":"; then
        # need this option, even when the library is installed in a
        # standard location...
        case $uname in
-                HP-UX*)
-                       # HP-UX needs the path, even for /usr/lib...
-                       case "$uarch" in
-                               ia64)
-                                       DSOFLAGS="-Wl,+s,+b,$libdir $DSOFLAGS"
-                                       ;;
-                               *)
-                                       DSOFLAGS="+s +b $libdir $DSOFLAGS"
-                                       ;;
-                       esac
-                       LDFLAGS="$LDFLAGS -Wl,+s,+b,$libdir"
-                       EXPORT_LDFLAGS="-Wl,+s,+b,$libdir"
-                       ;;
                 SunOS*)
                        # Solaris...
                        if test $exec_prefix != /usr; then
@@ -6604,8 +6528,8 @@ if test "$DSO" != ":"; then
                                EXPORT_LDFLAGS="-Wl,-R$libdir"
                        fi
                        ;;
-                IRIX | Linux | GNU)
-                        # IRIX, Linux, and HURD...
+                Linux | GNU)
+                        # Linux, and HURD...
                        if test $exec_prefix != /usr; then
                                DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS"
                                LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir"
@@ -6764,15 +6688,15 @@ if test -n "$GCC"; then
        fi
 
        # Generate position-independent code as needed...
-       if test $PICFLAG = 1 -a $uname != AIX; then
+       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 if GCC supports -fstack-protector" >&5
-$as_echo_n "checking if GCC supports -fstack-protector... " >&6; }
+       { $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
@@ -6787,7 +6711,12 @@ main ()
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  OPTIM="$OPTIM -fstack-protector"
+  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
@@ -6798,14 +6727,19 @@ rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
        CFLAGS="$OLDCFLAGS"
 
-       # 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.
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fPIE" >&5
-$as_echo_n "checking if GCC supports -fPIE... " >&6; }
-       OLDCFLAGS="$CFLAGS"
-       CFLAGS="$CFLAGS -fPIE"
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+       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 "$uname" in
+                       Darwin*)
+                               CFLAGS="$CFLAGS -fPIE -Wl,-pie"
+                               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -6817,36 +6751,106 @@ main ()
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  case "$CC" in
-                       *clang)
-                               PIEFLAGS="-fPIE -Wl,-pie"
+
+                                       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
                                ;;
+
                        *)
-                               PIEFLAGS="-fPIE -pie"
-                               ;;
-               esac
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+                               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
-       CFLAGS="$OLDCFLAGS"
+                               ;;
+               esac
+               CFLAGS="$OLDCFLAGS"
+       fi
 
        if test "x$with_optim" = x; then
                # Add useful warning options for tracking down problems...
                OPTIM="-Wall -Wno-format-y2k -Wunused $OPTIM"
 
-               # Additional warning options for development testing...
-               if test -d .svn; then
-                       OPTIM="-Wshadow -Werror $OPTIM"
-               else
-                       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -Wno-tautological-compare" >&5
-$as_echo_n "checking if GCC supports -Wno-tautological-compare... " >&6; }
-                       OLDCFLAGS="$CFLAGS"
-                       CFLAGS="$CFLAGS -Werror -Wno-tautological-compare"
-                       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-unused-result" >&5
+$as_echo_n "checking whether compiler supports -Wno-unused-result... " >&6; }
+               OLDCFLAGS="$CFLAGS"
+               CFLAGS="$CFLAGS -Werror -Wno-unused-result"
+               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  OPTIM="$OPTIM -Wno-unused-result"
+                       { $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="$OLDCFLAGS"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wsign-conversion" >&5
+$as_echo_n "checking whether compiler supports -Wsign-conversion... " >&6; }
+               OLDCFLAGS="$CFLAGS"
+               CFLAGS="$CFLAGS -Werror -Wsign-conversion"
+               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  OPTIM="$OPTIM -Wsign-conversion"
+                       { $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="$OLDCFLAGS"
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-tautological-compare" >&5
+$as_echo_n "checking whether compiler supports -Wno-tautological-compare... " >&6; }
+               OLDCFLAGS="$CFLAGS"
+               CFLAGS="$CFLAGS -Werror -Wno-tautological-compare"
+               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -6859,14 +6863,18 @@ main ()
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
   OPTIM="$OPTIM -Wno-tautological-compare"
-                               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+                       { $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="$OLDCFLAGS"
+               CFLAGS="$OLDCFLAGS"
+
+               # Additional warning options for development testing...
+               if test -d .svn; then
+                       OPTIM="-Werror $OPTIM"
                fi
        fi
 
@@ -6884,60 +6892,13 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
                        # 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"
+                               RELROFLAGS="-Wl,-z,relro,-z,now"
                        fi
                        ;;
        esac
 else
        # Add vendor-specific compiler options...
        case $uname in
-               AIX*)
-                       if test -z "$OPTIM"; then
-                               if test "x$with_optim" = x; then
-                                       OPTIM="-O2 -qmaxmem=6000"
-                               else
-                                       OPTIM="$with_optim $OPTIM"
-                               fi
-                       fi
-                       ;;
-               HP-UX*)
-                       if test -z "$OPTIM"; then
-                               if test "x$with_optim" = x; then
-                                       OPTIM="+O2"
-                               else
-                                       OPTIM="$with_optim $OPTIM"
-                               fi
-                       fi
-
-                       CFLAGS="-Ae $CFLAGS"
-
-                       if test $PICFLAG = 1; then
-                               OPTIM="+z $OPTIM"
-                       fi
-                       ;;
-               IRIX)
-                       if test -z "$OPTIM"; then
-                               if test "x$with_optim" = x; then
-                                       OPTIM="-O2"
-                               else
-                                       OPTIM="$with_optim $OPTIM"
-                               fi
-                       fi
-
-                       if test "x$with_optim" = x; then
-                               OPTIM="-fullwarn -woff 1183,1209,1349,1506,3201 $OPTIM"
-                       fi
-                       ;;
-               OSF*)
-                       # Tru64 UNIX aka Digital UNIX aka OSF/1
-                       if test -z "$OPTIM"; then
-                               if test "x$with_optim" = x; then
-                                       OPTIM="-O"
-                               else
-                                       OPTIM="$with_optim"
-                               fi
-                       fi
-                       ;;
                SunOS*)
                        # Solaris
                        if test -z "$OPTIM"; then
@@ -6952,26 +6913,12 @@ else
                                OPTIM="-KPIC $OPTIM"
                        fi
                        ;;
-               UNIX_SVR*)
-                       # UnixWare
-                       if test -z "$OPTIM"; then
-                               if test "x$with_optim" = x; then
-                                       OPTIM="-O"
-                               else
-                                       OPTIM="$with_optim $OPTIM"
-                               fi
-                       fi
-
-                       if test $PICFLAG = 1; then
-                               OPTIM="-KPIC $OPTIM"
-                       fi
-                       ;;
                *)
                        # Running some other operating system; inform the user they
                        # should contribute the necessary options to
                        # cups-support@cups.org...
                        echo "Building CUPS with default compiler optimizations; contact"
-                       echo "cups-bugs@cups.org with uname and compiler options needed"
+                       echo "cups-devel@cups.org with uname and compiler options needed"
                        echo "for your platform, or set the CFLAGS and LDFLAGS environment"
                        echo "variables before running configure."
                        ;;
@@ -6980,37 +6927,23 @@ fi
 
 # Add general compiler options per platform...
 case $uname in
-       HP-UX*)
-               # HP-UX 10.20 (at least) needs this definition to get the
-               # h_errno global...
-               OPTIM="$OPTIM -D_XOPEN_SOURCE_EXTENDED"
-
-               # HP-UX 11.00 (at least) needs this definition to get the
-               # u_short type used by the IP headers...
-               OPTIM="$OPTIM -D_INCLUDE_HPUX_SOURCE"
-
-               # HP-UX 11.23 (at least) needs this definition to get the
-               # IPv6 header to work...
-               OPTIM="$OPTIM -D_HPUX_SOURCE"
-               ;;
-
        Linux*)
                # glibc 2.8 and higher breaks peer credentials unless you
                # define _GNU_SOURCE...
                OPTIM="$OPTIM -D_GNU_SOURCE"
                ;;
-
-       OSF*)
-               # Tru64 UNIX aka Digital UNIX aka OSF/1 need to be told
-               # to be POSIX-compliant...
-               OPTIM="$OPTIM -D_XOPEN_SOURCE=500 -D_XOPEN_SOURCE_EXTENDED -D_OSF_SOURCE"
-               ;;
 esac
 
 
 
 
-ac_fn_c_check_header_mongrel "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "$ac_includes_default"
+ac_fn_c_check_header_compile "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+"
 if test "x$ac_cv_header_resolv_h" = xyes; then :
   $as_echo "#define HAVE_RESOLV_H 1" >>confdefs.h
 
@@ -7647,21 +7580,6 @@ fi
 
 
 
-for ac_header in AppleTalk/at_proto.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "AppleTalk/at_proto.h" "ac_cv_header_AppleTalk_at_proto_h" "#include <netat/appletalk.h>
-"
-if test "x$ac_cv_header_AppleTalk_at_proto_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_APPLETALK_AT_PROTO_H 1
-_ACEOF
- $as_echo "#define HAVE_APPLETALK_AT_PROTO_H 1" >>confdefs.h
-
-fi
-
-done
-
-
 
 
 ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll"
@@ -7695,8 +7613,9 @@ LIBGSSAPI=""
 
 
 if test x$enable_gssapi != xno; then
-       # Extract the first word of "krb5-config", so it can be a program name with args.
-set dummy krb5-config; ac_word=$2
+       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 :
@@ -7735,6 +7654,63 @@ $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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 "$uname" in
                        Darwin)
@@ -7914,53 +7890,27 @@ fi
 
 
                if test -d /System/Library/Frameworks/GSS.framework; then
-                       gssdir="/System/Library/Frameworks/GSS.framework"
-                       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi.h presence" >&5
-$as_echo_n "checking for GSS/gssapi.h presence... " >&6; }
-                       if test -f $gssdir/Headers/gssapi.h; then
-                               $as_echo "#define HAVE_GSS_GSSAPI_H 1" >>confdefs.h
+                       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
 
-                               { $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
-                       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi_generic.h presence" >&5
-$as_echo_n "checking for GSS/gssapi_generic.h presence... " >&6; }
-                       if test -f $gssdir/Headers/gssapi_generic.h; then
-                               $as_echo "#define HAVE_GSSAPI_GENERIC_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
 
-                               { $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
-                       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi_spi.h presence" >&5
-$as_echo_n "checking for GSS/gssapi_spi.h presence... " >&6; }
-                       if test -f $gssdir/PrivateHeaders/gssapi_spi.h; then
-                               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-                               { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi_spi.h usability" >&5
-$as_echo_n "checking for GSS/gssapi_spi.h usability... " >&6; }
-                               if test -s $gssdir/PrivateHeaders/gssapi_spi.h; then
-                                       { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-                                       $as_echo "#define HAVE_GSS_GSSAPI_SPI_H 1" >>confdefs.h
 
-                               else
-                                       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-                               fi
-                       else
-                               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-                               if test $uversion -ge 110 -a $uversion -lt 120; then
-                                       # Broken public headers in 10.7.x...
-                                       as_fn_error $? "Run 'sudo mkdir -p $gssdir/PrivateHeaders' and 'sudo touch $gssdir/PrivateHeaders/gssapi_spi.h' to build CUPS." "$LINENO" 5
-                               fi
-                       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 :
@@ -8167,31 +8117,11 @@ if test "${enable_gnutls+set}" = set; then :
   enableval=$enable_gnutls;
 fi
 
-# Check whether --enable-openssl was given.
-if test "${enable_openssl+set}" = set; then :
-  enableval=$enable_openssl;
-fi
-
-
-# Check whether --with-openssl-libs was given.
-if test "${with_openssl_libs+set}" = set; then :
-  withval=$with_openssl_libs; LDFLAGS="-L$withval $LDFLAGS"
-    DSOFLAGS="-L$withval $DSOFLAGS"
-fi
-
-
-# Check whether --with-openssl-includes was given.
-if test "${with_openssl_includes+set}" = set; then :
-  withval=$with_openssl_includes; CFLAGS="-I$withval $CFLAGS"
-    CPPFLAGS="-I$withval $CPPFLAGS"
-fi
-
 
 SSLFLAGS=""
 SSLLIBS=""
 have_ssl=0
-CUPS_SERVERCERT=""
-CUPS_SERVERKEY=""
+CUPS_SERVERKEYCHAIN=""
 
 if test x$enable_ssl != xno; then
         if test $have_ssl = 0 -a "x$enable_cdsassl" != "xno"; then
@@ -8204,7 +8134,7 @@ if test "x$ac_cv_header_Security_SecureTransport_h" = xyes; then :
 
                $as_echo "#define HAVE_CDSASSL 1" >>confdefs.h
 
-               CUPS_SERVERCERT="/Library/Keychains/System.keychain"
+               CUPS_SERVERKEYCHAIN="/Library/Keychains/System.keychain"
 
                                ac_fn_c_check_header_mongrel "$LINENO" "Security/SecureTransportPriv.h" "ac_cv_header_Security_SecureTransportPriv_h" "$ac_includes_default"
 if test "x$ac_cv_header_Security_SecureTransportPriv_h" = xyes; then :
@@ -8264,53 +8194,25 @@ fi
 
 
 
-                               { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SecCertificateCopyData" >&5
-$as_echo_n "checking for SecCertificateCopyData... " >&6; }
-               if test $uversion -ge 100; then
-                   $as_echo "#define HAVE_SECCERTIFICATECOPYDATA 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
-
-                               { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SecIdentitySearchCreateWithPolicy" >&5
-$as_echo_n "checking for SecIdentitySearchCreateWithPolicy... " >&6; }
-               if test $uversion -ge 80; then
-                   $as_echo "#define HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY 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
-
-                               { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SecPolicyCreateSSL" >&5
-$as_echo_n "checking for SecPolicyCreateSSL... " >&6; }
-               if test $uversion -ge 110; then
-                   $as_echo "#define HAVE_SECPOLICYCREATESSL 1" >>confdefs.h
+               $as_echo "#define HAVE_CSSMERRORSTRING 1" >>confdefs.h
+
+               $as_echo "#define HAVE_SECKEYCHAINOPEN 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
 fi
 
 
 
-               $as_echo "#define HAVE_CSSMERRORSTRING 1" >>confdefs.h
+               if test $uversion -ge 150; then
+                       $as_echo "#define HAVE_SSLSETENABLEDCIPHERS 1" >>confdefs.h
 
+               fi
        fi
     fi
 
         if test $have_ssl = 0 -a "x$enable_gnutls" != "xno" -a "x$PKGCONFIG" != x; then
-       # Extract the first word of "libgnutls-config", so it can be a program name with args.
-set dummy libgnutls-config; ac_word=$2
+       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 :
@@ -8349,8 +8251,66 @@ $as_echo "no" >&6; }
 fi
 
 
-       # Extract the first word of "libgcrypt-config", so it can be a program name with args.
-set dummy libgcrypt-config; ac_word=$2
+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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}libgcrypt-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}libgcrypt-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_LIBGCRYPTCONFIG+:} false; then :
@@ -8389,6 +8349,63 @@ $as_echo "no" >&6; }
 fi
 
 
+fi
+if test -z "$ac_cv_path_LIBGCRYPTCONFIG"; then
+  ac_pt_LIBGCRYPTCONFIG=$LIBGCRYPTCONFIG
+  # Extract the first word of "libgcrypt-config", so it can be a program name with args.
+set dummy libgcrypt-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_LIBGCRYPTCONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_LIBGCRYPTCONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_LIBGCRYPTCONFIG="$ac_pt_LIBGCRYPTCONFIG" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_LIBGCRYPTCONFIG="$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_LIBGCRYPTCONFIG=$ac_cv_path_ac_pt_LIBGCRYPTCONFIG
+if test -n "$ac_pt_LIBGCRYPTCONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LIBGCRYPTCONFIG" >&5
+$as_echo "$ac_pt_LIBGCRYPTCONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_LIBGCRYPTCONFIG" = x; then
+    LIBGCRYPTCONFIG=""
+  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
+    LIBGCRYPTCONFIG=$ac_pt_LIBGCRYPTCONFIG
+  fi
+else
+  LIBGCRYPTCONFIG="$ac_cv_path_LIBGCRYPTCONFIG"
+fi
+
        if $PKGCONFIG --exists gnutls; then
            have_ssl=1
            SSLLIBS=`$PKGCONFIG --libs gnutls`
        fi
 
        if test $have_ssl = 1; then
-           CUPS_SERVERCERT="ssl/server.crt"
-           CUPS_SERVERKEY="ssl/server.key"
-
-            if $PKGCONFIG --exists gcrypt; then
-               SSLLIBS="$SSLLIBS `$PKGCONFIG --libs gcrypt`"
-               SSLFLAGS="$SSLFLAGS `$PKGCONFIG --cflags gcrypt`"
-           elif test "x$LIBGCRYPTCONFIG" != x; then
-               SSLLIBS="$SSLLIBS `$LIBGCRYPTCONFIG --libs`"
-               SSLFLAGS="$SSLFLAGS `$LIBGCRYPTCONFIG --cflags`"
-           fi
-       fi
-    fi
-
-        if test $have_ssl = 0 -a "x$enable_openssl" != "xno"; then
-       ac_fn_c_check_header_mongrel "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default"
-if test "x$ac_cv_header_openssl_ssl_h" = xyes; then :
-
-                           SAVELIBS="$LIBS"
-
-
-           for libcrypto in \
-               "-lcrypto" \
-               "-lcrypto -lrsaref" \
-               "-lcrypto -lRSAglue -lrsaref"
-           do
-               { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_new in -lssl" >&5
-$as_echo_n "checking for SSL_new in -lssl... " >&6; }
-if ${ac_cv_lib_ssl_SSL_new+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lssl $libcrypto $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 SSL_new ();
-int
-main ()
-{
-return SSL_new ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_ssl_SSL_new=yes
-else
-  ac_cv_lib_ssl_SSL_new=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_ssl_SSL_new" >&5
-$as_echo "$ac_cv_lib_ssl_SSL_new" >&6; }
-if test "x$ac_cv_lib_ssl_SSL_new" = xyes; then :
-  have_ssl=1
-                    SSLFLAGS="-DOPENSSL_DISABLE_OLD_DES_SUPPORT"
-                    SSLLIBS="-lssl $libcrypto"
-                    $as_echo "#define HAVE_SSL 1" >>confdefs.h
+           CUPS_SERVERKEYCHAIN="ssl"
 
-                    $as_echo "#define HAVE_LIBSSL 1" >>confdefs.h
+           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
 
-
-               if test "x${SSLLIBS}" != "x"; then
-                   break
-               fi
-           done
-
-           if test "x${SSLLIBS}" != "x"; then
-               CUPS_SERVERCERT="ssl/server.crt"
-               CUPS_SERVERKEY="ssl/server.key"
-
-               LIBS="$SAVELIBS $SSLLIBS"
-               for ac_func in SSL_set_tlsext_host_name
-do :
-  ac_fn_c_check_func "$LINENO" "SSL_set_tlsext_host_name" "ac_cv_func_SSL_set_tlsext_host_name"
-if test "x$ac_cv_func_SSL_set_tlsext_host_name" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SSL_SET_TLSEXT_HOST_NAME 1
-_ACEOF
+           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
-done
-
-           fi
 
            LIBS="$SAVELIBS"
-fi
-
-
+       fi
     fi
 fi
 
@@ -8517,7 +8453,7 @@ $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 -o x$enable_openssl = xyes; then
+elif test x$enable_cdsa = xyes -o x$enable_gnutls = xyes; then
     as_fn_error $? "Unable to enable SSL support." "$LINENO" 5
 fi
 
@@ -8526,7 +8462,6 @@ fi
 
 
 
-
 EXPORT_SSLLIBS="$SSLLIBS"
 
 
@@ -8544,10 +8479,6 @@ if test "${with_pam_module+set}" = set; then :
 fi
 
 
-if test $uname = AIX; then
-       enable_pam=no
-fi
-
 PAMDIR=""
 PAMFILE="pam.std"
 PAMLIBS=""
@@ -9088,8 +9019,10 @@ fi
 
 DNSSDLIBS=""
 DNSSD_BACKEND=""
+IPPFIND_BIN=""
+IPPFIND_MAN=""
 
-if test "x$PKGCONFIG" != x -a x$enable_avahi != xno; then
+if test "x$PKGCONFIG" != x -a x$enable_avahi != xno -a x$uname != 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
@@ -9098,6 +9031,8 @@ $as_echo "yes" >&6; }
                CFLAGS="$CFLAGS `$PKGCONFIG --cflags avahi-client`"
                DNSSDLIBS="`$PKGCONFIG --libs avahi-client`"
                DNSSD_BACKEND="dnssd"
+               IPPFIND_BIN="ippfind"
+               IPPFIND_MAN="ippfind.\$(MAN1EXT)"
                $as_echo "#define HAVE_AVAHI 1" >>confdefs.h
 
        else
@@ -9117,6 +9052,8 @@ if test "x$ac_cv_header_dns_sd_h" = xyes; then :
 
                                DNSSDLIBS="-framework CoreFoundation -framework SystemConfiguration"
                                DNSSD_BACKEND="dnssd"
+                               IPPFIND_BIN="ippfind"
+                               IPPFIND_MAN="ippfind.\$(MAN1EXT)"
                                ;;
                        *)
                                # All others...
@@ -9147,7 +9084,9 @@ $as_echo "yes" >&6; }
                                        DNSSDLIBS="-ldns_sd"
                                        DNSSD_BACKEND="dnssd"
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+  IPPFIND_BIN="ippfind"
+                                       IPPFIND_MAN="ippfind.\$(MAN1EXT)"
+                                       { $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
@@ -9166,14 +9105,19 @@ fi
 
 
 
+
+ONDEMANDFLAGS=""
+ONDEMANDLIBS=""
+
+
+
 # Check whether --enable-launchd was given.
 if test "${enable_launchd+set}" = set; then :
   enableval=$enable_launchd;
 fi
 
+LAUNCHD_DIR=""
 
-DEFAULT_LAUNCHD_CONF=""
-LAUNCHDLIBS=""
 
 if test x$enable_launchd != xno; then
        ac_fn_c_check_func "$LINENO" "launch_msg" "ac_cv_func_launch_msg"
@@ -9182,6 +9126,17 @@ if test "x$ac_cv_func_launch_msg" = xyes; then :
 
 fi
 
+       if test $uversion -ge 140; 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_LAUNCH_ACTIVATE_SOCKET 1" >>confdefs.h
+
+fi
+
+       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
@@ -9193,7 +9148,7 @@ fi
        case "$uname" in
                Darwin*)
                        # Darwin, MacOS X
-                       DEFAULT_LAUNCHD_CONF="/System/Library/LaunchDaemons/org.cups.cupsd.plist"
+                       LAUNCHD_DIR="/System/Library/LaunchDaemons"
                        # liblaunch is already part of libSystem
                        ;;
                *)
@@ -9202,8 +9157,205 @@ fi
        esac
 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
+
+                       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
+
+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 "$uname" in
+               Linux | GNU | GNU/k*BSD*)
+                       # Linux
+                        rcstart="81"
+                       ;;
+
+               SunOS*)
+                       # Solaris
+                        rcstart="81"
+                       ;;
+
+                *)
+                        # Others
+                        rcstart="99"
+                        ;;
+       esac
+fi
+
+if test "x$rcstop" = x; then
+       case "$uname" in
+               Linux | GNU | GNU/k*BSD*)
+                       # 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
+
 
 
 
@@ -9319,7 +9471,7 @@ _ACEOF
 if test "${with_access_log_level+set}" = set; then :
   withval=$with_access_log_level; CUPS_ACCESS_LOG_LEVEL="$withval"
 else
-  CUPS_ACCESS_LOG_LEVEL="actions"
+  CUPS_ACCESS_LOG_LEVEL="none"
 fi
 
 
@@ -9328,6 +9480,18 @@ cat >>confdefs.h <<_ACEOF
 _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;
@@ -10081,7 +10245,7 @@ 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 data/testprint desktop/cups.desktop doc/help/ref-cups-files-conf.html doc/help/ref-cupsd-conf.html doc/help/standard.html doc/index.html man/client.conf.man man/cups-deviced.man man/cups-driverd.man man/cups-files.conf.man man/cups-lpd.man man/cups-snmp.man man/cupsaddsmb.man man/cupsd.conf.man man/cupsd.man man/lpoptions.man scheduler/cups-lpd.xinetd scheduler/cups.sh scheduler/cups.xml scheduler/org.cups.cups-lpd.plist templates/header.tmpl packaging/cups.list $LANGFILES"
+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 man/client.conf.man man/cups-files.conf.man man/cups-lpd.man man/cups-snmp.man man/cupsaddsmb.man man/cupsd.conf.man man/cupsd.man man/lpoptions.man 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
@@ -10601,7 +10765,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by $as_me, which was
+This file was extended by CUPS $as_me 2.1.2, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -10657,13 +10821,14 @@ $config_files
 Configuration headers:
 $config_headers
 
-Report bugs to the package provider."
+Report bugs to <https://www.cups.org/str.php>.
+CUPS home page: <https://www.cups.org/>."
 
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-config.status
+CUPS config.status 2.1.2
 configured by $0, generated by GNU Autoconf 2.68,
   with options \\"\$ac_cs_config\\"
 
     "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" ;;
-    "data/testprint") CONFIG_FILES="$CONFIG_FILES data/testprint" ;;
     "desktop/cups.desktop") CONFIG_FILES="$CONFIG_FILES desktop/cups.desktop" ;;
-    "doc/help/ref-cups-files-conf.html") CONFIG_FILES="$CONFIG_FILES doc/help/ref-cups-files-conf.html" ;;
-    "doc/help/ref-cupsd-conf.html") CONFIG_FILES="$CONFIG_FILES doc/help/ref-cupsd-conf.html" ;;
-    "doc/help/standard.html") CONFIG_FILES="$CONFIG_FILES doc/help/standard.html" ;;
     "doc/index.html") CONFIG_FILES="$CONFIG_FILES doc/index.html" ;;
     "man/client.conf.man") CONFIG_FILES="$CONFIG_FILES man/client.conf.man" ;;
-    "man/cups-deviced.man") CONFIG_FILES="$CONFIG_FILES man/cups-deviced.man" ;;
-    "man/cups-driverd.man") CONFIG_FILES="$CONFIG_FILES man/cups-driverd.man" ;;
     "man/cups-files.conf.man") CONFIG_FILES="$CONFIG_FILES man/cups-files.conf.man" ;;
     "man/cups-lpd.man") CONFIG_FILES="$CONFIG_FILES man/cups-lpd.man" ;;
     "man/cups-snmp.man") CONFIG_FILES="$CONFIG_FILES man/cups-snmp.man" ;;
     "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" ;;
similarity index 65%
rename from configure.in
rename to configure.ac
index 33a7ba2..e6dc4fb 100644 (file)
@@ -1,19 +1,23 @@
 dnl
-dnl "$Id: configure.in 11173 2013-07-23 12:31:34Z msweet $"
+dnl "$Id: configure.ac 12998 2015-12-02 15:09:04Z msweet $"
 dnl
-dnl   Configuration script for CUPS.
+dnl Configuration script for CUPS.
 dnl
-dnl   Copyright 2007-2013 by Apple Inc.
-dnl   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+dnl Copyright 2007-2015 by Apple Inc.
+dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
 dnl
-dnl   These coded instructions, statements, and computer programs are the
-dnl   property of Apple Inc. and are protected by Federal copyright
-dnl   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-dnl   which should have been included with this file.  If this file is
-dnl   file is missing or damaged, see the license at "http://www.cups.org/".
+dnl These coded instructions, statements, and computer programs are the
+dnl property of Apple Inc. and are protected by Federal copyright
+dnl law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+dnl which should have been included with this file.  If this file is
+dnl file is missing or damaged, see the license at "http://www.cups.org/".
 dnl
 
-AC_INIT(cups/cups.h)
+dnl We need at least autoconf 2.60...
+AC_PREREQ(2.60)
+
+dnl Package name and version...
+AC_INIT([CUPS], [2.1.2], [https://www.cups.org/str.php], [cups], [https://www.cups.org/])
 
 sinclude(config-scripts/cups-opsys.m4)
 sinclude(config-scripts/cups-common.m4)
@@ -32,7 +36,7 @@ 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-launchd.m4)
+sinclude(config-scripts/cups-startup.m4)
 sinclude(config-scripts/cups-defaults.m4)
 sinclude(config-scripts/cups-scripting.m4)
 
@@ -66,15 +70,9 @@ AC_OUTPUT(Makedefs
          conf/pam.std
          conf/snmp.conf
          cups-config
-         data/testprint
          desktop/cups.desktop
-         doc/help/ref-cups-files-conf.html
-         doc/help/ref-cupsd-conf.html
-         doc/help/standard.html
          doc/index.html
          man/client.conf.man
-         man/cups-deviced.man
-         man/cups-driverd.man
          man/cups-files.conf.man
          man/cups-lpd.man
          man/cups-snmp.man
@@ -86,6 +84,10 @@ AC_OUTPUT(Makedefs
          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)
@@ -93,5 +95,5 @@ AC_OUTPUT(Makedefs
 chmod +x cups-config
 
 dnl
-dnl End of "$Id: configure.in 11173 2013-07-23 12:31:34Z msweet $".
+dnl End of "$Id: configure.ac 12998 2015-12-02 15:09:04Z msweet $".
 dnl
index ee9a0ea..07726c5 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 #
-# "$Id: cups-config.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: cups-config.in 10996 2013-05-29 11:51:34Z msweet $"
 #
 #   CUPS configuration utility.
 #
@@ -142,5 +142,5 @@ while test $# -gt 0; do
 done
 
 #
-# End of "$Id: cups-config.in 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: cups-config.in 10996 2013-05-29 11:51:34Z msweet $".
 #
index 10beea2..64a0d19 100644 (file)
 adminutil.o: adminutil.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h adminutil.h
-array.o: array.c string-private.h ../config.h debug-private.h \
-  ../cups/versioning.h array-private.h ../cups/array.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h adminutil.h
+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 debug-private.h \
+  array-private.h
 attr.o: attr.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 auth.o: auth.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 backchannel.o: backchannel.c cups.h file.h versioning.h ipp.h http.h \
-  array.h language.h
+  array.h language.h pwg.h
 backend.o: backend.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h backend.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h backend.h
 conflicts.o: conflicts.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 custom.o: custom.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 debug.o: debug.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 dest.o: dest.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 dest-job.o: dest-job.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 dest-localization.o: dest-localization.c cups-private.h string-private.h \
-  ../config.h debug-private.h ../cups/versioning.h ipp-private.h \
-  ../cups/ipp.h http.h array.h http-private.h md5-private.h \
-  language-private.h ../cups/transcode.h language.h pwg-private.h \
-  ../cups/cups.h file.h ppd-private.h ../cups/ppd.h thread-private.h
+  ../config.h debug-private.h ../cups/versioning.h array-private.h \
+  ../cups/array.h ipp-private.h ../cups/ipp.h http.h http-private.h \
+  ../cups/language.h md5-private.h language-private.h \
+  ../cups/transcode.h pwg-private.h ../cups/cups.h file.h pwg.h \
+  ppd-private.h ../cups/ppd.h thread-private.h
 dest-options.o: dest-options.c cups-private.h string-private.h \
-  ../config.h debug-private.h ../cups/versioning.h ipp-private.h \
-  ../cups/ipp.h http.h array.h http-private.h md5-private.h \
-  language-private.h ../cups/transcode.h language.h pwg-private.h \
-  ../cups/cups.h file.h ppd-private.h ../cups/ppd.h thread-private.h
+  ../config.h debug-private.h ../cups/versioning.h array-private.h \
+  ../cups/array.h ipp-private.h ../cups/ipp.h http.h http-private.h \
+  ../cups/language.h md5-private.h language-private.h \
+  ../cups/transcode.h pwg-private.h ../cups/cups.h file.h pwg.h \
+  ppd-private.h ../cups/ppd.h thread-private.h
 dir.o: dir.c string-private.h ../config.h debug-private.h \
   ../cups/versioning.h dir.h
 emit.o: emit.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 encode.o: encode.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 file.o: file.c file-private.h cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 getdevices.o: getdevices.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
-getifaddrs.o: getifaddrs.c http-private.h ../config.h ../cups/http.h \
-  versioning.h array.h md5-private.h ipp-private.h ../cups/ipp.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
+getifaddrs.o: getifaddrs.c http-private.h ../config.h ../cups/language.h \
+  array.h versioning.h ../cups/http.h md5-private.h ipp-private.h \
+  ../cups/ipp.h
 getputfile.o: getputfile.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 globals.o: globals.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 http.o: http.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 http-addr.o: http-addr.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 http-addrlist.o: http-addrlist.c cups-private.h string-private.h \
-  ../config.h debug-private.h ../cups/versioning.h ipp-private.h \
-  ../cups/ipp.h http.h array.h http-private.h md5-private.h \
-  language-private.h ../cups/transcode.h language.h pwg-private.h \
-  ../cups/cups.h file.h ppd-private.h ../cups/ppd.h thread-private.h
+  ../config.h debug-private.h ../cups/versioning.h array-private.h \
+  ../cups/array.h ipp-private.h ../cups/ipp.h http.h http-private.h \
+  ../cups/language.h md5-private.h language-private.h \
+  ../cups/transcode.h pwg-private.h ../cups/cups.h file.h pwg.h \
+  ppd-private.h ../cups/ppd.h thread-private.h
 http-support.o: http-support.c cups-private.h string-private.h \
-  ../config.h debug-private.h ../cups/versioning.h ipp-private.h \
-  ../cups/ipp.h http.h array.h http-private.h md5-private.h \
-  language-private.h ../cups/transcode.h language.h pwg-private.h \
-  ../cups/cups.h file.h ppd-private.h ../cups/ppd.h thread-private.h
+  ../config.h debug-private.h ../cups/versioning.h array-private.h \
+  ../cups/array.h ipp-private.h ../cups/ipp.h http.h http-private.h \
+  ../cups/language.h md5-private.h language-private.h \
+  ../cups/transcode.h pwg-private.h ../cups/cups.h file.h pwg.h \
+  ppd-private.h ../cups/ppd.h thread-private.h
 ipp.o: ipp.c cups-private.h string-private.h ../config.h debug-private.h \
-  ../cups/versioning.h ipp-private.h ../cups/ipp.h http.h array.h \
-  http-private.h md5-private.h language-private.h ../cups/transcode.h \
-  language.h pwg-private.h ../cups/cups.h file.h ppd-private.h \
-  ../cups/ppd.h thread-private.h
+  ../cups/versioning.h array-private.h ../cups/array.h ipp-private.h \
+  ../cups/ipp.h http.h http-private.h ../cups/language.h md5-private.h \
+  language-private.h ../cups/transcode.h pwg-private.h ../cups/cups.h \
+  file.h pwg.h ppd-private.h ../cups/ppd.h thread-private.h
 ipp-support.o: ipp-support.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 langprintf.o: langprintf.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 language.o: language.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 localize.o: localize.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 mark.o: mark.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 md5.o: md5.c md5-private.h string-private.h ../config.h
-md5passwd.o: md5passwd.c http-private.h ../config.h ../cups/http.h \
-  versioning.h array.h md5-private.h ipp-private.h ../cups/ipp.h \
-  string-private.h
+md5passwd.o: md5passwd.c http-private.h ../config.h ../cups/language.h \
+  array.h versioning.h ../cups/http.h md5-private.h ipp-private.h \
+  ../cups/ipp.h string-private.h
 notify.o: notify.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 options.o: options.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 page.o: page.c string-private.h ../config.h debug-private.h \
   ../cups/versioning.h ppd.h cups.h file.h ipp.h http.h array.h \
-  language.h
+  language.h pwg.h
 ppd.o: ppd.c cups-private.h string-private.h ../config.h debug-private.h \
-  ../cups/versioning.h ipp-private.h ../cups/ipp.h http.h array.h \
-  http-private.h md5-private.h language-private.h ../cups/transcode.h \
-  language.h pwg-private.h ../cups/cups.h file.h ppd-private.h \
-  ../cups/ppd.h thread-private.h
+  ../cups/versioning.h array-private.h ../cups/array.h ipp-private.h \
+  ../cups/ipp.h http.h http-private.h ../cups/language.h md5-private.h \
+  language-private.h ../cups/transcode.h pwg-private.h ../cups/cups.h \
+  file.h pwg.h ppd-private.h ../cups/ppd.h thread-private.h
 ppd-cache.o: ppd-cache.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 pwg-media.o: pwg-media.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 request.o: request.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 sidechannel.o: sidechannel.c sidechannel.h versioning.h cups-private.h \
-  string-private.h ../config.h debug-private.h ipp-private.h \
-  ../cups/ipp.h http.h array.h http-private.h md5-private.h \
-  language-private.h ../cups/transcode.h language.h pwg-private.h \
-  ../cups/cups.h file.h ppd-private.h ../cups/ppd.h thread-private.h
+  string-private.h ../config.h debug-private.h array-private.h \
+  ../cups/array.h ipp-private.h ../cups/ipp.h http.h http-private.h \
+  ../cups/language.h md5-private.h language-private.h \
+  ../cups/transcode.h pwg-private.h ../cups/cups.h file.h pwg.h \
+  ppd-private.h ../cups/ppd.h thread-private.h
 snmp.o: snmp.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h snmp-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h snmp-private.h
 snprintf.o: snprintf.c string-private.h ../config.h
-string.o: string.c string-private.h ../config.h debug-private.h \
-  ../cups/versioning.h thread-private.h array.h
+string.o: string.c cups-private.h string-private.h ../config.h \
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 tempfile.o: tempfile.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 thread.o: thread.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
+tls.o: tls.c cups-private.h string-private.h ../config.h debug-private.h \
+  ../cups/versioning.h array-private.h ../cups/array.h ipp-private.h \
+  ../cups/ipp.h http.h http-private.h ../cups/language.h md5-private.h \
+  language-private.h ../cups/transcode.h pwg-private.h ../cups/cups.h \
+  file.h pwg.h ppd-private.h ../cups/ppd.h thread-private.h tls-darwin.c
 transcode.o: transcode.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 usersys.o: usersys.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 util.o: util.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 testadmin.o: testadmin.c adminutil.h cups.h file.h versioning.h ipp.h \
-  http.h array.h language.h string-private.h ../config.h
+  http.h array.h language.h pwg.h string-private.h ../config.h
 testarray.o: testarray.c string-private.h ../config.h debug-private.h \
-  ../cups/versioning.h array.h dir.h
+  ../cups/versioning.h array-private.h ../cups/array.h dir.h
 testconflicts.o: testconflicts.c cups.h file.h versioning.h ipp.h http.h \
-  array.h language.h ppd.h string-private.h ../config.h
+  array.h language.h pwg.h ppd.h string-private.h ../config.h
 testcups.o: testcups.c string-private.h ../config.h cups.h file.h \
-  versioning.h ipp.h http.h array.h language.h ppd.h
+  versioning.h ipp.h http.h array.h language.h pwg.h ppd.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 debug-private.h \
   ../cups/versioning.h file.h
-testhttp.o: testhttp.c string-private.h ../config.h http-private.h \
-  ../cups/http.h versioning.h array.h md5-private.h ipp-private.h \
-  ../cups/ipp.h
+testhttp.o: testhttp.c cups-private.h string-private.h ../config.h \
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 testi18n.o: testi18n.c string-private.h ../config.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 \
   ipp-private.h ../cups/ipp.h http.h array.h
 testoptions.o: testoptions.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 testlang.o: testlang.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 testppd.o: testppd.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h
 testpwg.o: testpwg.c ppd-private.h ../cups/cups.h file.h versioning.h \
-  ipp.h http.h array.h language.h ../cups/ppd.h pwg-private.h \
+  ipp.h http.h array.h language.h pwg.h ../cups/ppd.h pwg-private.h \
   file-private.h cups-private.h string-private.h ../config.h \
-  debug-private.h ipp-private.h http-private.h md5-private.h \
-  language-private.h ../cups/transcode.h thread-private.h
+  debug-private.h array-private.h ipp-private.h http-private.h \
+  md5-private.h language-private.h ../cups/transcode.h thread-private.h
 testsnmp.o: testsnmp.c cups-private.h string-private.h ../config.h \
-  debug-private.h ../cups/versioning.h ipp-private.h ../cups/ipp.h \
-  http.h array.h http-private.h md5-private.h language-private.h \
-  ../cups/transcode.h language.h pwg-private.h ../cups/cups.h file.h \
-  ppd-private.h ../cups/ppd.h thread-private.h snmp-private.h
+  debug-private.h ../cups/versioning.h array-private.h ../cups/array.h \
+  ipp-private.h ../cups/ipp.h http.h http-private.h ../cups/language.h \
+  md5-private.h language-private.h ../cups/transcode.h pwg-private.h \
+  ../cups/cups.h file.h pwg.h ppd-private.h ../cups/ppd.h \
+  thread-private.h snmp-private.h
index 662a00b..7b65214 100644 (file)
@@ -1,22 +1,30 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12850 2015-08-27 19:29:06Z msweet $"
 #
-#   API library Makefile for CUPS.
+# API library Makefile for CUPS.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2006 by Easy Software Products, all rights reserved.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
-#   This file is subject to the Apple OS-Developed Software exception.
+# This file is subject to the Apple OS-Developed Software exception.
 #
 
 include ../Makedefs
 
+
+#
+# Options to build libcups without the use of deprecated APIs...
+#
+
+OPTIONS        =       -D_CUPS_NO_DEPRECATED=1 -D_PPD_DEPRECATED=""
+
+
 #
 # Object files...
 #
@@ -68,14 +76,17 @@ LIBOBJS     =       \
                string.o \
                tempfile.o \
                thread.o \
+               tls.o \
                transcode.o \
                usersys.o \
                util.o
 TESTOBJS       = \
                testadmin.o \
                testarray.o \
+               testcache.o \
                testconflicts.o \
                testcups.o \
+               testdest.o \
                testfile.o \
                testhttp.o \
                testi18n.o \
@@ -84,7 +95,8 @@ TESTOBJS      = \
                testlang.o \
                testppd.o \
                testpwg.o \
-               testsnmp.o
+               testsnmp.o \
+               tlscheck.o
 OBJS   =       \
                $(LIBOBJS) \
                $(TESTOBJS)
@@ -105,6 +117,7 @@ HEADERS     =       \
                ipp.h \
                language.h \
                ppd.h \
+               pwg.h \
                raster.h \
                sidechannel.h \
                transcode.h \
@@ -138,8 +151,10 @@ LIBTARGETS =       \
 UNITTARGETS =  \
                testadmin \
                testarray \
+               testcache \
                testconflicts \
                testcups \
+               testdest \
                testfile \
                testhttp \
                testi18n \
@@ -148,7 +163,8 @@ UNITTARGETS =       \
                testoptions \
                testppd \
                testpwg \
-               testsnmp
+               testsnmp \
+               tlscheck
 
 TARGETS        =       \
                $(LIBTARGETS)
@@ -181,7 +197,7 @@ unittests:  $(UNITTARGETS)
 
 clean:
        $(RM) $(OBJS) $(TARGETS) $(UNITTARGETS)
-       $(RM) libcups.so libcups.sl libcups.dylib
+       $(RM) libcups.so libcups.dylib
 
 
 #
@@ -248,7 +264,7 @@ install-libs: $(INSTALLSTATIC)
        echo Installing libraries in $(LIBDIR)...
        $(INSTALL_DIR) -m 755 $(LIBDIR)
        $(INSTALL_LIB) $(LIBCUPS) $(LIBDIR)
-       if test $(LIBCUPS) = "libcups.so.2" -o $(LIBCUPS) = "libcups.sl.2"; then \
+       if test $(LIBCUPS) = "libcups.so.2"; then \
                $(RM) $(LIBDIR)/`basename $(LIBCUPS) .2`; \
                $(LN) $(LIBCUPS) $(LIBDIR)/`basename $(LIBCUPS) .2`; \
        fi
@@ -259,6 +275,7 @@ install-libs: $(INSTALLSTATIC)
        if test "x$(SYMROOT)" != "x"; then \
                $(INSTALL_DIR) $(SYMROOT); \
                cp $(LIBCUPS) $(SYMROOT); \
+               dsymutil $(SYMROOT)/$(LIBCUPS); \
        fi
 
 installstatic:
@@ -276,9 +293,6 @@ uninstall:
        $(RM) $(LIBDIR)/libcups.2.dylib
        $(RM) $(LIBDIR)/$(LIBCUPSSTATIC)
        $(RM) $(LIBDIR)/libcups.dylib
-       $(RM) $(LIBDIR)/libcups_s.a
-       $(RM) $(LIBDIR)/libcups.sl
-       $(RM) $(LIBDIR)/libcups.sl.2
        $(RM) $(LIBDIR)/libcups.so
        $(RM) $(LIBDIR)/libcups.so.2
        -$(RMDIR) $(LIBDIR)
@@ -289,10 +303,10 @@ uninstall:
 
 
 #
-# libcups.so.2, libcups.sl.2
+# libcups.so.2
 #
 
-libcups.so.2 libcups.sl.2:     $(LIBOBJS)
+libcups.so.2:  $(LIBOBJS)
        echo Linking $@...
        $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBGSSAPI) \
                $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
@@ -312,7 +326,7 @@ libcups.2.dylib:    $(LIBOBJS) $(LIBCUPSORDER)
        echo Linking $@...
        $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ \
                -install_name $(libdir)/$@ \
-               -current_version 2.10.0 \
+               -current_version 2.11.0 \
                -compatibility_version 2.0.0 \
                -exported_symbols_list t.exp \
                $(LIBOBJS) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
@@ -322,26 +336,13 @@ libcups.2.dylib:  $(LIBOBJS) $(LIBCUPSORDER)
 
 
 #
-# libcups_s.a
-#
-
-libcups_s.a:   $(LIBOBJS) libcups_s.exp
-       echo Creating $@...
-       $(DSO) $(DSOFLAGS) -Wl,-bexport:libcups_s.exp -o libcups_s.o \
-               $(LIBOBJS) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
-               $(COMMONLIBS) $(LIBZ)
-       $(RM) $@
-       $(AR) $(ARFLAGS) $@ libcups_s.o
-
-
-#
 # libcups.la
 #
 
 libcups.la:    $(LIBOBJS)
        echo Linking $@...
        $(CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) \
-               -rpath $(LIBDIR) -version-info 2:10 $(LIBGSSAPI) $(SSLLIBS) \
+               -rpath $(LIBDIR) -version-info 2:11 $(LIBGSSAPI) $(SSLLIBS) \
                $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
 
 
@@ -357,6 +358,23 @@ libcups.a: $(LIBOBJS)
 
 
 #
+# libcups2.def (Windows DLL exports file...)
+#
+
+libcups2.def: $(LIBOBJS) Makefile
+       echo Generating $@...
+       echo "LIBRARY libcups2" >libcups2.def
+       echo "VERSION 2.11" >>libcups2.def
+       echo "EXPORTS" >>libcups2.def
+       (nm $(LIBOBJS) 2>/dev/null | grep "T _" | awk '{print $$3}'; \
+        echo __cups_strcpy; echo __cups_strlcat; echo __cups_strlcpy) | \
+               grep -v -E \
+                   -e 'cups_debug|Apple|BackChannel|Backend|FileCheck|Filter|GSSService|SetNegotiate|SideChannel' \
+                   -e 'Block$$' | \
+               sed -e '1,$$s/^_//' | sort >>libcups2.def
+
+
+#
 # testadmin (dependency on static CUPS library is intentional)
 #
 
@@ -379,6 +397,16 @@ testarray: testarray.o $(LIBCUPSSTATIC)
 
 
 #
+# testcache (dependency on static CUPS library is intentional)
+#
+
+testcache:     testcache.o $(LIBCUPSSTATIC)
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o $@ testcache.o $(LIBCUPSSTATIC) \
+               $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
+#
 # testconflicts (dependency on static CUPS library is intentional)
 #
 
@@ -399,6 +427,16 @@ testcups:  testcups.o $(LIBCUPSSTATIC)
 
 
 #
+# testdest (dependency on static CUPS library is intentional)
+#
+
+testdest:      testdest.o $(LIBCUPSSTATIC)
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o $@ testdest.o $(LIBCUPSSTATIC) \
+               $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
+#
 # testfile (dependency on static CUPS library is intentional)
 #
 
@@ -505,6 +543,16 @@ testsnmp:  testsnmp.o $(LIBCUPSSTATIC)
 
 
 #
+# tlscheck (dependency on static CUPS library is intentional)
+#
+
+tlscheck:      tlscheck.o $(LIBCUPSSTATIC)
+       echo Linking $@...
+       $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ tlscheck.o $(LIBCUPSSTATIC) \
+               $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
+#
 # Automatic API help files...
 #
 
@@ -526,8 +574,8 @@ apihelp:
                --css ../doc/cups-printable.css \
                --header api-cups.header --intro api-cups.shtml \
                api-cups.xml \
-               cups.h adminutil.c dest*.c language.c notify.c \
-               options.c tempfile.c usersys.c \
+               cups.h pwg.h adminutil.c dest*.c language.c notify.c \
+               options.c pwg-media.c tempfile.c usersys.c \
                util.c >../doc/help/api-cups.html
        mxmldoc --tokens help/api-cups.html api-cups.xml >../doc/help/api-cups.tokens
        $(RM) api-cups.xml
@@ -626,8 +674,9 @@ sloc:
 #
 
 include Dependencies
+tls.o: tls-darwin.c tls-gnutls.c tls-sspi.c
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12850 2015-08-27 19:29:06Z msweet $".
 #
index a5e2612..6f38f4f 100644 (file)
@@ -1,29 +1,18 @@
 /*
- * "$Id: adminutil.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: adminutil.c 12945 2015-10-26 19:46:02Z msweet $"
  *
- *   Administration utility API definitions for CUPS.
+ * Administration utility API definitions for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 2001-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 2001-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsAdminCreateWindowsPPD()  - Create the Windows PPD file for a printer.
- *   cupsAdminExportSamba()       - Export a printer to Samba.
- *   cupsAdminGetServerSettings() - Get settings from the server.
- *   cupsAdminSetServerSettings() - Set settings on the server.
- *   do_samba_command()           - Do a SAMBA command.
- *   get_cupsd_conf()             - Get the current cupsd.conf file.
- *   invalidate_cupsd_cache()     - Invalidate the cached cupsd.conf settings.
- *   write_option()               - Write a CUPS option to a PPD file.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -52,7 +41,7 @@ static int            do_samba_command(const char *command,
                                         FILE *logfile);
 static http_status_t   get_cupsd_conf(http_t *http, _cups_globals_t *cg,
                                       time_t last_update, char *name,
-                                      int namelen, int *remote);
+                                      size_t namelen, int *remote);
 static void            invalidate_cupsd_cache(_cups_globals_t *cg);
 static void            write_option(cups_file_t *dstfp, int order,
                                     const char *name, const char *text,
@@ -129,7 +118,7 @@ cupsAdminCreateWindowsPPD(
   * Get the supported banner pages, etc. for the printer...
   */
 
-  request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+  request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
 
   httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
                    "localhost", 0, "/printers/%s", dest);
@@ -145,7 +134,7 @@ cupsAdminCreateWindowsPPD(
   */
 
   response = cupsDoRequest(http, request, "/");
-  if (!response || cupsLastError() > IPP_OK_CONFLICT)
+  if (!response || cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     unlink(src);
     return (NULL);
@@ -253,7 +242,7 @@ cupsAdminCreateWindowsPPD(
         snprintf(line, sizeof(line),
                 _cupsLangString(language, _("Missing value on line %d.")),
                 linenum);
-        _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, line, 0);
+        _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, line, 0);
 
         cupsFileClose(srcfp);
         cupsFileClose(dstfp);
@@ -272,7 +261,7 @@ cupsAdminCreateWindowsPPD(
                 _cupsLangString(language,
                                 _("Missing double quote on line %d.")),
                 linenum);
-        _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, line, 0);
+        _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, line, 0);
 
         cupsFileClose(srcfp);
         cupsFileClose(dstfp);
@@ -291,7 +280,7 @@ cupsAdminCreateWindowsPPD(
                 _cupsLangString(language,
                                 _("Bad option + choice on line %d.")),
                 linenum);
-        _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, line, 0);
+        _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, line, 0);
 
         cupsFileClose(srcfp);
         cupsFileClose(dstfp);
@@ -319,7 +308,7 @@ cupsAdminCreateWindowsPPD(
        }
       }
 
-      snprintf(ptr + 1, sizeof(line) - (ptr - line + 1),
+      snprintf(ptr + 1, sizeof(line) - (size_t)(ptr - line + 1),
                "%%cupsJobTicket: %s=%s\n\"\n*End", option, choice);
 
       cupsFilePrintf(dstfp, "*%% Changed for CUPS Windows Driver...\n%s\n",
@@ -334,7 +323,7 @@ cupsAdminCreateWindowsPPD(
 
   if (linenum == 0)
   {
-    _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, _("Empty PPD file."), 1);
+    _cupsSetError(IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, _("Empty PPD file."), 1);
 
     cupsFileClose(dstfp);
     unlink(buffer);
@@ -424,7 +413,7 @@ cupsAdminExportSamba(
 
   if (!dest || !ppd || !samba_server || !samba_user || !samba_password)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     return (0);
   }
 
@@ -434,7 +423,7 @@ cupsAdminExportSamba(
 
   if ((fp = cupsTempFile2(authfile, sizeof(authfile))) == NULL)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
     return (0);
   }
 
@@ -487,7 +476,7 @@ cupsAdminExportSamba(
                               _("Unable to copy Windows 2000 printer "
                                 "driver files (%d).")), status);
 
-      _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
 
       if (logfile)
        _cupsLangPuts(logfile, message);
@@ -522,7 +511,7 @@ cupsAdminExportSamba(
                                 _("Unable to copy CUPS printer driver "
                                   "files (%d).")), status);
 
-       _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
 
        if (logfile)
          _cupsLangPuts(logfile, message);
@@ -565,7 +554,7 @@ cupsAdminExportSamba(
                               _("Unable to install Windows 2000 printer "
                                 "driver files (%d).")), status);
 
-      _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
 
       if (logfile)
        _cupsLangPuts(logfile, message);
@@ -610,7 +599,7 @@ cupsAdminExportSamba(
                               _("Unable to copy Windows 9x printer "
                                 "driver files (%d).")), status);
 
-      _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
 
       if (logfile)
        _cupsLangPuts(logfile, message);
@@ -639,7 +628,7 @@ cupsAdminExportSamba(
                               _("Unable to install Windows 9x printer "
                                 "driver files (%d).")), status);
 
-      _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
 
       if (logfile)
        _cupsLangPuts(logfile, message);
@@ -691,7 +680,7 @@ cupsAdminExportSamba(
                               _("Unable to copy 64-bit Windows printer "
                                 "driver files (%d).")), status);
 
-      _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
 
       if (logfile)
        _cupsLangPuts(logfile, message);
@@ -726,7 +715,7 @@ cupsAdminExportSamba(
                                 _("Unable to copy 64-bit CUPS printer driver "
                                   "files (%d).")), status);
 
-       _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
 
        if (logfile)
          _cupsLangPuts(logfile, message);
@@ -769,7 +758,7 @@ cupsAdminExportSamba(
                               _("Unable to install Windows 2000 printer "
                                 "driver files (%d).")), status);
 
-      _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
 
       if (logfile)
        _cupsLangPuts(logfile, message);
@@ -794,13 +783,13 @@ cupsAdminExportSamba(
                                "are installed.")),
               sizeof(message));
 
-    _cupsSetError(IPP_NOT_FOUND, message, 0);
+    _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, message, 0);
     _cupsLangPuts(logfile, message);
   }
 
   if (have_drivers == 0)
   {
-    _cupsSetError(IPP_NOT_FOUND, message, 0);
+    _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, message, 0);
 
     unlink(authfile);
 
@@ -821,7 +810,7 @@ cupsAdminExportSamba(
                             _("Unable to set Windows printer driver (%d).")),
                             status);
 
-    _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
 
     if (logfile)
       _cupsLangPuts(logfile, message);
@@ -882,9 +871,9 @@ cupsAdminGetServerSettings(
       */
 
       if (strcmp(cg->http->hostname, cg->server) ||
-          cg->ipp_port != _httpAddrPort(cg->http->hostaddr) ||
+          cg->ipp_port != httpAddrPort(cg->http->hostaddr) ||
          (cg->http->encryption != cg->encryption &&
-          cg->http->encryption == HTTP_ENCRYPT_NEVER))
+          cg->http->encryption == HTTP_ENCRYPTION_NEVER))
       {
        /*
        * Need to close the current connection because something has changed...
@@ -901,13 +890,13 @@ cupsAdminGetServerSettings(
 
     if (!cg->http)
     {
-      if ((cg->http = _httpCreate(cupsServer(), ippPort(), NULL,
-                                  cupsEncryption(), AF_UNSPEC)) == NULL)
+      if ((cg->http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC,
+                                   cupsEncryption(), 1, 0, NULL)) == NULL)
       {
        if (errno)
-         _cupsSetError(IPP_SERVICE_UNAVAILABLE, NULL, 0);
+         _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, NULL, 0);
        else
-         _cupsSetError(IPP_SERVICE_UNAVAILABLE,
+         _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE,
                        _("Unable to connect to host."), 1);
 
        if (num_settings)
@@ -925,7 +914,7 @@ cupsAdminGetServerSettings(
 
   if (!http || !num_settings || !settings)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
 
     if (num_settings)
       *num_settings = 0;
@@ -944,7 +933,7 @@ cupsAdminGetServerSettings(
   */
 
   if ((status = get_cupsd_conf(http, cg, cg->cupsd_update, cupsdconf,
-                               sizeof(cupsdconf), &remote)) == HTTP_OK)
+                               sizeof(cupsdconf), &remote)) == HTTP_STATUS_OK)
   {
     if ((cupsd = cupsFileOpen(cupsdconf, "r")) == NULL)
     {
@@ -954,7 +943,7 @@ cupsAdminGetServerSettings(
       snprintf(message, sizeof(message),
                _cupsLangString(cupsLangDefault(), _("Open of %s failed: %s")),
                cupsdconf, strerror(errno));
-      _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
     }
   }
   else
@@ -1136,7 +1125,7 @@ cupsAdminGetServerSettings(
                                           cg->cupsd_num_settings,
                                           &(cg->cupsd_settings));
   }
-  else if (status != HTTP_NOT_MODIFIED)
+  else if (status != HTTP_STATUS_NOT_MODIFIED)
     invalidate_cupsd_cache(cg);
 
  /*
@@ -1186,6 +1175,7 @@ cupsAdminSetServerSettings(
                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 */
@@ -1199,6 +1189,7 @@ cupsAdminSetServerSettings(
                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 */
@@ -1220,7 +1211,7 @@ cupsAdminSetServerSettings(
 
   if (!http || !num_settings || !settings)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
 
     return (0);
   }
@@ -1230,11 +1221,11 @@ cupsAdminSetServerSettings(
   */
 
   if (get_cupsd_conf(http, cg, 0, cupsdconf, sizeof(cupsdconf),
-                     &remote) == HTTP_OK)
+                     &remote) == HTTP_STATUS_OK)
   {
     if ((cupsd = cupsFileOpen(cupsdconf, "r")) == NULL)
     {
-      _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
       return (0);
     }
   }
@@ -1398,7 +1389,7 @@ cupsAdminSetServerSettings(
     if (remote)
       unlink(cupsdconf);
 
-    _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
     return (0);
   }
 
@@ -1412,12 +1403,14 @@ cupsAdminSetServerSettings(
   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;
@@ -1561,8 +1554,10 @@ cupsAdminSetServerSettings(
       indent += 2;
       if (!strcmp(value, "/admin"))
        in_admin_location = 1;
-      if (!strcmp(value, "/admin/conf"))
+      else if (!strcmp(value, "/admin/conf"))
        in_conf_location = 1;
+      else if (!strcmp(value, "/admin/log"))
+       in_log_location = 1;
       else if (!strcmp(value, "/"))
        in_root_location = 1;
 
@@ -1604,6 +1599,23 @@ cupsAdminSetServerSettings(
          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))
       {
@@ -1630,6 +1642,7 @@ cupsAdminSetServerSettings(
 
       in_admin_location = 0;
       in_conf_location  = 0;
+      in_log_location   = 0;
       in_root_location  = 0;
 
       cupsFilePuts(temp, "</Location>\n");
@@ -1878,6 +1891,25 @@ cupsAdminSetServerSettings(
     cupsFilePuts(temp, "</Location>\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, "<Location /admin/log>\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, "</Location>\n");
+  }
+
   if (!wrote_policy && user_cancel_any >= 0)
   {
     cupsFilePuts(temp, "<Policy default>\n"
@@ -1954,7 +1986,7 @@ cupsAdminSetServerSettings(
 
   status = cupsPutFile(http, "/admin/conf/cupsd.conf", tempfile);
 
-  if (status == HTTP_CREATED)
+  if (status == HTTP_STATUS_CREATED)
   {
    /*
     * Updated OK, add the basic settings...
@@ -2024,7 +2056,7 @@ cupsAdminSetServerSettings(
 
   unlink(tempfile);
 
-  return (status == HTTP_CREATED);
+  return (status == HTTP_STATUS_CREATED);
 }
 
 
@@ -2120,7 +2152,7 @@ get_cupsd_conf(
     _cups_globals_t *cg,               /* I - Global data */
     time_t          last_update,       /* I - Last update time for file */
     char            *name,             /* I - Filename buffer */
-    int             namesize,          /* I - Size of filename buffer */
+    size_t          namesize,          /* I - Size of filename buffer */
     int             *remote)           /* O - Remote file? */
 {
   int          fd;                     /* Temporary file descriptor */
@@ -2158,16 +2190,16 @@ get_cupsd_conf(
       snprintf(message, sizeof(message),
                _cupsLangString(cupsLangDefault(), _("stat of %s failed: %s")),
                name, strerror(errno));
-      _cupsSetError(IPP_INTERNAL_ERROR, message, 0);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
 
       *name = '\0';
 
-      return (HTTP_SERVER_ERROR);
+      return (HTTP_STATUS_SERVER_ERROR);
     }
     else if (last_update && info.st_mtime <= last_update)
-      status = HTTP_NOT_MODIFIED;
+      status = HTTP_STATUS_NOT_MODIFIED;
     else
-      status = HTTP_OK;
+      status = HTTP_STATUS_OK;
   }
   else
 #endif /* !WIN32 */
@@ -2176,15 +2208,15 @@ get_cupsd_conf(
     * Read cupsd.conf via a HTTP GET request...
     */
 
-    if ((fd = cupsTempFd(name, namesize)) < 0)
+    if ((fd = cupsTempFd(name, (int)namesize)) < 0)
     {
       *name = '\0';
 
-      _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
 
       invalidate_cupsd_cache(cg);
 
-      return (HTTP_SERVER_ERROR);
+      return (HTTP_STATUS_SERVER_ERROR);
     }
 
     *remote = 1;
@@ -2199,7 +2231,7 @@ get_cupsd_conf(
 
     close(fd);
 
-    if (status != HTTP_OK)
+    if (status != HTTP_STATUS_OK)
     {
       unlink(name);
       *name = '\0';
@@ -2337,5 +2369,5 @@ write_option(cups_file_t     *dstfp,      /* I - PPD file */
 
 
 /*
- * End of "$Id: adminutil.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: adminutil.c 12945 2015-10-26 19:46:02Z msweet $".
  */
index d00452e..f03d2fa 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: adminutil.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: adminutil.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Administration utility API definitions for CUPS.
  *
@@ -77,5 +77,5 @@ extern int    cupsAdminSetServerSettings(http_t *http,
 #endif /* !_CUPS_ADMINUTIL_H_ */
 
 /*
- * End of "$Id: adminutil.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: adminutil.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index 5b7ee18..3031452 100644 (file)
@@ -3,7 +3,7 @@
 
   Filter and backend programming header for CUPS.
 
-  Copyright 2008-2011 by Apple Inc.
+  Copyright 2008-2014 by Apple Inc.
 
   These coded instructions, statements, and computer programs are the
   property of Apple Inc. and are protected by Federal copyright
index 3f912ba..7c33179 100644 (file)
@@ -3,7 +3,7 @@
 
   Filter and backend programming introduction for CUPS.
 
-  Copyright 2007-2013 by Apple Inc.
+  Copyright 2007-2014 by Apple Inc.
   Copyright 1997-2006 by Easy Software Products, all rights reserved.
 
   These coded instructions, statements, and computer programs are the
@@ -81,7 +81,7 @@ directory to write to.</p>
 
 <p>In addition, some operating systems provide additional security mechanisms
 that further limit file system access, even for backends running as root. On
-OS X, for example, no backend may write to a user's home directory.</p>
+OS X, for example, no backend may write to a user's home directory. See the <a href="#SANDBOXING">Sandboxing on OS X</a> section for more information.</p>
 </blockquote>
 
 <h3><a name="SIGNALS">Canceled Jobs and Signal Handling</a></h3>
@@ -237,7 +237,7 @@ prefix strings:</p>
        <code>marker-types</code>, <code>printer-alert</code>, and
        <code>printer-alert-description</code> printer attributes. Standard
        <code>marker-types</code> values are listed in <a href='#TABLE1'>Table
-       1</a>.</dd>
+       1</a>. String values need special handling - see <a href="#ATTR_STRINGS">Reporting Attribute String Values</a> below.</dd>
 
        <dt>CRIT: message</dt>
        <dd>Sets the printer-state-message attribute and adds the specified
@@ -320,11 +320,11 @@ the "DEBUG:" prefix string.</p>
        <td>Fuser unit</td>
 </tr>
 <tr>
-       <td>fuserCleaningPad</td>
+       <td>fuser-cleaning-pad</td>
        <td>Fuser cleaning pad</td>
 </tr>
 <tr>
-       <td>fuserOil</td>
+       <td>fuser-oil</td>
        <td>Fuser oil</td>
 </tr>
 <tr>
@@ -336,7 +336,7 @@ the "DEBUG:" prefix string.</p>
        <td>Photo conductor</td>
 </tr>
 <tr>
-       <td>solidWax</td>
+       <td>solid-wax</td>
        <td>Wax supply</td>
 </tr>
 <tr>
@@ -348,19 +348,19 @@ the "DEBUG:" prefix string.</p>
        <td>Toner supply</td>
 </tr>
 <tr>
-       <td>transferUnit</td>
+       <td>transfer-unit</td>
        <td>Transfer unit</td>
 </tr>
 <tr>
-       <td>wasteInk</td>
+       <td>waste-ink</td>
        <td>Waste ink tank</td>
 </tr>
 <tr>
-       <td>wasteToner</td>
+       <td>waste-toner</td>
        <td>Waste toner tank</td>
 </tr>
 <tr>
-       <td>wasteWax</td>
+       <td>waste-wax</td>
        <td>Waste wax tank</td>
 </tr>
 </tbody>
@@ -440,6 +440,95 @@ the "DEBUG:" prefix string.</p>
 </tbody>
 </table></div>
 
+
+<h4><a name="ATTR_STRINGS">Reporting Attribute String Values</a></h4>
+
+<p>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:</p>
+
+<pre class="example">
+name=simple
+name=simple,simple,...
+name='complex value'
+name="complex value"
+name='"complex value"','"complex value"',...
+</pre>
+
+<p>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:</p>
+
+<pre class="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);
+</pre>
+
+<p>Complex values that contains spaces, quotes, backslashes, or the comma must be quoted. For a single value a single set of quotes is sufficient:</p>
+
+<pre class="example">
+fputs("ATTR: marker-message='Levels shown are approximate.'\n", stderr);
+</pre>
+
+<p>When multiple values are reported, each value must be enclosed by a set of single and double quotes:</p>
+
+<pre class="example">
+fputs("ATTR: marker-names='\"Cyan Toner\"','\"Magenta Toner\"',"
+      "'\"Yellow Toner\"','\"Black Toner\"'\n", stderr);
+</pre>
+
+<p>The IPP backend includes a <var>quote_string</var> function that may be used to properly quote a complex value in an "ATTR:" message:</p>
+
+<pre class="example">
+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 &lt; q)
+  {
+    *q = '\0';
+    return (q);
+  }
+
+  *qptr++ = '\'';
+  *qptr++ = '\"';
+
+  while (*s && qptr &lt; qend)
+  {
+    if (*s == '\\' || *s == '\"' || *s == '\'')
+    {
+      if (qptr &lt; (qend - 4))
+      {
+        *qptr++ = '\\';
+        *qptr++ = '\\';
+        *qptr++ = '\\';
+      }
+      else
+        break;
+    }
+
+    *qptr++ = *s++;
+  }
+
+  *qptr++ = '\"';
+  *qptr++ = '\'';
+  *qptr   = '\0';
+
+  return (q);
+}
+</pre>
+
+
 <h4><a name="MANAGING_STATE">Managing Printer State in a Filter</a></h4>
 
 <p>Filters are responsible for managing the state keywords they set using
@@ -763,3 +852,25 @@ void *my_data;
 
 <a href="#cupsSideChannelSNMPWalk">cupsSNMPSideChannelWalk</a>(".1.3.6.1.2.1.43", 5.0, my_callback, my_data);
 </pre>
+
+<h2><a name="SANDBOXING">Sandboxing on OS X</a></h2>
+
+<p>Starting with OS X 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:</p>
+
+<ol>
+
+       <li>Reading of files: pursuant to normal UNIX file permissions, filters and backends can read files for the current job from the <var>/private/var/spool/cups</var> directory and other files on mounted filesystems <em>except</em> for user home directories under <var>/Users</var>.</li>
+
+       <li>Writing of files: pursuant to normal UNIX file permissions, filters and backends can read/write files to the cache directory specified by the <code>CUPS_CACHEDIR</code> environment variable, to the state directory specified by the <code>CUPS_STATEDIR</code> environment variable, to the temporary directory specified by the <code>TMPDIR</code> environment variable, and under the <var>/private/var/db</var>, <var>/private/var/folders</var>, <var>/private/var/lib</var>, <var>/private/var/mysql</var>, <var>/private/var/run</var>, <var>/private/var/spool</var> (except <var>/private/var/spool/cups</var>), <var>/Library/Application&nbsp;Support</var>, <var>/Library/Caches</var>, <var>/Library/Logs</var>, <var>/Library/Preferences</var>, <var>/Library/WebServer</var>, and <var>/Users/Shared</var> directories.</li>
+
+       <li>Execution of programs: pursuant to normal UNIX file permissions, filters and backends can execute any program not located under the <var>/Users</var> directory. Child processes inherit the sandbox and are subject to the same restrictions as the parent.</li>
+
+       <li>Bluetooth and USB: backends can access Bluetooth and USB printers through IOKit. <em>Filters cannot access Bluetooth and USB printers directly.</em></li>
+
+       <li>Network: filters and backends can access UNIX domain sockets under the <var>/private/tmp</var>, <var>/private/var/run</var>, and <var>/private/var/tmp</var> directories. Backends can also create IPv4 and IPv6 TCP (outgoing) and UDP (incoming and outgoing) socket, and bind to local source ports. <em>Filters cannot directly create IPv4 and IPv6 TCP or UDP sockets.</em></li>
+
+       <li>Notifications: filters and backends can send notifications via the Darwin <code>notify_post()</code> API.</li>
+
+</ol>
+
+<blockquote><b>Note:</b> The sandbox profile used in CUPS 2.0 still allows some actions that are not listed above - these privileges will be removed over time until the profile matches the list above.</blockquote>
index b9d0b7f..74b0c9b 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: array-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: array-private.h 3933 2012-10-01 03:01:10Z msweet $"
  *
  *   Private array definitions for CUPS.
  *
- *   Copyright 2011 by Apple Inc.
+ *   Copyright 2011-2012 by Apple Inc.
  *
  *   These coded instructions, statements, and computer programs are the
  *   property of Apple Inc. and are protected by Federal copyright
@@ -37,9 +37,10 @@ extern "C" {
  * Functions...
  */
 
-extern int             _cupsArrayAddStrings(cups_array_t *a, const char *s)
-                                            _CUPS_API_1_5;
-extern cups_array_t    *_cupsArrayNewStrings(const char *s) _CUPS_API_1_5;
+extern int             _cupsArrayAddStrings(cups_array_t *a, const char *s,
+                                            char delim) _CUPS_API_1_5;
+extern cups_array_t    *_cupsArrayNewStrings(const char *s, char delim)
+                                             _CUPS_API_1_5;
 
 #  ifdef __cplusplus
 }
@@ -47,5 +48,5 @@ extern cups_array_t   *_cupsArrayNewStrings(const char *s) _CUPS_API_1_5;
 #endif /* !_CUPS_ARRAY_PRIVATE_H_ */
 
 /*
- * End of "$Id: array-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: array-private.h 3933 2012-10-01 03:01:10Z msweet $".
  */
index cd8f64d..b93ca18 100644 (file)
@@ -1,56 +1,25 @@
 /*
- * "$Id: array.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: array.c 12031 2014-07-15 19:57:59Z msweet $"
  *
- *   Sorted array routines for CUPS.
+ * Sorted array routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsArrayAdd()         - Add an element to the array.
- *   _cupsArrayAddStrings() - Add zero or more comma-delimited strings to an
- *                            array.
- *   cupsArrayClear()       - Clear the array.
- *   cupsArrayCount()       - Get the number of elements in the array.
- *   cupsArrayCurrent()     - Return the current element in the array.
- *   cupsArrayDelete()      - Free all memory used by the array.
- *   cupsArrayDup()         - Duplicate the array.
- *   cupsArrayFind()        - Find an element in the array.
- *   cupsArrayFirst()       - Get the first element in the array.
- *   cupsArrayGetIndex()    - Get the index of the current element.
- *   cupsArrayGetInsert()   - Get the index of the last inserted element.
- *   cupsArrayIndex()       - Get the N-th element in the array.
- *   cupsArrayInsert()      - Insert an element in the array.
- *   cupsArrayLast()        - Get the last element in the array.
- *   cupsArrayNew()         - Create a new array.
- *   cupsArrayNew2()        - Create a new array with hash.
- *   cupsArrayNew3()        - Create a new array with hash and/or free function.
- *   _cupsArrayNewStrings() - Create a new array of comma-delimited strings.
- *   cupsArrayNext()        - Get the next element in the array.
- *   cupsArrayPrev()        - Get the previous element in the array.
- *   cupsArrayRemove()      - Remove an element from the array.
- *   cupsArrayRestore()     - Reset the current element to the last @link
- *                            cupsArraySave@.
- *   cupsArraySave()        - Mark the current element for a later @link
- *                            cupsArrayRestore@.
- *   cupsArrayUserData()    - Return the user data for an array.
- *   cups_array_add()       - Insert or append an element to the array.
- *   cups_array_find()      - Find an element in the array.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
  * Include necessary headers...
  */
 
+#include <cups/cups.h>
 #include "string-private.h"
 #include "debug-private.h"
 #include "array-private.h"
@@ -138,8 +107,7 @@ cupsArrayAdd(cups_array_t *a,               /* I - Array */
 
 
 /*
- * '_cupsArrayAddStrings()' - Add zero or more comma-delimited strings to an
- *                            array.
+ * '_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
@@ -148,7 +116,8 @@ cupsArrayAdd(cups_array_t *a,               /* I - Array */
 
 int                                    /* O - 1 on success, 0 on failure */
 _cupsArrayAddStrings(cups_array_t *a,  /* I - Array */
-                     const char   *s)  /* I - Comma-delimited strings or NULL */
+                     const char   *s,  /* I - Delimited strings or NULL */
+                     char         delim)/* I - Delimiter character */
 {
   char         *buffer,                /* Copy of string */
                *start,                 /* Start of string */
@@ -156,20 +125,47 @@ _cupsArrayAddStrings(cups_array_t *a,     /* I - Array */
   int          status = 1;             /* Status of add */
 
 
+  DEBUG_printf(("_cupsArrayAddStrings(a=%p, s=\"%s\", delim='%c')", a, s,
+                delim));
+
   if (!a || !s || !*s)
+  {
+    DEBUG_puts("1_cupsArrayAddStrings: Returning 0");
     return (0);
+  }
 
-  if (!strchr(s, ','))
+  if (delim == ' ')
   {
    /*
-    * String doesn't contain a comma, so add it as a single value...
+    * 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)
@@ -179,11 +175,21 @@ _cupsArrayAddStrings(cups_array_t *a,     /* I - Array */
       * it...
       */
 
-      if ((end = strchr(start, ',')) != NULL)
+      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);
     }
@@ -191,6 +197,8 @@ _cupsArrayAddStrings(cups_array_t *a,       /* I - Array */
     free(buffer);
   }
 
+  DEBUG_printf(("1_cupsArrayAddStrings: Returning %d.", status));
+
   return (status);
 }
 
@@ -384,7 +392,7 @@ cupsArrayDup(cups_array_t *a)               /* I - Array */
     * Allocate memory for the elements...
     */
 
-    da->elements = malloc(a->num_elements * sizeof(void *));
+    da->elements = malloc((size_t)a->num_elements * sizeof(void *));
     if (!da->elements)
     {
       free(da);
@@ -412,7 +420,7 @@ cupsArrayDup(cups_array_t *a)               /* I - Array */
       * Just copy raw pointers...
       */
 
-      memcpy(da->elements, a->elements, a->num_elements * sizeof(void *));
+      memcpy(da->elements, a->elements, (size_t)a->num_elements * sizeof(void *));
     }
 
     da->num_elements   = a->num_elements;
@@ -755,7 +763,7 @@ cupsArrayNew3(cups_array_func_t  f, /* I - Comparison function or @code NULL@ fo
   {
     a->hashfunc  = h;
     a->hashsize  = hsize;
-    a->hash      = malloc(hsize * sizeof(int));
+    a->hash      = malloc((size_t)hsize * sizeof(int));
 
     if (!a->hash)
     {
@@ -763,7 +771,7 @@ cupsArrayNew3(cups_array_func_t  f, /* I - Comparison function or @code NULL@ fo
       return (NULL);
     }
 
-    memset(a->hash, -1, hsize * sizeof(int));
+    memset(a->hash, -1, (size_t)hsize * sizeof(int));
   }
 
   a->copyfunc = cf;
@@ -782,7 +790,8 @@ cupsArrayNew3(cups_array_func_t  f, /* I - Comparison function or @code NULL@ fo
  */
 
 cups_array_t *                         /* O - Array */
-_cupsArrayNewStrings(const char *s)    /* I - Comma-delimited strings or NULL */
+_cupsArrayNewStrings(const char *s,    /* I - Delimited strings or NULL */
+                     char       delim) /* I - Delimiter character */
 {
   cups_array_t *a;                     /* Array */
 
@@ -790,7 +799,7 @@ _cupsArrayNewStrings(const char *s) /* I - Comma-delimited strings or NULL */
   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);
+    _cupsArrayAddStrings(a, s, delim);
 
   return (a);
 }
@@ -878,9 +887,9 @@ int                                 /* O - 1 on success, 0 on failure */
 cupsArrayRemove(cups_array_t *a,       /* I - Array */
                 void         *e)       /* I - Element */
 {
-  int  i,                              /* Looping var */
-       current,                        /* Current element */
-       diff;                           /* Difference */
+  ssize_t      i,                      /* Looping var */
+               current;                /* Current element */
+  int          diff;                   /* Difference */
 
 
  /*
@@ -912,7 +921,7 @@ cupsArrayRemove(cups_array_t *a,    /* I - Array */
 
   if (current < a->num_elements)
     memmove(a->elements + current, a->elements + current + 1,
-            (a->num_elements - current) * sizeof(void *));
+            (size_t)(a->num_elements - current) * sizeof(void *));
 
   if (current <= a->current)
     a->current --;
@@ -1013,9 +1022,9 @@ 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 */
-       diff;                           /* Comparison with current element */
+  int          i,                      /* Looping var */
+               current;                /* Current element */
+  int          diff;                   /* Comparison with current element */
 
 
   DEBUG_printf(("7cups_array_add(a=%p, e=%p, insert=%d)", a, e, insert));
@@ -1039,7 +1048,7 @@ cups_array_add(cups_array_t *a,           /* I - Array */
     if (a->alloc_elements == 0)
     {
       count = 16;
-      temp  = malloc(count * sizeof(void *));
+      temp  = malloc((size_t)count * sizeof(void *));
     }
     else
     {
@@ -1048,10 +1057,10 @@ cups_array_add(cups_array_t *a,         /* I - Array */
       else
         count = a->alloc_elements + 1024;
 
-      temp = realloc(a->elements, count * sizeof(void *));
+      temp = realloc(a->elements, (size_t)count * sizeof(void *));
     }
 
-    DEBUG_printf(("9cups_array_add: count=%d", count));
+    DEBUG_printf(("9cups_array_add: count=" CUPS_LLFMT, CUPS_LLCAST count));
 
     if (!temp)
     {
@@ -1141,7 +1150,7 @@ cups_array_add(cups_array_t *a,           /* I - Array */
     */
 
     memmove(a->elements + current + 1, a->elements + current,
-            (a->num_elements - current) * sizeof(void *));
+            (size_t)(a->num_elements - current) * sizeof(void *));
 
     if (a->current >= current)
       a->current ++;
@@ -1150,11 +1159,11 @@ cups_array_add(cups_array_t *a,         /* I - Array */
       if (a->saved[i] >= current)
        a->saved[i] ++;
 
-    DEBUG_printf(("9cups_array_add: insert element at index %d...", current));
+    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 %d...", current));
+    DEBUG_printf(("9cups_array_add: append element at " CUPS_LLFMT, CUPS_LLCAST current));
 #endif /* DEBUG */
 
   if (a->copyfunc)
@@ -1173,8 +1182,7 @@ cups_array_add(cups_array_t *a,           /* I - Array */
 
 #ifdef DEBUG
   for (current = 0; current < a->num_elements; current ++)
-    DEBUG_printf(("9cups_array_add: a->elements[%d]=%p", current,
-                  a->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");
@@ -1322,5 +1330,5 @@ cups_array_find(cups_array_t *a,  /* I - Array */
 
 
 /*
- * End of "$Id: array.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: array.c 12031 2014-07-15 19:57:59Z msweet $".
  */
index 235fcc9..7a5fc58 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: array.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: array.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Sorted array definitions for CUPS.
  *
@@ -88,5 +88,5 @@ extern void           *cupsArrayUserData(cups_array_t *a) _CUPS_API_1_2;
 #endif /* !_CUPS_ARRAY_H_ */
 
 /*
- * End of "$Id: array.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: array.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index 10d88dd..1f3d2e5 100644 (file)
@@ -1,22 +1,16 @@
 /*
- * "$Id: attr.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: attr.c 12867 2015-09-13 23:49:19Z msweet $"
  *
- *   PPD model-specific attribute routines for CUPS.
+ * PPD model-specific attribute routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   ppdFindAttr()               - Find the first matching attribute.
- *   ppdFindNextAttr()           - Find the next matching attribute.
- *   _ppdNormalizeMakeAndModel() - Normalize a product/make-and-model string.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -229,14 +223,6 @@ _ppdNormalizeMakeAndModel(
 
     snprintf(buffer, bufsize, "Canon %s", make_and_model);
   }
-  else if (!_cups_strncasecmp(make_and_model, "primera", 7))
-  {
-   /*
-    * Fargo...
-    */
-
-    snprintf(buffer, bufsize, "Fargo %s", make_and_model);
-  }
   else if (!_cups_strncasecmp(make_and_model, "designjet", 9) ||
            !_cups_strncasecmp(make_and_model, "deskjet", 7))
   {
@@ -331,5 +317,5 @@ _ppdNormalizeMakeAndModel(
 
 
 /*
- * End of "$Id: attr.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: attr.c 12867 2015-09-13 23:49:19Z msweet $".
  */
index e1fc2c9..52a9db3 100644 (file)
@@ -1,32 +1,21 @@
 /*
- * "$Id: auth.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: auth.c 12619 2015-05-06 21:00:19Z msweet $"
  *
- *   Authentication functions for CUPS.
+ * Authentication functions for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   This file contains Kerberos support code, copyright 2006 by
- *   Jelmer Vernooij.
+ * This file contains Kerberos support code, copyright 2006 by
+ * Jelmer Vernooij.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsDoAuthentication()        - Authenticate a request.
- *   _cupsSetNegotiateAuthString() - Set the Kerberos authentication string.
- *   cups_gss_acquire()            - Kerberos credentials callback.
- *   cups_gss_getname()            - Get CUPS service credentials for
- *                                   authentication.
- *   cups_gss_printf()             - Show debug error messages from GSSAPI.
- *   cups_local_auth()             - Get the local authorization certificate if
- *                                   available/applicable.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -112,7 +101,7 @@ static int  cups_local_auth(http_t *http);
 /*
  * 'cupsDoAuthentication()' - Authenticate a request.
  *
- * This function should be called in response to a @code HTTP_UNAUTHORIZED@
+ * This function should be called in response to a @code HTTP_STATUS_UNAUTHORIZED@
  * status, prior to resubmitting your request.
  *
  * @since CUPS 1.1.20/OS X 10.4@
@@ -164,14 +153,14 @@ cupsDoAuthentication(
       DEBUG_printf(("2cupsDoAuthentication: authstring=\"%s\"",
                     http->authstring));
 
-      if (http->status == HTTP_UNAUTHORIZED)
+      if (http->status == HTTP_STATUS_UNAUTHORIZED)
        http->digest_tries ++;
 
       return (0);
     }
     else if (localauth == -1)
     {
-      http->status = HTTP_AUTHORIZATION_CANCELED;
+      http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
       return (-1);                     /* Error or canceled */
     }
   }
@@ -190,11 +179,18 @@ cupsDoAuthentication(
     * 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 (httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "username",
+                        default_username))
+      cupsSetUser(default_username);
+
     snprintf(prompt, sizeof(prompt),
              _cupsLangString(cg->lang_default, _("Password for %s on %s? ")),
             cupsUser(),
@@ -205,22 +201,22 @@ cupsDoAuthentication(
 
     if ((password = cupsGetPassword2(prompt, http, method, resource)) == NULL)
     {
-      http->status = HTTP_AUTHORIZATION_CANCELED;
+      http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
       return (-1);
     }
 
     snprintf(http->userpass, sizeof(http->userpass), "%s:%s", cupsUser(),
              password);
   }
-  else if (http->status == HTTP_UNAUTHORIZED)
+  else if (http->status == HTTP_STATUS_UNAUTHORIZED)
     http->digest_tries ++;
 
-  if (http->status == HTTP_UNAUTHORIZED && http->digest_tries >= 3)
+  if (http->status == HTTP_STATUS_UNAUTHORIZED && http->digest_tries >= 3)
   {
     DEBUG_printf(("1cupsDoAuthentication: Too many authentication tries (%d)",
                  http->digest_tries));
 
-    http->status = HTTP_AUTHORIZATION_CANCELED;
+    http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
     return (-1);
   }
 
@@ -237,7 +233,7 @@ cupsDoAuthentication(
 
     if (_cupsSetNegotiateAuthString(http, method, resource))
     {
-      http->status = HTTP_AUTHORIZATION_CANCELED;
+      http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
       return (-1);
     }
   }
@@ -265,7 +261,6 @@ cupsDoAuthentication(
     char       encode[33],             /* MD5 buffer */
                digest[1024];           /* Digest auth data */
 
-
     httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "realm", realm);
     httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "nonce", nonce);
 
@@ -280,7 +275,7 @@ cupsDoAuthentication(
   {
     DEBUG_printf(("1cupsDoAuthentication: Unknown auth type: \"%s\"",
                   www_auth));
-    http->status = HTTP_AUTHORIZATION_CANCELED;
+    http->status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
     return (-1);
   }
 
@@ -316,7 +311,7 @@ _cupsSetNegotiateAuthString(
   * to use it...
   */
 
-  if (gss_init_sec_context == NULL)
+  if (&gss_init_sec_context == NULL)
   {
     DEBUG_puts("1_cupsSetNegotiateAuthString: Weak-linked GSSAPI/Kerberos "
                "framework is not present");
@@ -446,21 +441,21 @@ _cupsSetNegotiateAuthString(
     * arbitrarily large credentials...
     */
 
-    int authsize = 10 +                                /* "Negotiate " */
-                  output_token.length * 4 / 3 + 1 +    /* Base64 */
-                  1;                                   /* nul */
+    int authsize = 10 +                        /* "Negotiate " */
+                  (int)output_token.length * 4 / 3 + 1 + 1;
+                                       /* Base64 + nul */
 
     httpSetAuthString(http, NULL, NULL);
 
-    if ((http->authstring = malloc(authsize)) == NULL)
+    if ((http->authstring = malloc((size_t)authsize)) == NULL)
     {
       http->authstring = http->_authstring;
       authsize         = sizeof(http->_authstring);
     }
 
-    strcpy(http->authstring, "Negotiate ");
+    strlcpy(http->authstring, "Negotiate ", (size_t)authsize);
     httpEncode64_2(http->authstring + 10, authsize - 10, output_token.value,
-                  output_token.length);
+                  (int)output_token.length);
 
     gss_release_buffer(&minor_status, &output_token);
   }
@@ -766,7 +761,7 @@ cups_local_auth(http_t *http)               /* I - HTTP connection to server */
 
   if (
 #    ifdef HAVE_GSSAPI
-      strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9) &&
+      _cups_strncasecmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9) &&
 #    endif /* HAVE_GSSAPI */
 #    ifdef HAVE_AUTHORIZATION_H
       !httpGetSubField2(http, HTTP_FIELD_WWW_AUTHENTICATE, "authkey",
@@ -813,7 +808,7 @@ cups_local_auth(http_t *http)               /* I - HTTP connection to server */
                   filename, strerror(errno)));
 
 #  ifdef HAVE_GSSAPI
-    if (!strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9))
+    if (!_cups_strncasecmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9))
     {
      /*
       * Kerberos required, don't try the root certificate...
@@ -881,5 +876,5 @@ cups_local_auth(http_t *http)               /* I - HTTP connection to server */
 
 
 /*
- * End of "$Id: auth.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: auth.c 12619 2015-05-06 21:00:19Z msweet $".
  */
index ffae80b..dca31d2 100644 (file)
@@ -1,24 +1,18 @@
 /*
- * "$Id: backchannel.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: backchannel.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Backchannel functions for CUPS.
+ * Backchannel functions for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsBackChannelRead()  - Read data from the backchannel.
- *   cupsBackChannelWrite() - Write data to the backchannel.
- *   cups_setup()           - Setup select()
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -169,7 +163,7 @@ cupsBackChannelWrite(
       */
 
       buffer += count;
-      total  += count;
+      total  += (size_t)count;
     }
   }
 
@@ -195,5 +189,5 @@ cups_setup(fd_set         *set,             /* I - Set for select() */
 
 
 /*
- * End of "$Id: backchannel.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: backchannel.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 22b379e..0789471 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: backend.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: backend.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Backend functions for CUPS.
  *
@@ -150,5 +150,5 @@ quote_string(const char *s)         /* I - String to write */
 
 
 /*
- * End of "$Id: backend.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: backend.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 565960d..127c027 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: backend.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: backend.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Backend definitions for CUPS.
  *
@@ -74,5 +74,5 @@ extern void           cupsBackendReport(const char *device_scheme,
 #endif /* !_CUPS_BACKEND_H_ */
 
 /*
- * End of "$Id: backend.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: backend.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index dcfd84d..23fecde 100644 (file)
@@ -1,34 +1,20 @@
 /*
- * "$Id: conflicts.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: conflicts.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Option marking routines for CUPS.
+ * Option marking routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   PostScript is a trademark of Adobe Systems, Inc.
+ * PostScript is a trademark of Adobe Systems, Inc.
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsGetConflicts()       - Get a list of conflicting options in a marked
- *                              PPD.
- *   cupsResolveConflicts()   - Resolve conflicts in a marked PPD.
- *   ppdConflicts()           - Check to see if there are any conflicts among
- *                              the marked option choices.
- *   ppdInstallableConflict() - Test whether an option choice conflicts with an
- *                              installable option.
- *   ppd_is_installable()     - Determine whether an option is in the
- *                              InstallableOptions group.
- *   ppd_load_constraints()   - Load constraints from a PPD file.
- *   ppd_test_constraints()   - See if any constraints are active.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -193,7 +179,7 @@ cupsResolveConflicts(
                        tries,          /* Number of tries */
                        num_newopts;    /* Number of new options */
   cups_option_t                *newopts;       /* New options */
-  cups_array_t         *active,        /* Active constraints */
+  cups_array_t         *active = NULL, /* Active constraints */
                        *pass,          /* Resolvers for this pass */
                        *resolvers,     /* Resolvers we have used */
                        *test;          /* Test array for conflicts */
@@ -886,7 +872,7 @@ ppd_load_constraints(ppd_file_t *ppd)       /* I - PPD file */
       return;
     }
 
-    if ((constptr = calloc(i, sizeof(_ppd_cups_uiconst_t))) == NULL)
+    if ((constptr = calloc((size_t)i, sizeof(_ppd_cups_uiconst_t))) == NULL)
     {
       free(consts);
       DEBUG_puts("8ppd_load_constraints: Unable to allocate memory for "
@@ -930,7 +916,7 @@ ppd_load_constraints(ppd_file_t *ppd)       /* I - PPD file */
       if (!_cups_strncasecmp(option, "Custom", 6) && !_cups_strcasecmp(choice, "True"))
       {
        _cups_strcpy(option, option + 6);
-       strcpy(choice, "Custom");
+       strlcpy(choice, "Custom", sizeof(choice));
       }
 
       constptr->option      = ppdFindOption(ppd, option);
@@ -1210,5 +1196,5 @@ ppd_test_constraints(
 
 
 /*
- * End of "$Id: conflicts.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: conflicts.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 6ef16b4..da8a396 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: cups-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cups-private.h 12441 2015-01-29 14:42:32Z msweet $"
  *
  *   Private definitions for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
+ *   Copyright 2007-2015 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -24,6 +24,7 @@
 
 #  include "string-private.h"
 #  include "debug-private.h"
+#  include "array-private.h"
 #  include "ipp-private.h"
 #  include "http-private.h"
 #  include "language-private.h"
@@ -86,6 +87,11 @@ typedef struct _cups_globals_s               /**** CUPS global state data ****/
   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 */
 
@@ -125,7 +131,7 @@ typedef struct _cups_globals_s              /**** CUPS global state data ****/
   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 */
+  pwg_media_t          pwg_media;      /* PWG media data for custom size */
   char                 pwg_name[65];   /* PWG media name for custom size */
 
   /* request.c */
@@ -145,6 +151,7 @@ typedef struct _cups_globals_s              /**** CUPS global state data ****/
   /* usersys.c */
   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 */
@@ -159,9 +166,9 @@ typedef struct _cups_globals_s              /**** CUPS global state data ****/
   void                 *server_cert_data;
                                        /* Server certificate user data */
   int                  server_version, /* Server IPP version */
-                       any_root,       /* Allow any root */
+                       any_root,       /* Allow any (e.g., self-signed) root */
                        expired_certs,  /* Allow expired certs */
-                       expired_root;   /* Allow expired root */
+                       validate_certs; /* Validate certificates */
 
   /* util.c */
   char                 def_printer[256];
@@ -200,6 +207,7 @@ typedef struct _cups_dconstres_s    /* Constraint/resolver */
 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 */
@@ -211,6 +219,11 @@ struct _cups_dinfo_s                       /* Destination capability and status
   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 */
 };
 
 
@@ -268,5 +281,5 @@ extern char         *_cupsUserDefault(char *name, size_t namesize);
 #endif /* !_CUPS_CUPS_PRIVATE_H_ */
 
 /*
- * End of "$Id: cups-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cups-private.h 12441 2015-01-29 14:42:32Z msweet $".
  */
index b6a2674..dc000ab 100644 (file)
@@ -1,18 +1,18 @@
 /*
- * "$Id: cups.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cups.h 12998 2015-12-02 15:09:04Z msweet $"
  *
- *   API definitions for CUPS.
+ * API definitions for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_CUPS_H_
 typedef off_t ssize_t;                 /* @private@ */
 #  endif /* WIN32 && !__CUPS_SSIZE_T_DEFINED */
 
-#  ifdef __BLOCKS__
-#    include <dispatch/dispatch.h>
-#  endif /* __BLOCKS__ */
-
 #  include "file.h"
 #  include "ipp.h"
 #  include "language.h"
+#  include "pwg.h"
+
+/*
+ * Define _PPD_DEPRECATED to silence the warnings about PPD functions being
+ * deprecated...
+ */
+
+#  ifndef _PPD_DEPRECATED
+#    define _PPD_DEPRECATED _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead.")
+#  endif /* !_PPD_DEPRECATED */
 
 
 /*
@@ -52,10 +58,10 @@ extern "C" {
  * Constants...
  */
 
-#  define CUPS_VERSION                 1.0604
-#  define CUPS_VERSION_MAJOR           1
-#  define CUPS_VERSION_MINOR           6
-#  define CUPS_VERSION_PATCH           4
+#  define CUPS_VERSION                 2.0102
+#  define CUPS_VERSION_MAJOR           2
+#  define CUPS_VERSION_MINOR           1
+#  define CUPS_VERSION_PATCH           2
 
 #  define CUPS_BC_FD                   3
                                        /* Back-channel file descriptor for
@@ -244,6 +250,7 @@ enum cups_ptype_e                   /* Printer type/capability bit
                                         * @since CUPS 1.4/OS X 10.6@ */
   CUPS_PRINTER_MFP = 0x4000000,                /* Printer with scanning capabilities
                                         * @since CUPS 1.4/OS X 10.6@ */
+  CUPS_PRINTER_3D = 0x8000000,         /* 3D Printing @since CUPS 2.1@ */
   CUPS_PRINTER_OPTIONS = 0x6fffc       /* ~(CLASS | REMOTE | IMPLICIT |
                                         * DEFAULT | FAX | REJECTING | DELETE |
                                         * NOT_SHARED | AUTHENTICATED |
@@ -353,12 +360,12 @@ extern ipp_t              *cupsDoRequest(http_t *http, ipp_t *request,
                                       const char *resource);
 extern http_encryption_t cupsEncryption(void);
 extern void            cupsFreeJobs(int num_jobs, cups_job_t *jobs);
-extern int             cupsGetClasses(char ***classes) _CUPS_DEPRECATED;
+extern int             cupsGetClasses(char ***classes) _CUPS_DEPRECATED_MSG("Use cupsGetDests instead.");
 extern const char      *cupsGetDefault(void);
 extern int             cupsGetJobs(cups_job_t **jobs, const char *name,
                                    int myjobs, int whichjobs);
-extern const char      *cupsGetPPD(const char *name);
-extern int             cupsGetPrinters(char ***printers) _CUPS_DEPRECATED;
+extern const char      *cupsGetPPD(const char *name) _PPD_DEPRECATED;
+extern int             cupsGetPrinters(char ***printers) _CUPS_DEPRECATED_MSG("Use cupsGetDests instead.");
 extern ipp_status_t    cupsLastError(void);
 extern int             cupsPrintFile(const char *name, const char *filename,
                                      const char *title, int num_options,
@@ -366,7 +373,7 @@ extern int          cupsPrintFile(const char *name, const char *filename,
 extern int             cupsPrintFiles(const char *name, int num_files,
                                       const char **files, const char *title,
                                       int num_options, cups_option_t *options);
-extern char            *cupsTempFile(char *filename, int len) _CUPS_DEPRECATED;
+extern char            *cupsTempFile(char *filename, int len) _CUPS_DEPRECATED_MSG("Use cupsTempFd or cupsTempFile2 instead.");
 extern int             cupsTempFd(char *filename, int len);
 
 extern int             cupsAddDest(const char *name, const char *instance,
@@ -415,8 +422,7 @@ extern int          cupsGetDests2(http_t *http, cups_dest_t **dests)
 extern int             cupsGetJobs2(http_t *http, cups_job_t **jobs,
                                     const char *name, int myjobs,
                                     int whichjobs) _CUPS_API_1_1_21;
-extern const char      *cupsGetPPD2(http_t *http, const char *name)
-                                    _CUPS_API_1_1_21;
+extern const char      *cupsGetPPD2(http_t *http, const char *name) _PPD_DEPRECATED;
 extern int             cupsPrintFile2(http_t *http, const char *name,
                                       const char *filename,
                                       const char *title, int num_options,
@@ -481,7 +487,7 @@ extern const char   *cupsGetPassword2(const char *prompt, http_t *http,
                                          const char *resource) _CUPS_API_1_4;
 extern http_status_t   cupsGetPPD3(http_t *http, const char *name,
                                    time_t *modtime, char *buffer,
-                                   size_t bufsize) _CUPS_API_1_4;
+                                   size_t bufsize) _PPD_DEPRECATED;
 extern ipp_t           *cupsGetResponse(http_t *http,
                                         const char *resource) _CUPS_API_1_4;
 extern ssize_t         cupsReadResponseData(http_t *http, char *buffer,
@@ -590,6 +596,39 @@ extern http_status_t       cupsStartDestDocument(http_t *http, cups_dest_t *dest,
                                              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/OS X 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;
+
 #  ifdef __cplusplus
 }
 #  endif /* __cplusplus */
@@ -597,5 +636,5 @@ extern http_status_t        cupsStartDestDocument(http_t *http, cups_dest_t *dest,
 #endif /* !_CUPS_CUPS_H_ */
 
 /*
- * End of "$Id: cups.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cups.h 12998 2015-12-02 15:09:04Z msweet $".
  */
index 09c3b71..28c1fed 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: custom.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: custom.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   PPD custom option routines for CUPS.
  *
@@ -118,5 +118,5 @@ ppdNextCustomParam(ppd_coption_t *opt)      /* I - Custom option */
 
 
 /*
- * End of "$Id: custom.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: custom.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 7a817ad..8968aeb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: debug-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: debug-private.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Private debugging macros for CUPS.
  *
@@ -113,5 +113,5 @@ extern int  _cups_gettimeofday(struct timeval *tv, void *tz);
 #endif /* !_CUPS_DEBUG_PRIVATE_H_ */
 
 /*
- * End of "$Id: debug-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: debug-private.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index 846d98b..5b51d46 100644 (file)
@@ -1,24 +1,17 @@
 /*
- * "$Id: debug.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: debug.c 12928 2015-10-23 21:31:58Z msweet $"
  *
- *   Debugging functions for CUPS.
+ * Debugging functions for CUPS.
  *
- *   Copyright 2008-2012 by Apple Inc.
+ * Copyright 2008-2015 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   debug_vsnprintf()    - Format a string into a fixed size buffer.
- *   _cups_debug_printf() - Write a formatted line to the log.
- *   _cups_debug_puts()   - Write a single line to the log.
- *   _cups_debug_set()    - Enable or disable debug logging.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -68,19 +61,279 @@ int                        _cups_debug_level = 1;
 static regex_t         *debug_filter = NULL;
                                        /* Filter expression for messages */
 static int             debug_init = 0; /* Did we initialize debugging? */
-static _cups_mutex_t   debug_mutex = _CUPS_MUTEX_INITIALIZER;
+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 DLLExport
+_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 DLLExport
+_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);
+}
 
 
 /*
- * 'debug_vsnprintf()' - Format a string into a fixed size buffer.
+ * '_cups_debug_set()' - Enable or disable debug logging.
  */
 
-static int                             /* O - Number of bytes formatted */
-debug_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 */
+void DLLExport
+_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);
+}
+#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 */
@@ -88,11 +341,11 @@ debug_vsnprintf(char       *buffer,        /* O - Output buffer */
                type;                   /* Format type character */
   int          width,                  /* Width of field */
                prec;                   /* Number of characters of precision */
-  char         tformat[100],           /* Temporary format string for sprintf() */
+  char         tformat[100],           /* Temporary format string for snprintf() */
                *tptr,                  /* Pointer into temporary format */
                temp[1024];             /* Buffer for formatted numbers */
   char         *s;                     /* Pointer to string */
-  int          bytes;                  /* Total number of bytes needed */
+  ssize_t      bytes;                  /* Total number of bytes needed */
 
 
   if (!buffer || bufsize < 2 || !format)
@@ -133,7 +386,7 @@ debug_vsnprintf(char       *buffer, /* O - Output buffer */
        format ++;
        width = va_arg(ap, int);
 
-       snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width);
+       snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", width);
        tptr += strlen(tptr);
       }
       else
@@ -165,7 +418,7 @@ debug_vsnprintf(char       *buffer, /* O - Output buffer */
          format ++;
          prec = va_arg(ap, int);
 
-         snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec);
+         snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", prec);
          tptr += strlen(tptr);
        }
        else
@@ -220,25 +473,17 @@ debug_vsnprintf(char       *buffer,       /* O - Output buffer */
        case 'e' :
        case 'f' :
        case 'g' :
-           if ((width + 2) > sizeof(temp))
+           if ((size_t)(width + 2) > sizeof(temp))
              break;
 
-           sprintf(temp, tformat, va_arg(ap, double));
+           snprintf(temp, sizeof(temp), tformat, va_arg(ap, double));
 
             bytes += (int)strlen(temp);
 
             if (bufptr)
            {
-             if ((bufptr + strlen(temp)) > bufend)
-             {
-               strncpy(bufptr, temp, (size_t)(bufend - bufptr));
-               bufptr = bufend;
-             }
-             else
-             {
-               strcpy(bufptr, temp);
-               bufptr += strlen(temp);
-             }
+             strlcpy(bufptr, temp, (size_t)(bufend - bufptr));
+             bufptr += strlen(bufptr);
            }
            break;
 
@@ -250,56 +495,40 @@ debug_vsnprintf(char       *buffer,       /* O - Output buffer */
        case 'o' :
        case 'u' :
        case 'x' :
-           if ((width + 2) > sizeof(temp))
+           if ((size_t)(width + 2) > sizeof(temp))
              break;
 
 #  ifdef HAVE_LONG_LONG
             if (size == 'L')
-             sprintf(temp, tformat, va_arg(ap, long long));
+             snprintf(temp, sizeof(temp), tformat, va_arg(ap, long long));
            else
 #  endif /* HAVE_LONG_LONG */
             if (size == 'l')
-             sprintf(temp, tformat, va_arg(ap, long));
+             snprintf(temp, sizeof(temp), tformat, va_arg(ap, long));
            else
-             sprintf(temp, tformat, va_arg(ap, int));
+             snprintf(temp, sizeof(temp), tformat, va_arg(ap, int));
 
             bytes += (int)strlen(temp);
 
            if (bufptr)
            {
-             if ((bufptr + strlen(temp)) > bufend)
-             {
-               strncpy(bufptr, temp, (size_t)(bufend - bufptr));
-               bufptr = bufend;
-             }
-             else
-             {
-               strcpy(bufptr, temp);
-               bufptr += strlen(temp);
-             }
+             strlcpy(bufptr, temp, (size_t)(bufend - bufptr));
+             bufptr += strlen(bufptr);
            }
            break;
 
        case 'p' : /* Pointer value */
-           if ((width + 2) > sizeof(temp))
+           if ((size_t)(width + 2) > sizeof(temp))
              break;
 
-           sprintf(temp, tformat, va_arg(ap, void *));
+           snprintf(temp, sizeof(temp), tformat, va_arg(ap, void *));
 
             bytes += (int)strlen(temp);
 
            if (bufptr)
            {
-             if ((bufptr + strlen(temp)) > bufend)
-             {
-               strncpy(bufptr, temp, (size_t)(bufend - bufptr));
-               bufptr = bufend;
-             }
-             else
-             {
-               strcpy(bufptr, temp);
-               bufptr += strlen(temp);
-             }
+             strlcpy(bufptr, temp, (size_t)(bufend - bufptr));
+             bufptr += strlen(bufptr);
            }
            break;
 
@@ -309,7 +538,7 @@ debug_vsnprintf(char       *buffer, /* O - Output buffer */
            if (bufptr)
            {
              if (width <= 1)
-               *bufptr++ = va_arg(ap, int);
+               *bufptr++ = (char)va_arg(ap, int);
              else
              {
                if ((bufptr + width) > bufend)
@@ -390,7 +619,7 @@ debug_vsnprintf(char       *buffer, /* O - Output buffer */
            break;
 
        case 'n' : /* Output number of chars so far */
-           *(va_arg(ap, int *)) = bytes;
+           *(va_arg(ap, int *)) = (int)bytes;
            break;
       }
     }
@@ -416,243 +645,5 @@ debug_vsnprintf(char       *buffer,       /* O - Output buffer */
 
 
 /*
- * '_cups_debug_printf()' - Write a formatted line to the log.
- */
-
-void DLLExport
-_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 */
-  size_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_mutex);
-    result = regexec(debug_filter, format, 0, NULL, 0);
-    _cupsMutexUnlock(&debug_mutex);
-
-    if (result)
-      return;
-  }
-
- /*
-  * Format the message...
-  */
-
-  gettimeofday(&curtime, NULL);
-  snprintf(buffer, sizeof(buffer), "%02d:%02d:%02d.%03d ",
-          (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 = debug_vsnprintf(buffer + 13, sizeof(buffer) - 14, format, ap) + 13;
-  va_end(ap);
-
-  if (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...
-  */
-
-  write(_cups_debug_fd, buffer, bytes);
-}
-
-
-/*
- * '_cups_debug_puts()' - Write a single line to the log.
- */
-
-void DLLExport
-_cups_debug_puts(const char *s)                /* I - String to output */
-{
-  struct timeval       curtime;        /* Current time */
-  char                 buffer[2048];   /* Output buffer */
-  size_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_mutex);
-    result = regexec(debug_filter, s, 0, NULL, 0);
-    _cupsMutexUnlock(&debug_mutex);
-
-    if (result)
-      return;
-  }
-
- /*
-  * Format the message...
-  */
-
-  gettimeofday(&curtime, NULL);
-  bytes = snprintf(buffer, sizeof(buffer), "%02d:%02d:%02d.%03d %s",
-                  (int)((curtime.tv_sec / 3600) % 24),
-                  (int)((curtime.tv_sec / 60) % 60),
-                  (int)(curtime.tv_sec % 60), (int)(curtime.tv_usec / 1000),
-                  s);
-
-  if (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...
-  */
-
-  write(_cups_debug_fd, buffer, bytes);
-}
-
-
-/*
- * '_cups_debug_set()' - Enable or disable debug logging.
- */
-
-void DLLExport
-_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_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_mutex);
-}
-#endif /* DEBUG */
-
-
-/*
- * End of "$Id: debug.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: debug.c 12928 2015-10-23 21:31:58Z msweet $".
  */
index a11386c..703b171 100644 (file)
@@ -1,25 +1,17 @@
 /*
- * "$Id: dest-job.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dest-job.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Destination job support for CUPS.
+ * Destination job support for CUPS.
  *
- *   Copyright 2012 by Apple Inc.
+ * Copyright 2012-2014 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsCancelDestJob()      - Cancel a job on a destination.
- *   cupsCloseDestJob()       - Close a job and start printing.
- *   cupsCreateDestJob()      - Create a job on a destination.
- *   cupsFinishDestDocument() - Finish the current document.
- *   cupsStartDestDocument()  - Start a new document.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -34,7 +26,7 @@
  *
  * The "job_id" is the number returned by cupsCreateDestJob.
  *
- * Returns IPP_OK on success and IPP_NOT_AUTHORIZED or IPP_FORBIDDEN on
+ * Returns IPP_STATUS_OK on success and IPP_NOT_AUTHORIZED or IPP_FORBIDDEN on
  * failure.
  *
  * @since CUPS 1.6/OS X 10.8@
@@ -45,7 +37,13 @@ cupsCancelDestJob(http_t      *http, /* I - Connection to destination */
                   cups_dest_t *dest,   /* I - Destination */
                   int         job_id)  /* I - Job ID */
 {
-  return (IPP_NOT_FOUND);
+  /* TODO: Needs to be implemented! */
+  /* Probably also needs to be revved to accept cups_dinfo_t... */
+  (void)http;
+  (void)dest;
+  (void)job_id;
+
+  return (IPP_STATUS_ERROR_NOT_FOUND);
 }
 
 
@@ -53,7 +51,7 @@ cupsCancelDestJob(http_t      *http,  /* I - Connection to destination */
  * '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_OK@
+ * "job_id" is the job ID returned by cupsCreateDestJob. Returns @code IPP_STATUS_OK@
  * on success.
  *
  * @since CUPS 1.6/OS X 10.8@
@@ -81,9 +79,9 @@ cupsCloseDestJob(
 
   if (!http || !dest || !info || job_id <= 0)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     DEBUG_puts("1cupsCloseDestJob: Bad arguments.");
-    return (IPP_INTERNAL_ERROR);
+    return (IPP_STATUS_ERROR_INTERNAL);
   }
 
  /*
@@ -94,31 +92,33 @@ cupsCloseDestJob(
                                IPP_TAG_ENUM)) != NULL)
   {
     for (i = 0; i < attr->num_values; i ++)
-      if (attr->values[i].integer == IPP_CLOSE_JOB)
+      if (attr->values[i].integer == IPP_OP_CLOSE_JOB)
       {
-        request = ippNewRequest(IPP_CLOSE_JOB);
+        request = ippNewRequest(IPP_OP_CLOSE_JOB);
         break;
       }
   }
 
   if (!request)
-    request = ippNewRequest(IPP_SEND_DOCUMENT);
+    request = ippNewRequest(IPP_OP_SEND_DOCUMENT);
 
   if (!request)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOMEM), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0);
     DEBUG_puts("1cupsCloseDestJob: Unable to create Close-Job/Send-Document "
                "request.");
-    return (IPP_INTERNAL_ERROR);
+    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_SEND_DOCUMENT)
+  if (ippGetOperation(request) == IPP_OP_SEND_DOCUMENT)
     ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", 1);
 
  /*
@@ -137,7 +137,7 @@ cupsCloseDestJob(
 /*
  * 'cupsCreateDestJob()' - Create a job on a destination.
  *
- * Returns @code IPP_OK@ or @code IPP_OK_SUBST@ on success, saving the job ID
+ * 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/OS X 10.8@
@@ -173,22 +173,24 @@ cupsCreateDestJob(
 
   if (!http || !dest || !info || !job_id)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     DEBUG_puts("1cupsCreateDestJob: Bad arguments.");
-    return (IPP_INTERNAL_ERROR);
+    return (IPP_STATUS_ERROR_INTERNAL);
   }
 
  /*
   * Build a Create-Job request...
   */
 
-  if ((request = ippNewRequest(IPP_CREATE_JOB)) == NULL)
+  if ((request = ippNewRequest(IPP_OP_CREATE_JOB)) == NULL)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOMEM), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0);
     DEBUG_puts("1cupsCreateDestJob: Unable to create Create-Job request.");
-    return (IPP_INTERNAL_ERROR);
+    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",
@@ -197,6 +199,7 @@ cupsCreateDestJob(
     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);
 
@@ -228,7 +231,7 @@ cupsCreateDestJob(
 /*
  * 'cupsFinishDestDocument()' - Finish the current document.
  *
- * Returns @code IPP_OK@ or @code IPP_OK_SUBST@ on success.
+ * Returns @code IPP_STATUS_OK@ or @code IPP_STATUS_OK_SUBST@ on success.
  *
  * @since CUPS 1.6/OS X 10.8@
  */
@@ -249,9 +252,9 @@ cupsFinishDestDocument(
 
   if (!http || !dest || !info)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     DEBUG_puts("1cupsFinishDestDocument: Bad arguments.");
-    return (IPP_INTERNAL_ERROR);
+    return (IPP_STATUS_ERROR_INTERNAL);
   }
 
  /*
@@ -309,23 +312,25 @@ cupsStartDestDocument(
 
   if (!http || !dest || !info || job_id <= 0)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     DEBUG_puts("1cupsStartDestDocument: Bad arguments.");
-    return (HTTP_ERROR);
+    return (HTTP_STATUS_ERROR);
   }
 
  /*
   * Create a Send-Document request...
   */
 
-  if ((request = ippNewRequest(IPP_SEND_DOCUMENT)) == NULL)
+  if ((request = ippNewRequest(IPP_OP_SEND_DOCUMENT)) == NULL)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOMEM), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0);
     DEBUG_puts("1cupsStartDestDocument: Unable to create Send-Document "
                "request.");
-    return (HTTP_ERROR);
+    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);
@@ -337,8 +342,9 @@ cupsStartDestDocument(
   if (format)
     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE,
                  "document-format", NULL, format);
-  ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", last_document);
+  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);
 
  /*
@@ -354,5 +360,5 @@ cupsStartDestDocument(
 
 
 /*
- * End of "$Id: dest-job.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dest-job.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 4d8bff6..d76ae2b 100644 (file)
@@ -1,28 +1,17 @@
 /*
- * "$Id: dest-localization.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dest-localization.c 12094 2014-08-19 12:15:11Z msweet $"
  *
- *   Destination localization support for CUPS.
+ * Destination localization support for CUPS.
  *
- *   Copyright 2012 by Apple Inc.
+ * Copyright 2012-2014 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsLocalizeDestOption()   - Get the localized string for a destination
- *                                option.
- *   cupsLocalizeDestValue()    - Get the localized string for a destination
- *                                option+value pair.
- *   cups_create_localizations() - Create the localizations array for a
- *                                destination.
- *   cups_read_strings()        - Read a pair of strings from a .strings file.
- *   cups_scan_strings()        - Scan a quoted string.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -43,6 +32,170 @@ static char *cups_scan_strings(char *buffer);
 
 
 /*
+ * '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/OS X 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                 name[1024],     /* Size name */
+                       temp[256];      /* Temporary string */
+  const char           *lsize,         /* Localized media size */
+                       *lsource,       /* Localized media source */
+                       *ltype;         /* Localized media type */
+
+
+ /*
+  * Range check input...
+  */
+
+  if (!http || !dest || !dinfo || !size)
+  {
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
+    return (NULL);
+  }
+
+ /*
+  * See if the localization is cached...
+  */
+
+  if (!dinfo->localizations)
+    cups_create_localizations(http, dinfo);
+
+  key.id = size->media;
+  if ((match = (_cups_message_t *)cupsArrayFind(dinfo->localizations, &key)) != NULL)
+    return (match->str);
+
+ /*
+  * If not, get the localized size, source, and type strings...
+  */
+
+  lang = cupsLangDefault();
+  pwg  = pwgMediaForSize(size->width, size->length);
+
+  if (pwg->ppd)
+    lsize = _cupsLangString(lang, pwg->ppd);
+  else
+    lsize = NULL;
+
+  if (!lsize)
+  {
+    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 (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;
+    }
+  }
+
+  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]", mdb, mdb->key, mdb->size_name, mdb->source, mdb->type, mdb->width, mdb->length, mdb->bottom, mdb->left, mdb->right, mdb->top));
+
+    lsource = cupsLocalizeDestValue(http, dest, dinfo, "media-source", mdb->source);
+    ltype   = cupsLocalizeDestValue(http, dest, dinfo, "media-type", mdb->type);
+  }
+  else
+  {
+    lsource = NULL;
+    ltype   = NULL;
+  }
+
+  if (!lsource && !ltype)
+  {
+    if (size->bottom || size->left || size->right || size->top)
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (Borderless)")), lsize);
+    else
+      strlcpy(name, lsize, sizeof(name));
+  }
+  else if (!lsource)
+  {
+    if (size->bottom || size->left || size->right || size->top)
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (Borderless, %s)")), lsize, ltype);
+    else
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (%s)")), lsize, ltype);
+  }
+  else if (!ltype)
+  {
+    if (size->bottom || size->left || size->right || size->top)
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (Borderless, %s)")), lsize, lsource);
+    else
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (%s)")), lsize, lsource);
+  }
+  else
+  {
+    if (size->bottom || size->left || size->right || size->top)
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (Borderless, %s, %s)")), lsize, ltype, lsource);
+    else
+      snprintf(name, sizeof(name), _cupsLangString(lang, _("%s (%s, %s)")), lsize, ltype, lsource);
+  }
+
+  if ((match = (_cups_message_t *)calloc(1, sizeof(_cups_message_t))) == NULL)
+    return (NULL);
+
+  match->id  = strdup(size->media);
+  match->str = strdup(name);
+
+  cupsArrayAdd(dinfo->localizations, match);
+
+  return (match->str);
+}
+
+
+/*
  * 'cupsLocalizeDestOption()' - Get the localized string for a destination
  *                              option.
  *
@@ -178,7 +331,7 @@ cups_create_localizations(
   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_OK)
+                      sizeof(resource)) < HTTP_URI_STATUS_OK)
   {
     DEBUG_printf(("4cups_create_localizations: Bad printer-strings-uri value "
                   "\"%s\".", attr->values[0].string.text));
@@ -188,7 +341,7 @@ cups_create_localizations(
   httpGetHostname(http, http_hostname, sizeof(http_hostname));
 
   if (!_cups_strcasecmp(http_hostname, hostname) &&
-      port == _httpAddrPort(http->hostaddr))
+      port == httpAddrPort(http->hostaddr))
   {
    /*
     * Use the same connection...
@@ -203,11 +356,12 @@ cups_create_localizations(
     */
 
     if (!strcmp(scheme, "https"))
-      encryption = HTTP_ENCRYPT_ALWAYS;
+      encryption = HTTP_ENCRYPTION_ALWAYS;
     else
-      encryption = HTTP_ENCRYPT_IF_REQUESTED;
+      encryption = HTTP_ENCRYPTION_IF_REQUESTED;
 
-    if ((http2 = httpConnectEncrypt(hostname, port, encryption)) == NULL)
+    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()));
@@ -233,7 +387,7 @@ cups_create_localizations(
   DEBUG_printf(("4cups_create_localizations: GET %s = %s", resource,
                 httpStatus(status)));
 
-  if (status == HTTP_OK)
+  if (status == HTTP_STATUS_OK)
   {
    /*
     * Got the file, read it...
@@ -355,8 +509,7 @@ cups_scan_strings(char *buffer)             /* I - Start of string */
        * Decode \nnn octal escape...
        */
 
-       *bufptr = ((((bufptr[1] - '0') << 3) | (bufptr[2] - '0')) << 3) |
-                 (bufptr[3] - '0');
+       *bufptr = (char)(((((bufptr[1] - '0') << 3) | (bufptr[2] - '0')) << 3) | (bufptr[3] - '0'));
        _cups_strcpy(bufptr + 1, bufptr + 4);
       }
       else
@@ -382,5 +535,5 @@ cups_scan_strings(char *buffer)             /* I - Start of string */
 
 
 /*
- * End of "$Id: dest-localization.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dest-localization.c 12094 2014-08-19 12:15:11Z msweet $".
  */
index 08bd16d..8fda3c8 100644 (file)
@@ -1,42 +1,17 @@
 /*
- * "$Id: dest-options.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dest-options.c 11882 2014-05-16 21:02:15Z msweet $"
  *
- *   Destination option/media support for CUPS.
+ * Destination option/media support for CUPS.
  *
- *   Copyright 2012 by Apple Inc.
+ * Copyright 2012-2014 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsCheckDestSupported()  - Check that the option and value are supported
- *                              by the destination.
- *   cupsCopyDestConflicts()   - Get conflicts and resolutions for a new
- *                              option/value pair.
- *   cupsCopyDestInfo()        - Get the supported values/capabilities for the
- *                              destination.
- *   cupsFreeDestInfo()        - Free destination information obtained using
- *                              @link cupsCopyDestInfo@.
- *   cupsGetDestMediaByName()  - Get media names, dimensions, and margins.
- *   cupsGetDestMediaBySize()  - Get media names, dimensions, and margins.
- *   cups_add_dconstres()      - Add a constraint or resolver to an array.
- *   cups_compare_dconstres()  - Compare to resolver entries.
- *   cups_compare_media_db()   - Compare two media entries.
- *   cups_copy_media_db()      - Copy a media entry.
- *   cups_create_constraints() - Create the constraints and resolvers arrays.
- *   cups_create_defaults()    - Create the -default option array.
- *   cups_create_media_db()    - Create the media database.
- *   cups_free_media_cb()      - Free a media entry.
- *   cups_get_media_db()       - Lookup the media entry for a given size.
- *   cups_is_close_media_db()  - Compare two media entries to see if they are
- *                              close to the same size.
- *   cups_test_constraints()   - Test constraints.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
 
 
 /*
+ * Local constants...
+ */
+
+#define _CUPS_MEDIA_READY_TTL  30      /* Life of xxx-ready values */
+
+
+/*
  * Local functions...
  */
 
@@ -56,12 +38,15 @@ static int          cups_compare_dconstres(_cups_dconstres_t *a,
 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);
+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(cups_dinfo_t *dinfo,
-                                         _pwg_media_t *pwg, unsigned flags,
+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);
@@ -72,6 +57,7 @@ static cups_array_t   *cups_test_constraints(cups_dinfo_t *dinfo,
                                               cups_option_t *options,
                                               int *num_conflicts,
                                               cups_option_t **conflicts);
+static void            cups_update_ready(http_t *http, cups_dinfo_t *dinfo);
 
 
 /*
@@ -133,7 +119,7 @@ cupsCheckDestSupported(
     * Check range of custom media sizes...
     */
 
-    _pwg_media_t       *pwg;           /* Current PWG media size info */
+    pwg_media_t        *pwg;           /* Current PWG media size info */
     int                        min_width,      /* Minimum width */
                        min_length,     /* Minimum length */
                        max_width,      /* Maximum width */
@@ -151,13 +137,13 @@ cupsCheckDestSupported(
         i --, attrval ++)
     {
       if (!strncmp(attrval->string.text, "custom_min_", 11) &&
-          (pwg = _pwgMediaForPWG(attrval->string.text)) != NULL)
+          (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)
+              (pwg = pwgMediaForPWG(attrval->string.text)) != NULL)
       {
         max_width  = pwg->width;
         max_length = pwg->length;
@@ -169,7 +155,7 @@ cupsCheckDestSupported(
     */
 
     if (min_width < INT_MAX && max_width > 0 &&
-        (pwg = _pwgMediaForPWG(value)) != NULL &&
+        (pwg = pwgMediaForPWG(value)) != NULL &&
         pwg->width >= min_width && pwg->width <= max_width &&
         pwg->length >= min_length && pwg->length <= max_length)
       return (1);
@@ -304,7 +290,7 @@ cupsCopyDestConflicts(
                *myres = NULL,          /* My resolved options */
                *myoption,              /* My current option */
                *option;                /* Current option */
-  cups_array_t *active,                /* Active conflicts */
+  cups_array_t *active = NULL,         /* Active conflicts */
                *pass = NULL,           /* Resolvers for this pass */
                *resolvers = NULL,      /* Resolvers we have used */
                *test;                  /* Test array for conflicts */
@@ -620,11 +606,11 @@ cupsCopyDestInfo(
     * Send a Get-Printer-Attributes request...
     */
 
-    request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+    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_NAME,
+                 "requesting-user-name", NULL, cupsUser());
     ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
                  "requested-attributes",
                  (int)(sizeof(requested_attrs) / sizeof(requested_attrs[0])),
@@ -632,7 +618,7 @@ cupsCopyDestInfo(
     response = cupsDoRequest(http, request, resource);
     status   = cupsLastError();
 
-    if (status > IPP_OK_SUBST)
+    if (status > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
     {
       DEBUG_printf(("cupsCopyDestSupported: Get-Printer-Attributes for '%s' "
                    "returned %s (%s)", dest->name, ippErrorString(status),
@@ -641,11 +627,11 @@ cupsCopyDestInfo(
       ippDelete(response);
       response = NULL;
 
-      if (status == IPP_VERSION_NOT_SUPPORTED && version > 11)
+      if (status == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED && version > 11)
         version = 11;
-      else if (status == IPP_PRINTER_BUSY)
+      else if (status == IPP_STATUS_ERROR_BUSY)
       {
-        sleep(delay);
+        sleep((unsigned)delay);
 
         delay = _cupsNextDelay(delay, &prev_delay);
       }
@@ -666,11 +652,12 @@ cupsCopyDestInfo(
 
   if ((dinfo = calloc(1, sizeof(cups_dinfo_t))) == NULL)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
     ippDelete(response);
     return (NULL);
   }
 
+  dinfo->version  = version;
   dinfo->uri      = uri;
   dinfo->resource = _cupsStrAlloc(resource);
   dinfo->attrs    = response;
@@ -680,6 +667,129 @@ cupsCopyDestInfo(
 
 
 /*
+ * '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/OS X 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 */
+
+
+ /*
+  * 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/OS X 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 */
+
+
+ /*
+  * 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/OS X 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 */
+
+
+ /*
+  * 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@.
  */
@@ -707,6 +817,11 @@ cupsFreeDestInfo(cups_dinfo_t *dinfo)      /* I - Destination information */
 
   cupsArrayDelete(dinfo->media_db);
 
+  cupsArrayDelete(dinfo->cached_db);
+
+  ippDelete(dinfo->ready_attrs);
+  cupsArrayDelete(dinfo->ready_db);
+
   ippDelete(dinfo->attrs);
 
   free(dinfo);
@@ -714,6 +829,86 @@ cupsFreeDestInfo(cups_dinfo_t *dinfo)      /* I - Destination information */
 
 
 /*
+ * '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/OS X 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 */
+
+
+ /*
+  * 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->size_name)
+    strlcpy(size->media, nsize->size_name, sizeof(size->media));
+  else if (nsize->key)
+    strlcpy(size->media, nsize->key, 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
@@ -742,7 +937,7 @@ cupsGetDestMediaByName(
     unsigned     flags,                        /* I - Media matching flags */
     cups_size_t  *size)                        /* O - Media size information */
 {
-  _pwg_media_t         *pwg;           /* PWG media info */
+  pwg_media_t          *pwg;           /* PWG media info */
 
 
  /*
@@ -754,7 +949,7 @@ cupsGetDestMediaByName(
 
   if (!http || !dest || !dinfo || !media || !size)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     return (0);
   }
 
@@ -762,11 +957,11 @@ cupsGetDestMediaByName(
   * Lookup the media size name...
   */
 
-  if ((pwg = _pwgMediaForPWG(media)) == NULL)
-    if ((pwg = _pwgMediaForLegacy(media)) == NULL)
+  if ((pwg = pwgMediaForPWG(media)) == NULL)
+    if ((pwg = pwgMediaForLegacy(media)) == NULL)
     {
       DEBUG_printf(("1cupsGetDestMediaByName: Unknown size '%s'.", media));
-      _cupsSetError(IPP_INTERNAL_ERROR, _("Unknown media size name."), 1);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown media size name."), 1);
       return (0);
     }
 
@@ -774,7 +969,7 @@ cupsGetDestMediaByName(
   * Lookup the size...
   */
 
-  return (cups_get_media_db(dinfo, pwg, flags, size));
+  return (cups_get_media_db(http, dinfo, pwg, flags, size));
 }
 
 
@@ -810,7 +1005,7 @@ cupsGetDestMediaBySize(
     unsigned     flags,                        /* I - Media matching flags */
     cups_size_t  *size)                        /* O - Media size information */
 {
-  _pwg_media_t         *pwg;           /* PWG media info */
+  pwg_media_t          *pwg;           /* PWG media info */
 
 
  /*
@@ -822,7 +1017,7 @@ cupsGetDestMediaBySize(
 
   if (!http || !dest || !dinfo || width <= 0 || length <= 0 || !size)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     return (0);
   }
 
@@ -830,11 +1025,11 @@ cupsGetDestMediaBySize(
   * Lookup the media size name...
   */
 
-  if ((pwg = _pwgMediaForSize(width, length)) == NULL)
+  if ((pwg = pwgMediaForSize(width, length)) == NULL)
   {
     DEBUG_printf(("1cupsGetDestMediaBySize: Invalid size %dx%d.", width,
                   length));
-    _cupsSetError(IPP_INTERNAL_ERROR, _("Invalid media size."), 1);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid media size."), 1);
     return (0);
   }
 
@@ -842,7 +1037,116 @@ cupsGetDestMediaBySize(
   * Lookup the size...
   */
 
-  return (cups_get_media_db(dinfo, pwg, flags, 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/OS X 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 */
+{
+ /*
+  * 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/OS X 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 */
+
+
+ /*
+  * 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));
 }
 
 
@@ -944,6 +1248,86 @@ cups_copy_media_db(
 
 
 /*
+ * '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)", http, 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", 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", 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", 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", mdb));
+      cupsArrayAdd(dinfo->cached_db, mdb);
+    }
+  }
+
+  if (flags & CUPS_MEDIA_FLAGS_DUPLEX)
+  {
+    DEBUG_printf(("4cups_create_cached: add %p", first));
+    cupsArrayAdd(dinfo->cached_db, first);
+  }
+}
+
+
+/*
  * 'cups_create_constraints()' - Create the constraints and resolvers arrays.
  */
 
@@ -1036,7 +1420,8 @@ cups_create_defaults(
 
 static void
 cups_create_media_db(
-    cups_dinfo_t *dinfo)               /* I - Destination information */
+    cups_dinfo_t *dinfo,               /* I - Destination information */
+    unsigned     flags)                        /* I - Media flags */
 {
   int                  i;              /* Looping var */
   _ipp_value_t         *val;           /* Current value */
@@ -1044,21 +1429,40 @@ cups_create_media_db(
                        *media_attr,    /* media-xxx */
                        *x_dimension,   /* x-dimension */
                        *y_dimension;   /* y-dimension */
-  _pwg_media_t         *pwg;           /* PWG media info */
+  pwg_media_t          *pwg;           /* PWG media info */
+  cups_array_t         *db;            /* New media database array */
   _cups_media_db_t     mdb;            /* Media entry */
 
 
-  dinfo->media_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);
-  dinfo->min_size.width  = INT_MAX;
-  dinfo->min_size.length = INT_MAX;
-  dinfo->max_size.width  = 0;
-  dinfo->max_size.length = 0;
+  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 ((media_col_db = ippFindAttribute(dinfo->attrs, "media-col-database",
-                                       IPP_TAG_BEGIN_COLLECTION)) != NULL)
+  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 */
 
@@ -1075,15 +1479,32 @@ cups_create_media_db(
                                        /* media-size collection value */
 
         if ((x_dimension = ippFindAttribute(media_size, "x-dimension",
-                                          IPP_TAG_INTEGER)) != NULL &&
+                                            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_RANGE)) != NULL &&
+       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)
        {
@@ -1107,7 +1528,6 @@ cups_create_media_db(
          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;
        }
       }
@@ -1167,7 +1587,7 @@ cups_create_media_db(
                                          IPP_TAG_INTEGER)) != NULL)
         mdb.top = media_attr->values[0].integer;
 
-      cupsArrayAdd(dinfo->media_db, &mdb);
+      cupsArrayAdd(db, &mdb);
     }
 
     if (custom)
@@ -1205,8 +1625,7 @@ cups_create_media_db(
       }
     }
   }
-  else if ((media_attr = ippFindAttribute(dinfo->attrs, "media-supported",
-                                          IPP_TAG_ZERO)) != NULL &&
+  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))
@@ -1222,8 +1641,8 @@ cups_create_media_db(
          i > 0;
          i --, val ++)
     {
-      if ((pwg = _pwgMediaForPWG(val->string.text)) == NULL)
-        if ((pwg = _pwgMediaForLegacy(val->string.text)) == NULL)
+      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));
@@ -1233,12 +1652,14 @@ cups_create_media_db(
       mdb.width  = pwg->width;
       mdb.length = pwg->length;
 
-      if (!strncmp(val->string.text, "custom_min_", 11))
+      if (flags != CUPS_MEDIA_FLAGS_READY &&
+          !strncmp(val->string.text, "custom_min_", 11))
       {
         mdb.size_name   = NULL;
         dinfo->min_size = mdb;
       }
-      else if (!strncmp(val->string.text, "custom_max_", 11))
+      else if (flags != CUPS_MEDIA_FLAGS_READY &&
+              !strncmp(val->string.text, "custom_max_", 11))
       {
         mdb.size_name   = NULL;
         dinfo->max_size = mdb;
@@ -1247,7 +1668,7 @@ cups_create_media_db(
       {
         mdb.size_name = val->string.text;
 
-        cupsArrayAdd(dinfo->media_db, &mdb);
+        cupsArrayAdd(db, &mdb);
       }
     }
   }
@@ -1284,11 +1705,13 @@ cups_free_media_db(
  */
 
 static int                             /* O - 1 on match, 0 on failure */
-cups_get_media_db(cups_dinfo_t *dinfo, /* I - Destination information */
-                  _pwg_media_t *pwg,   /* I - PWG media info */
+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_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 */
@@ -1298,8 +1721,18 @@ cups_get_media_db(cups_dinfo_t *dinfo,   /* I - Destination information */
   * Create the media database as needed...
   */
 
-  if (!dinfo->media_db)
-    cups_create_media_db(dinfo);
+  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...
@@ -1309,7 +1742,7 @@ cups_get_media_db(cups_dinfo_t *dinfo,    /* I - Destination information */
   key.width  = pwg->width;
   key.length = pwg->length;
 
-  if ((mdb = cupsArrayFind(dinfo->media_db, &key)) != NULL)
+  if ((mdb = cupsArrayFind(db, &key)) != NULL)
   {
    /*
     * Found an exact match, let's figure out the best margins for the flags
@@ -1324,12 +1757,11 @@ cups_get_media_db(cups_dinfo_t *dinfo,  /* I - Destination information */
       * Look for the smallest margins...
       */
 
-      if (best->left != 0 || best->right != 0 || best->top != 0 ||
-          best->bottom != 0)
+      if (best->left != 0 || best->right != 0 || best->top != 0 || best->bottom != 0)
       {
-       for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+       for (mdb = (_cups_media_db_t *)cupsArrayNext(db);
             mdb && !cups_compare_media_db(mdb, &key);
-            mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+            mdb = (_cups_media_db_t *)cupsArrayNext(db))
        {
          if (mdb->left <= best->left && mdb->right <= best->right &&
              mdb->top <= best->top && mdb->bottom <= best->bottom)
@@ -1357,12 +1789,13 @@ cups_get_media_db(cups_dinfo_t *dinfo,  /* I - Destination information */
       * Look for the largest margins...
       */
 
-      for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+      for (mdb = (_cups_media_db_t *)cupsArrayNext(db);
           mdb && !cups_compare_media_db(mdb, &key);
-          mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+          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->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;
       }
     }
@@ -1372,16 +1805,15 @@ cups_get_media_db(cups_dinfo_t *dinfo,  /* I - Destination information */
       * Look for the smallest non-zero margins...
       */
 
-      for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+      for (mdb = (_cups_media_db_t *)cupsArrayNext(db);
           mdb && !cups_compare_media_db(mdb, &key);
-          mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+          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->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 > 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;
       }
     }
@@ -1434,9 +1866,9 @@ cups_get_media_db(cups_dinfo_t *dinfo,    /* I - Destination information */
     * Find a close size...
     */
 
-    for (mdb = (_cups_media_db_t *)cupsArrayFirst(dinfo->media_db);
+    for (mdb = (_cups_media_db_t *)cupsArrayFirst(db);
          mdb;
-         mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+         mdb = (_cups_media_db_t *)cupsArrayNext(db))
       if (cups_is_close_media_db(mdb, &key))
         break;
 
@@ -1454,12 +1886,13 @@ cups_get_media_db(cups_dinfo_t *dinfo,  /* I - Destination information */
       if (best->left != 0 || best->right != 0 || best->top != 0 ||
           best->bottom != 0)
       {
-       for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+       for (mdb = (_cups_media_db_t *)cupsArrayNext(db);
             mdb && cups_is_close_media_db(mdb, &key);
-            mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+            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->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 &&
@@ -1475,12 +1908,13 @@ cups_get_media_db(cups_dinfo_t *dinfo,  /* I - Destination information */
       * Look for the largest margins...
       */
 
-      for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+      for (mdb = (_cups_media_db_t *)cupsArrayNext(db);
           mdb && cups_is_close_media_db(mdb, &key);
-          mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+          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->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;
       }
     }
@@ -1490,16 +1924,17 @@ cups_get_media_db(cups_dinfo_t *dinfo,  /* I - Destination information */
       * Look for the smallest non-zero margins...
       */
 
-      for (mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db);
+      for (mdb = (_cups_media_db_t *)cupsArrayNext(db);
           mdb && cups_is_close_media_db(mdb, &key);
-          mdb = (_cups_media_db_t *)cupsArrayNext(dinfo->media_db))
+          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))
+            best->bottom == 0) &&
+           (mdb->bottom != best->bottom || mdb->left != best->left || mdb->right != best->right || mdb->top != best->top))
          best = mdb;
       }
     }
@@ -1759,5 +2194,78 @@ cups_test_constraints(
 
 
 /*
- * End of "$Id: dest-options.c 11173 2013-07-23 12:31:34Z msweet $".
+ * '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);
+}
+
+
+/*
+ * End of "$Id: dest-options.c 11882 2014-05-16 21:02:15Z msweet $".
  */
index 9999c0c..413fc27 100644 (file)
@@ -1,85 +1,18 @@
 /*
- * "$Id: dest.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dest.c 12733 2015-06-12 01:21:05Z msweet $"
  *
- *   User-defined destination (and option) support for CUPS.
+ * User-defined destination (and option) support for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsAddDest()                 - Add a destination to the list of
- *                                   destinations.
- *   _cupsAppleCopyDefaultPaperID() - Get the default paper ID.
- *   _cupsAppleCopyDefaultPrinter() - Get the default printer at this location.
- *   _cupsAppleGetUseLastPrinter()  - Get whether to use the last used printer.
- *   _cupsAppleSetDefaultPaperID()  - Set the default paper id.
- *   _cupsAppleSetDefaultPrinter()  - Set the default printer for this
- *                                   location.
- *   _cupsAppleSetUseLastPrinter()  - Set whether to use the last used printer.
- *   cupsConnectDest()             - Connect to the server for a destination.
- *   cupsConnectDestBlock()        - Connect to the server for a destination.
- *   cupsCopyDest()                - Copy a destination.
- *   cupsEnumDests()               - Enumerate available destinations with a
- *                                   callback function.
- *   cupsEnumDestsBlock()          - Enumerate available destinations with a
- *                                   block.
- *   cupsFreeDests()               - Free the memory used by the list of
- *                                   destinations.
- *   cupsGetDest()                 - Get the named destination from the list.
- *   _cupsGetDestResource()        - Get the resource path and URI for a
- *                                   destination.
- *   _cupsGetDests()               - Get destinations from a server.
- *   cupsGetDests()                - Get the list of destinations from the
- *                                   default server.
- *   cupsGetDests2()               - Get the list of destinations from the
- *                                   specified server.
- *   cupsGetNamedDest()            - Get options for the named destination.
- *   cupsRemoveDest()              - Remove a destination from the destination
- *                                   list.
- *   cupsSetDefaultDest()          - Set the default destination.
- *   cupsSetDests()                - Save the list of destinations for the
- *                                   default server.
- *   cupsSetDests2()               - Save the list of destinations for the
- *                                   specified server.
- *   _cupsUserDefault()            - Get the user default printer from
- *                                   environment variables and location
- *                                   information.
- *   appleCopyLocations()          - Copy the location history array.
- *   appleCopyNetwork()            - Get the network ID for the current
- *                                   location.
- *   appleGetPaperSize()           - Get the default paper size.
- *   appleGetPrinter()             - Get a printer from the history array.
- *   cups_add_dest()               - Add a destination to the array.
- *   cups_block_cb()               - Enumeration callback for block API.
- *   cups_compare_dests()          - Compare two destinations.
- *   cups_dnssd_browse_cb()        - Browse for printers.
- *   cups_dnssd_browse_cb()        - Browse for printers.
- *   cups_dnssd_client_cb()        - Avahi client callback function.
- *   cups_dnssd_compare_device()    - Compare two devices.
- *   cups_dnssd_free_device()      - Free the memory used by a device.
- *   cups_dnssd_get_device()       - Lookup a device and create it as needed.
- *   cups_dnssd_local_cb()         - Browse for local printers.
- *   cups_dnssd_poll_cb()          - Wait for input on the specified file
- *                                   descriptors.
- *   cups_dnssd_query_cb()         - Process query data.
- *   cups_dnssd_resolve()          - Resolve a Bonjour printer URI.
- *   cups_dnssd_resolve_cb()       - See if we should continue resolving.
- *   cups_dnssd_unquote()          - Unquote a name string.
- *   cups_find_dest()              - Find a destination using a binary search.
- *   cups_get_default()            - Get the default destination from an
- *                                   lpoptions file.
- *   cups_get_dests()              - Get destinations from a file.
- *   cups_make_string()            - Make a comma-separated string of values
- *                                   from an IPP attribute.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -319,7 +252,8 @@ cupsAddDest(const char  *name,              /* I  - Destination name */
     if (instance && !cupsGetDest(name, NULL, num_dests, *dests))
       return (num_dests);
 
-    dest = cups_add_dest(name, instance, &num_dests, 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.
@@ -333,7 +267,7 @@ cupsAddDest(const char  *name,              /* I  - Destination name */
       * Copy options from parent...
       */
 
-      dest->options = calloc(sizeof(cups_option_t), parent->num_options);
+      dest->options = calloc(sizeof(cups_option_t), (size_t)parent->num_options);
 
       if (dest->options)
       {
@@ -634,7 +568,7 @@ cupsConnectDest(
     if (resource)
       *resource = '\0';
 
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     return (NULL);
   }
 
@@ -651,7 +585,7 @@ cupsConnectDest(
   if ((uri = cupsGetOption("printer-uri-supported", dest->num_options,
                            dest->options)) == NULL)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOENT), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOENT), 0);
 
     if (cb)
       (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR,
@@ -671,9 +605,9 @@ cupsConnectDest(
 
   if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme),
                       userpass, sizeof(userpass), hostname, sizeof(hostname),
-                      &port, resource, resourcesize) < HTTP_URI_OK)
+                      &port, resource, (int)resourcesize) < HTTP_URI_STATUS_OK)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, _("Bad printer URI."), 1);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad printer-uri."), 1);
 
     if (cb)
       (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR,
@@ -717,11 +651,13 @@ cupsConnectDest(
   */
 
   if (!strcmp(scheme, "ipps") || port == 443)
-    encryption = HTTP_ENCRYPT_ALWAYS;
+    encryption = HTTP_ENCRYPTION_ALWAYS;
   else
-    encryption = HTTP_ENCRYPT_IF_REQUESTED;
+    encryption = HTTP_ENCRYPTION_IF_REQUESTED;
 
-  http = _httpCreate(hostname, port, addrlist, encryption, AF_UNSPEC);
+  http = httpConnect2(hostname, port, addrlist, AF_UNSPEC, encryption, 1, 0,
+                      NULL);
+  httpAddrFreeList(addrlist);
 
  /*
   * Connect if requested...
@@ -840,8 +776,7 @@ cupsCopyDest(cups_dest_t *dest,
 
   if (new_dest)
   {
-    if ((new_dest->options = calloc(sizeof(cups_option_t),
-                                    dest->num_options)) == NULL)
+    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;
@@ -889,6 +824,10 @@ cupsEnumDests(
                        num_dests;      /* Number of destinations */
   cups_dest_t          *dests = NULL,  /* Destinations */
                        *dest;          /* Current destination */
+  const char           *defprinter;    /* Default printer */
+  char                 name[1024],     /* Copy of printer name */
+                       *instance,      /* Pointer to instance name */
+                       *user_default;  /* User default printer */
 #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
   int                  count,          /* Number of queries started */
                        remaining;      /* Remainder of timeout */
@@ -931,8 +870,33 @@ cupsEnumDests(
   * Get the list of local printers and pass them to the callback function...
   */
 
-  num_dests = _cupsGetDests(CUPS_HTTP_DEFAULT, CUPS_GET_PRINTERS, NULL, &dests,
-                            type, mask);
+  num_dests = _cupsGetDests(CUPS_HTTP_DEFAULT, IPP_OP_CUPS_GET_PRINTERS, NULL,
+                            &dests, type, mask | CUPS_PRINTER_3D);
+
+  if ((user_default = _cupsUserDefault(name, sizeof(name))) != NULL)
+    defprinter = name;
+  else if ((defprinter = cupsGetDefault2(CUPS_HTTP_DEFAULT)) != NULL)
+  {
+    strlcpy(name, defprinter, sizeof(name));
+    defprinter = name;
+  }
+
+  if (defprinter)
+  {
+   /*
+    * Separate printer and instance name...
+    */
+
+    if ((instance = strchr(name, '/')) != NULL)
+      *instance++ = '\0';
+
+   /*
+    * Lookup the printer and instance and make it the default...
+    */
+
+    if ((dest = cupsGetDest(name, instance, num_dests, dests)) != NULL)
+      dest->is_default = 1;
+  }
 
   for (i = num_dests, dest = dests;
        i > 0 && (!cancel || !*cancel);
@@ -951,11 +915,11 @@ cupsEnumDests(
   * Get Bonjour-shared printers...
   */
 
-  data.type    = type;
-  data.mask    = mask;
-  data.devices = cupsArrayNew3((cups_array_func_t)cups_dnssd_compare_devices,
-                               NULL, NULL, 0, NULL,
-                               (cups_afree_func_t)cups_dnssd_free_device);
+  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);
 
 #  ifdef HAVE_DNSSD
   if (DNSServiceCreateConnection(&data.main_ref) != kDNSServiceErr_NoError)
@@ -1299,7 +1263,7 @@ _cupsGetDestResource(
     if (resource)
       *resource = '\0';
 
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     return (NULL);
   }
 
@@ -1313,7 +1277,7 @@ _cupsGetDestResource(
     if (resource)
       *resource = '\0';
 
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOENT), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOENT), 0);
 
     return (NULL);
   }
@@ -1328,9 +1292,9 @@ _cupsGetDestResource(
 
   if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme),
                       userpass, sizeof(userpass), hostname, sizeof(hostname),
-                      &port, resource, resourcesize) < HTTP_URI_OK)
+                      &port, resource, (int)resourcesize) < HTTP_URI_STATUS_OK)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, _("Bad printer URI."), 1);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad printer-uri."), 1);
 
     return (NULL);
   }
@@ -1340,14 +1304,108 @@ _cupsGetDestResource(
 
 
 /*
+ * '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/OS X 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 */
+  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)
+  {
+   /*
+    * Create the name from the URI...
+    */
+
+    if (strstr(hostname, "._tcp"))
+    {
+     /*
+      * Use the service instance name...
+      */
+
+      if ((ptr = strchr(hostname, '.')) != NULL)
+        *ptr = '\0';
+
+      name = hostname;
+    }
+    else if (!strncmp(resource, "/classes/", 9))
+    {
+      snprintf(temp, sizeof(temp), "%s @ %s", resource + 9, hostname);
+      name = temp;
+    }
+    else if (!strncmp(resource, "/printers/", 10))
+    {
+      snprintf(temp, sizeof(temp), "%s @ %s", resource + 10, hostname);
+      name = temp;
+    }
+    else
+    {
+      name = 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("printer-uri-supported", uri, dest->num_options, &(dest->options));
+  dest->num_options = cupsAddOption("printer-info", name, dest->num_options, &(dest->options));
+
+  return (dest);
+}
+
+
+/*
  * '_cupsGetDests()' - Get destinations from a server.
  *
- * "op" is CUPS_GET_PRINTERS to get a full list, CUPS_GET_DEFAULT to get the
- * system-wide default printer, or IPP_GET_PRINTER_ATTRIBUTES for a known
- * printer.
+ * "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_GET_PRINTER_ATTRIBUTES.
+ * IPP_OP_GET_PRINTER_ATTRIBUTES.
  *
  * "dest" is initialized to point to the array of destinations.
  *
@@ -1409,6 +1467,7 @@ _cupsGetDests(http_t       *http, /* I  - Connection to server or
                  "printer-is-shared",
                  "printer-location",
                  "printer-make-and-model",
+                 "printer-mandatory-job-attributes",
                  "printer-name",
                  "printer-state",
                  "printer-state-change-time",
@@ -1427,13 +1486,13 @@ _cupsGetDests(http_t       *http,       /* I  - Connection to server or
 #endif /* __APPLE__ */
 
  /*
-  * Build a CUPS_GET_PRINTERS or IPP_GET_PRINTER_ATTRIBUTES request, which
+  * 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_GET_PRINTER_ATTRIBUTES]
+  *    printer-uri [for IPP_OP_GET_PRINTER_ATTRIBUTES]
   */
 
   request = ippNewRequest(op);
@@ -1445,7 +1504,7 @@ _cupsGetDests(http_t       *http, /* I  - Connection to server or
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
                "requesting-user-name", NULL, cupsUser());
 
-  if (name && op != CUPS_GET_DEFAULT)
+  if (name && op != IPP_OP_CUPS_GET_DEFAULT)
   {
     httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
                      "localhost", ippPort(), "/printers/%s", name);
@@ -1454,10 +1513,8 @@ _cupsGetDests(http_t       *http,        /* I  - Connection to server or
   }
   else if (mask)
   {
-    ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type",
-                  type);
-    ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask",
-                  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);
   }
 
  /*
@@ -1514,6 +1571,7 @@ _cupsGetDests(http_t       *http, /* I  - Connection to server or
            !strcmp(attr->name, "printer-info") ||
            !strcmp(attr->name, "printer-is-shared") ||
            !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") ||
@@ -1676,7 +1734,7 @@ cupsGetDests2(http_t      *http,  /* I - Connection to server or @code CUPS_HTTP_
 
   if (!dests)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, _("Bad NULL dests pointer"), 1);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad NULL dests pointer"), 1);
     return (0);
   }
 
@@ -1685,9 +1743,9 @@ cupsGetDests2(http_t      *http,  /* I - Connection to server or @code CUPS_HTTP_
   */
 
   *dests    = (cups_dest_t *)0;
-  num_dests = _cupsGetDests(http, CUPS_GET_PRINTERS, NULL, dests, 0, 0);
+  num_dests = _cupsGetDests(http, IPP_OP_CUPS_GET_PRINTERS, NULL, dests, 0, CUPS_PRINTER_3D);
 
-  if (cupsLastError() >= IPP_REDIRECTION_OTHER_SITE)
+  if (cupsLastError() >= IPP_STATUS_REDIRECTION_OTHER_SITE)
   {
     cupsFreeDests(num_dests, *dests);
     *dests = (cups_dest_t *)0;
@@ -1701,10 +1759,10 @@ cupsGetDests2(http_t      *http,        /* I - Connection to server or @code CUPS_HTTP_
   if (num_dests > 0)
   {
     num_reals = num_dests;
-    reals     = calloc(num_reals, sizeof(cups_dest_t));
+    reals     = calloc((size_t)num_reals, sizeof(cups_dest_t));
 
     if (reals)
-      memcpy(reals, *dests, num_reals * sizeof(cups_dest_t));
+      memcpy(reals, *dests, (size_t)num_reals * sizeof(cups_dest_t));
     else
       num_reals = 0;
   }
@@ -1803,7 +1861,7 @@ cupsGetDests2(http_t      *http,  /* I - Connection to server or @code CUPS_HTTP_
   */
 
   if (num_dests > 0)
-    _cupsSetError(IPP_OK, NULL, 0);
+    _cupsSetError(IPP_STATUS_OK, NULL, 0);
 
   return (num_dests);
 }
@@ -1840,7 +1898,7 @@ cupsGetNamedDest(http_t     *http,        /* I - Connection to server or @code CUPS_HTT
                defname[256];           /* Default printer name */
   const char   *home = getenv("HOME"); /* Home directory */
   int          set_as_default = 0;     /* Set returned destination as default */
-  ipp_op_t     op = IPP_GET_PRINTER_ATTRIBUTES;
+  ipp_op_t     op = IPP_OP_GET_PRINTER_ATTRIBUTES;
                                        /* IPP operation to get server ops */
   _cups_globals_t *cg = _cupsGlobals();        /* Pointer to library globals */
 
@@ -1894,7 +1952,7 @@ cupsGetNamedDest(http_t     *http,        /* I - Connection to server or @code CUPS_HTT
       * No locally-set default destination, ask the server...
       */
 
-      op = CUPS_GET_DEFAULT;
+      op = IPP_OP_CUPS_GET_DEFAULT;
     }
   }
 
@@ -1902,7 +1960,7 @@ cupsGetNamedDest(http_t     *http,        /* I - Connection to server or @code CUPS_HTT
   * Get the printer's attributes...
   */
 
-  if (!_cupsGetDests(http, op, name, &dest, 0, 0))
+  if (!_cupsGetDests(http, op, name, &dest, 0, CUPS_PRINTER_3D))
     return (NULL);
 
   if (instance)
@@ -1975,10 +2033,10 @@ cupsRemoveDest(const char  *name,       /* I  - Destination name */
 
   num_dests --;
 
-  i = dest - *dests;
+  i = (int)(dest - *dests);
 
   if (i < num_dests)
-    memmove(dest, dest + 1, (num_dests - i) * sizeof(cups_dest_t));
+    memmove(dest, dest + 1, (size_t)(num_dests - i) * sizeof(cups_dest_t));
 
   return (num_dests);
 }
@@ -2078,9 +2136,9 @@ cupsSetDests2(http_t      *http,  /* I - Connection to server or @code CUPS_HTTP_
   * Get the server destinations...
   */
 
-  num_temps = _cupsGetDests(http, CUPS_GET_PRINTERS, NULL, &temps, 0, 0);
+  num_temps = _cupsGetDests(http, IPP_OP_CUPS_GET_PRINTERS, NULL, &temps, 0, CUPS_PRINTER_3D);
 
-  if (cupsLastError() >= IPP_REDIRECTION_OTHER_SITE)
+  if (cupsLastError() >= IPP_STATUS_REDIRECTION_OTHER_SITE)
   {
     cupsFreeDests(num_temps, temps);
     return (-1);
@@ -2312,7 +2370,7 @@ _cupsUserDefault(char   *name,            /* I - Name buffer */
 
   if ((locprinter = _cupsAppleCopyDefaultPrinter()) != NULL)
   {
-    CFStringGetCString(locprinter, name, namesize, kCFStringEncodingUTF8);
+    CFStringGetCString(locprinter, name, (CFIndex)namesize, kCFStringEncodingUTF8);
     CFRelease(locprinter);
   }
   else
@@ -2437,7 +2495,7 @@ appleGetPaperSize(char *name,             /* I - Paper size name buffer */
                   int  namesize)       /* I - Size of buffer */
 {
   CFStringRef  defaultPaperID;         /* Default paper ID */
-  _pwg_media_t *pwgmedia;              /* PWG media size */
+  pwg_media_t  *pwgmedia;              /* PWG media size */
 
 
   defaultPaperID = _cupsAppleCopyDefaultPaperID();
@@ -2446,7 +2504,7 @@ appleGetPaperSize(char *name,             /* I - Paper size name buffer */
       !CFStringGetCString(defaultPaperID, name, namesize,
                          kCFStringEncodingUTF8))
     name[0] = '\0';
-  else if ((pwgmedia = _pwgMediaForLegacy(name)) != NULL)
+  else if ((pwgmedia = pwgMediaForLegacy(name)) != NULL)
     strlcpy(name, pwgmedia->pwg, namesize);
 
   if (defaultPaperID)
@@ -2520,7 +2578,7 @@ cups_add_dest(const char  *name,  /* I  - Name of destination */
   if (*num_dests == 0)
     dest = malloc(sizeof(cups_dest_t));
   else
-    dest = realloc(*dests, sizeof(cups_dest_t) * (*num_dests + 1));
+    dest = realloc(*dests, sizeof(cups_dest_t) * (size_t)(*num_dests + 1));
 
   if (!dest)
     return (NULL);
@@ -2547,8 +2605,7 @@ cups_add_dest(const char  *name,  /* I  - Name of destination */
   */
 
   if (insert < *num_dests)
-    memmove(*dests + insert + 1, *dests + insert,
-            (*num_dests - insert) * sizeof(cups_dest_t));
+    memmove(*dests + insert + 1, *dests + insert, (size_t)(*num_dests - insert) * sizeof(cups_dest_t));
 
   (*num_dests) ++;
 
@@ -3133,7 +3190,7 @@ cups_dnssd_query_cb(
     device->state     = _CUPS_DNSSD_PENDING;
     make_and_model[0] = '\0';
 
-    strcpy(model, "Unknown");
+    strlcpy(model, "Unknown", sizeof(model));
 
     for (txt = rdata, txtend = txt + rdlen;
         txt < txtend;
@@ -3153,7 +3210,7 @@ cups_dnssd_query_cb(
       txtnext = txt + txtlen;
 
       for (ptr = key; txt < txtnext && *txt != '='; txt ++)
-       *ptr++ = *txt;
+       *ptr++ = (char)*txt;
       *ptr = '\0';
 
       if (txt < txtnext && *txt == '=')
@@ -3161,7 +3218,7 @@ cups_dnssd_query_cb(
        txt ++;
 
        if (txt < txtnext)
-         memcpy(value, txt, txtnext - txt);
+         memcpy(value, txt, (size_t)(txtnext - txt));
        value[txtnext - txt] = '\0';
 
        DEBUG_printf(("6cups_dnssd_query_cb: %s=%s", key, value));
@@ -3175,10 +3232,10 @@ cups_dnssd_query_cb(
       if (!_cups_strcasecmp(key, "usb_MFG") ||
           !_cups_strcasecmp(key, "usb_MANU") ||
          !_cups_strcasecmp(key, "usb_MANUFACTURER"))
-       strcpy(make_and_model, value);
+       strlcpy(make_and_model, value, sizeof(make_and_model));
       else if (!_cups_strcasecmp(key, "usb_MDL") ||
                !_cups_strcasecmp(key, "usb_MODEL"))
-       strcpy(model, value);
+       strlcpy(model, value, sizeof(model));
       else if (!_cups_strcasecmp(key, "product") && !strstr(value, "Ghostscript"))
       {
        if (value[0] == '(')
@@ -3190,14 +3247,14 @@ cups_dnssd_query_cb(
          if ((ptr = value + strlen(value) - 1) > value && *ptr == ')')
            *ptr = '\0';
 
-         strcpy(model, value + 1);
+         strlcpy(model, value + 1, sizeof(model));
        }
        else
-         strcpy(model, value);
+         strlcpy(model, value, sizeof(model));
       }
       else if (!_cups_strcasecmp(key, "ty"))
       {
-       strcpy(model, value);
+       strlcpy(model, value, sizeof(model));
 
        if ((ptr = strchr(model, ',')) != NULL)
          *ptr = '\0';
@@ -3238,7 +3295,7 @@ cups_dnssd_query_cb(
         */
 
        saw_printer_type = 1;
-        type             = strtol(value, NULL, 0);
+        type             = (cups_ptype_t)strtol(value, NULL, 0);
       }
       else if (!saw_printer_type)
       {
@@ -3386,7 +3443,7 @@ cups_dnssd_resolve(
                             _HTTP_RESOLVE_FQDN, cups_dnssd_resolve_cb,
                             &resolve)) == NULL)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, _("Unable to resolve printer URI."), 1);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to resolve printer-uri."), 1);
 
     if (cb)
       (*cb)(user_data, CUPS_DEST_FLAGS_UNCONNECTED | CUPS_DEST_FLAGS_ERROR,
@@ -3840,22 +3897,21 @@ cups_make_string(
     {
       case IPP_TAG_INTEGER :
       case IPP_TAG_ENUM :
-         snprintf(ptr, end - ptr + 1, "%d", attr->values[i].integer);
+         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", end - ptr + 1);
+           strlcpy(ptr, "true", (size_t)(end - ptr + 1));
          else
-           strlcpy(ptr, "false", end - ptr + 1);
+           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, end - ptr + 1, "%d", attr->values[i].range.lower);
+           snprintf(ptr, (size_t)(end - ptr + 1), "%d", attr->values[i].range.lower);
          else
-           snprintf(ptr, end - ptr + 1, "%d-%d", attr->values[i].range.lower,
-                    attr->values[i].range.upper);
+           snprintf(ptr, (size_t)(end - ptr + 1), "%d-%d", attr->values[i].range.lower, attr->values[i].range.upper);
          break;
 
       default :
@@ -3887,5 +3943,5 @@ cups_make_string(
 
 
 /*
- * End of "$Id: dest.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dest.c 12733 2015-06-12 01:21:05Z msweet $".
  */
index ede139d..1bae123 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: dir.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dir.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Directory routines for CUPS.
  *
@@ -468,5 +468,5 @@ cupsDirRewind(cups_dir_t *dp)               /* I - Directory pointer */
 #endif /* WIN32 */
 
 /*
- * End of "$Id: dir.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dir.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index a16871f..ad8278c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: dir.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dir.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Public directory definitions for CUPS.
  *
@@ -65,5 +65,5 @@ extern void           cupsDirRewind(cups_dir_t *dp) _CUPS_API_1_2;
 #endif /* !_CUPS_DIR_H_ */
 
 /*
- * End of "$Id: dir.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dir.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index 15f2fcd..b1ad410 100644 (file)
@@ -1,37 +1,20 @@
 /*
- * "$Id: emit.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: emit.c 11594 2014-02-14 20:09:01Z msweet $"
  *
- *   PPD code emission routines for CUPS.
+ * PPD code emission routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   PostScript is a trademark of Adobe Systems, Inc.
+ * PostScript is a trademark of Adobe Systems, Inc.
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   ppdCollect()          - Collect all marked options that reside in the
- *                           specified section.
- *   ppdCollect2()         - Collect all marked options that reside in the
- *                           specified section and minimum order.
- *   ppdEmit()             - Emit code for marked options to a file.
- *   ppdEmitAfterOrder()   - Emit a subset of the code for marked options to a
- *                           file.
- *   ppdEmitFd()           - Emit code for marked options to a file.
- *   ppdEmitJCL()          - Emit code for JCL options to a file.
- *   ppdEmitJCLEnd()       - Emit JCLEnd code to a file.
- *   ppdEmitString()       - Get a string containing the code for marked
- *                           options.
- *   ppd_compare_cparams() - Compare the order of two custom parameters.
- *   ppd_handle_media()    - Handle media selection...
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -121,13 +104,13 @@ ppdCollect2(ppd_file_t    *ppd,           /* I - PPD file data */
 
   count = 0;
   if ((collect = calloc(sizeof(ppd_choice_t *),
-                        cupsArrayCount(ppd->marked))) == NULL)
+                        (size_t)cupsArrayCount(ppd->marked))) == NULL)
   {
     *choices = NULL;
     return (0);
   }
 
-  if ((orders = calloc(sizeof(float), cupsArrayCount(ppd->marked))) == NULL)
+  if ((orders = calloc(sizeof(float), (size_t)cupsArrayCount(ppd->marked))) == NULL)
   {
     *choices = NULL;
     free(collect);
@@ -358,7 +341,7 @@ ppdEmitFd(ppd_file_t    *ppd,               /* I - PPD file record */
        break;
       }
 
-      buflength -= bytes;
+      buflength -= (size_t)bytes;
       bufptr    += bytes;
     }
 
@@ -831,8 +814,7 @@ ppdEmitString(ppd_file_t    *ppd,   /* I - PPD file record */
                      break;
 
                  case PPD_CUSTOM_INT :
-                     snprintf(bufptr, bufend - bufptr, "%d",
-                              cparam->current.custom_int);
+                     snprintf(bufptr, (size_t)(bufend - bufptr), "%d", cparam->current.custom_int);
                      bufptr += strlen(bufptr);
                      break;
 
@@ -841,8 +823,7 @@ ppdEmitString(ppd_file_t    *ppd,   /* I - PPD file record */
                  case PPD_CUSTOM_STRING :
                      if (cparam->current.custom_string)
                      {
-                       strlcpy(bufptr, cparam->current.custom_string,
-                               bufend - bufptr);
+                       strlcpy(bufptr, cparam->current.custom_string, (size_t)(bufend - bufptr));
                        bufptr += strlen(bufptr);
                      }
                      break;
@@ -862,7 +843,7 @@ ppdEmitString(ppd_file_t    *ppd,   /* I - PPD file record */
         * Otherwise just copy the option code directly...
        */
 
-        strlcpy(bufptr, choices[i]->code, bufend - bufptr + 1);
+        strlcpy(bufptr, choices[i]->code, (size_t)(bufend - bufptr + 1));
         bufptr += strlen(bufptr);
       }
     }
@@ -873,7 +854,7 @@ ppdEmitString(ppd_file_t    *ppd,   /* I - PPD file record */
       * options...
       */
 
-      strlcpy(bufptr, "[{\n", bufend - bufptr + 1);
+      strlcpy(bufptr, "[{\n", (size_t)(bufend - bufptr + 1));
       bufptr += 3;
 
      /*
@@ -898,8 +879,7 @@ ppdEmitString(ppd_file_t    *ppd,   /* I - PPD file record */
        float           values[5];      /* Values for custom command */
 
 
-        strlcpy(bufptr, "%%BeginFeature: *CustomPageSize True\n",
-               bufend - bufptr + 1);
+        strlcpy(bufptr, "%%BeginFeature: *CustomPageSize True\n", (size_t)(bufend - bufptr + 1));
         bufptr += 37;
 
         size = ppdPageSize(ppd, "Custom");
@@ -994,7 +974,7 @@ ppdEmitString(ppd_file_t    *ppd,   /* I - PPD file record */
          * Level 2 command sequence...
          */
 
-         strlcpy(bufptr, ppd_custom_code, bufend - bufptr + 1);
+         strlcpy(bufptr, ppd_custom_code, (size_t)(bufend - bufptr + 1));
           bufptr += strlen(bufptr);
        }
       }
@@ -1017,8 +997,7 @@ ppdEmitString(ppd_file_t    *ppd,  /* I - PPD file record */
             cparam = (ppd_cparam_t *)cupsArrayNext(coption->params))
           cupsArrayAdd(params, cparam);
 
-        snprintf(bufptr, bufend - bufptr + 1,
-                "%%%%BeginFeature: *Custom%s True\n", coption->keyword);
+        snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%%%%BeginFeature: *Custom%s True\n", coption->keyword);
         bufptr += strlen(bufptr);
 
         for (cparam = (ppd_cparam_t *)cupsArrayFirst(params);
@@ -1037,8 +1016,7 @@ ppdEmitString(ppd_file_t    *ppd, /* I - PPD file record */
                break;
 
            case PPD_CUSTOM_INT :
-               snprintf(bufptr, bufend - bufptr + 1, "%d\n",
-                        cparam->current.custom_int);
+               snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d\n", cparam->current.custom_int);
                bufptr += strlen(bufptr);
                break;
 
@@ -1053,7 +1031,7 @@ ppdEmitString(ppd_file_t    *ppd, /* I - PPD file record */
                  {
                    if (*s < ' ' || *s == '(' || *s == ')' || *s >= 127)
                    {
-                     snprintf(bufptr, bufend - bufptr + 1, "\\%03o", *s & 255);
+                     snprintf(bufptr, (size_t)(bufend - bufptr + 1), "\\%03o", *s & 255);
                      bufptr += strlen(bufptr);
                    }
                    else
@@ -1071,15 +1049,14 @@ ppdEmitString(ppd_file_t    *ppd,       /* I - PPD file record */
       }
       else
       {
-        snprintf(bufptr, bufend - bufptr + 1, "%%%%BeginFeature: *%s %s\n",
-                 choices[i]->option->keyword, choices[i]->choice);
+        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, j);
+       memcpy(bufptr, choices[i]->code, (size_t)j);
        bufptr += j;
 
        if (choices[i]->code[j - 1] != '\n')
@@ -1087,7 +1064,7 @@ ppdEmitString(ppd_file_t    *ppd, /* I - PPD file record */
       }
 
       strlcpy(bufptr, "%%EndFeature\n"
-                     "} stopped cleartomark\n", bufend - bufptr + 1);
+                     "} stopped cleartomark\n", (size_t)(bufend - bufptr + 1));
       bufptr += strlen(bufptr);
 
       DEBUG_printf(("2ppdEmitString: Offset in string is %d...",
@@ -1095,7 +1072,7 @@ ppdEmitString(ppd_file_t    *ppd, /* I - PPD file record */
     }
     else
     {
-      strlcpy(bufptr, choices[i]->code, bufend - bufptr + 1);
+      strlcpy(bufptr, choices[i]->code, (size_t)(bufend - bufptr + 1));
       bufptr += strlen(bufptr);
     }
 
@@ -1225,5 +1202,5 @@ ppd_handle_media(ppd_file_t *ppd) /* I - PPD file */
 
 
 /*
- * End of "$Id: emit.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: emit.c 11594 2014-02-14 20:09:01Z msweet $".
  */
index ee0f955..b43c4a3 100644 (file)
@@ -1,26 +1,18 @@
 /*
- * "$Id: encode.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: encode.c 12668 2015-05-27 19:30:32Z msweet $"
  *
- *   Option encoding routines for CUPS.
+ * Option encoding routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsEncodeOptions()   - Encode printer options into IPP attributes.
- *   cupsEncodeOptions2()  - Encode printer options into IPP attributes for
- *                           a group.
- *   _ippFindOption()      - Find the attribute information for an option.
- *   compare_ipp_options() - Compare two IPP options.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
 
 
 /*
- * Local list of option names and the value tags they should use...
+ * Local list of option names, the value tags they should use, and the list of
+ * supported operations...
  *
- * **** THIS LIST MUST BE SORTED ****
+ * **** 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 },
@@ -46,18 +111,29 @@ static const _ipp_option_t ipp_options[] =
   { 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 },
+  { 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 },
-  { 0, "document-format",      IPP_TAG_MIMETYPE,       IPP_TAG_OPERATION },
+                                                       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 },
-  { 1, "exclude-schemes",      IPP_TAG_NAME,           IPP_TAG_OPERATION },
+                                                       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-default",   IPP_TAG_ENUM,           IPP_TAG_PRINTER },
@@ -70,7 +146,17 @@ static const _ipp_option_t ipp_options[] =
   { 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 },
+  { 1, "include-schemes",      IPP_TAG_NAME,           IPP_TAG_OPERATION,
+                                                       IPP_TAG_ZERO,
+                                                       cups_schemes },
+  { 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-id",               IPP_TAG_INTEGER,        IPP_TAG_ZERO }, /* never send as option */
   { 0, "job-impressions",      IPP_TAG_INTEGER,        IPP_TAG_ZERO }, /* never send as option */
   { 0, "job-impressions-completed", IPP_TAG_INTEGER,   IPP_TAG_ZERO }, /* never send as option */
@@ -80,6 +166,12 @@ static const _ipp_option_t ipp_options[] =
   { 0, "job-media-sheets",     IPP_TAG_INTEGER,        IPP_TAG_ZERO }, /* never send as option */
   { 0, "job-media-sheets-completed", IPP_TAG_INTEGER,  IPP_TAG_ZERO }, /* never send as option */
   { 0, "job-page-limit",       IPP_TAG_INTEGER,        IPP_TAG_PRINTER },
+  { 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-quota-period",     IPP_TAG_INTEGER,        IPP_TAG_PRINTER },
   { 1, "job-sheets",           IPP_TAG_NAME,           IPP_TAG_JOB },
@@ -149,7 +241,33 @@ static const _ipp_option_t ipp_options[] =
   { 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-name",             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 },
@@ -159,6 +277,7 @@ static const _ipp_option_t ipp_options[] =
   { 0, "print-quality-default",        IPP_TAG_ENUM,           IPP_TAG_PRINTER },
   { 1, "printer-commands",     IPP_TAG_KEYWORD,        IPP_TAG_PRINTER },
   { 0, "printer-error-policy", IPP_TAG_NAME,           IPP_TAG_PRINTER },
+  { 0, "printer-geo-location", IPP_TAG_URI,            IPP_TAG_PRINTER },
   { 0, "printer-info",         IPP_TAG_TEXT,           IPP_TAG_PRINTER },
   { 0, "printer-is-accepting-jobs", IPP_TAG_BOOLEAN,   IPP_TAG_PRINTER },
   { 0, "printer-is-shared",    IPP_TAG_BOOLEAN,        IPP_TAG_PRINTER },
@@ -249,23 +368,27 @@ cupsEncodeOptions2(
     cups_option_t *options,            /* I - Options */
     ipp_tag_t     group_tag)           /* I - Group to encode */
 {
-  int          i, j;                   /* Looping vars */
-  int          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 */
-  cups_option_t        *option;                /* Current option */
-  ipp_t                *collection;            /* Collection value */
-  int          num_cols;               /* Number of collection values */
-  cups_option_t        *cols;                  /* Collection values */
-
-
-  DEBUG_printf(("cupsEncodeOptions2(ipp=%p, num_options=%d, options=%p, "
-                "group_tag=%x)", ipp, num_options, options, group_tag));
+  int                  i, j;           /* Looping vars */
+  int                  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 */
+  cups_option_t                *option;        /* Current option */
+  ipp_t                        *collection;    /* Collection value */
+  int                  num_cols;       /* Number of collection values */
+  cups_option_t                *cols;          /* Collection values */
+  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)", ipp,
+                ipp ? ippOpString(ippGetOperation(ipp)) : "", num_options,
+                options, group_tag));
 
  /*
   * Range check input...
@@ -278,13 +401,18 @@ cupsEncodeOptions2(
   * Do special handling for the document-format/raw options...
   */
 
-  if (group_tag == IPP_TAG_OPERATION)
+  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)
+    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))
@@ -323,6 +451,22 @@ cupsEncodeOptions2(
         continue;
 
       value_tag = match->value_tag;
+
+      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
     {
@@ -336,10 +480,23 @@ cupsEncodeOptions2(
            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;
 
       if (!_cups_strcasecmp(option->value, "true") ||
           !_cups_strcasecmp(option->value, "false"))
@@ -349,6 +506,22 @@ cupsEncodeOptions2(
     }
 
    /*
+    * 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;
+    }
+
+   /*
     * Count the number of values...
     */
 
@@ -480,7 +653,7 @@ cupsEncodeOptions2(
            * Integer/enumeration value...
            */
 
-            attr->values[j].integer = strtol(val, &s, 10);
+            attr->values[j].integer = (int)strtol(val, &s, 10);
 
             DEBUG_printf(("2cupsEncodeOptions2: Added integer option value "
                          "%d...", attr->values[j].integer));
@@ -522,12 +695,12 @@ cupsEncodeOptions2(
              s = val;
            }
            else
-             attr->values[j].range.lower = strtol(val, &s, 10);
+             attr->values[j].range.lower = (int)strtol(val, &s, 10);
 
            if (*s == '-')
            {
              if (s[1])
-               attr->values[j].range.upper = strtol(s + 1, NULL, 10);
+               attr->values[j].range.upper = (int)strtol(s + 1, NULL, 10);
              else
                attr->values[j].range.upper = 2147483647;
             }
@@ -544,10 +717,10 @@ cupsEncodeOptions2(
            * Resolution...
            */
 
-           attr->values[j].resolution.xres = strtol(val, &s, 10);
+           attr->values[j].resolution.xres = (int)strtol(val, &s, 10);
 
            if (*s == 'x')
-             attr->values[j].resolution.yres = strtol(s + 1, &s, 10);
+             attr->values[j].resolution.yres = (int)strtol(s + 1, &s, 10);
            else
              attr->values[j].resolution.yres = attr->values[j].resolution.xres;
 
@@ -623,6 +796,26 @@ cupsEncodeOptions2(
 }
 
 
+#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.
  */
@@ -660,5 +853,5 @@ compare_ipp_options(_ipp_option_t *a,       /* I - First option */
 
 
 /*
- * End of "$Id: encode.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: encode.c 12668 2015-05-27 19:30:32Z msweet $".
  */
index ed61700..7a34207 100644 (file)
@@ -1,21 +1,23 @@
 /*
- * "$Id: file-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: file-private.h 11627 2014-02-20 16:15:09Z msweet $"
  *
- *   Private file definitions for CUPS.
+ * 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
- *   gzip'd print files, PPD files, etc.
+ * 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
+ * gzip'd print files, PPD files, etc.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_FILE_PRIVATE_H_
@@ -133,5 +135,5 @@ extern void                 _cupsFileCheckFilter(void *context,
 #endif /* !_CUPS_FILE_PRIVATE_H_ */
 
 /*
- * End of "$Id: file-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: file-private.h 11627 2014-02-20 16:15:09Z msweet $".
  */
index 062d1a2..a69f0f9 100644 (file)
@@ -1,61 +1,23 @@
 /*
- * "$Id: file.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: file.c 12641 2015-05-19 15:04:39Z msweet $"
  *
- *   File functions for CUPS.
+ * 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
- *   gzip'd print files, PPD files, etc.
+ * 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
+ * gzip'd print files, PPD files, etc.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- * Contents:
- *
- *   _cupsFileCheck()       - Check the permissions of the given filename.
- *   _cupsFileCheckFilter() - Report file check results as CUPS filter messages.
- *   cupsFileClose()        - Close a CUPS file.
- *   cupsFileCompression()  - Return whether a file is compressed.
- *   cupsFileEOF()          - Return the end-of-file status.
- *   cupsFileFind()         - Find a file using the specified path.
- *   cupsFileFlush()        - Flush pending output.
- *   cupsFileGetChar()      - Get a single character from a file.
- *   cupsFileGetConf()      - Get a line from a configuration file.
- *   cupsFileGetLine()      - Get a CR and/or LF-terminated line that may
- *                            contain binary data.
- *   cupsFileGets()         - Get a CR and/or LF-terminated line.
- *   cupsFileLock()         - Temporarily lock access to a file.
- *   cupsFileNumber()       - Return the file descriptor associated with a CUPS
- *                            file.
- *   cupsFileOpen()         - Open a CUPS file.
- *   cupsFileOpenFd()       - Open a CUPS file using a file descriptor.
- *   cupsFilePeekChar()     - Peek at the next character from a file.
- *   cupsFilePrintf()       - Write a formatted string.
- *   cupsFilePutChar()      - Write a character.
- *   cupsFilePutConf()      - Write a configuration line.
- *   cupsFilePuts()         - Write a string.
- *   cupsFileRead()         - Read from a file.
- *   cupsFileRewind()       - Set the current file position to the beginning of
- *                            the file.
- *   cupsFileSeek()         - Seek in a file.
- *   cupsFileStderr()       - Return a CUPS file associated with stderr.
- *   cupsFileStdin()        - Return a CUPS file associated with stdin.
- *   cupsFileStdout()       - Return a CUPS file associated with stdout.
- *   cupsFileTell()         - Return the current file position.
- *   cupsFileUnlock()       - Unlock access to a file.
- *   cupsFileWrite()        - Write to a file.
- *   cups_compress()        - Compress a buffer of data.
- *   cups_fill()            - Fill the input buffer.
- *   cups_open()            - Safely open a file for writing.
- *   cups_read()            - Read from a file descriptor.
- *   cups_write()           - Write to a file descriptor.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -410,7 +372,7 @@ cupsFileClose(cups_file_t *fp)              /* I - CUPS file */
         if (fp->stream.next_out > fp->cbuf)
        {
          if (cups_write(fp, (char *)fp->cbuf,
-                        fp->stream.next_out - fp->cbuf) < 0)
+                        (size_t)(fp->stream.next_out - fp->cbuf)) < 0)
            status = -1;
 
          fp->stream.next_out  = fp->cbuf;
@@ -428,14 +390,14 @@ cupsFileClose(cups_file_t *fp)            /* I - CUPS file */
       * Write the CRC and length...
       */
 
-      trailer[0] = fp->crc;
-      trailer[1] = fp->crc >> 8;
-      trailer[2] = fp->crc >> 16;
-      trailer[3] = fp->crc >> 24;
-      trailer[4] = fp->pos;
-      trailer[5] = fp->pos >> 8;
-      trailer[6] = fp->pos >> 16;
-      trailer[7] = fp->pos >> 24;
+      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;
@@ -468,7 +430,7 @@ cupsFileClose(cups_file_t *fp)              /* I - CUPS file */
 
   if (mode == 's')
   {
-    if (closesocket(fd) < 0)
+    if (httpAddrClose(NULL, fd) < 0)
       status = -1;
   }
   else if (!is_stdio)
@@ -549,7 +511,7 @@ cupsFileFind(const char *filename,  /* I - File to find */
 
     if (!access(filename, 0))
     {
-      strlcpy(buffer, filename, bufsize);
+      strlcpy(buffer, filename, (size_t)bufsize);
       return (buffer);
     }
     else
@@ -574,7 +536,7 @@ cupsFileFind(const char *filename,  /* I - File to find */
       if (bufptr > buffer && bufptr[-1] != '/' && bufptr < bufend)
         *bufptr++ = '/';
 
-      strlcpy(bufptr, filename, bufend - bufptr);
+      strlcpy(bufptr, filename, (size_t)(bufend - bufptr));
 
 #ifdef WIN32
       if (!access(buffer, 0))
@@ -601,7 +563,7 @@ cupsFileFind(const char *filename,  /* I - File to find */
   if (bufptr > buffer && bufptr[-1] != '/' && bufptr < bufend)
     *bufptr++ = '/';
 
-  strlcpy(bufptr, filename, bufend - bufptr);
+  strlcpy(bufptr, filename, (size_t)(bufend - bufptr));
 
   if (!access(buffer, 0))
   {
@@ -649,10 +611,10 @@ cupsFileFlush(cups_file_t *fp)            /* I - CUPS file */
   {
 #ifdef HAVE_LIBZ
     if (fp->compressed)
-      bytes = cups_compress(fp, fp->buf, bytes);
+      bytes = cups_compress(fp, fp->buf, (size_t)bytes);
     else
 #endif /* HAVE_LIBZ */
-      bytes = cups_write(fp, fp->buf, bytes);
+      bytes = cups_write(fp, fp->buf, (size_t)bytes);
 
     if (bytes < 0)
       return (-1);
@@ -677,6 +639,8 @@ cupsFileGetChar(cups_file_t *fp)    /* I - CUPS file */
   * Range check input...
   */
 
+  DEBUG_printf(("4cupsFileGetChar(fp=%p)", fp));
+
   if (!fp || (fp->mode != 'r' && fp->mode != 's'))
   {
     DEBUG_puts("5cupsFileGetChar: Bad arguments!");
@@ -687,8 +651,10 @@ cupsFileGetChar(cups_file_t *fp)   /* I - CUPS file */
   * 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, fp->ptr, fp->end));
+
   if (fp->ptr >= fp->end)
-    if (cups_fill(fp) < 0)
+    if (cups_fill(fp) <= 0)
     {
       DEBUG_puts("5cupsFileGetChar: Unable to fill buffer!");
       return (-1);
@@ -923,7 +889,7 @@ cupsFileGetLine(cups_file_t *fp,    /* I - File to read from */
 
   DEBUG_printf(("4cupsFileGetLine: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos));
 
-  return (ptr - buf);
+  return ((size_t)(ptr - buf));
 }
 
 
@@ -998,7 +964,7 @@ cupsFileGets(cups_file_t *fp,               /* I - CUPS file */
       break;
     }
     else
-      *ptr++ = ch;
+      *ptr++ = (char)ch;
   }
 
   *ptr = '\0';
@@ -1170,7 +1136,7 @@ cupsFileOpen(const char *filename,        /* I - Name of file */
   if ((fp = cupsFileOpenFd(fd, mode)) == NULL)
   {
     if (*mode == 's')
-      closesocket(fd);
+      httpAddrClose(NULL, fd);
     else
       close(fd);
   }
@@ -1253,10 +1219,10 @@ cupsFileOpenFd(int        fd,           /* I - File descriptor */
          header[1] = 0x8b;
          header[2] = Z_DEFLATED;
          header[3] = 0;
-         header[4] = curtime;
-         header[5] = curtime >> 8;
-         header[6] = curtime >> 16;
-         header[7] = curtime >> 24;
+         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;
 
@@ -1322,7 +1288,7 @@ cupsFilePeekChar(cups_file_t *fp) /* I - CUPS file */
   */
 
   if (fp->ptr >= fp->end)
-    if (cups_fill(fp) < 0)
+    if (cups_fill(fp) <= 0)
       return (-1);
 
  /*
@@ -1381,11 +1347,11 @@ cupsFilePrintf(cups_file_t *fp,         /* I - CUPS file */
     if (bytes > 65535)
       return (-1);
 
-    if ((temp = realloc(fp->printf_buffer, bytes + 1)) == NULL)
+    if ((temp = realloc(fp->printf_buffer, (size_t)(bytes + 1))) == NULL)
       return (-1);
 
     fp->printf_buffer = temp;
-    fp->printf_size   = bytes + 1;
+    fp->printf_size   = (size_t)(bytes + 1);
 
     va_start(ap, format);
     bytes = vsnprintf(fp->printf_buffer, fp->printf_size, format, ap);
@@ -1394,14 +1360,14 @@ cupsFilePrintf(cups_file_t *fp,         /* I - CUPS file */
 
   if (fp->mode == 's')
   {
-    if (cups_write(fp, fp->printf_buffer, bytes) < 0)
+    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 (bytes);
+    return ((int)bytes);
   }
 
   if ((fp->ptr + bytes) > fp->end)
@@ -1412,20 +1378,20 @@ cupsFilePrintf(cups_file_t *fp,         /* I - CUPS file */
 
   DEBUG_printf(("4cupsFilePrintf: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos));
 
-  if (bytes > sizeof(fp->buf))
+  if ((size_t)bytes > sizeof(fp->buf))
   {
 #ifdef HAVE_LIBZ
     if (fp->compressed)
-      return (cups_compress(fp, fp->printf_buffer, bytes));
+      return ((int)cups_compress(fp, fp->printf_buffer, (size_t)bytes));
     else
 #endif /* HAVE_LIBZ */
-      return (cups_write(fp, fp->printf_buffer, bytes));
+      return ((int)cups_write(fp, fp->printf_buffer, (size_t)bytes));
   }
   else
   {
-    memcpy(fp->ptr, fp->printf_buffer, bytes);
+    memcpy(fp->ptr, fp->printf_buffer, (size_t)bytes);
     fp->ptr += bytes;
-    return (bytes);
+    return ((int)bytes);
   }
 }
 
@@ -1456,7 +1422,7 @@ cupsFilePutChar(cups_file_t *fp,  /* I - CUPS file */
     char ch;                           /* Output character */
 
 
-    ch = c;
+    ch = (char)c;
 
     if (send(fp->fd, &ch, 1, 0) < 1)
       return (-1);
@@ -1471,7 +1437,7 @@ cupsFilePutChar(cups_file_t *fp,  /* I - CUPS file */
       if (cupsFileFlush(fp))
        return (-1);
 
-    *(fp->ptr) ++ = c;
+    *(fp->ptr) ++ = (char)c;
   }
 
   fp->pos ++;
@@ -1518,7 +1484,7 @@ cupsFilePutConf(cups_file_t *fp,  /* I - CUPS file */
       * Need to quote the first # in the info string...
       */
 
-      if ((temp = cupsFileWrite(fp, value, ptr - value)) < 0)
+      if ((temp = cupsFileWrite(fp, value, (size_t)(ptr - value))) < 0)
         return (-1);
       bytes += temp;
 
@@ -1569,18 +1535,18 @@ cupsFilePuts(cups_file_t *fp,           /* I - CUPS file */
   * Write the string...
   */
 
-  bytes = (int)strlen(s);
+  bytes = (ssize_t)strlen(s);
 
   if (fp->mode == 's')
   {
-    if (cups_write(fp, s, bytes) < 0)
+    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 (bytes);
+    return ((int)bytes);
   }
 
   if ((fp->ptr + bytes) > fp->end)
@@ -1591,20 +1557,20 @@ cupsFilePuts(cups_file_t *fp,           /* I - CUPS file */
 
   DEBUG_printf(("4cupsFilePuts: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos));
 
-  if (bytes > sizeof(fp->buf))
+  if ((size_t)bytes > sizeof(fp->buf))
   {
 #ifdef HAVE_LIBZ
     if (fp->compressed)
-      return (cups_compress(fp, s, bytes));
+      return ((int)cups_compress(fp, s, (size_t)bytes));
     else
 #endif /* HAVE_LIBZ */
-      return (cups_write(fp, s, bytes));
+      return ((int)cups_write(fp, s, (size_t)bytes));
   }
   else
   {
-    memcpy(fp->ptr, s, bytes);
+    memcpy(fp->ptr, s, (size_t)bytes);
     fp->ptr += bytes;
-    return (bytes);
+    return ((int)bytes);
   }
 }
 
@@ -1660,7 +1626,7 @@ cupsFileRead(cups_file_t *fp,             /* I - CUPS file */
     if (count > (ssize_t)bytes)
       count = (ssize_t)bytes;
 
-    memcpy(buf, fp->ptr, count);
+    memcpy(buf, fp->ptr,(size_t) count);
     fp->ptr += count;
     fp->pos += count;
 
@@ -1670,8 +1636,8 @@ cupsFileRead(cups_file_t *fp,             /* I - CUPS file */
     * Update the counts for the last read...
     */
 
-    bytes -= count;
-    total += count;
+    bytes -= (size_t)count;
+    total += (size_t)count;
     buf   += count;
   }
 
@@ -1817,7 +1783,7 @@ cupsFileSeek(cups_file_t *fp,             /* I - CUPS file */
     * Preload a buffer to determine whether the file is compressed...
     */
 
-    if (cups_fill(fp) < 0)
+    if (cups_fill(fp) <= 0)
       return (-1);
   }
 #endif /* HAVE_LIBZ */
@@ -2143,14 +2109,14 @@ cups_compress(cups_file_t *fp,          /* I - CUPS file */
   * Update the CRC...
   */
 
-  fp->crc = crc32(fp->crc, (const Bytef *)buf, bytes);
+  fp->crc = crc32(fp->crc, (const Bytef *)buf, (uInt)bytes);
 
  /*
   * Deflate the bytes...
   */
 
   fp->stream.next_in  = (Bytef *)buf;
-  fp->stream.avail_in = bytes;
+  fp->stream.avail_in = (uInt)bytes;
 
   while (fp->stream.avail_in > 0)
   {
@@ -2161,9 +2127,9 @@ cups_compress(cups_file_t *fp,            /* I - CUPS file */
     DEBUG_printf(("9cups_compress: avail_in=%d, avail_out=%d",
                   fp->stream.avail_in, fp->stream.avail_out));
 
-    if (fp->stream.avail_out < (int)(sizeof(fp->cbuf) / 8))
+    if (fp->stream.avail_out < (uInt)(sizeof(fp->cbuf) / 8))
     {
-      if (cups_write(fp, (char *)fp->cbuf, fp->stream.next_out - fp->cbuf) < 0)
+      if (cups_write(fp, (char *)fp->cbuf, (size_t)(fp->stream.next_out - fp->cbuf)) < 0)
         return (-1);
 
       fp->stream.next_out  = fp->cbuf;
@@ -2173,7 +2139,7 @@ cups_compress(cups_file_t *fp,            /* I - CUPS file */
     deflate(&(fp->stream), Z_NO_FLUSH);
   }
 
-  return (bytes);
+  return ((ssize_t)bytes);
 }
 #endif /* HAVE_LIBZ */
 
@@ -2233,6 +2199,8 @@ cups_fill(cups_file_t *fp)                /* I - CUPS file */
         DEBUG_printf(("9cups_fill: cups_read() returned " CUPS_LLFMT,
                      CUPS_LLCAST bytes));
 
+        fp->eof = 1;
+
        return (-1);
       }
 
@@ -2272,6 +2240,11 @@ cups_fill(cups_file_t *fp)               /* I - CUPS file */
          * Can't read from file!
          */
 
+         DEBUG_puts("9cups_fill: Extra gzip header data missing, returning -1.");
+
+          fp->eof = 1;
+         errno   = EIO;
+
          return (-1);
        }
 
@@ -2284,6 +2257,11 @@ cups_fill(cups_file_t *fp)               /* I - CUPS file */
          * 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);
        }
       }
@@ -2305,6 +2283,11 @@ cups_fill(cups_file_t *fp)               /* I - CUPS file */
          * 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);
        }
       }
@@ -2326,6 +2309,11 @@ cups_fill(cups_file_t *fp)               /* I - CUPS file */
          * 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);
        }
       }
@@ -2344,6 +2332,11 @@ cups_fill(cups_file_t *fp)               /* I - CUPS file */
          * 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);
        }
       }
@@ -2353,7 +2346,7 @@ cups_fill(cups_file_t *fp)                /* I - CUPS file */
       */
 
       if ((bytes = end - ptr) > 0)
-        memcpy(fp->cbuf, ptr, bytes);
+        memcpy(fp->cbuf, ptr, (size_t)bytes);
 
      /*
       * Setup the decompressor data...
@@ -2364,12 +2357,19 @@ cups_fill(cups_file_t *fp)              /* I - CUPS file */
       fp->stream.opaque    = (voidpf)0;
       fp->stream.next_in   = (Bytef *)fp->cbuf;
       fp->stream.next_out  = NULL;
-      fp->stream.avail_in  = bytes;
+      fp->stream.avail_in  = (uInt)bytes;
       fp->stream.avail_out = 0;
       fp->crc              = crc32(0L, Z_NULL, 0);
 
-      if (inflateInit2(&(fp->stream), -15) != Z_OK)
+      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;
     }
@@ -2381,7 +2381,11 @@ cups_fill(cups_file_t *fp)               /* I - CUPS file */
       */
 
       if (fp->eof)
-       return (-1);
+      {
+        DEBUG_puts("9cups_fill: EOF, returning 0.");
+
+       return (0);
+      }
 
      /*
       * Fill the decompression buffer as needed...
@@ -2390,10 +2394,16 @@ cups_fill(cups_file_t *fp)              /* I - CUPS file */
       if (fp->stream.avail_in == 0)
       {
        if ((bytes = cups_read(fp, (char *)fp->cbuf, sizeof(fp->cbuf))) <= 0)
-          return (-1);
+       {
+         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 = bytes;
+       fp->stream.avail_in = (uInt)bytes;
       }
 
      /*
@@ -2407,7 +2417,7 @@ cups_fill(cups_file_t *fp)                /* I - CUPS file */
 
       if (fp->stream.next_out > (Bytef *)fp->buf)
         fp->crc = crc32(fp->crc, (Bytef *)fp->buf,
-                       fp->stream.next_out - (Bytef *)fp->buf);
+                       (uInt)(fp->stream.next_out - (Bytef *)fp->buf));
 
       if (status == Z_STREAM_END)
       {
@@ -2417,45 +2427,72 @@ cups_fill(cups_file_t *fp)              /* I - CUPS file */
 
        unsigned char   trailer[8];     /* Trailer bytes */
        uLong           tcrc;           /* Trailer CRC */
+       ssize_t         tbytes = 0;     /* Number of bytes */
 
-
-       if (read(fp->fd, trailer, sizeof(trailer)) < sizeof(trailer))
+       if (fp->stream.avail_in > 0)
        {
-        /*
-          * Can't get it, so mark end-of-file...
-         */
+         if (fp->stream.avail_in > sizeof(trailer))
+           tbytes = (ssize_t)sizeof(trailer);
+         else
+           tbytes = (ssize_t)fp->stream.avail_in;
 
-          fp->eof = 1;
+         memcpy(trailer, fp->stream.next_in, (size_t)tbytes);
+         fp->stream.next_in  += tbytes;
+         fp->stream.avail_in -= (size_t)tbytes;
        }
-       else
-       {
-         tcrc = (((((trailer[3] << 8) | trailer[2]) << 8) | trailer[1]) << 8) |
-                trailer[0];
 
-         if (tcrc != fp->crc)
+        if (tbytes < (ssize_t)sizeof(trailer))
+       {
+         if (read(fp->fd, trailer + tbytes, sizeof(trailer) - (size_t)tbytes) < ((ssize_t)sizeof(trailer) - tbytes))
          {
           /*
-            * Bad CRC, mark end-of-file...
+           * Can't get it, so mark end-of-file...
            */
 
-            DEBUG_printf(("9cups_fill: tcrc=%08x, fp->crc=%08x",
-                         (unsigned int)tcrc, (unsigned int)fp->crc));
+           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)
+       {
         /*
-         * Otherwise, reset the compressed flag so that we re-read the
-         * file header...
+         * Bad CRC, mark end-of-file...
          */
 
-         fp->compressed = 0;
+         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...
+       */
+
+       fp->compressed = 0;
       }
+      else if (status < Z_OK)
+      {
+       DEBUG_printf(("9cups_fill: inflate returned %d, returning -1.", status));
 
-      bytes = sizeof(fp->buf) - fp->stream.avail_out;
+        fp->eof = 1;
+        errno   = EIO;
+
+       return (-1);
+      }
+
+      bytes = (ssize_t)sizeof(fp->buf) - (ssize_t)fp->stream.avail_out;
 
      /*
       * Return the decompressed data...
@@ -2465,7 +2502,10 @@ cups_fill(cups_file_t *fp)               /* I - CUPS file */
       fp->end = fp->buf + bytes;
 
       if (bytes)
+      {
+        DEBUG_printf(("9cups_fill: Returning %d.", (int)bytes));
        return (bytes);
+      }
     }
   }
 #endif /* HAVE_LIBZ */
@@ -2483,17 +2523,19 @@ cups_fill(cups_file_t *fp)              /* I - CUPS file */
     fp->eof = 1;
     fp->ptr = fp->buf;
     fp->end = fp->buf;
-
-    return (-1);
   }
+  else
+  {
+   /*
+    * Return the bytes we read...
+    */
 
- /*
-  * Return the bytes we read...
-  */
+    fp->eof = 0;
+    fp->ptr = fp->buf;
+    fp->end = fp->buf + bytes;
+  }
 
-  fp->eof = 0;
-  fp->ptr = fp->buf;
-  fp->end = fp->buf + bytes;
+  DEBUG_printf(("9cups_fill: Not gzip, returning %d.", (int)bytes));
 
   return (bytes);
 }
@@ -2696,8 +2738,8 @@ cups_write(cups_file_t *fp,               /* I - CUPS file */
     * Update the counts for the last write call...
     */
 
-    bytes -= count;
-    total += count;
+    bytes -= (size_t)count;
+    total += (size_t)count;
     buf   += count;
   }
 
@@ -2710,5 +2752,5 @@ cups_write(cups_file_t *fp,               /* I - CUPS file */
 
 
 /*
- * End of "$Id: file.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: file.c 12641 2015-05-19 15:04:39Z msweet $".
  */
index fb63d64..43bf294 100644 (file)
@@ -1,21 +1,23 @@
 /*
- * "$Id: file.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: file.h 11627 2014-02-20 16:15:09Z msweet $"
  *
- *   Public file definitions for CUPS.
+ * 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
- *   gzip'd print files, PPD files, etc.
+ * 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
+ * gzip'd print files, PPD files, etc.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_FILE_H_
@@ -112,5 +114,5 @@ extern ssize_t              cupsFileWrite(cups_file_t *fp, const char *buf,
 #endif /* !_CUPS_FILE_H_ */
 
 /*
- * End of "$Id: file.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: file.h 11627 2014-02-20 16:15:09Z msweet $".
  */
index 89f5b8d..ea862a7 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: getdevices.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: getdevices.c 4216 2013-03-11 13:57:36Z msweet $"
  *
  *   cupsGetDevices implementation for CUPS.
  *
- *   Copyright 2008-2012 by Apple Inc.
+ *   Copyright 2008-2013 by Apple Inc.
  *
  *   These coded instructions, statements, and computer programs are the
  *   property of Apple Inc. and are protected by Federal copyright
@@ -71,19 +71,19 @@ cupsGetDevices(
                user_data));
 
   if (!callback)
-    return (IPP_INTERNAL_ERROR);
+    return (IPP_STATUS_ERROR_INTERNAL);
 
   if (!http)
     http = _cupsConnect();
 
   if (!http)
-    return (IPP_SERVICE_UNAVAILABLE);
+    return (IPP_STATUS_ERROR_SERVICE_UNAVAILABLE);
 
  /*
   * Create a CUPS-Get-Devices request...
   */
 
-  request = ippNewRequest(CUPS_GET_DEVICES);
+  request = ippNewRequest(IPP_OP_CUPS_GET_DEVICES);
 
   if (timeout > 0)
     ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "timeout",
@@ -115,14 +115,14 @@ cupsGetDevices(
     status = cupsSendRequest(http, request, "/", ippLength(request));
 
     DEBUG_puts("2cupsGetDevices: Waiting for response status...");
-    while (status == HTTP_CONTINUE)
+    while (status == HTTP_STATUS_CONTINUE)
       status = httpUpdate(http);
 
-    if (status != HTTP_OK)
+    if (status != HTTP_STATUS_OK)
     {
       httpFlush(http);
 
-      if (status == HTTP_UNAUTHORIZED)
+      if (status == HTTP_STATUS_UNAUTHORIZED)
       {
        /*
        * See if we can do authentication...
@@ -131,16 +131,16 @@ cupsGetDevices(
        DEBUG_puts("2cupsGetDevices: Need authorization...");
 
        if (!cupsDoAuthentication(http, "POST", "/"))
-         httpReconnect(http);
+         httpReconnect2(http, 30000, NULL);
        else
        {
-         status = HTTP_AUTHORIZATION_CANCELED;
+         status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
          break;
        }
       }
 
 #ifdef HAVE_SSL
-      else if (status == HTTP_UPGRADE_REQUIRED)
+      else if (status == HTTP_STATUS_UPGRADE_REQUIRED)
       {
        /*
        * Force a reconnect with encryption...
@@ -148,19 +148,20 @@ cupsGetDevices(
 
        DEBUG_puts("2cupsGetDevices: Need encryption...");
 
-       if (!httpReconnect(http))
-         httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
+       if (!httpReconnect2(http, 30000, NULL))
+         httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
       }
 #endif /* HAVE_SSL */
     }
   }
-  while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED);
+  while (status == HTTP_STATUS_UNAUTHORIZED ||
+         status == HTTP_STATUS_UPGRADE_REQUIRED);
 
   DEBUG_printf(("2cupsGetDevices: status=%d", status));
 
   ippDelete(request);
 
-  if (status != HTTP_OK)
+  if (status != HTTP_STATUS_OK)
   {
     _cupsSetHTTPError(status);
     return (cupsLastError());
@@ -186,7 +187,7 @@ cupsGetDevices(
 
   do
   {
-    if ((state = ippRead(http, response)) == IPP_ERROR)
+    if ((state = ippRead(http, response)) == IPP_STATE_ERROR)
       break;
 
     DEBUG_printf(("2cupsGetDevices: state=%d, response->last=%p", state,
@@ -240,7 +241,7 @@ cupsGetDevices(
         device_uri = attr->values[0].string.text;
     }
   }
-  while (state != IPP_DATA);
+  while (state != IPP_STATE_DATA);
 
   DEBUG_printf(("2cupsGetDevices: state=%d, response->last=%p", state,
                response->last));
@@ -257,8 +258,8 @@ cupsGetDevices(
   httpBlocking(http, blocking);
   httpFlush(http);
 
-  if (status == HTTP_ERROR)
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(http->error), 0);
+  if (status == HTTP_STATUS_ERROR)
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(http->error), 0);
   else
   {
     attr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT);
@@ -279,5 +280,5 @@ cupsGetDevices(
 
 
 /*
- * End of "$Id: getdevices.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: getdevices.c 4216 2013-03-11 13:57:36Z msweet $".
  */
index e227276..02903a7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: getifaddrs.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: getifaddrs.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Network interface functions for CUPS.
  *
@@ -262,5 +262,5 @@ _cups_freeifaddrs(struct ifaddrs *addrs)/* I - Interface list to free */
 
 
 /*
- * End of "$Id: getifaddrs.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: getifaddrs.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index c7534ec..73d2142 100644 (file)
@@ -1,25 +1,18 @@
 /*
- * "$Id: getputfile.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: getputfile.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Get/put file functions for CUPS.
+ * Get/put file functions for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsGetFd()   - Get a file from the server.
- *   cupsGetFile() - Get a file from the server.
- *   cupsPutFd()   - Put a file on the server.
- *   cupsPutFile() - Put a file on the server.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -39,7 +32,7 @@
 /*
  * 'cupsGetFd()' - Get a file from the server.
  *
- * This function returns @code HTTP_OK@ when the file is successfully retrieved.
+ * This function returns @code HTTP_STATUS_OK@ when the file is successfully retrieved.
  *
  * @since CUPS 1.1.20/OS X 10.4@
  */
@@ -49,7 +42,7 @@ cupsGetFd(http_t     *http,           /* I - Connection to server or @code CUPS_HTTP_DEFA
          const char *resource,         /* I - Resource name */
          int        fd)                /* I - File descriptor */
 {
-  int          bytes;                  /* Number of bytes read */
+  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];
@@ -68,12 +61,12 @@ cupsGetFd(http_t     *http,         /* I - Connection to server or @code CUPS_HTTP_DEFA
     if (http)
       http->error = EINVAL;
 
-    return (HTTP_ERROR);
+    return (HTTP_STATUS_ERROR);
   }
 
   if (!http)
     if ((http = _cupsConnect()) == NULL)
-      return (HTTP_SERVICE_UNAVAILABLE);
+      return (HTTP_STATUS_SERVICE_UNAVAILABLE);
 
  /*
   * Then send GET requests to the HTTP server...
@@ -84,27 +77,37 @@ cupsGetFd(http_t     *http,         /* I - Connection to server or @code CUPS_HTTP_DEFA
 
   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_AUTHORIZATION, http->authstring);
     httpSetField(http, HTTP_FIELD_IF_MODIFIED_SINCE, if_modified_since);
 
     if (httpGet(http, resource))
     {
-      if (httpReconnect(http))
+      if (httpReconnect2(http, 30000, NULL))
       {
-        status = HTTP_ERROR;
+        status = HTTP_STATUS_ERROR;
        break;
       }
       else
       {
-        status = HTTP_UNAUTHORIZED;
+        status = HTTP_STATUS_UNAUTHORIZED;
         continue;
       }
     }
 
-    while ((status = httpUpdate(http)) == HTTP_CONTINUE);
+    while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE);
 
-    if (status == HTTP_UNAUTHORIZED)
+    if (status == HTTP_STATUS_UNAUTHORIZED)
     {
      /*
       * Flush any error message...
@@ -118,53 +121,53 @@ cupsGetFd(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DEFA
 
       if (cupsDoAuthentication(http, "GET", resource))
       {
-        status = HTTP_AUTHORIZATION_CANCELED;
+        status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
         break;
       }
 
-      if (httpReconnect(http))
+      if (httpReconnect2(http, 30000, NULL))
       {
-        status = HTTP_ERROR;
+        status = HTTP_STATUS_ERROR;
         break;
       }
 
       continue;
     }
 #ifdef HAVE_SSL
-    else if (status == HTTP_UPGRADE_REQUIRED)
+    else if (status == HTTP_STATUS_UPGRADE_REQUIRED)
     {
       /* Flush any error message... */
       httpFlush(http);
 
       /* Reconnect... */
-      if (httpReconnect(http))
+      if (httpReconnect2(http, 30000, NULL))
       {
-        status = HTTP_ERROR;
+        status = HTTP_STATUS_ERROR;
         break;
       }
 
       /* Upgrade with encryption... */
-      httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
+      httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
 
       /* Try again, this time with encryption enabled... */
       continue;
     }
 #endif /* HAVE_SSL */
   }
-  while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED);
+  while (status == HTTP_STATUS_UNAUTHORIZED || status == HTTP_STATUS_UPGRADE_REQUIRED);
 
  /*
   * See if we actually got the file or an error...
   */
 
-  if (status == HTTP_OK)
+  if (status == HTTP_STATUS_OK)
   {
    /*
     * Yes, copy the file...
     */
 
     while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
-      write(fd, buffer, bytes);
+      write(fd, buffer, (size_t)bytes);
   }
   else
   {
@@ -185,7 +188,7 @@ cupsGetFd(http_t     *http,         /* I - Connection to server or @code CUPS_HTTP_DEFA
 /*
  * 'cupsGetFile()' - Get a file from the server.
  *
- * This function returns @code HTTP_OK@ when the file is successfully retrieved.
+ * This function returns @code HTTP_STATUS_OK@ when the file is successfully retrieved.
  *
  * @since CUPS 1.1.20/OS X 10.4@
  */
@@ -208,7 +211,7 @@ cupsGetFile(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DE
     if (http)
       http->error = EINVAL;
 
-    return (HTTP_ERROR);
+    return (HTTP_STATUS_ERROR);
   }
 
  /*
@@ -223,7 +226,7 @@ cupsGetFile(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DE
 
     http->error = errno;
 
-    return (HTTP_ERROR);
+    return (HTTP_STATUS_ERROR);
   }
 
  /*
@@ -238,7 +241,7 @@ cupsGetFile(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DE
 
   close(fd);
 
-  if (status != HTTP_OK)
+  if (status != HTTP_STATUS_OK)
     unlink(filename);
 
  /*
@@ -252,7 +255,7 @@ cupsGetFile(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DE
 /*
  * 'cupsPutFd()' - Put a file on the server.
  *
- * This function returns @code HTTP_CREATED@ when the file is stored
+ * This function returns @code HTTP_STATUS_CREATED@ when the file is stored
  * successfully.
  *
  * @since CUPS 1.1.20/OS X 10.4@
@@ -263,8 +266,8 @@ cupsPutFd(http_t     *http,         /* I - Connection to server or @code CUPS_HTTP_DEFA
           const char *resource,                /* I - Resource name */
          int        fd)                /* I - File descriptor */
 {
-  int          bytes,                  /* Number of bytes read */
-               retries;                /* Number of retries */
+  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 */
 
@@ -281,12 +284,12 @@ cupsPutFd(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DEFA
     if (http)
       http->error = EINVAL;
 
-    return (HTTP_ERROR);
+    return (HTTP_STATUS_ERROR);
   }
 
   if (!http)
     if ((http = _cupsConnect()) == NULL)
-      return (HTTP_SERVICE_UNAVAILABLE);
+      return (HTTP_STATUS_SERVICE_UNAVAILABLE);
 
  /*
   * Then send PUT requests to the HTTP server...
@@ -296,24 +299,34 @@ cupsPutFd(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DEFA
 
   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_AUTHORIZATION, http->authstring);
     httpSetField(http, HTTP_FIELD_TRANSFER_ENCODING, "chunked");
-    httpSetExpect(http, HTTP_CONTINUE);
+    httpSetExpect(http, HTTP_STATUS_CONTINUE);
 
     if (httpPut(http, resource))
     {
-      if (httpReconnect(http))
+      if (httpReconnect2(http, 30000, NULL))
       {
-        status = HTTP_ERROR;
+        status = HTTP_STATUS_ERROR;
        break;
       }
       else
       {
-        status = HTTP_UNAUTHORIZED;
+        status = HTTP_STATUS_UNAUTHORIZED;
         continue;
       }
     }
@@ -325,9 +338,9 @@ cupsPutFd(http_t     *http,         /* I - Connection to server or @code CUPS_HTTP_DEFA
     if (httpWait(http, 1000))
       status = httpUpdate(http);
     else
-      status = HTTP_CONTINUE;
+      status = HTTP_STATUS_CONTINUE;
 
-    if (status == HTTP_CONTINUE)
+    if (status == HTTP_STATUS_CONTINUE)
     {
      /*
       * Copy the file...
@@ -338,21 +351,21 @@ cupsPutFd(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DEFA
       while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
        if (httpCheck(http))
        {
-          if ((status = httpUpdate(http)) != HTTP_CONTINUE)
+          if ((status = httpUpdate(http)) != HTTP_STATUS_CONTINUE)
             break;
        }
        else
-          httpWrite2(http, buffer, bytes);
+          httpWrite2(http, buffer, (size_t)bytes);
     }
 
-    if (status == HTTP_CONTINUE)
+    if (status == HTTP_STATUS_CONTINUE)
     {
       httpWrite2(http, buffer, 0);
 
-      while ((status = httpUpdate(http)) == HTTP_CONTINUE);
+      while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE);
     }
 
-    if (status == HTTP_ERROR && !retries)
+    if (status == HTTP_STATUS_ERROR && !retries)
     {
       DEBUG_printf(("2cupsPutFd: retry on status %d", status));
 
@@ -362,9 +375,9 @@ cupsPutFd(http_t     *http,         /* I - Connection to server or @code CUPS_HTTP_DEFA
       httpFlush(http);
 
       /* Reconnect... */
-      if (httpReconnect(http))
+      if (httpReconnect2(http, 30000, NULL))
       {
-        status = HTTP_ERROR;
+        status = HTTP_STATUS_ERROR;
         break;
       }
 
@@ -374,7 +387,7 @@ cupsPutFd(http_t     *http,         /* I - Connection to server or @code CUPS_HTTP_DEFA
 
     DEBUG_printf(("2cupsPutFd: status=%d", status));
 
-    if (status == HTTP_UNAUTHORIZED)
+    if (status == HTTP_STATUS_UNAUTHORIZED)
     {
      /*
       * Flush any error message...
@@ -388,47 +401,47 @@ cupsPutFd(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DEFA
 
       if (cupsDoAuthentication(http, "PUT", resource))
       {
-        status = HTTP_AUTHORIZATION_CANCELED;
+        status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
         break;
       }
 
-      if (httpReconnect(http))
+      if (httpReconnect2(http, 30000, NULL))
       {
-        status = HTTP_ERROR;
+        status = HTTP_STATUS_ERROR;
         break;
       }
 
       continue;
     }
 #ifdef HAVE_SSL
-    else if (status == HTTP_UPGRADE_REQUIRED)
+    else if (status == HTTP_STATUS_UPGRADE_REQUIRED)
     {
       /* Flush any error message... */
       httpFlush(http);
 
       /* Reconnect... */
-      if (httpReconnect(http))
+      if (httpReconnect2(http, 30000, NULL))
       {
-        status = HTTP_ERROR;
+        status = HTTP_STATUS_ERROR;
         break;
       }
 
       /* Upgrade with encryption... */
-      httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
+      httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
 
       /* Try again, this time with encryption enabled... */
       continue;
     }
 #endif /* HAVE_SSL */
   }
-  while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED ||
-         (status == HTTP_ERROR && retries < 2));
+  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_CREATED)
+  if (status != HTTP_STATUS_CREATED)
   {
     _cupsSetHTTPError(status);
     httpFlush(http);
@@ -467,7 +480,7 @@ cupsPutFile(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DE
     if (http)
       http->error = EINVAL;
 
-    return (HTTP_ERROR);
+    return (HTTP_STATUS_ERROR);
   }
 
  /*
@@ -482,7 +495,7 @@ cupsPutFile(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DE
 
     http->error = errno;
 
-    return (HTTP_ERROR);
+    return (HTTP_STATUS_ERROR);
   }
 
  /*
@@ -498,5 +511,5 @@ cupsPutFile(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DE
 
 
 /*
- * End of "$Id: getputfile.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: getputfile.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 8493a08..4b041f4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: globals.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: globals.c 12480 2015-02-03 12:36:34Z msweet $"
  *
  *   Global variable access routines for CUPS.
  *
  */
 
 
+#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
@@ -212,9 +216,17 @@ cups_globals_alloc(void)
   memset(cg, 0, sizeof(_cups_globals_t));
   cg->encryption     = (http_encryption_t)-1;
   cg->password_cb    = (cups_password_cb2_t)_cupsGetPassword;
-  cg->any_root       = 1;
-  cg->expired_certs  = 1;
-  cg->expired_root   = 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...
@@ -227,7 +239,7 @@ cups_globals_alloc(void)
     * Open the registry...
     */
 
-    strcpy(installdir, "C:/Program Files/cups.org");
+    strlcpy(installdir, "C:/Program Files/cups.org", sizeof(installdir));
 
     if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\cups.org", 0, KEY_READ,
                       &key))
@@ -349,7 +361,9 @@ cups_globals_free(_cups_globals_t *cg)      /* I - Pointer to global data */
 
   httpClose(cg->http);
 
+#ifdef HAVE_SSL
   _httpFreeCredentials(cg->tls_credentials);
+#endif /* HAVE_SSL */
 
   cupsFileClose(cg->stdio_files[0]);
   cupsFileClose(cg->stdio_files[1]);
@@ -380,5 +394,5 @@ cups_globals_init(void)
 
 
 /*
- * End of "$Id: globals.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: globals.c 12480 2015-02-03 12:36:34Z msweet $".
  */
index 74218de..3f68d0d 100644 (file)
@@ -1,29 +1,18 @@
 /*
- * "$Id: http-addr.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: http-addr.c 12129 2014-08-28 19:26:31Z msweet $"
  *
- *   HTTP address routines for CUPS.
+ * HTTP address routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- * Contents:
- *
- *   httpAddrAny()       - Check for the "any" address.
- *   httpAddrEqual()     - Compare two addresses.
- *   httpAddrLocalhost() - Check for the local loopback address.
- *   httpAddrLookup()    - Lookup the hostname associated with the address.
- *   _httpAddrPort()     - Get the port number associated with an address.
- *   _httpAddrSetPort()  - Set the port number associated with an address.
- *   httpAddrString()    - Convert an IP address to a dotted string.
- *   httpGetHostByName() - Lookup a hostname or IP address, and return
- *                         address records for the specified name.
- *   httpGetHostname()   - Get the FQDN for the local system.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -31,6 +20,7 @@
  */
 
 #include "cups-private.h"
+#include <sys/stat.h>
 #ifdef HAVE_RESOLV_H
 #  include <resolv.h>
 #endif /* HAVE_RESOLV_H */
@@ -67,6 +57,37 @@ httpAddrAny(const http_addr_t *addr) /* I - Address to check */
 
 
 /*
+ * 'httpAddrClose()' - Close a socket created by @link httpAddrConnect@ or
+ *                     @link httpAddrListen@.
+ *
+ * Pass @code NULL@ for sockets created with @link httpAddrConnect@ and the
+ * listen address for sockets created with @link httpAddrListen@. This will
+ * ensure 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/OS X 10.5@
@@ -118,8 +139,7 @@ httpAddrLength(const http_addr_t *addr)     /* I - Address */
 #endif /* AF_INET6 */
 #ifdef AF_LOCAL
   if (addr->addr.sa_family == AF_LOCAL)
-    return (offsetof(struct sockaddr_un, sun_path) +
-            strlen(addr->un.sun_path) + 1);
+    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)
@@ -131,6 +151,133 @@ httpAddrLength(const http_addr_t *addr)   /* I - Address */
 
 
 /*
+ * 'httpAddrListen()' - Create a listening socket bound to the specified
+ *                      address and port.
+ *
+ * @since CUPS 1.7/OS X 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/OS X 10.5@
@@ -162,13 +309,6 @@ httpAddrLocalhost(
 }
 
 
-#ifdef __sgi
-#  define ADDR_CAST (struct sockaddr *)
-#else
-#  define ADDR_CAST (char *)
-#endif /* __sgi */
-
-
 /*
  * 'httpAddrLookup()' - Lookup the hostname associated with the address.
  *
@@ -203,7 +343,7 @@ httpAddrLookup(
 #ifdef AF_LOCAL
   if (addr->addr.sa_family == AF_LOCAL)
   {
-    strlcpy(name, addr->un.sun_path, namelen);
+    strlcpy(name, addr->un.sun_path, (size_t)namelen);
     return (name);
   }
 #endif /* AF_LOCAL */
@@ -214,7 +354,7 @@ httpAddrLookup(
 
   if (httpAddrLocalhost(addr))
   {
-    strlcpy(name, "localhost", namelen);
+    strlcpy(name, "localhost", (size_t)namelen);
     return (name);
   }
 
@@ -249,8 +389,7 @@ httpAddrLookup(
     * do...
     */
 
-    int error = getnameinfo(&addr->addr, httpAddrLength(addr), name, namelen,
-                           NULL, 0, 0);
+    int error = getnameinfo(&addr->addr, (socklen_t)httpAddrLength(addr), name, (socklen_t)namelen, NULL, 0, 0);
 
     if (error)
     {
@@ -267,11 +406,11 @@ httpAddrLookup(
 
 #  ifdef AF_INET6
     if (addr->addr.sa_family == AF_INET6)
-      host = gethostbyaddr(ADDR_CAST &(addr->ipv6.sin6_addr),
+      host = gethostbyaddr((char *)&(addr->ipv6.sin6_addr),
                           sizeof(struct in_addr), AF_INET6);
     else
 #  endif /* AF_INET6 */
-    host = gethostbyaddr(ADDR_CAST &(addr->ipv4.sin_addr),
+    host = gethostbyaddr((char *)&(addr->ipv4.sin_addr),
                         sizeof(struct in_addr), AF_INET);
 
     if (host == NULL)
@@ -286,7 +425,7 @@ httpAddrLookup(
       return (httpAddrString(addr, name, namelen));
     }
 
-    strlcpy(name, host->h_name, namelen);
+    strlcpy(name, host->h_name, (size_t)namelen);
   }
 #endif /* HAVE_GETNAMEINFO */
 
@@ -297,14 +436,30 @@ httpAddrLookup(
 
 
 /*
- * '_httpAddrPort()' - Get the port number associated with an address.
+ * '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/OS X 10.9@
  */
 
 int                                    /* O - Port number */
-_httpAddrPort(http_addr_t *addr)       /* I - Address */
+httpAddrPort(http_addr_t *addr)                /* I - Address */
 {
   if (!addr)
-    return (ippPort());
+    return (-1);
 #ifdef AF_INET6
   else if (addr->addr.sa_family == AF_INET6)
     return (ntohs(addr->ipv6.sin6_port));
@@ -312,7 +467,7 @@ _httpAddrPort(http_addr_t *addr)    /* I - Address */
   else if (addr->addr.sa_family == AF_INET)
     return (ntohs(addr->ipv4.sin_port));
   else
-    return (ippPort());
+    return (0);
 }
 
 
@@ -366,9 +521,9 @@ httpAddrString(const http_addr_t *addr,     /* I - Address to convert */
   if (addr->addr.sa_family == AF_LOCAL)
   {
     if (addr->un.sun_path[0] == '/')
-      strlcpy(s, addr->un.sun_path, slen);
+      strlcpy(s, addr->un.sun_path, (size_t)slen);
     else
-      strlcpy(s, "localhost", slen);
+      strlcpy(s, "localhost", (size_t)slen);
   }
   else
 #endif /* AF_LOCAL */
@@ -376,10 +531,9 @@ httpAddrString(const http_addr_t *addr,    /* I - Address to convert */
   {
     unsigned temp;                     /* Temporary address */
 
-
     temp = ntohl(addr->ipv4.sin_addr.s_addr);
 
-    snprintf(s, slen, "%d.%d.%d.%d", (temp >> 24) & 255,
+    snprintf(s, (size_t)slen, "%d.%d.%d.%d", (temp >> 24) & 255,
              (temp >> 16) & 255, (temp >> 8) & 255, temp & 255);
   }
 #ifdef AF_INET6
@@ -389,8 +543,7 @@ httpAddrString(const http_addr_t *addr,     /* I - Address to convert */
                temps[64];              /* Temporary string for address */
 
 #  ifdef HAVE_GETNAMEINFO
-    if (getnameinfo(&addr->addr, httpAddrLength(addr), temps, sizeof(temps),
-                    NULL, 0, NI_NUMERICHOST))
+    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
@@ -421,8 +574,7 @@ httpAddrString(const http_addr_t *addr,     /* I - Address to convert */
     {
       temp = ntohl(addr->ipv6.sin6_addr.s6_addr32[i]);
 
-      snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix,
-               (temp >> 16) & 0xffff);
+      snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, (temp >> 16) & 0xffff);
       prefix = ":";
       sptr += strlen(sptr);
 
@@ -430,7 +582,7 @@ httpAddrString(const http_addr_t *addr,     /* I - Address to convert */
 
       if (temp || i == 3 || addr->ipv6.sin6_addr.s6_addr32[i + 1])
       {
-        snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix, temp);
+        snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, temp);
        sptr += strlen(sptr);
       }
     }
@@ -442,7 +594,7 @@ httpAddrString(const http_addr_t *addr,     /* I - Address to convert */
 
       if (i < 4)
       {
-        snprintf(sptr, sizeof(temps) - (sptr - temps), "%s:", prefix);
+        snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s:", prefix);
        prefix = ":";
        sptr += strlen(sptr);
 
@@ -453,13 +605,11 @@ httpAddrString(const http_addr_t *addr,   /* I - Address to convert */
           if ((temp & 0xffff0000) ||
              (i > 0 && addr->ipv6.sin6_addr.s6_addr32[i - 1]))
          {
-            snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix,
-                    (temp >> 16) & 0xffff);
+            snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, (temp >> 16) & 0xffff);
            sptr += strlen(sptr);
           }
 
-          snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix,
-                  temp & 0xffff);
+          snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, temp & 0xffff);
          sptr += strlen(sptr);
        }
       }
@@ -477,7 +627,7 @@ httpAddrString(const http_addr_t *addr,     /* I - Address to convert */
        * Empty at end...
        */
 
-        strlcpy(sptr, "::", sizeof(temps) - (sptr - temps));
+        strlcpy(sptr, "::", sizeof(temps) - (size_t)(sptr - temps));
       }
     }
 #  endif /* HAVE_GETNAMEINFO */
@@ -486,11 +636,11 @@ httpAddrString(const http_addr_t *addr,   /* I - Address to convert */
     * Add "[v1." and "]" around IPv6 address to convert to URI form.
     */
 
-    snprintf(s, slen, "[v1.%s]", temps);
+    snprintf(s, (size_t)slen, "[v1.%s]", temps);
   }
 #endif /* AF_INET6 */
   else
-    strlcpy(s, "UNKNOWN", slen);
+    strlcpy(s, "UNKNOWN", (size_t)slen);
 
   DEBUG_printf(("1httpAddrString: returning \"%s\"...", s));
 
@@ -499,6 +649,24 @@ httpAddrString(const http_addr_t *addr,    /* I - Address to convert */
 
 
 /*
+ * 'httpGetAddress()' - Get the address of the connected peer of a connection.
+ *
+ * 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.
  *
@@ -547,7 +715,7 @@ httpGetHostByName(const char *name) /* I - Hostname or IP address */
     cg->hostent.h_name      = (char *)name;
     cg->hostent.h_aliases   = NULL;
     cg->hostent.h_addrtype  = AF_LOCAL;
-    cg->hostent.h_length    = strlen(name) + 1;
+    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;
@@ -573,8 +741,9 @@ httpGetHostByName(const char *name) /* I - Hostname or IP address */
     if (ip[0] > 255 || ip[1] > 255 || ip[2] > 255 || ip[3] > 255)
       return (NULL);                   /* Invalid byte ranges! */
 
-    cg->ip_addr = htonl(((((((ip[0] << 8) | ip[1]) << 8) | ip[2]) << 8) |
-                         ip[3]));
+    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...
@@ -610,7 +779,8 @@ httpGetHostByName(const char *name) /* I - Hostname or IP address */
  * '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().
+ * 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.
  *
@@ -622,15 +792,19 @@ httpGetHostname(http_t *http,             /* I - HTTP connection or NULL */
                 char   *s,             /* I - String buffer for name */
                 int    slen)           /* I - Size of buffer */
 {
-  if (!s || slen <= 1)
-    return (NULL);
-
   if (http)
   {
-    if (http->hostname[0] == '/')
-      strlcpy(s, "localhost", slen);
+    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, slen);
+      strlcpy(s, http->hostname, (size_t)slen);
   }
   else
   {
@@ -638,8 +812,11 @@ httpGetHostname(http_t *http,              /* I - HTTP connection or NULL */
     * Get the hostname...
     */
 
-    if (gethostname(s, slen) < 0)
-      strlcpy(s, "localhost", slen);
+    if (!s || slen <= 1)
+      return (NULL);
+
+    if (gethostname(s, (size_t)slen) < 0)
+      strlcpy(s, "localhost", (size_t)slen);
 
     if (!strchr(s, '.'))
     {
@@ -663,7 +840,7 @@ httpGetHostname(http_t *http,               /* I - HTTP connection or NULL */
         * Append ".local." to the hostname we get...
        */
 
-        snprintf(s, slen, "%s.local.", localStr);
+        snprintf(s, (size_t)slen, "%s.local.", localStr);
       }
 
       if (local)
@@ -684,10 +861,17 @@ httpGetHostname(http_t *http,             /* I - HTTP connection or NULL */
         * Use the resolved hostname...
        */
 
-       strlcpy(s, host->h_name, slen);
+       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);
   }
 
  /*
@@ -699,5 +883,46 @@ httpGetHostname(http_t *http,              /* I - HTTP connection or NULL */
 
 
 /*
- * End of "$Id: http-addr.c 11173 2013-07-23 12:31:34Z msweet $".
+ * '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);
+}
+
+
+/*
+ * End of "$Id: http-addr.c 12129 2014-08-28 19:26:31Z msweet $".
  */
index 7160007..b832148 100644 (file)
@@ -1,24 +1,18 @@
 /*
- * "$Id: http-addrlist.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: http-addrlist.c 11627 2014-02-20 16:15:09Z msweet $"
  *
- *   HTTP address list routines for CUPS.
+ * HTTP address list routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- * Contents:
- *
- *   httpAddrConnect()  - Connect to any of the addresses in the list.
- *   httpAddrConnect2() - Connect to any of the addresses in the list with a
- *                        timeout and optional cancel.
- *   httpAddrFreeList() - Free an address list.
- *   httpAddrGetList()  - Get a list of addresses for a hostname.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -58,7 +52,7 @@ httpAddrConnect(
  * 'httpAddrConnect2()' - Connect to any of the addresses in the list with a
  *                        timeout and optional cancel.
  *
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.7/OS X 10.9@
  */
 
 http_addrlist_t *                      /* O - Connected address or NULL on failure */
@@ -94,7 +88,7 @@ httpAddrConnect2(
   if (!sock)
   {
     errno = EINVAL;
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
     return (NULL);
   }
 
@@ -119,9 +113,9 @@ httpAddrConnect2(
 
     DEBUG_printf(("2httpAddrConnect2: Trying %s:%d...",
                  httpAddrString(&(addrlist->addr), temp, sizeof(temp)),
-                 _httpAddrPort(&(addrlist->addr))));
+                 httpAddrPort(&(addrlist->addr))));
 
-    if ((*sock = (int)socket(_httpAddrFamily(&(addrlist->addr)), SOCK_STREAM,
+    if ((*sock = (int)socket(httpAddrFamily(&(addrlist->addr)), SOCK_STREAM,
                              0)) < 0)
     {
      /*
@@ -138,21 +132,16 @@ httpAddrConnect2(
     */
 
     val = 1;
-#ifdef WIN32
-    setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&val,
-               sizeof(val));
-#else
-    setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
-#endif /* WIN32 */
+    setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, CUPS_SOCAST &val, sizeof(val));
 
 #ifdef SO_REUSEPORT
     val = 1;
-    setsockopt(*sock, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
+    setsockopt(*sock, SOL_SOCKET, SO_REUSEPORT, CUPS_SOCAST &val, sizeof(val));
 #endif /* SO_REUSEPORT */
 
 #ifdef SO_NOSIGPIPE
     val = 1;
-    setsockopt(*sock, SOL_SOCKET, SO_NOSIGPIPE, &val, sizeof(val));
+    setsockopt(*sock, SOL_SOCKET, SO_NOSIGPIPE, CUPS_SOCAST &val, sizeof(val));
 #endif /* SO_NOSIGPIPE */
 
    /*
@@ -161,12 +150,7 @@ httpAddrConnect2(
     */
 
     val = 1;
-#ifdef WIN32
-    setsockopt(*sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&val,
-               sizeof(val));
-#else
-    setsockopt(*sock, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
-#endif /* WIN32 */
+    setsockopt(*sock, IPPROTO_TCP, TCP_NODELAY, CUPS_SOCAST &val, sizeof(val));
 
 #ifdef FD_CLOEXEC
    /*
@@ -196,12 +180,11 @@ httpAddrConnect2(
     * Then connect...
     */
 
-    if (!connect(*sock, &(addrlist->addr.addr),
-                 httpAddrLength(&(addrlist->addr))))
+    if (!connect(*sock, &(addrlist->addr.addr), (socklen_t)httpAddrLength(&(addrlist->addr))))
     {
       DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...",
                    httpAddrString(&(addrlist->addr), temp, sizeof(temp)),
-                   _httpAddrPort(&(addrlist->addr))));
+                   httpAddrPort(&(addrlist->addr))));
 
 #ifdef O_NONBLOCK
       fcntl(*sock, F_SETFL, flags);
@@ -234,11 +217,7 @@ httpAddrConnect2(
 
             DEBUG_puts("1httpAddrConnect2: Canceled connect()");
 
-#    ifdef WIN32
-           closesocket(*sock);
-#    else
-           close(*sock);
-#    endif /* WIN32 */
+            httpAddrClose(NULL, *sock);
 
            *sock = -1;
 
@@ -282,7 +261,7 @@ httpAddrConnect2(
           {
            DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...",
                          httpAddrString(&peer, temp, sizeof(temp)),
-                         _httpAddrPort(&peer)));
+                         httpAddrPort(&peer)));
 
            return (addrlist);
          }
@@ -295,7 +274,7 @@ httpAddrConnect2(
 
     DEBUG_printf(("1httpAddrConnect2: Unable to connect to %s:%d: %s",
                  httpAddrString(&(addrlist->addr), temp, sizeof(temp)),
-                 _httpAddrPort(&(addrlist->addr)), strerror(errno)));
+                 httpAddrPort(&(addrlist->addr)), strerror(errno)));
 
 #ifndef WIN32
     if (errno == EINPROGRESS)
@@ -306,11 +285,7 @@ httpAddrConnect2(
     * Close this socket and move to the next address...
     */
 
-#ifdef WIN32
-    closesocket(*sock);
-#else
-    close(*sock);
-#endif /* WIN32 */
+    httpAddrClose(NULL, *sock);
 
     *sock    = -1;
     addrlist = addrlist->next;
@@ -318,15 +293,65 @@ httpAddrConnect2(
 
   if (!addrlist)
 #ifdef WIN32
-    _cupsSetError(IPP_SERVICE_UNAVAILABLE, "Connection failed", 0);
+    _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, "Connection failed", 0);
 #else
-    _cupsSetError(IPP_SERVICE_UNAVAILABLE, strerror(errno), 0);
+    _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, strerror(errno), 0);
 #endif /* WIN32 */
 
   return (addrlist);
 }
 
 
+
+/*
+ * 'httpAddrCopyList()' - Copy an address list.
+ *
+ * @since CUPS 1.7/OS X 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.
  *
@@ -423,6 +448,7 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
 
     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));
     }
@@ -508,7 +534,7 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
          if (!temp)
          {
            httpAddrFreeList(first);
-           _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+           _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
            return (NULL);
          }
 
@@ -543,7 +569,7 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
       if (error == EAI_FAIL)
         cg->need_res_init = 1;
 
-      _cupsSetError(IPP_INTERNAL_ERROR, gai_strerror(error), 0);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, gai_strerror(error), 0);
     }
 
 #else
@@ -606,9 +632,10 @@ httpAddrGetList(const char *hostname,      /* I - Hostname, IP address, or NULL for p
            return (NULL);
 
           first->addr.ipv4.sin_family = AF_INET;
-          first->addr.ipv4.sin_addr.s_addr = htonl(((((((ip[0] << 8) |
-                                                      ip[1]) << 8) |
-                                                    ip[2]) << 8) | ip[3]));
+          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);
        }
       }
@@ -667,7 +694,7 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
         if (h_errno == NO_RECOVERY)
           cg->need_res_init = 1;
 
-       _cupsSetError(IPP_INTERNAL_ERROR, hstrerror(h_errno), 0);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, hstrerror(h_errno), 0);
       }
     }
 #endif /* HAVE_GETADDRINFO */
@@ -707,7 +734,7 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
     {
       httpAddrFreeList(first);
 
-      _cupsSetError(IPP_INTERNAL_ERROR, _("Unknown service name."), 1);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown service name."), 1);
       return (NULL);
     }
 
@@ -730,7 +757,7 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
        temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
        if (!temp)
        {
-         _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+         _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
          httpAddrFreeList(first);
          return (NULL);
        }
@@ -759,7 +786,7 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
        temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
        if (!temp)
        {
-         _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+         _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
          httpAddrFreeList(first);
          return (NULL);
        }
@@ -791,7 +818,7 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
        temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
        if (!temp)
        {
-         _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+         _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
          httpAddrFreeList(first);
          return (NULL);
        }
@@ -815,7 +842,7 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
        temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
        if (!temp)
        {
-         _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+         _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
          httpAddrFreeList(first);
          return (NULL);
        }
@@ -841,5 +868,5 @@ httpAddrGetList(const char *hostname,       /* I - Hostname, IP address, or NULL for p
 
 
 /*
- * End of "$Id: http-addrlist.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: http-addrlist.c 11627 2014-02-20 16:15:09Z msweet $".
  */
index a99b381..3393e87 100644 (file)
@@ -1,18 +1,18 @@
 /*
- * "$Id: http-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: http-private.h 12645 2015-05-20 01:20:52Z msweet $"
  *
- *   Private HTTP definitions for CUPS.
+ * Private HTTP definitions for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_HTTP_PRIVATE_H_
@@ -23,6 +23,7 @@
  */
 
 #  include "config.h"
+#  include <cups/language.h>
 #  include <stddef.h>
 #  include <stdlib.h>
 
 #  ifdef WIN32
 #    include <io.h>
 #    include <winsock2.h>
+#    define CUPS_SOCAST (const char *)
 #  else
 #    include <unistd.h>
 #    include <fcntl.h>
 #    include <sys/socket.h>
-#    define closesocket(f) close(f)
+#    define CUPS_SOCAST
 #  endif /* WIN32 */
 
 #  ifdef HAVE_GSSAPI
 #    include <Security/Authorization.h>
 #  endif /* HAVE_AUTHORIZATION_H */
 
-#  if defined(__sgi) || (defined(__APPLE__) && !defined(_SOCKLEN_T))
+#  if defined(__APPLE__) && !defined(_SOCKLEN_T)
 /*
- * IRIX and MacOS X 10.2.x do not define socklen_t, and in fact use an int instead of
+ * MacOS X 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 /* __sgi || (__APPLE__ && !_SOCKLEN_T) */
+#  endif /* __APPLE__ && !_SOCKLEN_T */
 
 #  include <cups/http.h>
 #  include "md5-private.h"
 #  include "ipp-private.h"
 
-#  if defined HAVE_LIBSSL
-#    include <openssl/err.h>
-#    include <openssl/rand.h>
-#    include <openssl/ssl.h>
-#  elif defined HAVE_GNUTLS
+#  ifdef HAVE_GNUTLS
 #    include <gnutls/gnutls.h>
 #    include <gnutls/x509.h>
-#    include <gcrypt.h>
 #  elif defined(HAVE_CDSASSL)
 #    include <CoreFoundation/CoreFoundation.h>
 #    include <Security/Security.h>
@@ -96,6 +93,19 @@ typedef int socklen_t;
 #      include <Security/SecCertificate.h>
 #      include <Security/SecIdentity.h>
 #    endif /* HAVE_SECCERTIFICATE_H */
+#    ifdef HAVE_SECCERTIFICATEPRIV_H
+#      include <Security/SecCertificatePriv.h>
+#    else
+#      ifdef __cplusplus
+extern "C" {
+#      endif /* __cplusplus */
+extern SecCertificateRef SecCertificateCreateWithBytes(CFAllocatorRef allocator, const UInt8 *bytes, CFIndex length);
+extern bool SecCertificateIsValid(SecCertificateRef certificate, CFAbsoluteTime verifyTime);
+extern CFAbsoluteTime SecCertificateNotValidAfter(SecCertificateRef certificate);
+#      ifdef __cplusplus
+}
+#      endif /* __cplusplus */
+#    endif /* HAVE_SECCERTIFICATEPRIV_H */
 #    ifdef HAVE_SECITEMPRIV_H
 #      include <Security/SecItemPriv.h>
 #    endif /* HAVE_SECITEMPRIV_H */
@@ -106,11 +116,17 @@ typedef int socklen_t;
 #      include <Security/SecPolicyPriv.h>
 #    endif /* HAVE_SECPOLICYPRIV_H */
 #  elif defined(HAVE_SSPISSL)
-#    include "sspi-private.h"
-#  endif /* HAVE_LIBSSL */
+#    include <wincrypt.h>
+#    include <wintrust.h>
+#    include <schannel.h>
+#    define SECURITY_WIN32
+#    include <security.h>
+#    include <sspi.h>
+#  endif /* HAVE_GNUTLS */
 
 #  ifndef WIN32
 #    include <net/if.h>
+#    include <resolv.h>
 #    ifdef HAVE_GETIFADDRS
 #      include <ifaddrs.h>
 #    else
@@ -121,6 +137,10 @@ typedef int socklen_t;
 #    endif /* HAVE_GETIFADDRS */
 #  endif /* !WIN32 */
 
+#  ifdef HAVE_LIBZ
+#    include <zlib.h>
+#  endif /* HAVE_LIBZ */
+
 
 /*
  * C++ magic...
@@ -136,40 +156,30 @@ extern "C" {
  */
 
 
+#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_SSL3   2       /* Allow SSL 3.0 */
+#define _HTTP_TLS_ALLOW_DH     4       /* Allow DH/DHE key negotiation */
+#define _HTTP_TLS_DENY_TLS10   16      /* Deny TLS 1.0 */
 
-/*
- * Types and functions for SSL support...
- */
 
-#  if defined HAVE_LIBSSL
 /*
- * The OpenSSL library provides its own SSL/TLS context structure for its
- * IO and protocol management.  However, we need to provide our own BIO
- * (basic IO) implementation to do timeouts...
+ * Types and functions for SSL support...
  */
 
-typedef SSL  *http_tls_t;
-typedef void *http_tls_credentials_t;
-
-extern BIO_METHOD *_httpBIOMethods(void);
-
-#  elif defined HAVE_GNUTLS
+#  ifdef HAVE_GNUTLS
 /*
  * The GNU TLS library is more of a "bare metal" SSL/TLS library...
  */
 
-typedef gnutls_session http_tls_t;
-typedef void *http_tls_credentials_t;
-
-extern ssize_t _httpReadGNUTLS(gnutls_transport_ptr ptr, void *data,
-                               size_t length);
-extern ssize_t _httpWriteGNUTLS(gnutls_transport_ptr ptr, const void *data,
-                                size_t length);
+typedef gnutls_session_t http_tls_t;
+typedef gnutls_certificate_credentials_t *http_tls_credentials_t;
 
 #  elif defined(HAVE_CDSASSL)
 /*
@@ -180,10 +190,6 @@ extern ssize_t     _httpWriteGNUTLS(gnutls_transport_ptr ptr, const void *data,
 #    if !defined(HAVE_SECBASEPRIV_H) && defined(HAVE_CSSMERRORSTRING) /* Declare prototype for function in that header... */
 extern const char *cssmErrorString(int error);
 #    endif /* !HAVE_SECBASEPRIV_H && HAVE_CSSMERRORSTRING */
-#    ifndef HAVE_SECITEMPRIV_H /* Declare constants from that header... */
-extern const CFTypeRef kSecClassCertificate;
-extern const CFTypeRef kSecClassIdentity;
-#    endif /* !HAVE_SECITEMPRIV_H */
 #    if !defined(HAVE_SECIDENTITYSEARCHPRIV_H) && defined(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY) /* Declare prototype for function in that header... */
 extern OSStatus SecIdentitySearchCreateWithPolicy(SecPolicyRef policy,
                                CFStringRef idString, CSSM_KEYUSE keyUsage,
@@ -199,18 +205,31 @@ extern OSStatus SecPolicySetValue(SecPolicyRef policyRef,
 typedef SSLContextRef  http_tls_t;
 typedef CFArrayRef     http_tls_credentials_t;
 
-extern OSStatus        _httpReadCDSA(SSLConnectionRef connection, void *data,
-                             size_t *dataLength);
-extern OSStatus        _httpWriteCDSA(SSLConnectionRef connection, const void *data,
-                              size_t *dataLength);
-
 #  elif defined(HAVE_SSPISSL)
 /*
  * Windows' SSPI library gets a CUPS wrapper...
  */
 
-typedef _sspi_struct_t * http_tls_t;
-typedef void *http_tls_credentials_t;
+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
 /*
@@ -219,9 +238,25 @@ typedef void *http_tls_credentials_t;
 
 typedef void *http_tls_t;
 typedef void *http_tls_credentials_t;
-#  endif /* HAVE_LIBSSL */
+#  endif /* HAVE_GNUTLS */
 
-struct _http_s                         /**** HTTP connection structure. ****/
+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 */
@@ -234,31 +269,34 @@ struct _http_s                            /**** HTTP connection structure. ****/
   struct sockaddr_in   _hostaddr;      /* Address of connected host (deprecated) */
   char                 hostname[HTTP_MAX_HOST],
                                        /* Name of connected host */
-                       fields[HTTP_FIELD_MAX][HTTP_MAX_VALUE];
-                                       /* Field values */
+                       fields[HTTP_FIELD_ACCEPT_ENCODING][HTTP_MAX_VALUE];
+                                       /* Field values up to Accept-Encoding */
   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 */
+  int                  _auth_type;     /* Authentication in use (deprecated) */
   _cups_md5_state_t    md5_state;      /* MD5 state */
   char                 nonce[HTTP_MAX_VALUE];
                                        /* Nonce value */
   int                  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 Authentication value (deprecated) */
+                                       /* 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 */
@@ -266,10 +304,11 @@ struct _http_s                            /**** HTTP connection structure. ****/
   char                 wbuffer[HTTP_MAX_BUFFER];
                                        /* Buffer for outgoing data */
   int                  wused;          /* Write buffer bytes used */
+
   /**** New in CUPS 1.3 ****/
   char                 *field_authorization;
                                        /* Authorization field */
-  char                 *authstring;    /* Current authorization field */
+  char                 *authstring;    /* Current Authorization field */
 #  ifdef HAVE_GSSAPI
   gss_OID              gssmech;        /* Authentication mechanism */
   gss_ctx_id_t         gssctx;         /* Authentication context */
@@ -278,6 +317,7 @@ struct _http_s                              /**** HTTP connection structure. ****/
 #  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 */
@@ -288,7 +328,25 @@ struct _http_s                             /**** HTTP connection structure. ****/
 #  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 */
+  char                 *accept_encoding,
+                                       /* Accept-Encoding field */
+                       *allow,         /* Allow field */
+                       *server,        /* Server field */
+                       *default_accept_encoding,
+                       *default_server,
+                       *default_user_agent;
+                                       /* Default field values */
+#  ifdef HAVE_LIBZ
+  _http_coding_t       coding;         /* _HTTP_CODING_xxx */
+  z_stream             stream;         /* (De)compression stream */
+  Bytef                        *sbuffer;       /* (De)compression buffer */
+#  endif /* HAVE_LIBZ */
 };
+#  endif /* !_HTTP_NO_PRIVATE */
 
 
 /*
@@ -298,11 +356,6 @@ struct _http_s                             /**** HTTP connection structure. ****/
 #  ifndef HAVE_HSTRERROR
 extern const char *_cups_hstrerror(int error);
 #    define hstrerror _cups_hstrerror
-#  elif defined(_AIX) || defined(__osf__)
-/*
- * AIX and Tru64 UNIX don't provide a prototype but do provide the function...
- */
-extern const char *hstrerror(int error);
 #  endif /* !HAVE_HSTRERROR */
 
 
@@ -352,16 +405,7 @@ extern void        _cups_freeifaddrs(struct ifaddrs *addrs);
  * Prototypes...
  */
 
-#define                        _httpAddrFamily(addrp) (addrp)->addr.sa_family
-extern int             _httpAddrPort(http_addr_t *addr);
 extern void            _httpAddrSetPort(http_addr_t *addr, int port);
-extern char            *_httpAssembleUUID(const char *server, int port,
-                                          const char *name, int number,
-                                          char *buffer, size_t bufsize);
-extern http_t          *_httpCreate(const char *host, int port,
-                                    http_addrlist_t *addrlist,
-                                    http_encryption_t encryption,
-                                    int family);
 extern http_tls_credentials_t
                        _httpCreateCredentials(cups_array_t *credentials);
 extern char            *_httpDecodeURI(char *dst, const char *src,
@@ -370,11 +414,19 @@ extern void               _httpDisconnect(http_t *http);
 extern char            *_httpEncodeURI(char *dst, const char *src,
                                        size_t dstsize);
 extern void            _httpFreeCredentials(http_tls_credentials_t credentials);
-extern ssize_t         _httpPeek(http_t *http, char *buffer, size_t length);
 extern const char      *_httpResolveURI(const char *uri, char *resolved_uri,
                                         size_t resolved_size, int options,
                                         int (*cb)(void *context),
                                         void *context);
+extern const char      *_httpStatus(cups_lang_t *lang, http_status_t status);
+extern void            _httpTLSInitialize(void);
+extern size_t          _httpTLSPending(http_t *http);
+extern int             _httpTLSRead(http_t *http, char *buf, int len);
+extern int             _httpTLSSetCredentials(http_t *http);
+extern void            _httpTLSSetOptions(int options);
+extern int             _httpTLSStart(http_t *http);
+extern void            _httpTLSStop(http_t *http);
+extern int             _httpTLSWrite(http_t *http, const char *buf, int len);
 extern int             _httpUpdate(http_t *http, http_status_t *status);
 extern int             _httpWait(http_t *http, int msec, int usessl);
 
@@ -390,5 +442,5 @@ extern int          _httpWait(http_t *http, int msec, int usessl);
 #endif /* !_CUPS_HTTP_PRIVATE_H_ */
 
 /*
- * End of "$Id: http-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: http-private.h 12645 2015-05-20 01:20:52Z msweet $".
  */
index d15d904..1670b02 100644 (file)
@@ -1,52 +1,18 @@
 /*
- * "$Id: http-support.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: http-support.c 12970 2015-11-13 20:02:51Z msweet $"
  *
- *   HTTP support routines for CUPS.
+ * HTTP support routines for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   httpAssembleURI()   - Assemble a uniform resource identifier from its
- *                         components.
- *   httpAssembleURIf()   - Assemble a uniform resource identifier from its
- *                         components with a formatted resource.
- *   _httpAssembleUUID()  - Make a UUID URI conforming to RFC 4122.
- *   httpDecode64()      - Base64-decode a string.
- *   httpDecode64_2()    - Base64-decode a string.
- *   httpEncode64()      - Base64-encode a string.
- *   httpEncode64_2()    - Base64-encode a string.
- *   httpGetDateString()  - Get a formatted date/time string from a time value.
- *   httpGetDateString2() - Get a formatted date/time string from a time value.
- *   httpGetDateTime()   - Get a time value from a formatted date/time string.
- *   httpSeparate()      - Separate a Universal Resource Identifier into its
- *                         components.
- *   httpSeparate2()     - Separate a Universal Resource Identifier into its
- *                         components.
- *   httpSeparateURI()   - Separate a Universal Resource Identifier into its
- *                         components.
- *   httpStatus()        - Return a short string describing a HTTP status
- *                         code.
- *   _cups_hstrerror()   - hstrerror() emulation function for Solaris and
- *                         others.
- *   _httpDecodeURI()    - Percent-decode a HTTP request URI.
- *   _httpEncodeURI()    - Percent-encode a HTTP request URI.
- *   _httpResolveURI()   - Resolve a DNS-SD URI.
- *   http_client_cb()    - Client callback for resolving URI.
- *   http_copy_decode()   - Copy and decode a URI.
- *   http_copy_encode()   - Copy and encode a URI.
- *   http_poll_cb()       - Wait for input on the specified file descriptors.
- *   http_resolve_cb()   - Build a device URI for the given service name.
- *   http_resolve_cb()   - Build a device URI for the given service name.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -83,6 +49,7 @@ typedef struct _http_uribuf_s         /* URI 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;
 
 
@@ -90,7 +57,7 @@ typedef struct _http_uribuf_s         /* URI buffer */
  * Local globals...
  */
 
-static const char * const http_days[7] =
+static const char * const http_days[7] =/* Days of the week */
                        {
                          "Sun",
                          "Mon",
@@ -101,7 +68,7 @@ static const char * const http_days[7] =
                          "Sat"
                        };
 static const char * const http_months[12] =
-                       {
+                       {               /* Months of the year */
                          "Jan",
                          "Feb",
                          "Mar",
@@ -115,6 +82,26 @@ static const char * const http_months[12] =
                          "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"
+                       };
 
 
 /*
@@ -192,7 +179,7 @@ httpAssembleURI(
     if (uri)
       *uri = '\0';
 
-    return (HTTP_URI_BAD_ARGUMENTS);
+    return (HTTP_URI_STATUS_BAD_ARGUMENTS);
   }
 
  /*
@@ -205,10 +192,10 @@ httpAssembleURI(
   if (!ptr)
     goto assemble_overflow;
 
-  if (!strcmp(scheme, "mailto"))
+  if (!strcmp(scheme, "geo") || !strcmp(scheme, "mailto") || !strcmp(scheme, "tel"))
   {
    /*
-    * mailto: only has :, no //...
+    * geo:, mailto:, and tel: only have :, no //...
     */
 
     if (ptr < end)
@@ -219,7 +206,7 @@ httpAssembleURI(
   else
   {
    /*
-    * Schemes other than mailto: all have //...
+    * Schemes other than geo:, mailto:, and tel: typically have //...
     */
 
     if ((ptr + 2) < end)
@@ -371,7 +358,7 @@ httpAssembleURI(
 
     if (port > 0)
     {
-      snprintf(ptr, end - ptr + 1, ":%d", port);
+      snprintf(ptr, (size_t)(end - ptr + 1), ":%d", port);
       ptr += strlen(ptr);
 
       if (ptr >= end)
@@ -421,7 +408,7 @@ httpAssembleURI(
 
   *ptr = '\0';
 
-  return (HTTP_URI_OK);
+  return (HTTP_URI_STATUS_OK);
 
  /*
   * Clear the URI string and return an overflow error; I don't usually
@@ -431,7 +418,7 @@ httpAssembleURI(
   assemble_overflow:
 
   *uri = '\0';
-  return (HTTP_URI_OVERFLOW);
+  return (HTTP_URI_STATUS_OVERFLOW);
 }
 
 
@@ -474,7 +461,7 @@ httpAssembleURIf(
     if (uri)
       *uri = '\0';
 
-    return (HTTP_URI_BAD_ARGUMENTS);
+    return (HTTP_URI_STATUS_BAD_ARGUMENTS);
   }
 
  /*
@@ -485,10 +472,10 @@ httpAssembleURIf(
   bytes = vsnprintf(resource, sizeof(resource), resourcef, ap);
   va_end(ap);
 
-  if (bytes >= sizeof(resource))
+  if ((size_t)bytes >= sizeof(resource))
   {
     *uri = '\0';
-    return (HTTP_URI_OVERFLOW);
+    return (HTTP_URI_STATUS_OVERFLOW);
   }
   else
     return (httpAssembleURI(encoding,  uri, urilen, scheme, username, host,
@@ -497,18 +484,24 @@ httpAssembleURIf(
 
 
 /*
- * '_httpAssembleUUID()' - Make a UUID URI conforming to RFC 4122.
+ * '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/OS X 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 */
+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 */
   _cups_md5_state_t    md5state;       /* MD5 state */
@@ -527,7 +520,7 @@ _httpAssembleUUID(const char *server,       /* I - Server name */
           (unsigned)CUPS_RAND() & 0xffff, (unsigned)CUPS_RAND() & 0xffff);
 
   _cupsMD5Init(&md5state);
-  _cupsMD5Append(&md5state, (unsigned char *)data, strlen(data));
+  _cupsMD5Append(&md5state, (unsigned char *)data, (int)strlen(data));
   _cupsMD5Finish(&md5state, md5sum);
 
  /*
@@ -583,10 +576,10 @@ 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 */
-       base64;                         /* Value of this character */
-  char *outptr,                        /* Output pointer */
-       *outend;                        /* End of output buffer */
+  int          pos;                    /* Bit position */
+  unsigned     base64;                 /* Value of this character */
+  char         *outptr,                /* Output pointer */
+               *outend;                /* End of output buffer */
 
 
  /*
@@ -615,11 +608,11 @@ httpDecode64_2(char       *out,           /* I  - String to write to */
     */
 
     if (*in >= 'A' && *in <= 'Z')
-      base64 = *in - 'A';
+      base64 = (unsigned)(*in - 'A');
     else if (*in >= 'a' && *in <= 'z')
-      base64 = *in - 'a' + 26;
+      base64 = (unsigned)(*in - 'a' + 26);
     else if (*in >= '0' && *in <= '9')
-      base64 = *in - '0' + 52;
+      base64 = (unsigned)(*in - '0' + 52);
     else if (*in == '+')
       base64 = 62;
     else if (*in == '/')
@@ -637,26 +630,26 @@ httpDecode64_2(char       *out,           /* I  - String to write to */
     {
       case 0 :
           if (outptr < outend)
-            *outptr = base64 << 2;
+            *outptr = (char)(base64 << 2);
          pos ++;
          break;
       case 1 :
           if (outptr < outend)
-            *outptr++ |= (base64 >> 4) & 3;
+            *outptr++ |= (char)((base64 >> 4) & 3);
           if (outptr < outend)
-           *outptr = (base64 << 4) & 255;
+           *outptr = (char)((base64 << 4) & 255);
          pos ++;
          break;
       case 2 :
           if (outptr < outend)
-            *outptr++ |= (base64 >> 2) & 15;
+            *outptr++ |= (char)((base64 >> 2) & 15);
           if (outptr < outend)
-           *outptr = (base64 << 6) & 255;
+           *outptr = (char)((base64 << 6) & 255);
          pos ++;
          break;
       case 3 :
           if (outptr < outend)
-            *outptr++ |= base64;
+            *outptr++ |= (char)base64;
          pos = 0;
          break;
     }
@@ -816,10 +809,7 @@ httpGetDateString2(time_t t,               /* I - UNIX time */
 
   tdate = gmtime(&t);
   if (tdate)
-    snprintf(s, 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);
+    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);
   else
     s[0] = '\0';
 
@@ -997,16 +987,16 @@ httpSeparateURI(
   if (!uri || !port || !scheme || schemelen <= 0 || !username ||
       usernamelen <= 0 || !host || hostlen <= 0 || !resource ||
       resourcelen <= 0)
-    return (HTTP_URI_BAD_ARGUMENTS);
+    return (HTTP_URI_STATUS_BAD_ARGUMENTS);
 
   if (!*uri)
-    return (HTTP_URI_BAD_URI);
+    return (HTTP_URI_STATUS_BAD_URI);
 
  /*
   * Grab the scheme portion of the URI...
   */
 
-  status = HTTP_URI_OK;
+  status = HTTP_URI_STATUS_OK;
 
   if (!strncmp(uri, "//", 2))
   {
@@ -1014,8 +1004,8 @@ httpSeparateURI(
     * Workaround for HP IPP client bug...
     */
 
-    strlcpy(scheme, "ipp", schemelen);
-    status = HTTP_URI_MISSING_SCHEME;
+    strlcpy(scheme, "ipp", (size_t)schemelen);
+    status = HTTP_URI_STATUS_MISSING_SCHEME;
   }
   else if (*uri == '/')
   {
@@ -1023,8 +1013,8 @@ httpSeparateURI(
     * Filename...
     */
 
-    strlcpy(scheme, "file", schemelen);
-    status = HTTP_URI_MISSING_SCHEME;
+    strlcpy(scheme, "file", (size_t)schemelen);
+    status = HTTP_URI_STATUS_MISSING_SCHEME;
   }
   else
   {
@@ -1046,7 +1036,7 @@ httpSeparateURI(
     if (*uri != ':')
     {
       *scheme = '\0';
-      return (HTTP_URI_BAD_SCHEME);
+      return (HTTP_URI_STATUS_BAD_SCHEME);
     }
 
     uri ++;
@@ -1066,8 +1056,8 @@ httpSeparateURI(
     *port = 515;
   else if (!strcmp(scheme, "socket"))  /* Not yet registered with IANA... */
     *port = 9100;
-  else if (strcmp(scheme, "file") && strcmp(scheme, "mailto"))
-    status = HTTP_URI_UNKNOWN_SCHEME;
+  else if (strcmp(scheme, "file") && strcmp(scheme, "mailto") && strcmp(scheme, "tel"))
+    status = HTTP_URI_STATUS_UNKNOWN_SCHEME;
 
  /*
   * Now see if we have a hostname...
@@ -1097,7 +1087,7 @@ httpSeparateURI(
       if (!uri)
       {
         *username = '\0';
-        return (HTTP_URI_BAD_USERNAME);
+        return (HTTP_URI_STATUS_BAD_USERNAME);
       }
 
       uri ++;
@@ -1128,7 +1118,7 @@ httpSeparateURI(
         if (*uri != '.')
         {
          *host = '\0';
-         return (HTTP_URI_BAD_HOSTNAME);
+         return (HTTP_URI_STATUS_BAD_HOSTNAME);
         }
 
         uri ++;
@@ -1140,7 +1130,7 @@ httpSeparateURI(
       if (!uri)
       {
         *host = '\0';
-        return (HTTP_URI_BAD_HOSTNAME);
+        return (HTTP_URI_STATUS_BAD_HOSTNAME);
       }
 
      /*
@@ -1150,7 +1140,7 @@ httpSeparateURI(
       if (*uri != ']')
       {
         *host = '\0';
-        return (HTTP_URI_BAD_HOSTNAME);
+        return (HTTP_URI_STATUS_BAD_HOSTNAME);
       }
 
       uri ++;
@@ -1176,7 +1166,7 @@ httpSeparateURI(
        else if (*ptr != ':' && *ptr != '.' && !isxdigit(*ptr & 255))
        {
          *host = '\0';
-         return (HTTP_URI_BAD_HOSTNAME);
+         return (HTTP_URI_STATUS_BAD_HOSTNAME);
        }
     }
     else
@@ -1197,7 +1187,7 @@ httpSeparateURI(
                         "\\", *ptr))                   /* SMB domain */
        {
          *host = '\0';
-         return (HTTP_URI_BAD_HOSTNAME);
+         return (HTTP_URI_STATUS_BAD_HOSTNAME);
        }
 
      /*
@@ -1210,7 +1200,7 @@ httpSeparateURI(
       if (!uri)
       {
         *host = '\0';
-        return (HTTP_URI_BAD_HOSTNAME);
+        return (HTTP_URI_STATUS_BAD_HOSTNAME);
       }
     }
 
@@ -1222,7 +1212,7 @@ httpSeparateURI(
     if (!strcmp(scheme, "file") && strcmp(host, "localhost") && host[0])
     {
       *host = '\0';
-      return (HTTP_URI_BAD_HOSTNAME);
+      return (HTTP_URI_STATUS_BAD_HOSTNAME);
     }
 
    /*
@@ -1238,15 +1228,21 @@ httpSeparateURI(
       if (!isdigit(uri[1] & 255))
       {
         *port = 0;
-        return (HTTP_URI_BAD_PORT);
+        return (HTTP_URI_STATUS_BAD_PORT);
       }
 
-      *port = strtol(uri + 1, (char **)&uri, 10);
+      *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_BAD_PORT);
+        return (HTTP_URI_STATUS_BAD_PORT);
       }
     }
   }
@@ -1261,7 +1257,7 @@ httpSeparateURI(
     * Hostname but no path...
     */
 
-    status    = HTTP_URI_MISSING_RESOURCE;
+    status    = HTTP_URI_STATUS_MISSING_RESOURCE;
     *resource = '/';
 
    /*
@@ -1296,7 +1292,7 @@ httpSeparateURI(
   if (!uri)
   {
     *resource = '\0';
-    return (HTTP_URI_BAD_RESOURCE);
+    return (HTTP_URI_STATUS_BAD_RESOURCE);
   }
 
  /*
@@ -1308,95 +1304,107 @@ httpSeparateURI(
 
 
 /*
- * 'httpStatus()' - Return a short string describing a HTTP status code.
+ * 'httpStateString()' - Return the string describing a HTTP state value.
  *
- * The returned string is localized to the current POSIX locale and is based
- * on the status strings defined in RFC 2616.
+ * @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(http_status_t status)       /* I - HTTP status code */
+_httpStatus(cups_lang_t   *lang,       /* I - Language */
+            http_status_t status)      /* I - HTTP 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_ERROR :
+    case HTTP_STATUS_ERROR :
         s = strerror(errno);
         break;
-    case HTTP_CONTINUE :
+    case HTTP_STATUS_CONTINUE :
         s = _("Continue");
        break;
-    case HTTP_SWITCHING_PROTOCOLS :
+    case HTTP_STATUS_SWITCHING_PROTOCOLS :
         s = _("Switching Protocols");
        break;
-    case HTTP_OK :
+    case HTTP_STATUS_OK :
         s = _("OK");
        break;
-    case HTTP_CREATED :
+    case HTTP_STATUS_CREATED :
         s = _("Created");
        break;
-    case HTTP_ACCEPTED :
+    case HTTP_STATUS_ACCEPTED :
         s = _("Accepted");
        break;
-    case HTTP_NO_CONTENT :
+    case HTTP_STATUS_NO_CONTENT :
         s = _("No Content");
        break;
-    case HTTP_MOVED_PERMANENTLY :
+    case HTTP_STATUS_MOVED_PERMANENTLY :
         s = _("Moved Permanently");
        break;
-    case HTTP_SEE_OTHER :
+    case HTTP_STATUS_SEE_OTHER :
         s = _("See Other");
        break;
-    case HTTP_NOT_MODIFIED :
+    case HTTP_STATUS_NOT_MODIFIED :
         s = _("Not Modified");
        break;
-    case HTTP_BAD_REQUEST :
+    case HTTP_STATUS_BAD_REQUEST :
         s = _("Bad Request");
        break;
-    case HTTP_UNAUTHORIZED :
-    case HTTP_AUTHORIZATION_CANCELED :
+    case HTTP_STATUS_UNAUTHORIZED :
+    case HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED :
         s = _("Unauthorized");
        break;
-    case HTTP_FORBIDDEN :
+    case HTTP_STATUS_FORBIDDEN :
         s = _("Forbidden");
        break;
-    case HTTP_NOT_FOUND :
+    case HTTP_STATUS_NOT_FOUND :
         s = _("Not Found");
        break;
-    case HTTP_REQUEST_TOO_LARGE :
+    case HTTP_STATUS_REQUEST_TOO_LARGE :
         s = _("Request Entity Too Large");
        break;
-    case HTTP_URI_TOO_LONG :
+    case HTTP_STATUS_URI_TOO_LONG :
         s = _("URI Too Long");
        break;
-    case HTTP_UPGRADE_REQUIRED :
+    case HTTP_STATUS_UPGRADE_REQUIRED :
         s = _("Upgrade Required");
        break;
-    case HTTP_NOT_IMPLEMENTED :
+    case HTTP_STATUS_NOT_IMPLEMENTED :
         s = _("Not Implemented");
        break;
-    case HTTP_NOT_SUPPORTED :
+    case HTTP_STATUS_NOT_SUPPORTED :
         s = _("Not Supported");
        break;
-    case HTTP_EXPECTATION_FAILED :
+    case HTTP_STATUS_EXPECTATION_FAILED :
         s = _("Expectation Failed");
        break;
-    case HTTP_SERVICE_UNAVAILABLE :
+    case HTTP_STATUS_SERVICE_UNAVAILABLE :
         s = _("Service Unavailable");
        break;
-    case HTTP_SERVER_ERROR :
+    case HTTP_STATUS_SERVER_ERROR :
         s = _("Internal Server Error");
        break;
-    case HTTP_PKI_ERROR :
+    case HTTP_STATUS_CUPS_PKI_ERROR :
         s = _("SSL/TLS Negotiation Error");
        break;
-    case HTTP_WEBIF_DISABLED :
+    case HTTP_STATUS_CUPS_WEBIF_DISABLED :
         s = _("Web Interface is Disabled");
        break;
 
@@ -1405,6 +1413,90 @@ httpStatus(http_status_t status) /* I - HTTP status code */
        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 2616.
+ */
+
+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));
 }
 
@@ -1500,12 +1592,12 @@ _httpResolveURI(
   if ((status = httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme,
                                 sizeof(scheme), userpass, sizeof(userpass),
                                hostname, sizeof(hostname), &port, resource,
-                               sizeof(resource))) < HTTP_URI_OK)
+                               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_OK)
+                     sizeof(resource)) < HTTP_URI_STATUS_OK)
 #endif /* DEBUG */
   {
     if (options & _HTTP_RESOLVE_STDERR)
@@ -1524,7 +1616,9 @@ _httpResolveURI(
   {
 #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
     char               *regtype,       /* Pointer to type in hostname */
-                       *domain;        /* Pointer to domain 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
@@ -1532,9 +1626,11 @@ _httpResolveURI(
 #      pragma comment(lib, "dnssd.lib")
 #    endif /* WIN32 */
     DNSServiceRef      ref,            /* DNS-SD master service reference */
-                       domainref,      /* DNS-SD service reference for domain */
+                       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                        domainsent = 0; /* Send the domain resolve? */
+    int                        extrasent = 0;  /* Send the domain/IPP/IPPS resolves? */
 #    ifdef HAVE_POLL
     struct pollfd      polldata;       /* Polling data */
 #    else /* select() */
@@ -1581,12 +1677,21 @@ _httpResolveURI(
     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;
-
-    resolved_uri[0] = '\0';
+    uribuf.uuid     = uuid;
 
     DEBUG_printf(("6_httpResolveURI: Resolving hostname=\"%s\", regtype=\"%s\", "
                   "domain=\"%s\"\n", hostname, regtype, domain));
@@ -1602,10 +1707,16 @@ _httpResolveURI(
 #  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, 0, hostname, regtype,
-                           "local.", http_resolve_cb,
+                            kDNSServiceFlagsShareConnection, myinterface,
+                            hostname, regtype, "local.", http_resolve_cb,
                            &uribuf) == kDNSServiceErr_NoError)
       {
        int     fds;                    /* Number of ready descriptors */
@@ -1617,7 +1728,7 @@ _httpResolveURI(
        while (time(NULL) < end_time)
        {
          if (options & _HTTP_RESOLVE_STDERR)
-           _cupsLangPrintFilter(stderr, "INFO", _("Looking for printer."));
+           _cupsLangPrintFilter(stderr, "INFO", _("Looking for printer..."));
 
          if (cb && !(*cb)(context))
          {
@@ -1636,7 +1747,7 @@ _httpResolveURI(
          polldata.fd     = DNSServiceRefSockFD(ref);
          polldata.events = POLLIN;
 
-         fds = poll(&polldata, 1, 1000 * timeout);
+         fds = poll(&polldata, 1, (int)(1000 * timeout));
 
 #    else /* select() */
          FD_ZERO(&input_set);
@@ -1668,7 +1779,7 @@ _httpResolveURI(
            * comes in, do an additional domain resolution...
            */
 
-           if (domainsent == 0 && domain && _cups_strcasecmp(domain, "local."))
+           if (extrasent == 0 && domain && _cups_strcasecmp(domain, "local."))
            {
              if (options & _HTTP_RESOLVE_STDERR)
                fprintf(stderr,
@@ -1679,10 +1790,36 @@ _httpResolveURI(
              domainref = ref;
              if (DNSServiceResolve(&domainref,
                                    kDNSServiceFlagsShareConnection,
-                                   0, hostname, regtype, domain,
+                                   myinterface, hostname, regtype, domain,
                                    http_resolve_cb,
                                    &uribuf) == kDNSServiceErr_NoError)
-               domainsent = 1;
+               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;
            }
 
           /*
@@ -1699,7 +1836,8 @@ _httpResolveURI(
          }
          else
          {
-           if (DNSServiceProcessResult(ref) == kDNSServiceErr_NoError)
+           if (DNSServiceProcessResult(ref) == kDNSServiceErr_NoError &&
+               resolved_uri[0])
            {
              uri = resolved_uri;
              break;
@@ -1707,8 +1845,15 @@ _httpResolveURI(
          }
        }
 
-       if (domainsent)
-         DNSServiceRefDeallocate(domainref);
+       if (extrasent)
+       {
+         if (domainref)
+           DNSServiceRefDeallocate(domainref);
+         if (ippref)
+           DNSServiceRefDeallocate(ippref);
+         if (ippsref)
+           DNSServiceRefDeallocate(ippsref);
+       }
 
        DNSServiceRefDeallocate(localref);
       }
@@ -1807,7 +1952,7 @@ _httpResolveURI(
 #endif /* HAVE_DNSSD || HAVE_AVAHI */
 
     if ((options & _HTTP_RESOLVE_STDERR) && !uri)
-      _cupsLangPrintFilter(stderr, "ERROR", _("Unable to find printer."));
+      _cupsLangPrintFilter(stderr, "INFO", _("Unable to find printer."));
   }
   else
   {
@@ -1900,7 +2045,7 @@ http_copy_decode(char       *dst, /* O - Destination buffer */
          else
            quoted |= *src - '0';
 
-          *ptr++ = quoted;
+          *ptr++ = (char)quoted;
        }
        else
        {
@@ -2013,6 +2158,31 @@ http_resolve_cb(
                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(("7http_resolve_cb: Found UUID %s, looking for %s.", uuid,
+                    uribuf->uuid));
+      return;
+    }
+  }
+
+ /*
   * Figure out the scheme from the full name...
   */
 
@@ -2036,7 +2206,8 @@ http_resolve_cb(
   */
 
   if ((uribuf->options & _HTTP_RESOLVE_FAXOUT) &&
-      (!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")))
+      (!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")) &&
+      !TXTRecordGetValuePtr(txtLen, txtRecord, "printer-type", &valueLen))
   {
     reskey     = "rfo";
     resdefault = "/ipp/faxout";
@@ -2102,9 +2273,7 @@ http_resolve_cb(
     {
       for (addr = addrlist; addr; addr = addr->next)
       {
-        int error = getnameinfo(&(addr->addr.addr),
-                               httpAddrLength(&(addr->addr)),
-                               fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
+        int error = getnameinfo(&(addr->addr.addr), (socklen_t)httpAddrLength(&(addr->addr)), fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
 
         if (!error)
        {
@@ -2135,12 +2304,9 @@ http_resolve_cb(
 
   if ((!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")) &&
       !strcmp(uribuf->resource, "/cups"))
-    httpAssembleURIf(HTTP_URI_CODING_ALL, uribuf->buffer, uribuf->bufsize,
-                     scheme, NULL, hostTarget, ntohs(port), "%s?snmp=false",
-                     resource);
+    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, uribuf->bufsize,
-                    scheme, NULL, hostTarget, ntohs(port), resource);
+    httpAssembleURI(HTTP_URI_CODING_ALL, uribuf->buffer, (int)uribuf->bufsize, scheme, NULL, hostTarget, ntohs(port), resource);
 
   DEBUG_printf(("8http_resolve_cb: Resolved URI is \"%s\"...", uribuf->buffer));
 }
@@ -2216,6 +2382,31 @@ http_resolve_cb(
   }
 
  /*
+  * 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(("7http_resolve_cb: Found UUID %s, looking for %s.", uuid,
+                    uribuf->uuid));
+      return;
+    }
+  }
+
+ /*
   * Figure out the scheme from the full name...
   */
 
@@ -2252,7 +2443,8 @@ http_resolve_cb(
   */
 
   if ((uribuf->options & _HTTP_RESOLVE_FAXOUT) &&
-      (!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")))
+      (!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")) &&
+      !avahi_string_list_find(txt, "printer-type"))
   {
     reskey     = "rfo";
     resdefault = "/ipp/faxout";
@@ -2319,9 +2511,7 @@ http_resolve_cb(
     {
       for (addr = addrlist; addr; addr = addr->next)
       {
-        int error = getnameinfo(&(addr->addr.addr),
-                               httpAddrLength(&(addr->addr)),
-                               fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
+        int error = getnameinfo(&(addr->addr.addr), (socklen_t)httpAddrLength(&(addr->addr)), fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
 
         if (!error)
        {
@@ -2360,5 +2550,5 @@ http_resolve_cb(
 
 
 /*
- * End of "$Id: http-support.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: http-support.c 12970 2015-11-13 20:02:51Z msweet $".
  */
index 5c77d3d..e5e7be5 100644 (file)
 /*
- * "$Id: http.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: http.c 12970 2015-11-13 20:02:51Z msweet $"
  *
- *   HTTP routines for CUPS.
+ * HTTP routines for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * 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.
+ * This file contains Kerberos support code, copyright 2006 by
+ * Jelmer Vernooij.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   httpAddCredential()      - Allocates and adds a single credential to an
- *                             array.
- *   _httpBIOMethods()       - Get the OpenSSL BIO methods for HTTP
- *                             connections.
- *   httpBlocking()          - Set blocking/non-blocking behavior on a
- *                             connection.
- *   httpCheck()             - Check to see if there is a pending response
- *                             from the server.
- *   httpClearCookie()       - Clear the cookie value(s).
- *   httpClearFields()       - Clear HTTP request fields.
- *   httpClose()             - Close an HTTP connection.
- *   httpConnect()           - Connect to a HTTP server.
- *   httpConnectEncrypt()     - Connect to a HTTP server using encryption.
- *   httpCopyCredentials()    - Copy the credentials associated with an
- *                             encrypted connection.
- *   _httpCreate()           - Create an unconnected HTTP connection.
- *   _httpCreateCredentials() - Create credentials in the internal format.
- *   httpDelete()            - Send a DELETE request to the server.
- *   _httpDisconnect()       - Disconnect a HTTP connection.
- *   httpEncryption()        - Set the required encryption on the link.
- *   httpError()             - Get the last error on a connection.
- *   httpFlush()             - Flush data from a HTTP connection.
- *   httpFlushWrite()        - Flush data in write buffer.
- *   _httpFreeCredentials()   - Free internal credentials.
- *   httpFreeCredentials()    - Free an array of credentials.
- *   httpGet()               - Send a GET request to the server.
- *   httpGetAuthString()      - Get the current authorization string.
- *   httpGetBlocking()       - Get the blocking/non-block state of a
- *                             connection.
- *   httpGetCookie()         - Get any cookie data from the response.
- *   httpGetFd()             - Get the file descriptor associated with a
- *                             connection.
- *   httpGetField()          - Get a field value from a request/response.
- *   httpGetLength()         - Get the amount of data remaining from the
- *                             content-length or transfer-encoding fields.
- *   httpGetLength2()        - Get the amount of data remaining from the
- *                             content-length or transfer-encoding fields.
- *   httpGets()              - Get a line of text from a HTTP connection.
- *   httpGetState()          - Get the current state of the HTTP request.
- *   httpGetStatus()         - Get the status of the last HTTP request.
- *   httpGetSubField()       - Get a sub-field value.
- *   httpGetSubField2()       - Get a sub-field value.
- *   httpGetVersion()        - Get the HTTP version at the other end.
- *   httpHead()              - Send a HEAD request to the server.
- *   httpInitialize()        - Initialize the HTTP interface library and set
- *                             the default HTTP proxy (if any).
- *   httpOptions()           - Send an OPTIONS request to the server.
- *   _httpPeek()             - Peek at data from a HTTP connection.
- *   httpPost()              - Send a POST request to the server.
- *   httpPrintf()            - Print a formatted string to a HTTP connection.
- *   httpPut()               - Send a PUT request to the server.
- *   httpRead()              - Read data from a HTTP connection.
- *   httpRead2()             - Read data from a HTTP connection.
- *   _httpReadCDSA()         - Read function for the CDSA library.
- *   _httpReadGNUTLS()       - Read function for the GNU TLS library.
- *   httpReconnect()         - Reconnect to a HTTP server.
- *   httpReconnect2()        - Reconnect to a HTTP server with timeout and
- *                             optional cancel.
- *   httpSetAuthString()      - Set the current authorization string.
- *   httpSetCredentials()     - Set the credentials associated with an
- *                             encrypted connection.
- *   httpSetCookie()         - Set the cookie value(s).
- *   httpSetExpect()         - Set the Expect: header in a request.
- *   httpSetField()          - Set the value of an HTTP header.
- *   httpSetLength()         - Set the content-length and content-encoding.
- *   httpSetTimeout()        - Set read/write timeouts and an optional
- *                             callback.
- *   httpTrace()             - Send an TRACE request to the server.
- *   _httpUpdate()           - Update the current HTTP status for incoming
- *                             data.
- *   httpUpdate()            - Update the current HTTP state for incoming
- *                             data.
- *   _httpWait()             - Wait for data available on a connection (no
- *                             flush).
- *   httpWait()              - Wait for data available on a connection.
- *   httpWrite()             - Write data to a HTTP connection.
- *   httpWrite2()            - Write data to a HTTP connection.
- *   _httpWriteCDSA()        - Write function for the CDSA library.
- *   _httpWriteGNUTLS()       - Write function for the GNU TLS library.
- *   http_bio_ctrl()         - Control the HTTP connection.
- *   http_bio_free()         - Free OpenSSL data.
- *   http_bio_new()          - Initialize an OpenSSL BIO structure.
- *   http_bio_puts()         - Send a string for OpenSSL.
- *   http_bio_read()         - Read data for OpenSSL.
- *   http_bio_write()        - Write data for OpenSSL.
- *   http_debug_hex()        - Do a hex dump of a buffer.
- *   http_field()            - Return the field index for a field name.
- *   http_read_ssl()         - Read from a SSL/TLS connection.
- *   http_send()             - Send a request with all fields and the trailing
- *                             blank line.
- *   http_set_credentials()   - Set the SSL/TLS credentials.
- *   http_set_timeout()       - Set the socket timeout values.
- *   http_set_wait()         - Set the default wait value for reads.
- *   http_setup_ssl()        - Set up SSL/TLS support on a connection.
- *   http_shutdown_ssl()      - Shut down SSL/TLS on a connection.
- *   http_upgrade()          - Force upgrade to TLS encryption.
- *   http_write()            - Write a buffer to a HTTP connection.
- *   http_write_chunk()       - Write a chunked buffer.
- *   http_write_ssl()        - Write to a SSL/TLS connection.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
 #  include <signal.h>
 #  include <sys/time.h>
 #  include <sys/resource.h>
-#  include <sys/utsname.h>
 #endif /* WIN32 */
 #ifdef HAVE_POLL
 #  include <poll.h>
  * Local functions...
  */
 
+#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 http_field_t    http_field(const char *name);
+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 int             http_write(http_t *http, const char *buffer,
-                                  int length);
-static int             http_write_chunk(http_t *http, const char *buffer,
-                                        int length);
-#ifdef HAVE_SSL
-static int             http_read_ssl(http_t *http, char *buf, int len);
-#  if defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA)
-static int             http_set_credentials(http_t *http);
-#  endif /* HAVE_CDSASSL ** HAVE_SECCERTIFICATECOPYDATA */
-#endif /* HAVE_SSL */
+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_setup_ssl(http_t *http);
-static void            http_shutdown_ssl(http_t *http);
-static int             http_upgrade(http_t *http);
-static int             http_write_ssl(http_t *http, const char *buf, int len);
+static int             http_tls_upgrade(http_t *http);
 #endif /* HAVE_SSL */
 
 
@@ -203,55 +104,100 @@ static const char * const http_fields[] =
                          "Transfer-Encoding",
                          "Upgrade",
                          "User-Agent",
-                         "WWW-Authenticate"
-                       };
-#ifdef DEBUG
-static const char * const http_states[] =
-                       {
-                         "HTTP_WAITING",
-                         "HTTP_OPTIONS",
-                         "HTTP_GET",
-                         "HTTP_GET_SEND",
-                         "HTTP_HEAD",
-                         "HTTP_POST",
-                         "HTTP_POST_RECV",
-                         "HTTP_POST_SEND",
-                         "HTTP_PUT",
-                         "HTTP_PUT_RECV",
-                         "HTTP_DELETE",
-                         "HTTP_TRACE",
-                         "HTTP_CLOSE",
-                         "HTTP_STATUS"
+                         "WWW-Authenticate",
+                         "Accept-Encoding",
+                         "Allow",
+                         "Server"
                        };
-#endif /* DEBUG */
 
 
-#if defined(HAVE_SSL) && defined(HAVE_LIBSSL)
 /*
- * BIO methods for OpenSSL...
+ * 'httpAcceptConnection()' - Accept a new HTTP client connection from the
+ *                            specified listening socket.
+ *
+ * @since CUPS 1.7/OS X 10.9@
  */
 
-static int             http_bio_write(BIO *h, const char *buf, int num);
-static int             http_bio_read(BIO *h, char *buf, int size);
-static int             http_bio_puts(BIO *h, const char *str);
-static long            http_bio_ctrl(BIO *h, int cmd, long arg1, void *arg2);
-static int             http_bio_new(BIO *h);
-static int             http_bio_free(BIO *data);
+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 */
 
-static BIO_METHOD      http_bio_methods =
-                       {
-                         BIO_TYPE_SOCKET,
-                         "http",
-                         http_bio_write,
-                         http_bio_read,
-                         http_bio_puts,
-                         NULL, /* http_bio_gets, */
-                         http_bio_ctrl,
-                         http_bio_new,
-                         http_bio_free,
-                         NULL,
-                       };
-#endif /* HAVE_SSL && HAVE_LIBSSL */
+
+ /*
+  * 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);
+}
 
 
 /*
@@ -289,25 +235,12 @@ httpAddCredential(
 }
 
 
-#if defined(HAVE_SSL) && defined(HAVE_LIBSSL)
-/*
- * '_httpBIOMethods()' - Get the OpenSSL BIO methods for HTTP connections.
- */
-
-BIO_METHOD *                           /* O - BIO methods for OpenSSL */
-_httpBIOMethods(void)
-{
-  return (&http_bio_methods);
-}
-#endif /* HAVE_SSL && HAVE_LIBSSL */
-
-
 /*
  * 'httpBlocking()' - Set blocking/non-blocking behavior on a connection.
  */
 
 void
-httpBlocking(http_t *http,             /* I - Connection to server */
+httpBlocking(http_t *http,             /* I - HTTP connection */
              int    b)                 /* I - 1 = blocking, 0 = non-blocking */
 {
   if (http)
@@ -323,7 +256,7 @@ httpBlocking(http_t *http,          /* I - Connection to server */
  */
 
 int                                    /* O - 0 = no data, 1 = data available */
-httpCheck(http_t *http)                        /* I - Connection to server */
+httpCheck(http_t *http)                        /* I - HTTP connection */
 {
   return (httpWait(http, 0));
 }
@@ -336,7 +269,7 @@ httpCheck(http_t *http)                     /* I - Connection to server */
  */
 
 void
-httpClearCookie(http_t *http)          /* I - Connection to server */
+httpClearCookie(http_t *http)          /* I - HTTP connection */
 {
   if (!http)
     return;
@@ -354,15 +287,21 @@ httpClearCookie(http_t *http)             /* I - Connection to server */
  */
 
 void
-httpClearFields(http_t *http)          /* I - Connection to server */
+httpClearFields(http_t *http)          /* I - HTTP connection */
 {
+  DEBUG_printf(("httpClearFields(http=%p)", http));
+
   if (http)
   {
     memset(http->fields, 0, sizeof(http->fields));
-    if (http->hostname[0] == '/')
-      httpSetField(http, HTTP_FIELD_HOST, "localhost");
-    else
-      httpSetField(http, HTTP_FIELD_HOST, http->hostname);
+
+    if (http->mode == _HTTP_MODE_CLIENT)
+    {
+      if (http->hostname[0] == '/')
+       httpSetField(http, HTTP_FIELD_HOST, "localhost");
+      else
+       httpSetField(http, HTTP_FIELD_HOST, http->hostname);
+    }
 
     if (http->field_authorization)
     {
@@ -370,6 +309,24 @@ httpClearFields(http_t *http)              /* I - Connection to server */
       http->field_authorization = NULL;
     }
 
+    if (http->accept_encoding)
+    {
+      _cupsStrFree(http->accept_encoding);
+      http->accept_encoding = NULL;
+    }
+
+    if (http->allow)
+    {
+      _cupsStrFree(http->allow);
+      http->allow = NULL;
+    }
+
+    if (http->server)
+    {
+      _cupsStrFree(http->server);
+      http->server = NULL;
+    }
+
     http->expect = (http_status_t)0;
   }
 }
@@ -380,7 +337,7 @@ httpClearFields(http_t *http)               /* I - Connection to server */
  */
 
 void
-httpClose(http_t *http)                        /* I - Connection to server */
+httpClose(http_t *http)                        /* I - HTTP connection */
 {
 #ifdef HAVE_GSSAPI
   OM_uint32    minor_status;           /* Minor status code */
@@ -434,9 +391,33 @@ httpClose(http_t *http)                    /* I - Connection to server */
 
 
 /*
+ * '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 httpConnectEncrypt@ instead.
+ * This function is deprecated - use @link httpConnect2@ instead.
  *
  * @deprecated@
  */
@@ -445,251 +426,80 @@ http_t *                         /* O - New HTTP connection */
 httpConnect(const char *host,          /* I - Host to connect to */
             int        port)           /* I - Port number */
 {
-  return (httpConnectEncrypt(host, port, HTTP_ENCRYPT_IF_REQUESTED));
+  return (httpConnect2(host, port, NULL, AF_UNSPEC,
+                       HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL));
 }
 
 
 /*
- * 'httpConnectEncrypt()' - Connect to a HTTP server using encryption.
+ * 'httpConnect2()' - Connect to a HTTP server.
+ *
+ * @since CUPS 1.7/OS X 10.9@
  */
 
 http_t *                               /* O - New HTTP connection */
-httpConnectEncrypt(
+httpConnect2(
     const char        *host,           /* I - Host to connect to */
     int               port,            /* I - Port number */
-    http_encryption_t encryption)      /* I - Type of encryption to use */
+    http_addrlist_t   *addrlist,       /* I - List of addresses or 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(("httpConnectEncrypt(host=\"%s\", port=%d, encryption=%d)",
-                host, port, encryption));
+  DEBUG_printf(("httpConnect2(host=\"%s\", port=%d, addrlist=%p, family=%d, "
+                "encryption=%d, blocking=%d, msec=%d, cancel=%p)", host, port,
+                addrlist, family, encryption, blocking, msec, cancel));
 
  /*
   * Create the HTTP structure...
   */
 
-  if ((http = _httpCreate(host, port, NULL, encryption, AF_UNSPEC)) == NULL)
+  if ((http = http_create(host, port, addrlist, family, encryption, blocking,
+                          _HTTP_MODE_CLIENT)) == NULL)
     return (NULL);
 
  /*
-  * Connect to the remote system...
+  * Optionally connect to the remote system...
   */
 
-  if (!httpReconnect(http))
+  if (msec == 0 || !httpReconnect2(http, msec, cancel))
     return (http);
 
  /*
   * Could not connect to any known address - bail out!
   */
 
-  httpAddrFreeList(http->addrlist);
-
-  free(http);
+  httpClose(http);
 
   return (NULL);
 }
 
 
 /*
- * 'httpCopyCredentials()' - Copy the credentials associated with an encrypted
- *                          connection.
+ * 'httpConnectEncrypt()' - Connect to a HTTP server using encryption.
  *
- * @since CUPS 1.5/OS X 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 */
-{
-#  ifdef HAVE_LIBSSL
-#  elif defined(HAVE_GNUTLS)
-#  elif defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA)
-  OSStatus             error;          /* Error code */
-  CFIndex              count;          /* Number of credentials */
-  CFArrayRef           peerCerts;      /* Peer certificates */
-  SecCertificateRef    secCert;        /* Certificate reference */
-  CFDataRef            data;           /* Certificate data */
-  int                  i;              /* Looping var */
-#  elif defined(HAVE_SSPISSL)
-#  endif /* HAVE_LIBSSL */
-
-
-  if (credentials)
-    *credentials = NULL;
-
-  if (!http || !http->tls || !credentials)
-    return (-1);
-
-#  ifdef HAVE_LIBSSL
-  return (-1);
-
-#  elif defined(HAVE_GNUTLS)
-  return (-1);
-
-#  elif defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA)
-  if (!(error = SSLCopyPeerCertificates(http->tls, &peerCerts)) && peerCerts)
-  {
-    if ((*credentials = cupsArrayNew(NULL, NULL)) != NULL)
-    {
-      for (i = 0, count = CFArrayGetCount(peerCerts); i < count; i++)
-      {
-       secCert = (SecCertificateRef)CFArrayGetValueAtIndex(peerCerts, i);
-       if ((data = SecCertificateCopyData(secCert)))
-       {
-         httpAddCredential(*credentials, CFDataGetBytePtr(data),
-                           CFDataGetLength(data));
-         CFRelease(data);
-       }
-      }
-    }
-
-    CFRelease(peerCerts);
-  }
-
-  return (error);
-
-#  elif defined(HAVE_SSPISSL)
-  return (-1);
-
-#  else
-  return (-1);
-#  endif /* HAVE_LIBSSL */
-}
-
-
-/*
- * '_httpCreate()' - Create an unconnected HTTP connection.
+ * This function is now deprecated. Please use the @link httpConnect2@ function
+ * instead.
+ *
+ * @deprecated@
  */
 
-http_t *                               /* O - HTTP connection */
-_httpCreate(
-    const char        *host,           /* I - Hostname */
+http_t *                               /* O - New HTTP connection */
+httpConnectEncrypt(
+    const char        *host,           /* I - Host to connect to */
     int               port,            /* I - Port number */
-    http_addrlist_t   *addrlist,       /* I - Address list or NULL */
-    http_encryption_t encryption,      /* I - Encryption to use */
-    int               family)          /* I - Address family or AF_UNSPEC */
+    http_encryption_t encryption)      /* I - Type of encryption to use */
 {
-  http_t       *http;                  /* New HTTP connection */
-  char         service[255];           /* Service name */
-
-
-  DEBUG_printf(("4_httpCreate(host=\"%s\", port=%d, encryption=%d)",
+  DEBUG_printf(("httpConnectEncrypt(host=\"%s\", port=%d, encryption=%d)",
                 host, port, encryption));
 
-  if (!host)
-    return (NULL);
-
-  httpInitialize();
-
- /*
-  * Lookup the host...
-  */
-
-  sprintf(service, "%d", port);
-
-  if (!addrlist)
-    if ((addrlist = httpAddrGetList(host, family, service)) == NULL)
-      return (NULL);
-
- /*
-  * Allocate memory for the structure...
-  */
-
-  if ((http = calloc(sizeof(http_t), 1)) == NULL)
-  {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
-    httpAddrFreeList(addrlist);
-    return (NULL);
-  }
-
- /*
-  * Initialize the HTTP data...
-  */
-
-  http->activity = time(NULL);
-  http->addrlist = addrlist;
-  http->blocking = 1;
-  http->fd       = -1;
-#ifdef HAVE_GSSAPI
-  http->gssctx   = GSS_C_NO_CONTEXT;
-  http->gssname  = GSS_C_NO_NAME;
-#endif /* HAVE_GSSAPI */
-  http->version  = HTTP_1_1;
-
-  strlcpy(http->hostname, host, sizeof(http->hostname));
-
-  if (port == 443)                     /* Always use encryption for https */
-    http->encryption = HTTP_ENCRYPT_ALWAYS;
-  else
-    http->encryption = encryption;
-
-  http_set_wait(http);
-
- /*
-  * Return the new structure...
-  */
-
-  return (http);
-}
-
-
-/*
- * '_httpCreateCredentials()' - Create credentials in the internal format.
- */
-
-http_tls_credentials_t                 /* O - Internal credentials */
-_httpCreateCredentials(
-    cups_array_t *credentials)         /* I - Array of credentials */
-{
-  if (!credentials)
-    return (NULL);
-
-#  ifdef HAVE_LIBSSL
-  return (NULL);
-
-#  elif defined(HAVE_GNUTLS)
-  return (NULL);
-
-#  elif defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA)
-  CFMutableArrayRef    peerCerts;      /* Peer credentials reference */
-  SecCertificateRef    secCert;        /* Certificate reference */
-  CFDataRef            data;           /* Credential data reference */
-  http_credential_t    *credential;    /* Credential data */
-
-
-  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 ((data = CFDataCreate(kCFAllocatorDefault, credential->data,
-                            credential->datalen)))
-    {
-      if ((secCert = SecCertificateCreateWithData(kCFAllocatorDefault, data))
-              != NULL)
-      {
-       CFArrayAppendValue(peerCerts, secCert);
-       CFRelease(secCert);
-      }
-
-      CFRelease(data);
-    }
-  }
-
-  return (peerCerts);
-
-#  elif defined(HAVE_SSPISSL)
-  return (NULL);
-
-#  else
-  return (NULL);
-#  endif /* HAVE_LIBSSL */
+  return (httpConnect2(host, port, NULL, AF_UNSPEC, encryption, 1, 30000,
+                       NULL));
 }
 
 
@@ -698,10 +508,10 @@ _httpCreateCredentials(
  */
 
 int                                    /* O - Status of call (0 = success) */
-httpDelete(http_t     *http,           /* I - Connection to server */
+httpDelete(http_t     *http,           /* I - HTTP connection */
            const char *uri)            /* I - URI to delete */
 {
-  return (http_send(http, HTTP_DELETE, uri));
+  return (http_send(http, HTTP_STATE_DELETE, uri));
 }
 
 
@@ -710,18 +520,14 @@ httpDelete(http_t     *http,              /* I - Connection to server */
  */
 
 void
-_httpDisconnect(http_t *http)          /* I - Connection to server */
+_httpDisconnect(http_t *http)          /* I - HTTP connection */
 {
 #ifdef HAVE_SSL
   if (http->tls)
-    http_shutdown_ssl(http);
+    _httpTLSStop(http);
 #endif /* HAVE_SSL */
 
-#ifdef WIN32
-  closesocket(http->fd);
-#else
-  close(http->fd);
-#endif /* WIN32 */
+  httpAddrClose(NULL, http->fd);
 
   http->fd = -1;
 }
@@ -732,7 +538,7 @@ _httpDisconnect(http_t *http)               /* I - Connection to server */
  */
 
 int                                    /* O - -1 on error, 0 on success */
-httpEncryption(http_t            *http,        /* I - Connection to server */
+httpEncryption(http_t            *http,        /* I - HTTP connection */
                http_encryption_t e)    /* I - New encryption preference */
 {
   DEBUG_printf(("httpEncryption(http=%p, e=%d)", http, e));
@@ -741,17 +547,31 @@ httpEncryption(http_t            *http,   /* I - Connection to server */
   if (!http)
     return (0);
 
-  http->encryption = e;
+  if (http->mode == _HTTP_MODE_CLIENT)
+  {
+    http->encryption = e;
 
-  if ((http->encryption == HTTP_ENCRYPT_ALWAYS && !http->tls) ||
-      (http->encryption == HTTP_ENCRYPT_NEVER && http->tls))
-    return (httpReconnect(http));
-  else if (http->encryption == HTTP_ENCRYPT_REQUIRED && !http->tls)
-    return (http_upgrade(http));
+    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
-    return (0);
+  {
+    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_ENCRYPT_ALWAYS || e == HTTP_ENCRYPT_REQUIRED)
+  if (e == HTTP_ENCRYPTION_ALWAYS || e == HTTP_ENCRYPTION_REQUIRED)
     return (-1);
   else
     return (0);
@@ -764,7 +584,7 @@ httpEncryption(http_t            *http,     /* I - Connection to server */
  */
 
 int                                    /* O - Error code (errno) value */
-httpError(http_t *http)                        /* I - Connection to server */
+httpError(http_t *http)                        /* I - HTTP connection */
 {
   if (http)
     return (http->error);
@@ -774,11 +594,30 @@ httpError(http_t *http)                   /* I - Connection to server */
 
 
 /*
+ * '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 from a HTTP connection.
  */
 
 void
-httpFlush(http_t *http)                        /* I - Connection to server */
+httpFlush(http_t *http)                        /* I - HTTP connection */
 {
   char         buffer[8192];           /* Junk buffer */
   int          blocking;               /* To block or not to block */
@@ -786,7 +625,14 @@ httpFlush(http_t *http)                    /* I - Connection to server */
 
 
   DEBUG_printf(("httpFlush(http=%p), state=%s", http,
-                http_states[http->state]));
+                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()...
@@ -809,24 +655,28 @@ httpFlush(http_t *http)                   /* I - Connection to server */
 
   http->blocking = blocking;
 
-  if (http->state == oldstate && http->state != HTTP_WAITING && http->fd >= 0)
+  if (http->state == oldstate && http->state != HTTP_STATE_WAITING &&
+      http->fd >= 0)
   {
    /*
     * Didn't get the data back, so close the current connection.
     */
 
-    http->state = HTTP_WAITING;
+#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)
-      http_shutdown_ssl(http);
+      _httpTLSStop(http);
 #endif /* HAVE_SSL */
 
-#ifdef WIN32
-    closesocket(http->fd);
-#else
-    close(http->fd);
-#endif /* WIN32 */
+    httpAddrClose(NULL, http->fd);
 
     http->fd = -1;
   }
@@ -840,12 +690,13 @@ httpFlush(http_t *http)                   /* I - Connection to server */
  */
 
 int                                    /* O - Bytes written or -1 on error */
-httpFlushWrite(http_t *http)           /* I - Connection to server */
+httpFlushWrite(http_t *http)           /* I - HTTP connection */
 {
-  int  bytes;                          /* Bytes written */
+  ssize_t      bytes;                  /* Bytes written */
 
 
-  DEBUG_printf(("httpFlushWrite(http=%p)", http));
+  DEBUG_printf(("httpFlushWrite(http=%p) data_encoding=%d", http,
+                http ? http->data_encoding : 100));
 
   if (!http || !http->wused)
   {
@@ -854,43 +705,16 @@ httpFlushWrite(http_t *http)              /* I - Connection to server */
     return (0);
   }
 
-  if (http->data_encoding == HTTP_ENCODE_CHUNKED)
-    bytes = http_write_chunk(http, http->wbuffer, http->wused);
+  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, http->wused);
+    bytes = http_write(http, http->wbuffer, (size_t)http->wused);
 
   http->wused = 0;
 
-  DEBUG_printf(("1httpFlushWrite: Returning %d, errno=%d.", bytes, errno));
-
-  return (bytes);
-}
-
-
-/*
- * '_httpFreeCredentials()' - Free internal credentials.
- */
-
-void
-_httpFreeCredentials(
-    http_tls_credentials_t credentials)        /* I - Internal credentials */
-{
-  if (!credentials)
-    return;
-
-#ifdef HAVE_LIBSSL
-  (void)credentials;
-
-#elif defined(HAVE_GNUTLS)
-  (void)credentials;
+  DEBUG_printf(("1httpFlushWrite: Returning %d, errno=%d.", (int)bytes, errno));
 
-#elif defined(HAVE_CDSASSL)
-  CFRelease(credentials);
-
-#elif defined(HAVE_SSPISSL)
-  (void)credentials;
-
-#endif /* HAVE_LIBSSL */
+  return ((int)bytes);
 }
 
 
@@ -923,10 +747,25 @@ httpFreeCredentials(
  */
 
 int                                    /* O - Status of call (0 = success) */
-httpGet(http_t     *http,              /* I - Connection to server */
+httpGet(http_t     *http,              /* I - HTTP connection */
         const char *uri)               /* I - URI to get */
 {
-  return (http_send(http, HTTP_GET, uri));
+  return (http_send(http, HTTP_STATE_GET, uri));
+}
+
+
+/*
+ * 'httpGetActivity()' - Get the most recent activity for a connection.
+ *
+ * The return value is the UNIX time 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);
 }
 
 
@@ -942,7 +781,7 @@ httpGet(http_t     *http,           /* I - Connection to server */
  */
 
 char *                                 /* O - Authorization string */
-httpGetAuthString(http_t *http)                /* I - Connection to server */
+httpGetAuthString(http_t *http)                /* I - HTTP connection */
 {
   if (http)
     return (http->authstring);
@@ -958,33 +797,157 @@ httpGetAuthString(http_t *http)          /* I - Connection to server */
  */
 
 int                                    /* O - 1 if blocking, 0 if non-blocking */
-httpGetBlocking(http_t *http)          /* I - Connection to server */
+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/OS X 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->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->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/OS X 10.3@
  */
 
 const char *                           /* O - Cookie data or NULL */
-httpGetCookie(http_t *http)            /* I - HTTP connecion */
+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/OS X 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/OS X 10.5@
  */
 
 int                                    /* O - File descriptor or -1 if none */
-httpGetFd(http_t *http)                        /* I - Connection to server */
+httpGetFd(http_t *http)                        /* I - HTTP connection */
 {
   return (http ? http->fd : -1);
 }
@@ -995,23 +958,50 @@ httpGetFd(http_t *http)                   /* I - Connection to server */
  */
 
 const char *                           /* O - Field value */
-httpGetField(http_t       *http,       /* I - Connection to server */
+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 (field == HTTP_FIELD_AUTHORIZATION &&
-          http->field_authorization)
+
+  switch (field)
   {
-   /*
-    * Special case for WWW-Authenticate: as its contents can be
-    * longer than HTTP_MAX_VALUE...
-    */
+    case HTTP_FIELD_ACCEPT_ENCODING :
+        return (http->accept_encoding);
+
+    case HTTP_FIELD_ALLOW :
+        return (http->allow);
+
+    case HTTP_FIELD_SERVER :
+        return (http->server);
+
+    case HTTP_FIELD_AUTHORIZATION :
+        if (http->field_authorization)
+       {
+        /*
+         * Special case for WWW-Authenticate: as its contents can be
+         * longer than HTTP_MAX_VALUE...
+         */
+
+         return (http->field_authorization);
+       }
 
-    return (http->field_authorization);
+    default :
+        return (http->fields[field]);
   }
-  else
-    return (http->fields[field]);
+}
+
+
+/*
+ * '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);
 }
 
 
@@ -1026,7 +1016,7 @@ httpGetField(http_t       *http,  /* I - Connection to server */
  */
 
 int                                    /* O - Content length */
-httpGetLength(http_t *http)            /* I - Connection to server */
+httpGetLength(http_t *http)            /* I - HTTP connection */
 {
  /*
   * Get the read content length and return the 32-bit value.
@@ -1054,10 +1044,13 @@ httpGetLength(http_t *http)             /* I - Connection to server */
  */
 
 off_t                                  /* O - Content length */
-httpGetLength2(http_t *http)           /* I - Connection to server */
+httpGetLength2(http_t *http)           /* I - HTTP connection */
 {
+  off_t                        remaining;      /* Remaining length */
+
+
   DEBUG_printf(("2httpGetLength2(http=%p), state=%s", http,
-                http_states[http->state]));
+                httpStateString(http->state)));
 
   if (!http)
     return (-1);
@@ -1065,48 +1058,98 @@ httpGetLength2(http_t *http)            /* I - Connection to server */
   if (!_cups_strcasecmp(http->fields[HTTP_FIELD_TRANSFER_ENCODING], "chunked"))
   {
     DEBUG_puts("4httpGetLength2: chunked request!");
-
-    http->data_encoding  = HTTP_ENCODE_CHUNKED;
-    http->data_remaining = 0;
+    remaining = 0;
   }
   else
   {
-    http->data_encoding = HTTP_ENCODE_LENGTH;
-
    /*
     * The following is a hack for HTTP servers that don't send a
-    * content-length or transfer-encoding field...
+    * Content-Length or Transfer-Encoding field...
     *
-    * If there is no content-length then the connection must close
+    * If there is no Content-Length then the connection must close
     * after the transfer is complete...
     */
 
     if (!http->fields[HTTP_FIELD_CONTENT_LENGTH][0])
     {
      /*
-      * Default content length is 0 for errors and 2^31-1 for other
-      * successful requests...
+      * Default content length is 0 for errors and certain types of operations,
+      * and 2^31-1 for other successful requests...
       */
 
-      if (http->status >= HTTP_MULTIPLE_CHOICES)
-        http->data_remaining = 0;
+      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
-        http->data_remaining = 2147483647;
+        remaining = 2147483647;
     }
-    else
-      http->data_remaining = strtoll(http->fields[HTTP_FIELD_CONTENT_LENGTH],
-                                     NULL, 10);
+    else if ((remaining = strtoll(http->fields[HTTP_FIELD_CONTENT_LENGTH],
+                                 NULL, 10)) < 0)
+      remaining = -1;
 
     DEBUG_printf(("4httpGetLength2: content_length=" CUPS_LLFMT,
-                  CUPS_LLCAST http->data_remaining));
+                  CUPS_LLCAST remaining));
   }
 
-  if (http->data_remaining <= INT_MAX)
-    http->_data_remaining = (int)http->data_remaining;
-  else
-    http->_data_remaining = INT_MAX;
+  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@
+ */
 
-  return (http->data_remaining);
+size_t                                 /* O - Remaining bytes */
+httpGetRemaining(http_t *http)         /* I - HTTP connection */
+{
+  return (http ? (size_t)http->data_remaining : 0);
 }
 
 
@@ -1117,19 +1160,19 @@ httpGetLength2(http_t *http)            /* I - Connection to server */
 char *                                 /* O - Line or NULL */
 httpGets(char   *line,                 /* I - Line to read into */
          int    length,                        /* I - Max length of buffer */
-        http_t *http)                  /* I - Connection to server */
+        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 */
-  int  bytes,                          /* Number of bytes read */
-       eol;                            /* End-of-line? */
+  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)", line, length, http));
 
-  if (http == NULL || line == NULL)
+  if (!http || !line || length <= 1)
     return (NULL);
 
  /*
@@ -1173,20 +1216,9 @@ httpGets(char   *line,                   /* I - Line to read into */
         return (NULL);
       }
 
-#ifdef HAVE_SSL
-      if (http->tls)
-       bytes = http_read_ssl(http, http->buffer + http->used,
-                             HTTP_MAX_BUFFER - http->used);
-      else
-#endif /* HAVE_SSL */
-        bytes = recv(http->fd, http->buffer + http->used,
-                    HTTP_MAX_BUFFER - http->used, 0);
-
-      DEBUG_printf(("4httpGets: read %d bytes...", bytes));
+      bytes = http_read(http, http->buffer + http->used, (size_t)(HTTP_MAX_BUFFER - http->used));
 
-#ifdef DEBUG
-      http_debug_hex("httpGets", http->buffer + http->used, bytes);
-#endif /* DEBUG */
+      DEBUG_printf(("4httpGets: read " CUPS_LLFMT " bytes.", CUPS_LLCAST bytes));
 
       if (bytes < 0)
       {
@@ -1246,7 +1278,7 @@ httpGets(char   *line,                    /* I - Line to read into */
       * Yup, update the amount used...
       */
 
-      http->used += bytes;
+      http->used += (int)bytes;
     }
 
    /*
@@ -1270,7 +1302,7 @@ httpGets(char   *line,                    /* I - Line to read into */
 
     http->used -= (int)(bufptr - http->buffer);
     if (http->used > 0)
-      memmove(http->buffer, bufptr, http->used);
+      memmove(http->buffer, bufptr, (size_t)http->used);
 
     if (eol)
     {
@@ -1299,9 +1331,9 @@ httpGets(char   *line,                    /* I - Line to read into */
  */
 
 http_state_t                           /* O - HTTP state */
-httpGetState(http_t *http)             /* I - Connection to server */
+httpGetState(http_t *http)             /* I - HTTP connection */
 {
-  return (http ? http->state : HTTP_ERROR);
+  return (http ? http->state : HTTP_STATE_ERROR);
 }
 
 
@@ -1312,9 +1344,9 @@ httpGetState(http_t *http)                /* I - Connection to server */
  */
 
 http_status_t                          /* O - HTTP status */
-httpGetStatus(http_t *http)            /* I - Connection to server */
+httpGetStatus(http_t *http)            /* I - HTTP connection */
 {
-  return (http ? http->status : HTTP_ERROR);
+  return (http ? http->status : HTTP_STATUS_ERROR);
 }
 
 
@@ -1325,7 +1357,7 @@ httpGetStatus(http_t *http)               /* I - Connection to server */
  */
 
 char *                                 /* O - Value or NULL */
-httpGetSubField(http_t       *http,    /* I - Connection to server */
+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 */
@@ -1341,7 +1373,7 @@ httpGetSubField(http_t       *http,       /* I - Connection to server */
  */
 
 char *                                 /* O - Value or NULL */
-httpGetSubField2(http_t       *http,   /* I - Connection to server */
+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 */
@@ -1471,9 +1503,9 @@ httpGetSubField2(http_t       *http,      /* I - Connection to server */
  */
 
 http_version_t                         /* O - Version number */
-httpGetVersion(http_t *http)           /* I - Connection to server */
+httpGetVersion(http_t *http)           /* I - HTTP connection */
 {
-  return (http ? http->version : HTTP_1_0);
+  return (http ? http->version : HTTP_VERSION_1_0);
 }
 
 
@@ -1482,11 +1514,11 @@ httpGetVersion(http_t *http)            /* I - Connection to server */
  */
 
 int                                    /* O - Status of call (0 = success) */
-httpHead(http_t     *http,             /* I - Connection to server */
+httpHead(http_t     *http,             /* I - HTTP connection */
          const char *uri)              /* I - URI for head */
 {
   DEBUG_printf(("httpHead(http=%p, uri=\"%s\")", http, uri));
-  return (http_send(http, HTTP_HEAD, uri));
+  return (http_send(http, HTTP_STATE_HEAD, uri));
 }
 
 
@@ -1502,10 +1534,6 @@ httpInitialize(void)
 #ifdef WIN32
   WSADATA      winsockdata;            /* WinSock data */
 #endif /* WIN32 */
-#ifdef HAVE_LIBSSL
-  int          i;                      /* Looping var */
-  unsigned char        data[1024];             /* Seed data */
-#endif /* HAVE_LIBSSL */
 
 
   _cupsGlobalLock();
@@ -1539,36 +1567,43 @@ httpInitialize(void)
 #  endif /* !SO_NOSIGPIPE */
 #endif /* WIN32 */
 
-#ifdef HAVE_GNUTLS
- /*
-  * Initialize GNU TLS...
-  */
+#  ifdef HAVE_SSL
+  _httpTLSInitialize();
+#  endif /* HAVE_SSL */
 
-  gnutls_global_init();
-
-#elif defined(HAVE_LIBSSL)
- /*
-  * Initialize OpenSSL...
-  */
+  initialized = 1;
+  _cupsGlobalUnlock();
+}
 
-  SSL_load_error_strings();
-  SSL_library_init();
 
- /*
-  * Using the current time is a dubious random seed, but on some systems
-  * it is the best we can do (on others, this seed isn't even used...)
-  */
+/*
+ * '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@
+ */
 
-  CUPS_SRAND(time(NULL));
+int                                    /* O - 1 if chunked, 0 if not */
+httpIsChunked(http_t *http)            /* I - HTTP connection */
+{
+  return (http ? http->data_encoding == HTTP_ENCODING_CHUNKED : 0);
+}
 
-  for (i = 0; i < sizeof(data); i ++)
-    data[i] = CUPS_RAND();
 
-  RAND_seed(data, sizeof(data));
-#endif /* HAVE_GNUTLS */
+/*
+ * '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@
+ */
 
-  initialized = 1;
-  _cupsGlobalUnlock();
+int                                    /* O - 1 if encrypted, 0 if not */
+httpIsEncrypted(http_t *http)          /* I - HTTP connection */
+{
+  return (http ? http->tls != NULL : 0);
 }
 
 
@@ -1577,33 +1612,35 @@ httpInitialize(void)
  */
 
 int                                    /* O - Status of call (0 = success) */
-httpOptions(http_t     *http,          /* I - Connection to server */
+httpOptions(http_t     *http,          /* I - HTTP connection */
             const char *uri)           /* I - URI for options */
 {
-  return (http_send(http, HTTP_OPTIONS, uri));
+  return (http_send(http, HTTP_STATE_OPTIONS, uri));
 }
 
 
 /*
- * '_httpPeek()' - Peek at data from a HTTP connection.
+ * '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 httpRead@ or @link httpRead2@.
  *
  * For non-blocking connections the usual timeouts apply.
+ *
+ * @since CUPS 1.7/OS X 10.9@
  */
 
 ssize_t                                        /* O - Number of bytes copied */
-_httpPeek(http_t *http,                        /* I - Connection to server */
-          char   *buffer,              /* I - Buffer for data */
-         size_t length)                /* I - Maximum number of bytes */
+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 ")",
+  DEBUG_printf(("httpPeek(http=%p, buffer=%p, length=" CUPS_LLFMT ")",
                 http, buffer, CUPS_LLCAST length));
 
   if (http == NULL || buffer == NULL)
@@ -1615,55 +1652,80 @@ _httpPeek(http_t *http,                 /* I - Connection to server */
   if (length <= 0)
     return (0);
 
-  if (http->data_encoding == HTTP_ENCODE_CHUNKED &&
+  if (http->data_encoding == HTTP_ENCODING_CHUNKED &&
       http->data_remaining <= 0)
   {
-    DEBUG_puts("2_httpPeek: Getting chunk length...");
+    DEBUG_puts("2httpPeek: Getting chunk length...");
 
     if (httpGets(len, sizeof(len), http) == NULL)
     {
-      DEBUG_puts("1_httpPeek: Could not get length!");
+      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("1_httpPeek: Negative chunk length!");
+      DEBUG_puts("1httpPeek: Negative chunk length!");
       return (0);
     }
   }
 
-  DEBUG_printf(("2_httpPeek: data_remaining=" CUPS_LLFMT,
+  DEBUG_printf(("2httpPeek: data_remaining=" CUPS_LLFMT,
                 CUPS_LLCAST http->data_remaining));
 
-  if (http->data_remaining <= 0)
+  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...
     */
 
-    if (http->data_encoding == HTTP_ENCODE_CHUNKED)
+#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_POST_RECV)
+    if (http->state == HTTP_STATE_POST_RECV)
       http->state ++;
     else
-      http->state = HTTP_WAITING;
+      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_ENCODE_LENGTH;
+    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 && http->stream.avail_in == 0)))
+#else
   if (http->used == 0)
+#endif /* HAVE_LIBZ */
   {
    /*
     * Buffer small reads for better performance...
@@ -1682,72 +1744,99 @@ _httpPeek(http_t *http,                 /* I - Connection to server */
       }
     }
 
-    if (http->data_remaining > sizeof(http->buffer))
+    if ((size_t)http->data_remaining > sizeof(http->buffer))
       buflen = sizeof(http->buffer);
     else
-      buflen = http->data_remaining;
+      buflen = (ssize_t)http->data_remaining;
 
-    DEBUG_printf(("2_httpPeek: Reading %d bytes into buffer.", (int)buflen));
+    DEBUG_printf(("2httpPeek: Reading %d bytes into buffer.", (int)buflen));
+    bytes = http_read(http, http->buffer, (size_t)buflen);
 
-    do
+    DEBUG_printf(("2httpPeek: Read " CUPS_LLFMT " bytes into buffer.",
+                  CUPS_LLCAST bytes));
+    if (bytes > 0)
     {
-#ifdef HAVE_SSL
-      if (http->tls)
-       bytes = http_read_ssl(http, http->buffer, buflen);
-      else
-#endif /* HAVE_SSL */
-      bytes = recv(http->fd, http->buffer, buflen, 0);
+#ifdef DEBUG
+      http_debug_hex("httpPeek", http->buffer, (int)bytes);
+#endif /* DEBUG */
 
-      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
-       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 */
-      }
+      http->used = (int)bytes;
     }
-    while (bytes < 0);
+  }
 
-    DEBUG_printf(("2_httpPeek: Read " CUPS_LLFMT " bytes into buffer.",
-                  CUPS_LLCAST 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 && http->stream.avail_in < HTTP_MAX_BUFFER)
+    {
+      size_t buflen = buflen = HTTP_MAX_BUFFER - http->stream.avail_in;
+                                       /* Number of bytes to copy */
+
+      if (http->stream.avail_in > 0 &&
+         http->stream.next_in > http->sbuffer)
+        memmove(http->sbuffer, http->stream.next_in, http->stream.avail_in);
+
+      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 + http->stream.avail_in, http->buffer, buflen);
+      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)http->stream.avail_in));
+
+    if (inflateCopy(&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("_httpPeek", http->buffer, (int)bytes);
+      http_debug_hex("2httpPeek", (char *)http->sbuffer, (int)http->stream.avail_in);
 #endif /* DEBUG */
 
-    http->used = bytes;
-  }
+      http->error = EIO;
+      return (-1);
+    }
+
+    bytes = (ssize_t)(length - 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)
@@ -1755,7 +1844,7 @@ _httpPeek(http_t *http,                   /* I - Connection to server */
 
     bytes = (ssize_t)length;
 
-    DEBUG_printf(("2_httpPeek: grabbing %d bytes from input buffer...",
+    DEBUG_printf(("2httpPeek: grabbing %d bytes from input buffer...",
                   (int)bytes));
 
     memcpy(buffer, http->buffer, length);
@@ -1783,10 +1872,6 @@ _httpPeek(http_t *http,                  /* I - Connection to server */
     return (0);
   }
 
-#ifdef DEBUG
-  http_debug_hex("_httpPeek", buffer, (int)bytes);
-#endif /* DEBUG */
-
   return (bytes);
 }
 
@@ -1796,10 +1881,10 @@ _httpPeek(http_t *http,                 /* I - Connection to server */
  */
 
 int                                    /* O - Status of call (0 = success) */
-httpPost(http_t     *http,             /* I - Connection to server */
+httpPost(http_t     *http,             /* I - HTTP connection */
          const char *uri)              /* I - URI for post */
 {
-  return (http_send(http, HTTP_POST, uri));
+  return (http_send(http, HTTP_STATE_POST, uri));
 }
 
 
@@ -1810,11 +1895,11 @@ httpPost(http_t     *http,              /* I - Connection to server */
  */
 
 int                                    /* O - Number of bytes written */
-httpPrintf(http_t     *http,           /* I - Connection to server */
+httpPrintf(http_t     *http,           /* I - HTTP connection */
            const char *format,         /* I - printf-style format string */
           ...)                         /* I - Additional args as needed */
 {
-  int          bytes;                  /* Number of bytes to write */
+  ssize_t      bytes;                  /* Number of bytes to write */
   char         buf[16384];             /* Buffer for formatted string */
   va_list      ap;                     /* Variable argument pointer */
 
@@ -1825,10 +1910,10 @@ httpPrintf(http_t     *http,            /* I - Connection to server */
   bytes = vsnprintf(buf, sizeof(buf), format, ap);
   va_end(ap);
 
-  DEBUG_printf(("3httpPrintf: %s", buf));
+  DEBUG_printf(("3httpPrintf: (" CUPS_LLFMT " bytes) %s", CUPS_LLCAST bytes, buf));
 
-  if (http->data_encoding == HTTP_ENCODE_FIELDS)
-    return (httpWrite2(http, buf, bytes));
+  if (http->data_encoding == HTTP_ENCODING_FIELDS)
+    return ((int)httpWrite2(http, buf, (size_t)bytes));
   else
   {
     if (http->wused)
@@ -1839,7 +1924,7 @@ httpPrintf(http_t     *http,              /* I - Connection to server */
        return (-1);
     }
 
-    return (http_write(http, buf, bytes));
+    return ((int)http_write(http, buf, (size_t)bytes));
   }
 }
 
@@ -1849,11 +1934,11 @@ httpPrintf(http_t     *http,            /* I - Connection to server */
  */
 
 int                                    /* O - Status of call (0 = success) */
-httpPut(http_t     *http,              /* I - Connection to server */
+httpPut(http_t     *http,              /* I - HTTP connection */
         const char *uri)               /* I - URI to put */
 {
   DEBUG_printf(("httpPut(http=%p, uri=\"%s\")", http, uri));
-  return (http_send(http, HTTP_PUT, uri));
+  return (http_send(http, HTTP_STATE_PUT, uri));
 }
 
 
@@ -1867,11 +1952,11 @@ httpPut(http_t     *http,               /* I - Connection to server */
  */
 
 int                                    /* O - Number of bytes read */
-httpRead(http_t *http,                 /* I - Connection to server */
+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, length));
+  return ((int)httpRead2(http, buffer, (size_t)length));
 }
 
 
@@ -1882,16 +1967,25 @@ httpRead(http_t *http,                  /* I - Connection to server */
  */
 
 ssize_t                                        /* O - Number of bytes read */
-httpRead2(http_t *http,                        /* I - Connection to server */
+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 */
-  char         len[32];                /* Length string */
 
 
-  DEBUG_printf(("httpRead2(http=%p, buffer=%p, length=" CUPS_LLFMT ")",
-                http, buffer, CUPS_LLCAST length));
+#ifdef HAVE_LIBZ
+  DEBUG_printf(("httpRead2(http=%p, buffer=%p, length=" CUPS_LLFMT
+                ") coding=%d data_encoding=%d data_remaining=" CUPS_LLFMT,
+                http, 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,
+                http, buffer, CUPS_LLCAST length,
+                http->data_encoding, CUPS_LLCAST http->data_remaining));
+#endif /* HAVE_LIBZ */
 
   if (http == NULL || buffer == NULL)
     return (-1);
@@ -1902,399 +1996,358 @@ httpRead2(http_t *http,                       /* I - Connection to server */
   if (length <= 0)
     return (0);
 
-  if (http->data_encoding == HTTP_ENCODE_CHUNKED &&
-      http->data_remaining <= 0)
+#ifdef HAVE_LIBZ
+  if (http->coding >= _HTTP_CODING_GUNZIP)
   {
-    DEBUG_puts("2httpRead2: Getting chunk length...");
-
-    if (httpGets(len, sizeof(len), http) == NULL)
+    do
     {
-      DEBUG_puts("1httpRead2: Could not get length!");
-      return (0);
-    }
-
-    http->data_remaining = strtoll(len, NULL, 16);
-    if (http->data_remaining < 0)
-    {
-      DEBUG_puts("1httpRead2: Negative chunk length!");
-      return (0);
-    }
-  }
-
-  DEBUG_printf(("2httpRead2: data_remaining=" CUPS_LLFMT,
-                CUPS_LLCAST http->data_remaining));
-
-  if (http->data_remaining <= 0)
-  {
-   /*
-    * A zero-length chunk ends a transfer; unless we are reading POST
-    * data, go idle...
-    */
+      if (http->stream.avail_in > 0)
+      {
+       int     zerr;                   /* Decompressor error */
 
-    if (http->data_encoding == HTTP_ENCODE_CHUNKED)
-      httpGets(len, sizeof(len), http);
+       DEBUG_printf(("2httpRead2: avail_in=%d, avail_out=%d",
+                     (int)http->stream.avail_in, (int)length));
 
-    if (http->state == HTTP_POST_RECV)
-      http->state ++;
-    else
-      http->state = HTTP_WAITING;
+       http->stream.next_out  = (Bytef *)buffer;
+       http->stream.avail_out = (uInt)length;
 
-   /*
-    * Prevent future reads for this request...
-    */
-
-    http->data_encoding = HTTP_ENCODE_LENGTH;
+       if ((zerr = inflate(&(http->stream), Z_SYNC_FLUSH)) < Z_OK)
+       {
+         DEBUG_printf(("2httpRead2: zerr=%d", zerr));
+#ifdef DEBUG
+          http_debug_hex("2httpRead2", (char *)http->sbuffer, (int)http->stream.avail_in);
+#endif /* DEBUG */
 
-    return (0);
-  }
-  else if (length > (size_t)http->data_remaining)
-    length = (size_t)http->data_remaining;
+         http->error = EIO;
+         return (-1);
+       }
 
-  if (http->used == 0 && length <= 256)
-  {
-   /*
-    * Buffer small reads for better performance...
-    */
+       bytes = (ssize_t)(length - http->stream.avail_out);
 
-    ssize_t    buflen;                 /* Length of read for buffer */
+       DEBUG_printf(("2httpRead2: avail_in=%d, avail_out=%d, bytes=%d",
+                     http->stream.avail_in, http->stream.avail_out,
+                     (int)bytes));
+      }
+      else
+        bytes = 0;
 
-    if (!http->blocking)
-    {
-      while (!httpWait(http, http->wait_value))
+      if (bytes == 0)
       {
-       if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
-         continue;
+        ssize_t buflen = HTTP_MAX_BUFFER - (ssize_t)http->stream.avail_in;
+                                       /* Additional bytes for buffer */
 
-       return (0);
-      }
-    }
+        if (buflen > 0)
+        {
+          if (http->stream.avail_in > 0 &&
+              http->stream.next_in > http->sbuffer)
+            memmove(http->sbuffer, http->stream.next_in, http->stream.avail_in);
 
-    if (http->data_remaining > sizeof(http->buffer))
-      buflen = sizeof(http->buffer);
-    else
-      buflen = http->data_remaining;
+         http->stream.next_in = http->sbuffer;
 
-    DEBUG_printf(("2httpRead2: Reading %d bytes into buffer.", (int)buflen));
+          DEBUG_printf(("1httpRead2: Reading up to %d more bytes of data into "
+                        "decompression buffer.", (int)buflen));
 
-    do
-    {
-#ifdef HAVE_SSL
-      if (http->tls)
-       bytes = http_read_ssl(http, http->buffer, buflen);
-      else
-#endif /* HAVE_SSL */
-      bytes = recv(http->fd, http->buffer, buflen, 0);
+          if (http->data_remaining > 0)
+          {
+           if (buflen > http->data_remaining)
+             buflen = (ssize_t)http->data_remaining;
 
-      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
-       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);
+           bytes = http_read_buffered(http, (char *)http->sbuffer + http->stream.avail_in, (size_t)buflen);
+          }
+          else if (http->data_encoding == HTTP_ENCODING_CHUNKED)
+            bytes = http_read_chunk(http, (char *)http->sbuffer + http->stream.avail_in, (size_t)buflen);
+          else
+            bytes = 0;
 
-    DEBUG_printf(("2httpRead2: Read " CUPS_LLFMT " bytes into buffer.",
-                  CUPS_LLCAST bytes));
-#ifdef DEBUG
-    http_debug_hex("httpRead2", http->buffer, (int)bytes);
-#endif /* DEBUG */
+          if (bytes < 0)
+            return (bytes);
+          else if (bytes == 0)
+            break;
 
-    http->used = bytes;
-  }
+          DEBUG_printf(("1httpRead2: Adding " CUPS_LLFMT " bytes to "
+                        "decompression buffer.", CUPS_LLCAST bytes));
 
-  if (http->used > 0)
-  {
-    if (length > (size_t)http->used)
-      length = (size_t)http->used;
+          http->data_remaining  -= bytes;
+          http->stream.avail_in += (uInt)bytes;
 
-    bytes = (ssize_t)length;
+         if (http->data_remaining <= 0 &&
+             http->data_encoding == HTTP_ENCODING_CHUNKED)
+         {
+          /*
+           * Read the trailing blank line now...
+           */
 
-    DEBUG_printf(("2httpRead2: grabbing %d bytes from input buffer...",
-                  (int)bytes));
+           char        len[32];                /* Length string */
 
-    memcpy(buffer, http->buffer, length);
-    http->used -= (int)length;
+           httpGets(len, sizeof(len), http);
+         }
 
-    if (http->used > 0)
-      memmove(http->buffer, http->buffer + length, http->used);
+          bytes = 0;
+        }
+        else
+          return (0);
+      }
+    }
+    while (bytes == 0);
   }
-#ifdef HAVE_SSL
-  else if (http->tls)
+  else
+#endif /* HAVE_LIBZ */
+  if (http->data_remaining == 0 && http->data_encoding == HTTP_ENCODING_CHUNKED)
   {
-    if (!http->blocking)
+    if ((bytes = http_read_chunk(http, buffer, length)) > 0)
     {
-      while (!httpWait(http, http->wait_value))
+      http->data_remaining -= bytes;
+
+      if (http->data_remaining <= 0)
       {
-       if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
-         continue;
+       /*
+        * Read the trailing blank line now...
+        */
 
-       return (0);
-      }
-    }
+        char   len[32];                /* Length string */
 
-    while ((bytes = (ssize_t)http_read_ssl(http, buffer, (int)length)) < 0)
-    {
-#ifdef WIN32
-      if (WSAGetLastError() == WSAEWOULDBLOCK)
-      {
-        if (!http->timeout_cb || !(*http->timeout_cb)(http, http->timeout_data))
-         break;
-      }
-      else if (WSAGetLastError() != WSAEINTR)
-        break;
-#else
-      if (errno == EWOULDBLOCK || errno == EAGAIN)
-      {
-        if (http->timeout_cb && !(*http->timeout_cb)(http, http->timeout_data))
-         break;
-        else if (!http->timeout_cb && errno != EAGAIN)
-         break;
+        httpGets(len, sizeof(len), http);
       }
-      else if (errno != EINTR)
-        break;
-#endif /* WIN32 */
     }
   }
-#endif /* HAVE_SSL */
-  else
+  else if (http->data_remaining <= 0)
   {
-    if (!http->blocking)
-    {
-      while (!httpWait(http, http->wait_value))
-      {
-       if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
-         continue;
+   /*
+    * No more data to read...
+    */
 
-       return (0);
-      }
-    }
+    return (0);
+  }
+  else
+  {
+    DEBUG_printf(("1httpRead2: Reading up to %d bytes into buffer.",
+                  (int)length));
 
-    DEBUG_printf(("2httpRead2: reading " CUPS_LLFMT " bytes from socket...",
-                  CUPS_LLCAST length));
+    if (length > (size_t)http->data_remaining)
+      length = (size_t)http->data_remaining;
 
-#ifdef WIN32
-    while ((bytes = (ssize_t)recv(http->fd, buffer, (int)length, 0)) < 0)
+    if ((bytes = http_read_buffered(http, buffer, length)) > 0)
     {
-      if (WSAGetLastError() == WSAEWOULDBLOCK)
-      {
-        if (!http->timeout_cb || !(*http->timeout_cb)(http, http->timeout_data))
-         break;
-      }
-      else if (WSAGetLastError() != WSAEINTR)
-        break;
-    }
-#else
-    while ((bytes = recv(http->fd, buffer, length, 0)) < 0)
-    {
-      if (errno == EWOULDBLOCK || errno == EAGAIN)
+      http->data_remaining -= bytes;
+
+      if (http->data_remaining <= 0 &&
+          http->data_encoding == HTTP_ENCODING_CHUNKED)
       {
-        if (http->timeout_cb && !(*http->timeout_cb)(http, http->timeout_data))
-         break;
-        else if (!http->timeout_cb && errno != EAGAIN)
-         break;
+       /*
+        * Read the trailing blank line now...
+        */
+
+        char   len[32];                /* Length string */
+
+        httpGets(len, sizeof(len), http);
       }
-      else if (errno != EINTR)
-        break;
     }
-#endif /* WIN32 */
-
-    DEBUG_printf(("2httpRead2: read " CUPS_LLFMT " bytes from socket...",
-                  CUPS_LLCAST bytes));
-#ifdef DEBUG
-    http_debug_hex("httpRead2", buffer, (int)bytes);
-#endif /* DEBUG */
   }
 
-  if (bytes > 0)
+  if (
+#ifdef HAVE_LIBZ
+      (http->coding == _HTTP_CODING_IDENTITY ||
+       (http->coding >= _HTTP_CODING_GUNZIP && 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)))
   {
-    http->data_remaining -= bytes;
+#ifdef HAVE_LIBZ
+    if (http->coding >= _HTTP_CODING_GUNZIP)
+      http_content_coding_finish(http);
+#endif /* HAVE_LIBZ */
 
-    if (http->data_remaining <= INT_MAX)
-      http->_data_remaining = (int)http->data_remaining;
-    else
-      http->_data_remaining = INT_MAX;
-  }
-  else 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
-  {
-    http->error = EPIPE;
-    return (0);
-  }
-
-  if (http->data_remaining == 0)
-  {
-    if (http->data_encoding == HTTP_ENCODE_CHUNKED)
-      httpGets(len, sizeof(len), http);
-    else if (http->state == HTTP_POST_RECV)
+    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_WAITING;
+      http->state = HTTP_STATE_STATUS;
+
+    DEBUG_printf(("1httpRead2: End of content, set state to %s.",
+                 httpStateString(http->state)));
   }
 
   return (bytes);
 }
 
 
-#if defined(HAVE_SSL) && defined(HAVE_CDSASSL)
 /*
- * '_httpReadCDSA()' - Read function for the CDSA library.
+ * 'httpReadRequest()' - Read a HTTP request from a connection.
+ *
+ * @since CUPS 1.7/OS X 10.9@
  */
 
-OSStatus                               /* O  - -1 on error, 0 on success */
-_httpReadCDSA(
-    SSLConnectionRef connection,       /* I  - SSL/TLS connection */
-    void             *data,            /* I  - Data buffer */
-    size_t           *dataLength)      /* IO - Number of bytes */
+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 */
 {
-  OSStatus     result;                 /* Return value */
-  ssize_t      bytes;                  /* Number of bytes read */
-  http_t       *http;                  /* HTTP connection */
+  char line[4096],                     /* HTTP request line */
+       *req_method,                    /* HTTP request method */
+       *req_uri,                       /* HTTP request URI */
+       *req_version;                   /* HTTP request version number string */
 
 
-  http = (http_t *)connection;
+ /*
+  * Range check input...
+  */
 
-  if (!http->blocking)
-  {
-   /*
-    * Make sure we have data before we read...
-    */
+  DEBUG_printf(("httpReadRequest(http=%p, uri=%p, urilen=" CUPS_LLFMT ")",
+                http, uri, CUPS_LLCAST urilen));
 
-    while (!_httpWait(http, http->wait_value, 0))
-    {
-      if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
-       continue;
+  if (uri)
+    *uri = '\0';
 
-      http->error = ETIMEDOUT;
-      return (-1);
-    }
+  if (!http || !uri || urilen < 1)
+  {
+    DEBUG_puts("1httpReadRequest: Bad arguments, returning HTTP_STATE_ERROR.");
+    return (HTTP_STATE_ERROR);
   }
-
-  do
+  else if (http->state != HTTP_STATE_WAITING)
   {
-    bytes = recv(http->fd, data, *dataLength, 0);
+    DEBUG_printf(("1httpReadRequest: Bad state %s, returning HTTP_STATE_ERROR.",
+                  httpStateString(http->state)));
+    return (HTTP_STATE_ERROR);
   }
-  while (bytes == -1 && (errno == EINTR || errno == EAGAIN));
 
-  if (bytes == *dataLength)
+ /*
+  * 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))
   {
-    result = 0;
+    DEBUG_puts("1httpReadRequest: Unable to read, returning HTTP_STATE_ERROR");
+    return (HTTP_STATE_ERROR);
   }
-  else if (bytes > 0)
+
+  if (!line[0])
   {
-    *dataLength = bytes;
-    result = errSSLWouldBlock;
+    DEBUG_puts("1httpReadRequest: Blank line, returning HTTP_STATE_WAITING");
+    return (HTTP_STATE_WAITING);
   }
-  else
-  {
-    *dataLength = 0;
 
-    if (bytes == 0)
-      result = errSSLClosedGraceful;
-    else if (errno == EAGAIN)
-      result = errSSLWouldBlock;
-    else
-      result = errSSLClosedAbort;
+  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);
   }
 
-  return (result);
-}
-#endif /* HAVE_SSL && HAVE_CDSASSL */
+  *req_uri++ = '\0';
 
+  while (*req_uri && isspace(*req_uri & 255))
+    req_uri ++;
 
-#if defined(HAVE_SSL) && defined(HAVE_GNUTLS)
-/*
- * '_httpReadGNUTLS()' - Read function for the GNU TLS library.
- */
+  req_version = req_uri;
 
-ssize_t                                        /* O - Number of bytes read or -1 on error */
-_httpReadGNUTLS(
-    gnutls_transport_ptr 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 */
+  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';
 
-  DEBUG_printf(("6_httpReadGNUTLS(ptr=%p, data=%p, length=%d)", ptr, data, (int)length));
+  while (*req_version && isspace(*req_version & 255))
+    req_version ++;
 
-  http = (http_t *)ptr;
+ /*
+  * Validate...
+  */
 
-  if (!http->blocking)
+  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
   {
-   /*
-    * Make sure we have data before we read...
-    */
+    DEBUG_printf(("1httpReadRequest: Unknown method \"%s\".", req_method));
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown request method."), 1);
+    return (HTTP_STATE_UNKNOWN_METHOD);
+  }
 
-    while (!_httpWait(http, http->wait_value, 0))
-    {
-      if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
-       continue;
+  DEBUG_printf(("1httpReadRequest: Set state to %s.",
+                httpStateString(http->state)));
 
-      http->error = ETIMEDOUT;
-      return (-1);
-    }
+  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);
   }
 
-  bytes = recv(http->fd, data, length, 0);
-  DEBUG_printf(("6_httpReadGNUTLS: bytes=%d", (int)bytes));
-  return (bytes);
+  DEBUG_printf(("1httpReadRequest: URI is \"%s\".", req_uri));
+  strlcpy(uri, req_uri, urilen);
+
+  return (http->state);
 }
-#endif /* HAVE_SSL && HAVE_GNUTLS */
 
 
 /*
  * 'httpReconnect()' - Reconnect to a HTTP server.
+ *
+ * This function is deprecated. Please use the @link httpReconnect2@ function
+ * instead.
+ *
+ * @deprecated@
  */
 
 int                                    /* O - 0 on success, non-zero on failure */
-httpReconnect(http_t *http)            /* I - Connection to server */
+httpReconnect(http_t *http)            /* I - HTTP connection */
 {
   DEBUG_printf(("httpReconnect(http=%p)", http));
 
@@ -2308,7 +2361,7 @@ httpReconnect(http_t *http)               /* I - Connection to server */
  */
 
 int                                    /* O - 0 on success, non-zero on failure */
-httpReconnect2(http_t *http,           /* I - Connection to server */
+httpReconnect2(http_t *http,           /* I - HTTP connection */
               int    msec,             /* I - Timeout in milliseconds */
               int    *cancel)          /* I - Pointer to "cancel" variable */
 {
@@ -2324,7 +2377,7 @@ httpReconnect2(http_t *http,              /* I - Connection to server */
 
   if (!http)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     return (-1);
   }
 
@@ -2332,7 +2385,7 @@ httpReconnect2(http_t *http,              /* I - Connection to server */
   if (http->tls)
   {
     DEBUG_puts("2httpReconnect2: Shutting down SSL/TLS...");
-    http_shutdown_ssl(http);
+    _httpTLSStop(http);
   }
 #endif /* HAVE_SSL */
 
@@ -2344,11 +2397,7 @@ httpReconnect2(http_t *http,             /* I - Connection to server */
   {
     DEBUG_printf(("2httpReconnect2: Closing socket %d...", http->fd));
 
-#ifdef WIN32
-    closesocket(http->fd);
-#else
-    close(http->fd);
-#endif /* WIN32 */
+    httpAddrClose(NULL, http->fd);
 
     http->fd = -1;
   }
@@ -2357,15 +2406,13 @@ httpReconnect2(http_t *http,            /* I - Connection to server */
   * Reset all state (except fields, which may be reused)...
   */
 
-  http->state           = HTTP_WAITING;
-  http->status          = HTTP_CONTINUE;
-  http->version         = HTTP_1_1;
+  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_ENCODE_LENGTH;
+  http->data_encoding   = HTTP_ENCODING_FIELDS;
   http->_data_remaining = 0;
   http->used            = 0;
-  http->expect          = 0;
   http->data_remaining  = 0;
   http->hostaddr        = NULL;
   http->wused           = 0;
@@ -2378,7 +2425,7 @@ httpReconnect2(http_t *http,              /* I - Connection to server */
   for (current = http->addrlist; current; current = current->next)
     DEBUG_printf(("2httpReconnect2: Address %s:%d",
                   httpAddrString(&(current->addr), temp, sizeof(temp)),
-                  _httpAddrPort(&(current->addr))));
+                  httpAddrPort(&(current->addr))));
 #endif /* DEBUG */
 
   if ((addr = httpAddrConnect2(http->addrlist, &(http->fd), msec,
@@ -2393,7 +2440,7 @@ httpReconnect2(http_t *http,              /* I - Connection to server */
 #else
     http->error  = errno;
 #endif /* WIN32 */
-    http->status = HTTP_ERROR;
+    http->status = HTTP_STATUS_ERROR;
 
     DEBUG_printf(("1httpReconnect2: httpAddrConnect failed: %s",
                   strerror(http->error)));
@@ -2410,30 +2457,26 @@ httpReconnect2(http_t *http,            /* I - Connection to server */
   http->error    = 0;
 
 #ifdef HAVE_SSL
-  if (http->encryption == HTTP_ENCRYPT_ALWAYS)
+  if (http->encryption == HTTP_ENCRYPTION_ALWAYS)
   {
    /*
     * Always do encryption via SSL.
     */
 
-    if (http_setup_ssl(http) != 0)
+    if (_httpTLSStart(http) != 0)
     {
-#  ifdef WIN32
-      closesocket(http->fd);
-#  else
-      close(http->fd);
-#  endif /* WIN32 */
+      httpAddrClose(NULL, http->fd);
 
       return (-1);
     }
   }
-  else if (http->encryption == HTTP_ENCRYPT_REQUIRED)
-    return (http_upgrade(http));
+  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)));
+               httpAddrPort(http->hostaddr)));
 
   return (0);
 }
@@ -2451,7 +2494,7 @@ httpReconnect2(http_t *http,              /* I - Connection to server */
  */
 
 void
-httpSetAuthString(http_t     *http,    /* I - Connection to server */
+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) */
 {
@@ -2473,10 +2516,10 @@ httpSetAuthString(http_t     *http,     /* I - Connection to server */
     * Set the current authorization string...
     */
 
-    int len = (int)strlen(scheme) + (data ? (int)strlen(data) + 1 : 0) + 1;
+    size_t len = strlen(scheme) + (data ? strlen(data) + 1 : 0) + 1;
     char *temp;
 
-    if (len > (int)sizeof(http->_authstring))
+    if (len > sizeof(http->_authstring))
     {
       if ((temp = malloc(len)) == NULL)
         len = sizeof(http->_authstring);
@@ -2508,15 +2551,17 @@ httpSetAuthString(http_t     *http,     /* I - Connection to server */
  */
 
 int                                            /* O - Status of call (0 = success) */
-httpSetCredentials(http_t      *http,          /* I - Connection to server */
+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);
 }
@@ -2546,17 +2591,71 @@ httpSetCookie(http_t     *http,         /* I - Connection */
 
 
 /*
+ * '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/OS X 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\")",
+                http, field, http_fields[field], value));
+
+  if (!http)
+    return;
+
+  switch (field)
+  {
+    case HTTP_FIELD_ACCEPT_ENCODING :
+        if (http->default_accept_encoding)
+          _cupsStrFree(http->default_accept_encoding);
+
+        http->default_accept_encoding = value ? _cupsStrAlloc(value) : NULL;
+        break;
+
+    case HTTP_FIELD_SERVER :
+        if (http->default_server)
+          _cupsStrFree(http->default_server);
+
+        http->default_server = value ? _cupsStrAlloc(value) : NULL;
+        break;
+
+    case HTTP_FIELD_USER_AGENT :
+        if (http->default_user_agent)
+          _cupsStrFree(http->default_user_agent);
+
+        http->default_user_agent = value ? _cupsStrAlloc(value) : NULL;
+        break;
+
+    default :
+        DEBUG_puts("1httpSetDefaultField: Ignored.");
+       break;
+  }
+}
+
+
+/*
  * 'httpSetExpect()' - Set the Expect: header in a request.
  *
- * Currently only HTTP_CONTINUE is supported for the "expect" argument.
+ * Currently only @code HTTP_STATUS_CONTINUE@ is supported for the "expect"
+ * argument.
  *
  * @since CUPS 1.2/OS X 10.5@
  */
 
 void
-httpSetExpect(http_t        *http,     /* I - Connection to server */
-              http_status_t expect)    /* I - HTTP status to expect (HTTP_CONTINUE) */
+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)", http, expect));
+
   if (http)
     http->expect = expect;
 }
@@ -2567,17 +2666,59 @@ httpSetExpect(http_t        *http,      /* I - Connection to server */
  */
 
 void
-httpSetField(http_t       *http,       /* I - Connection to server */
+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\")", http,
+                field, http_fields[field], value));
+
   if (http == NULL ||
       field < HTTP_FIELD_ACCEPT_LANGUAGE ||
-      field > HTTP_FIELD_WWW_AUTHENTICATE ||
+      field >= HTTP_FIELD_MAX ||
       value == NULL)
     return;
 
-  strlcpy(http->fields[field], value, HTTP_MAX_VALUE);
+  switch (field)
+  {
+    case HTTP_FIELD_ACCEPT_ENCODING :
+        if (http->accept_encoding)
+          _cupsStrFree(http->accept_encoding);
+
+        http->accept_encoding = _cupsStrAlloc(value);
+        break;
+
+    case HTTP_FIELD_ALLOW :
+        if (http->allow)
+          _cupsStrFree(http->allow);
+
+        http->allow = _cupsStrAlloc(value);
+        break;
+
+    case HTTP_FIELD_SERVER :
+        if (http->server)
+          _cupsStrFree(http->server);
+
+        http->server = _cupsStrAlloc(value);
+        break;
+
+    case HTTP_FIELD_WWW_AUTHENTICATE :
+       /* CUPS STR #4503 - don't override WWW-Authenticate for unknown auth schemes */
+        if (http->fields[HTTP_FIELD_WWW_AUTHENTICATE][0] &&
+           _cups_strncasecmp(value, "Basic ", 6) &&
+           _cups_strncasecmp(value, "Digest ", 7) &&
+           _cups_strncasecmp(value, "Negotiate ", 10))
+       {
+         DEBUG_printf(("1httpSetField: Ignoring unknown auth scheme in \"%s\".", value));
+          return;
+       }
+
+       /* Fall through to copy */
+
+    default :
+       strlcpy(http->fields[field], value, HTTP_MAX_VALUE);
+       break;
+  }
 
   if (field == HTTP_FIELD_AUTHORIZATION)
   {
@@ -2629,6 +2770,30 @@ httpSetField(http_t       *http, /* I - Connection to server */
       }
     }
   }
+#ifdef HAVE_LIBZ
+  else 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 */
+}
+
+
+/*
+ * '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;
 }
 
 
@@ -2639,15 +2804,19 @@ httpSetField(http_t       *http,        /* I - Connection to server */
  */
 
 void
-httpSetLength(http_t *http,            /* I - Connection to server */
+httpSetLength(http_t *http,            /* I - HTTP connection */
               size_t length)           /* I - Length (0 for chunked) */
 {
+  DEBUG_printf(("httpSetLength(http=%p, length=" CUPS_LLFMT ")", http,
+                CUPS_LLCAST length));
+
   if (!http)
     return;
 
   if (!length)
   {
-    strcpy(http->fields[HTTP_FIELD_TRANSFER_ENCODING], "chunked");
+    strlcpy(http->fields[HTTP_FIELD_TRANSFER_ENCODING], "chunked",
+            HTTP_MAX_VALUE);
     http->fields[HTTP_FIELD_CONTENT_LENGTH][0] = '\0';
   }
   else
@@ -2670,7 +2839,7 @@ httpSetLength(http_t *http,               /* I - Connection to server */
 
 void
 httpSetTimeout(
-    http_t            *http,           /* I - Connection to server */
+    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 NULL */
@@ -2691,14 +2860,39 @@ httpSetTimeout(
 
 
 /*
+ * '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.
  */
 
 int                                    /* O - Status of call (0 = success) */
-httpTrace(http_t     *http,            /* I - Connection to server */
+httpTrace(http_t     *http,            /* I - HTTP connection */
           const char *uri)             /* I - URI for trace */
 {
-  return (http_send(http, HTTP_TRACE, uri));
+  return (http_send(http, HTTP_STATE_TRACE, uri));
 }
 
 
@@ -2710,7 +2904,7 @@ httpTrace(http_t     *http,               /* I - Connection to server */
  */
 
 int                                    /* O - 1 to continue, 0 to stop */
-_httpUpdate(http_t        *http,       /* I - Connection to server */
+_httpUpdate(http_t        *http,       /* I - HTTP connection */
             http_status_t *status)     /* O - Current HTTP status */
 {
   char         line[32768],            /* Line from connection... */
@@ -2720,7 +2914,7 @@ _httpUpdate(http_t        *http,  /* I - Connection to server */
 
 
   DEBUG_printf(("_httpUpdate(http=%p, status=%p), state=%s", http, status,
-                http_states[http->state]));
+                httpStateString(http->state)));
 
  /*
   * Grab a single line from the connection...
@@ -2728,7 +2922,7 @@ _httpUpdate(http_t        *http,  /* I - Connection to server */
 
   if (!httpGets(line, sizeof(line), http))
   {
-    *status = HTTP_ERROR;
+    *status = HTTP_STATUS_ERROR;
     return (0);
   }
 
@@ -2740,62 +2934,76 @@ _httpUpdate(http_t        *http,        /* I - Connection to server */
     * Blank line means the start of the data section (if any).  Return
     * the result code, too...
     *
-    * If we get status 100 (HTTP_CONTINUE), then we *don't* change states.
-    * Instead, we just return HTTP_CONTINUE to the caller and keep on
-    * tryin'...
+    * 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_CONTINUE)
+    if (http->status == HTTP_STATUS_CONTINUE)
     {
       *status = http->status;
       return (0);
     }
 
-    if (http->status < HTTP_BAD_REQUEST)
+    if (http->status < HTTP_STATUS_BAD_REQUEST)
       http->digest_tries = 0;
 
 #ifdef HAVE_SSL
-    if (http->status == HTTP_SWITCHING_PROTOCOLS && !http->tls)
+    if (http->status == HTTP_STATUS_SWITCHING_PROTOCOLS && !http->tls)
     {
-      if (http_setup_ssl(http) != 0)
+      if (_httpTLSStart(http) != 0)
       {
-#  ifdef WIN32
-       closesocket(http->fd);
-#  else
-       close(http->fd);
-#  endif /* WIN32 */
+        httpAddrClose(NULL, http->fd);
 
-       *status = http->status = HTTP_ERROR;
+       *status = http->status = HTTP_STATUS_ERROR;
        return (0);
       }
 
-      *status = HTTP_CONTINUE;
+      *status = HTTP_STATUS_CONTINUE;
       return (0);
     }
 #endif /* HAVE_SSL */
 
-    httpGetLength2(http);
+    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_GET :
-      case HTTP_POST :
-      case HTTP_POST_RECV :
-      case HTTP_PUT :
+      case HTTP_STATE_GET :
+      case HTTP_STATE_POST :
+      case HTTP_STATE_POST_RECV :
+      case HTTP_STATE_PUT :
          http->state ++;
-      case HTTP_POST_SEND :
-      case HTTP_HEAD :
+
+         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_WAITING;
+         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))
+  else if (!strncmp(line, "HTTP/", 5) && http->mode == _HTTP_MODE_CLIENT)
   {
    /*
     * Got the beginning of a response...
@@ -2805,10 +3013,12 @@ _httpUpdate(http_t        *http,        /* I - Connection to server */
 
     if (sscanf(line, "HTTP/%d.%d%d", &major, &minor, &intstatus) != 3)
     {
-      *status = http->status = HTTP_ERROR;
+      *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;
   }
@@ -2822,6 +3032,8 @@ _httpUpdate(http_t        *http,  /* I - Connection to server */
     while (_cups_isspace(*value))
       value ++;
 
+    DEBUG_printf(("1_httpUpdate: Header %s: %s", line, value));
+
    /*
     * Be tolerants of servers that send unknown attribute fields...
     */
@@ -2842,7 +3054,7 @@ _httpUpdate(http_t        *http,  /* I - Connection to server */
 
       httpSetCookie(http, value);
     }
-    else if ((field = http_field(line)) != HTTP_FIELD_UNKNOWN)
+    else if ((field = httpFieldValue(line)) != HTTP_FIELD_UNKNOWN)
       httpSetField(http, field, value);
 #ifdef DEBUG
     else
@@ -2852,7 +3064,8 @@ _httpUpdate(http_t        *http,  /* I - Connection to server */
   else
   {
     DEBUG_printf(("1_httpUpdate: Bad response line \"%s\"!", line));
-    *status = http->status = HTTP_ERROR;
+    http->error  = EINVAL;
+    http->status = *status = HTTP_STATUS_ERROR;
     return (0);
   }
 
@@ -2865,13 +3078,13 @@ _httpUpdate(http_t        *http,        /* I - Connection to server */
  */
 
 http_status_t                          /* O - HTTP status */
-httpUpdate(http_t *http)               /* I - Connection to server */
+httpUpdate(http_t *http)               /* I - HTTP connection */
 {
   http_status_t        status;                 /* Request status */
 
 
   DEBUG_printf(("httpUpdate(http=%p), state=%s", http,
-                http_states[http->state]));
+                httpStateString(http->state)));
 
  /*
   * Flush pending data, if any...
@@ -2882,15 +3095,15 @@ httpUpdate(http_t *http)                /* I - Connection to server */
     DEBUG_puts("2httpUpdate: flushing buffer...");
 
     if (httpFlushWrite(http) < 0)
-      return (HTTP_ERROR);
+      return (HTTP_STATUS_ERROR);
   }
 
  /*
   * If we haven't issued any commands, then there is nothing to "update"...
   */
 
-  if (http->state == HTTP_WAITING)
-    return (HTTP_CONTINUE);
+  if (http->state == HTTP_STATE_WAITING)
+    return (HTTP_STATUS_CONTINUE);
 
  /*
   * Grab all of the lines we can from the connection...
@@ -2902,7 +3115,7 @@ httpUpdate(http_t *http)          /* I - Connection to server */
   * See if there was an error...
   */
 
-  if (http->error == EPIPE && http->status > HTTP_CONTINUE)
+  if (http->error == EPIPE && http->status > HTTP_STATUS_CONTINUE)
   {
     DEBUG_printf(("1httpUpdate: Returning status %d...", http->status));
     return (http->status);
@@ -2912,8 +3125,8 @@ httpUpdate(http_t *http)          /* I - Connection to server */
   {
     DEBUG_printf(("1httpUpdate: socket error %d - %s", http->error,
                   strerror(http->error)));
-    http->status = HTTP_ERROR;
-    return (HTTP_ERROR);
+    http->status = HTTP_STATUS_ERROR;
+    return (HTTP_STATUS_ERROR);
   }
 
  /*
@@ -2929,7 +3142,7 @@ httpUpdate(http_t *http)          /* I - Connection to server */
  */
 
 int                                    /* O - 1 if data is available, 0 otherwise */
-_httpWait(http_t *http,                        /* I - Connection to server */
+_httpWait(http_t *http,                        /* I - HTTP connection */
           int    msec,                 /* I - Milliseconds to wait */
          int    usessl)                /* I - Use SSL context? */
 {
@@ -2955,32 +3168,10 @@ _httpWait(http_t *http,                 /* I - Connection to server */
   */
 
 #ifdef HAVE_SSL
-  if (http->tls && usessl)
+  if (http->tls && _httpTLSPending(http))
   {
-#  ifdef HAVE_LIBSSL
-    if (SSL_pending(http->tls))
-    {
-      DEBUG_puts("5_httpWait: Return 1 since there is pending SSL data.");
-      return (1);
-    }
-
-#  elif defined(HAVE_GNUTLS)
-    if (gnutls_record_check_pending(http->tls))
-    {
-      DEBUG_puts("5_httpWait: Return 1 since there is pending SSL data.");
-      return (1);
-    }
-
-#  elif defined(HAVE_CDSASSL)
-    size_t bytes;                      /* Bytes that are available */
-
-    if (!SSLGetBufferedReadSize(http->tls, &bytes) &&
-        bytes > 0)
-    {
-      DEBUG_puts("5_httpWait: Return 1 since there is pending SSL data.");
-      return (1);
-    }
-#  endif /* HAVE_LIBSSL */
+    DEBUG_puts("5_httpWait: Return 1 since there is pending TLS data.");
+    return (1);
   }
 #endif /* HAVE_SSL */
 
@@ -3040,7 +3231,7 @@ _httpWait(http_t *http,                   /* I - Connection to server */
  */
 
 int                                    /* O - 1 if data is available, 0 otherwise */
-httpWait(http_t *http,                 /* I - Connection to server */
+httpWait(http_t *http,                 /* I - HTTP connection */
          int    msec)                  /* I - Milliseconds to wait */
 {
  /*
@@ -3058,6 +3249,14 @@ httpWait(http_t *http,                   /* I - Connection to server */
     return (1);
   }
 
+#ifdef HAVE_LIBZ
+  if (http->coding >= _HTTP_CODING_GUNZIP && 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...
   */
@@ -3088,11 +3287,11 @@ httpWait(http_t *http,                  /* I - Connection to server */
  */
 
 int                                    /* O - Number of bytes written */
-httpWrite(http_t     *http,            /* I - Connection to server */
+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, length));
+  return ((int)httpWrite2(http, buffer, (size_t)length));
 }
 
 
@@ -3103,7 +3302,7 @@ httpWrite(http_t     *http,               /* I - Connection to server */
  */
 
 ssize_t                                        /* O - Number of bytes written */
-httpWrite2(http_t     *http,           /* I - Connection to server */
+httpWrite2(http_t     *http,           /* I - HTTP connection */
            const char *buffer,         /* I - Buffer for data */
           size_t     length)           /* I - Number of bytes to write */
 {
@@ -3117,8 +3316,11 @@ httpWrite2(http_t     *http,             /* I - Connection to server */
   * Range check input...
   */
 
-  if (http == NULL || buffer == NULL)
+  if (!http || !buffer)
+  {
+    DEBUG_puts("1httpWrite2: Returning -1 due to bad input.");
     return (-1);
+  }
 
  /*
   * Mark activity on the connection...
@@ -3130,9 +3332,60 @@ httpWrite2(http_t     *http,             /* I - Connection to server */
   * 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 */
+
+      http->stream.next_in   = (Bytef *)buffer;
+      http->stream.avail_in  = (uInt)length;
+
+      while (deflate(&(http->stream), Z_NO_FLUSH) == Z_OK)
+      {
+        DEBUG_printf(("1httpWrite2: avail_out=%d", http->stream.avail_out));
+
+        if (http->stream.avail_out > 0)
+         continue;
+
+       slen = _HTTP_MAX_SBUFFER - 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);
+       }
+
+       http->stream.next_out  = (Bytef *)http->sbuffer;
+       http->stream.avail_out = (uInt)_HTTP_MAX_SBUFFER;
+      }
+
+      bytes = (ssize_t)length;
+    }
+  }
+  else
+#endif /* HAVE_LIBZ */
   if (length > 0)
   {
-    if (http->wused && (length + http->wused) > sizeof(http->wbuffer))
+    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));
@@ -3140,8 +3393,7 @@ httpWrite2(http_t     *http,              /* I - Connection to server */
       httpFlushWrite(http);
     }
 
-    if ((length + http->wused) <= sizeof(http->wbuffer) &&
-        length < sizeof(http->wbuffer))
+    if ((length + (size_t)http->wused) <= sizeof(http->wbuffer) && length < sizeof(http->wbuffer))
     {
      /*
       * Write to buffer...
@@ -3163,16 +3415,16 @@ httpWrite2(http_t     *http,            /* I - Connection to server */
       DEBUG_printf(("2httpWrite2: Writing " CUPS_LLFMT " bytes to socket...",
                     CUPS_LLCAST length));
 
-      if (http->data_encoding == HTTP_ENCODE_CHUNKED)
-       bytes = (ssize_t)http_write_chunk(http, buffer, (int)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, (int)length);
+       bytes = (ssize_t)http_write(http, buffer, length);
 
       DEBUG_printf(("2httpWrite2: Wrote " CUPS_LLFMT " bytes...",
                     CUPS_LLCAST bytes));
     }
 
-    if (http->data_encoding == HTTP_ENCODE_LENGTH)
+    if (http->data_encoding == HTTP_ENCODING_LENGTH)
       http->data_remaining -= bytes;
   }
   else
@@ -3182,20 +3434,26 @@ httpWrite2(http_t     *http,            /* I - Connection to server */
   * Handle end-of-request processing...
   */
 
-  if ((http->data_encoding == HTTP_ENCODE_CHUNKED && length == 0) ||
-      (http->data_encoding == HTTP_ENCODE_LENGTH && http->data_remaining == 0))
+  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...
     */
 
-    DEBUG_puts("2httpWrite: changing states...");
+#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)
-      httpFlushWrite(http);
+    {
+      if (httpFlushWrite(http) < 0)
+        return (-1);
+    }
 
-    if (http->data_encoding == HTTP_ENCODE_CHUNKED)
+    if (http->data_encoding == HTTP_ENCODING_CHUNKED)
     {
      /*
       * Send a 0-length chunk at the end of the request...
@@ -3207,238 +3465,543 @@ httpWrite2(http_t     *http,          /* I - Connection to server */
       * Reset the data state...
       */
 
-      http->data_encoding  = HTTP_ENCODE_LENGTH;
+      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);
 }
 
 
-#if defined(HAVE_SSL) && defined(HAVE_CDSASSL)
 /*
- * '_httpWriteCDSA()' - Write function for the CDSA library.
+ * 'httpWriteResponse()' - Write a HTTP response to a client connection.
+ *
+ * @since CUPS 1.7/OS X 10.9@
  */
 
-OSStatus                               /* O  - -1 on error, 0 on success */
-_httpWriteCDSA(
-    SSLConnectionRef connection,       /* I  - SSL/TLS connection */
-    const void       *data,            /* I  - Data buffer */
-    size_t           *dataLength)      /* IO - Number of bytes */
+int                                    /* O - 0 on success, -1 on error */
+httpWriteResponse(http_t        *http, /* I - HTTP connection */
+                 http_status_t status) /* I - Status code */
 {
-  OSStatus     result;                 /* Return value */
-  ssize_t      bytes;                  /* Number of bytes read */
-  http_t       *http;                  /* HTTP connection */
+  http_encoding_t      old_encoding;   /* Old data_encoding value */
+  off_t                        old_remaining;  /* Old data_remaining value */
+
 
+ /*
+  * Range check input...
+  */
 
-  http = (http_t *)connection;
+  DEBUG_printf(("httpWriteResponse(http=%p, status=%d)", http, status));
 
-  do
+  if (!http || status < HTTP_STATUS_CONTINUE)
   {
-    bytes = write(http->fd, data, *dataLength);
+    DEBUG_puts("1httpWriteResponse: Bad input.");
+    return (-1);
   }
-  while (bytes == -1 && (errno == EINTR || errno == EAGAIN));
 
-  if (bytes == *dataLength)
+ /*
+  * Set the various standard fields if they aren't already...
+  */
+
+  if (!http->fields[HTTP_FIELD_DATE][0])
+    httpSetField(http, HTTP_FIELD_DATE, httpGetDateString(time(NULL)));
+
+  if (status >= HTTP_STATUS_BAD_REQUEST && http->keep_alive)
   {
-    result = 0;
+    http->keep_alive = HTTP_KEEPALIVE_OFF;
+    httpSetField(http, HTTP_FIELD_KEEP_ALIVE, "");
   }
-  else if (bytes >= 0)
+
+  if (http->version == HTTP_VERSION_1_1)
   {
-    *dataLength = bytes;
-    result = errSSLWouldBlock;
+    if (!http->fields[HTTP_FIELD_CONNECTION][0])
+    {
+      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][0])
+      httpSetField(http, HTTP_FIELD_KEEP_ALIVE, "timeout=10");
   }
-  else
+
+#ifdef HAVE_SSL
+  if (status == HTTP_STATUS_UPGRADE_REQUIRED ||
+      status == HTTP_STATUS_SWITCHING_PROTOCOLS)
+  {
+    if (!http->fields[HTTP_FIELD_CONNECTION][0])
+      httpSetField(http, HTTP_FIELD_CONNECTION, "Upgrade");
+
+    if (!http->fields[HTTP_FIELD_UPGRADE][0])
+      httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.2,TLS/1.1,TLS/1.0");
+
+    if (!http->fields[HTTP_FIELD_CONTENT_LENGTH][0])
+      httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, "0");
+  }
+#endif /* HAVE_SSL */
+
+  if (!http->server)
+    httpSetField(http, HTTP_FIELD_SERVER,
+                 http->default_server ? http->default_server : CUPS_MINIMAL);
+
+ /*
+  * Set the Accept-Encoding field if it isn't already...
+  */
+
+  if (!http->accept_encoding)
+    httpSetField(http, HTTP_FIELD_ACCEPT_ENCODING,
+                 http->default_accept_encoding ? http->default_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)
   {
-    *dataLength = 0;
+   /*
+    * Restore the old data_encoding and data_length values...
+    */
+
+    http->data_encoding  = old_encoding;
+    http->data_remaining = old_remaining;
 
-    if (errno == EAGAIN)
-      result = errSSLWouldBlock;
+    if (old_remaining <= INT_MAX)
+      http->_data_remaining = (int)old_remaining;
     else
-      result = errSSLClosedAbort;
+      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);
+    }
+
+#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 (result);
+  return (0);
 }
-#endif /* HAVE_SSL && HAVE_CDSASSL */
 
 
-#if defined(HAVE_SSL) && defined(HAVE_GNUTLS)
+#ifdef HAVE_LIBZ
 /*
- * '_httpWriteGNUTLS()' - Write function for the GNU TLS library.
+ * 'http_content_coding_finish()' - Finish doing any content encoding.
  */
 
-ssize_t                                        /* O - Number of bytes written or -1 on error */
-_httpWriteGNUTLS(
-    gnutls_transport_ptr ptr,          /* I - Connection to server */
-    const void           *data,                /* I - Data buffer */
-    size_t               length)       /* I - Number of bytes to write */
+static void
+http_content_coding_finish(
+    http_t *http)                      /* I - HTTP connection */
 {
-  ssize_t bytes;                       /* Bytes written */
+  int          zerr;                   /* Compression status */
+  Byte         dummy[1];               /* Dummy read buffer */
+  size_t       bytes;                  /* Number of bytes to write */
 
 
-  DEBUG_printf(("6_httpWriteGNUTLS(ptr=%p, data=%p, length=%d)", ptr, data,
-                (int)length));
-#ifdef DEBUG
-  http_debug_hex("_httpWriteGNUTLS", data, (int)length);
-#endif /* DEBUG */
+  DEBUG_printf(("http_content_coding_finish(http=%p)", http));
+  DEBUG_printf(("1http_content_coding_finishing: http->coding=%d", http->coding));
 
-  bytes = send(((http_t *)ptr)->fd, data, length, 0);
-  DEBUG_printf(("_httpWriteGNUTLS: bytes=%d", (int)bytes));
+  switch (http->coding)
+  {
+    case _HTTP_CODING_DEFLATE :
+    case _HTTP_CODING_GZIP :
+        http->stream.next_in  = dummy;
+        http->stream.avail_in = 0;
 
-  return (bytes);
+        do
+        {
+          zerr  = deflate(&(http->stream), Z_FINISH);
+         bytes = _HTTP_MAX_SBUFFER - 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);
+          }
+
+          http->stream.next_out  = (Bytef *)http->sbuffer;
+          http->stream.avail_out = (uInt)_HTTP_MAX_SBUFFER;
+       }
+        while (zerr == Z_OK);
+
+        deflateEnd(&(http->stream));
+
+        free(http->sbuffer);
+        http->sbuffer = NULL;
+
+        if (http->wused)
+          httpFlushWrite(http);
+        break;
+
+    case _HTTP_CODING_INFLATE :
+    case _HTTP_CODING_GUNZIP :
+        inflateEnd(&(http->stream));
+        free(http->sbuffer);
+        http->sbuffer = NULL;
+        break;
+
+    default :
+        break;
+  }
+
+  http->coding = _HTTP_CODING_IDENTITY;
 }
-#endif /* HAVE_SSL && HAVE_GNUTLS */
 
 
-#if defined(HAVE_SSL) && defined(HAVE_LIBSSL)
 /*
- * 'http_bio_ctrl()' - Control the HTTP connection.
+ * 'http_content_coding_start()' - Start doing content encoding.
  */
 
-static long                            /* O - Result/data */
-http_bio_ctrl(BIO  *h,                 /* I - BIO data */
-              int  cmd,                        /* I - Control command */
-             long arg1,                /* I - First argument */
-             void *arg2)               /* I - Second argument */
-{
-  switch (cmd)
+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\")", 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;
+  }
+
+  memset(&(http->stream), 0, sizeof(http->stream));
+
+  switch (coding)
   {
-    default :
-        return (0);
+    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;
+        }
 
-    case BIO_CTRL_RESET :
-        h->ptr = NULL;
-       return (0);
+       /*
+        * 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 ((zerr = deflateInit2(&(http->stream), Z_DEFAULT_COMPRESSION,
+                                 Z_DEFLATED,
+                                coding == _HTTP_CODING_DEFLATE ? -11 : 27, 7,
+                                Z_DEFAULT_STRATEGY)) < Z_OK)
+        {
+          http->status = HTTP_STATUS_ERROR;
+          http->error  = zerr == Z_MEM_ERROR ? ENOMEM : EINVAL;
+          return;
+        }
+
+       http->stream.next_out  = (Bytef *)http->sbuffer;
+       http->stream.avail_out = (uInt)_HTTP_MAX_SBUFFER;
+        break;
 
-    case BIO_C_SET_FILE_PTR :
-        h->ptr  = arg2;
-       h->init = 1;
-       return (1);
+    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;
+        }
 
-    case BIO_C_GET_FILE_PTR :
-        if (arg2)
-       {
-         *((void **)arg2) = h->ptr;
-         return (1);
-       }
-       else
-         return (0);
+       /*
+        * Window size for decompression is up to 15 bits (maximum supported).
+        * -15 is raw inflate, 31 is gunzip, per ZLIB documentation.
+        */
+
+        if ((zerr = inflateInit2(&(http->stream),
+                                 coding == _HTTP_CODING_INFLATE ? -15 : 31))
+               < Z_OK)
+        {
+          free(http->sbuffer);
+          http->sbuffer = NULL;
+          http->status  = HTTP_STATUS_ERROR;
+          http->error   = zerr == Z_MEM_ERROR ? ENOMEM : EINVAL;
+          return;
+        }
+
+        http->stream.avail_in = 0;
+        http->stream.next_in  = http->sbuffer;
+        break;
 
-    case BIO_CTRL_DUP :
-    case BIO_CTRL_FLUSH :
-        return (1);
+    default :
+        break;
   }
-}
-
-
-/*
- * 'http_bio_free()' - Free OpenSSL data.
- */
-
-static int                             /* O - 1 on success, 0 on failure */
-http_bio_free(BIO *h)                  /* I - BIO data */
-{
-  if (!h)
-    return (0);
 
-  if (h->shutdown)
-  {
-    h->init  = 0;
-    h->flags = 0;
-  }
+  http->coding = coding;
 
-  return (1);
+  DEBUG_printf(("1http_content_coding_start: http->coding now %d.",
+               http->coding));
 }
+#endif /* HAVE_LIBZ */
 
 
 /*
- * 'http_bio_new()' - Initialize an OpenSSL BIO structure.
+ * 'http_create()' - Create an unconnected HTTP connection.
  */
 
-static int                             /* O - 1 on success, 0 on failure */
-http_bio_new(BIO *h)                   /* I - BIO data */
+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 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 */
 {
-  if (!h)
-    return (0);
-
-  h->init  = 0;
-  h->num   = 0;
-  h->ptr   = NULL;
-  h->flags = 0;
+  http_t       *http;                  /* New HTTP connection */
+  char         service[255];           /* Service name */
+  http_addrlist_t *myaddrlist = NULL;  /* My address list */
 
-  return (1);
-}
 
+  DEBUG_printf(("4http_create(host=\"%s\", port=%d, addrlist=%p, family=%d, "
+                "encryption=%d, blocking=%d, mode=%d)", host, port, addrlist,
+                family, encryption, blocking, mode));
 
-/*
- * 'http_bio_puts()' - Send a string for OpenSSL.
- */
+  if (!host && mode == _HTTP_MODE_CLIENT)
+    return (NULL);
 
-static int                             /* O - Bytes written */
-http_bio_puts(BIO        *h,           /* I - BIO data */
-              const char *str)         /* I - String to write */
-{
-#ifdef WIN32
-  return (send(((http_t *)h->ptr)->fd, str, (int)strlen(str), 0));
-#else
-  return (send(((http_t *)h->ptr)->fd, str, strlen(str), 0));
-#endif /* WIN32 */
-}
+  httpInitialize();
 
+ /*
+  * Lookup the host...
+  */
 
-/*
- * 'http_bio_read()' - Read data for OpenSSL.
- */
+  if (addrlist)
+  {
+    myaddrlist = httpAddrCopyList(addrlist);
+  }
+  else
+  {
+    snprintf(service, sizeof(service), "%d", port);
 
-static int                             /* O - Bytes read */
-http_bio_read(BIO  *h,                 /* I - BIO data */
-              char *buf,               /* I - Buffer */
-             int  size)                /* I - Number of bytes to read */
-{
-  http_t       *http;                  /* HTTP connection */
+    myaddrlist = httpAddrGetList(host, family, service);
+  }
 
+  if (!myaddrlist)
+    return (NULL);
 
-  http = (http_t *)h->ptr;
+ /*
+  * Allocate memory for the structure...
+  */
 
-  if (!http->blocking)
+  if ((http = calloc(sizeof(http_t), 1)) == NULL)
   {
-   /*
-    * Make sure we have data before we read...
-    */
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
+    httpAddrFreeList(addrlist);
+    return (NULL);
+  }
 
-    while (!_httpWait(http, http->wait_value, 0))
-    {
-      if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data))
-       continue;
+ /*
+  * Initialize the HTTP data...
+  */
 
-#ifdef WIN32
-      http->error = WSAETIMEDOUT;
-#else
-      http->error = ETIMEDOUT;
-#endif /* WIN32 */
+  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;
 
-      return (-1);
-    }
-  }
+  if (host)
+    strlcpy(http->hostname, host, sizeof(http->hostname));
 
-  return (recv(http->fd, buf, size, 0));
-}
+  if (port == 443)                     /* Always use encryption for https */
+    http->encryption = HTTP_ENCRYPTION_ALWAYS;
+  else
+    http->encryption = encryption;
 
+  http_set_wait(http);
 
-/*
* 'http_bio_write()' - Write data for OpenSSL.
- */
+ /*
 * Return the new structure...
 */
 
-static int                             /* O - Bytes written */
-http_bio_write(BIO        *h,          /* I - BIO data */
-               const char *buf,                /* I - Buffer to write */
-              int        num)          /* I - Number of bytes to write */
-{
-  return (send(((http_t *)h->ptr)->fd, buf, num, 0));
+  return (http);
 }
-#endif /* HAVE_SSL && HAVE_LIBSSL */
 
 
 #ifdef DEBUG
@@ -3469,16 +4032,16 @@ http_debug_hex(const char *prefix,      /* I - Prefix for line */
   for (i = 0; i < bytes; i += 16)
   {
     for (j = 0, ptr = start; j < 16 && (i + j) < bytes; j ++, ptr += 2)
-      sprintf(ptr, "%02X", buffer[i + j] & 255);
+      snprintf(ptr, 3, "%02X", buffer[i + j] & 255);
 
     while (j < 16)
     {
-      strcpy(ptr, "  ");
+      memcpy(ptr, "  ", 3);
       ptr += 2;
       j ++;
     }
 
-    strcpy(ptr, "  ");
+    memcpy(ptr, "  ", 3);
     ptr += 2;
 
     for (j = 0; j < 16 && (i + j) < bytes; j ++)
@@ -3488,7 +4051,7 @@ http_debug_hex(const char *prefix,        /* I - Prefix for line */
       if (ch < ' ' || ch >= 127)
        ch = '.';
 
-      *ptr++ = ch;
+      *ptr++ = (char)ch;
     }
 
     *ptr = '\0';
@@ -3499,127 +4062,244 @@ http_debug_hex(const char *prefix,    /* I - Prefix for line */
 
 
 /*
- * 'http_field()' - Return the field index for a field name.
+ * '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 http_field_t                    /* O - Field index */
-http_field(const char *name)           /* I - String name */
+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 */
 {
-  int  i;                              /* Looping var */
+  ssize_t      bytes;                  /* Bytes read */
 
 
-  for (i = 0; i < HTTP_FIELD_MAX; i ++)
-    if (_cups_strcasecmp(name, http_fields[i]) == 0)
-      return ((http_field_t)i);
+  DEBUG_printf(("http_read(http=%p, buffer=%p, length=" CUPS_LLFMT ")", http,
+                buffer, CUPS_LLCAST length));
 
-  return (HTTP_FIELD_UNKNOWN);
-}
+  if (!http->blocking)
+  {
+    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_ssl()' - Read from a SSL/TLS connection.
+ * '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 int                             /* O - Bytes read */
-http_read_ssl(http_t *http,            /* I - Connection to server */
-             char   *buf,              /* I - Buffer to store data */
-             int    len)               /* I - Length of buffer */
+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 */
 {
-#  if defined(HAVE_LIBSSL)
-  return (SSL_read((SSL *)(http->tls), buf, len));
-
-#  elif defined(HAVE_GNUTLS)
-  ssize_t      result;                 /* Return value */
+  ssize_t      bytes;                  /* Bytes read */
 
 
-  result = gnutls_record_recv(http->tls, buf, len);
+  DEBUG_printf(("http_read_buffered(http=%p, buffer=%p, length=" CUPS_LLFMT
+                ") used=%d",
+                http, buffer, CUPS_LLCAST length, http->used));
 
-  if (result < 0 && !errno)
+  if (http->used > 0)
   {
-   /*
-    * Convert GNU TLS error to errno value...
-    */
-
-    switch (result)
-    {
-      case GNUTLS_E_INTERRUPTED :
-         errno = EINTR;
-         break;
+    if (length > (size_t)http->used)
+      bytes = (ssize_t)http->used;
+    else
+      bytes = (ssize_t)length;
 
-      case GNUTLS_E_AGAIN :
-          errno = EAGAIN;
-          break;
+    DEBUG_printf(("2http_read: Grabbing %d bytes from input buffer.",
+                  (int)bytes));
 
-      default :
-          errno = EPIPE;
-          break;
-    }
+    memcpy(buffer, http->buffer, (size_t)bytes);
+    http->used -= (int)bytes;
 
-    result = -1;
+    if (http->used > 0)
+      memmove(http->buffer, http->buffer + bytes, (size_t)http->used);
   }
+  else
+    bytes = http_read(http, buffer, length);
+
+  return (bytes);
+}
 
-  return ((int)result);
 
-#  elif defined(HAVE_CDSASSL)
-  int          result;                 /* Return value */
-  OSStatus     error;                  /* Error info */
-  size_t       processed;              /* Number of bytes processed */
+/*
+ * '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 ")",
+                http, buffer, CUPS_LLCAST length));
 
-  error = SSLRead(http->tls, buf, len, &processed);
-  DEBUG_printf(("6http_read_ssl: error=%d, processed=%d", (int)error,
-                (int)processed));
-  switch (error)
+  if (http->data_remaining <= 0)
   {
-    case 0 :
-       result = (int)processed;
-       break;
+    char       len[32];                /* Length string */
 
-    case errSSLWouldBlock :
-       if (processed)
-         result = (int)processed;
-       else
-       {
-         result = -1;
-         errno  = EINTR;
-       }
-       break;
+    if (!httpGets(len, sizeof(len), http))
+    {
+      DEBUG_puts("1http_read_chunk: Could not get chunk length.");
+      return (0);
+    }
 
-    case errSSLClosedGraceful :
-    default :
-       if (processed)
-         result = (int)processed;
-       else
-       {
-         result = -1;
-         errno  = EPIPE;
-       }
-       break;
+    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);
+    }
   }
 
-  return (result);
+  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;
 
-#  elif defined(HAVE_SSPISSL)
-  return _sspiRead((_sspi_struct_t*) http->tls, buf, len);
-#  endif /* HAVE_LIBSSL */
+  return (http_read_buffered(http, buffer, length));
 }
-#endif /* HAVE_SSL */
 
 
 /*
  * '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 - Connection to server */
-          http_state_t request,        /* I - Request code */
-         const char   *uri)    /* I - URI */
+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 */
-  static const char * const codes[] =
-               {               /* Request code strings */
+  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",
@@ -3632,11 +4312,13 @@ http_send(http_t       *http,   /* I - Connection to server */
                  NULL,
                  "DELETE",
                  "TRACE",
-                 "CLOSE"
+                 "CLOSE",
+                 NULL,
+                 NULL
                };
 
 
-  DEBUG_printf(("7http_send(http=%p, request=HTTP_%s, uri=\"%s\")",
+  DEBUG_printf(("4http_send(http=%p, request=HTTP_%s, uri=\"%s\")",
                 http, codes[request], uri));
 
   if (http == NULL || uri == NULL)
@@ -3648,38 +4330,19 @@ http_send(http_t       *http,   /* I - Connection to server */
 
   if (!http->fields[HTTP_FIELD_USER_AGENT][0])
   {
-#ifdef WIN32
-    SYSTEM_INFO        sysinfo;                /* System information */
-    OSVERSIONEX        version;                /* OS version info */
-
-    version.dwOSVersionInfoSize = sizeof(OSVERSIONEX);
-    GetVersionInfoEx(&version);
-    GetNativeSystemInfo(&sysinfo);
-
-    snprintf(buf, sizeof(buf), CUPS_MINIMAL " (Windows %d.%d; %s) IPP/2.0",
-            version.major, version.minor,
-            sysinfo.wProcessorArchitecture
-                == PROCESSOR_ARCHITECTURE_AMD64 ? "amd64" :
-                sysinfo.wProcessorArchitecture
-                    == PROCESSOR_ARCHITECTURE_ARM ? "arm" :
-                sysinfo.wProcessorArchitecture
-                    == PROCESSOR_ARCHITECTURE_IA64 ? "ia64" :
-                sysinfo.wProcessorArchitecture
-                    == PROCESSOR_ARCHITECTURE_INTEL ? "intel" :
-                "unknown");
-
-#else
-    struct utsname     name;           /* uname info */
-
-    uname(&name);
+    if (http->default_user_agent)
+      httpSetField(http, HTTP_FIELD_USER_AGENT, http->default_user_agent);
+    else
+      httpSetField(http, HTTP_FIELD_USER_AGENT, cupsUserAgent());
+  }
 
-    snprintf(buf, sizeof(buf), CUPS_MINIMAL " (%s %s; %s) IPP/2.0",
-            name.sysname, name.release, name.machine);
-#endif /* WIN32 */
+ /*
+  * Set the Accept-Encoding field if it isn't already...
+  */
 
-    DEBUG_printf(("8http_send: Default User-Agent: %s", buf));
-    httpSetField(http, HTTP_FIELD_USER_AGENT, buf);
-  }
+  if (!http->accept_encoding && http->default_accept_encoding)
+    httpSetField(http, HTTP_FIELD_ACCEPT_ENCODING,
+                 http->default_accept_encoding);
 
  /*
   * Encode the URI as needed...
@@ -3691,9 +4354,15 @@ http_send(http_t       *http,    /* I - Connection to server */
   * See if we had an error the last time around; if so, reconnect...
   */
 
-  if (http->status == HTTP_ERROR || http->status >= HTTP_BAD_REQUEST)
-    if (httpReconnect(http))
+  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...
@@ -3702,7 +4371,7 @@ http_send(http_t       *http,     /* I - Connection to server */
   if (http->wused)
   {
     if (httpFlushWrite(http) < 0)
-      if (httpReconnect(http))
+      if (httpReconnect2(http, 30000, NULL))
         return (-1);
   }
 
@@ -3711,46 +4380,44 @@ http_send(http_t       *http,   /* I - Connection to server */
   */
 
   http->state         = request;
-  http->data_encoding = HTTP_ENCODE_FIELDS;
+  http->data_encoding = HTTP_ENCODING_FIELDS;
 
-  if (request == HTTP_POST || request == HTTP_PUT)
+  if (request == HTTP_STATE_POST || request == HTTP_STATE_PUT)
     http->state ++;
 
-  http->status = HTTP_CONTINUE;
+  http->status = HTTP_STATUS_CONTINUE;
 
 #ifdef HAVE_SSL
-  if (http->encryption == HTTP_ENCRYPT_REQUIRED && !http->tls)
+  if (http->encryption == HTTP_ENCRYPTION_REQUIRED && !http->tls)
   {
     httpSetField(http, HTTP_FIELD_CONNECTION, "Upgrade");
-    httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.0,SSL/2.0,SSL/3.0");
+    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_ERROR;
+    http->status = HTTP_STATUS_ERROR;
     return (-1);
   }
 
   for (i = 0; i < HTTP_FIELD_MAX; i ++)
-    if (http->fields[i][0] != '\0')
+    if ((value = httpGetField(http, i)) != NULL && *value)
     {
-      DEBUG_printf(("9http_send: %s: %s", http_fields[i],
-                    httpGetField(http, i)));
+      DEBUG_printf(("5http_send: %s: %s", http_fields[i], value));
 
       if (i == HTTP_FIELD_HOST)
       {
-       if (httpPrintf(http, "Host: %s:%d\r\n", httpGetField(http, i),
-                      _httpAddrPort(http->hostaddr)) < 1)
+       if (httpPrintf(http, "Host: %s:%d\r\n", value,
+                      httpAddrPort(http->hostaddr)) < 1)
        {
-         http->status = HTTP_ERROR;
+         http->status = HTTP_STATUS_ERROR;
          return (-1);
        }
       }
-      else if (httpPrintf(http, "%s: %s\r\n", http_fields[i],
-                         httpGetField(http, i)) < 1)
+      else if (httpPrintf(http, "%s: %s\r\n", http_fields[i], value) < 1)
       {
-       http->status = HTTP_ERROR;
+       http->status = HTTP_STATUS_ERROR;
        return (-1);
       }
     }
@@ -3758,28 +4425,32 @@ http_send(http_t       *http,   /* I - Connection to server */
   if (http->cookie)
     if (httpPrintf(http, "Cookie: $Version=0; %s\r\n", http->cookie) < 1)
     {
-      http->status = HTTP_ERROR;
+      http->status = HTTP_STATUS_ERROR;
       return (-1);
     }
 
-  if (http->expect == HTTP_CONTINUE &&
-      (http->state == HTTP_POST_RECV || http->state == HTTP_PUT_RECV))
+  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_ERROR;
+      http->status = HTTP_STATUS_ERROR;
       return (-1);
     }
 
   if (httpPrintf(http, "\r\n") < 1)
   {
-    http->status = HTTP_ERROR;
+    http->status = HTTP_STATUS_ERROR;
     return (-1);
   }
 
   if (httpFlushWrite(http) < 0)
     return (-1);
 
-  httpGetLength2(http);
+  http_set_length(http);
   httpClearFields(http);
 
  /*
@@ -3802,44 +4473,57 @@ http_send(http_t       *http,   /* I - Connection to server */
 }
 
 
-#ifdef HAVE_SSL
-#  if defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA)
 /*
- * 'http_set_credentials()' - Set the SSL/TLS credentials.
+ * 'http_set_length()' - Set the data_encoding and data_remaining values.
  */
 
-static int                             /* O - Status of connection */
-http_set_credentials(http_t *http)     /* I - Connection to server */
+static off_t                           /* O - Remainder or -1 on error */
+http_set_length(http_t *http)          /* I - Connection */
 {
-  _cups_globals_t *cg = _cupsGlobals();        /* Pointer to library globals */
-  OSStatus             error = 0;      /* Error code */
-  http_tls_credentials_t credentials = NULL;
-                                       /* TLS credentials */
+  off_t        remaining;                      /* Remainder */
 
 
-  DEBUG_printf(("7http_set_credentials(%p)", http));
+  DEBUG_printf(("http_set_length(http=%p) mode=%d state=%s", http, http->mode,
+                httpStateString(http->state)));
 
- /*
-  * Prefer connection specific credentials...
-  */
+  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(http->fields[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;
+    }
 
-  if ((credentials = http->tls_credentials) == NULL)
-    credentials = cg->tls_credentials;
+    DEBUG_printf(("1http_set_length: Setting data_remaining to " CUPS_LLFMT ".",
+                  CUPS_LLCAST remaining));
+    http->data_remaining = remaining;
 
-  if (credentials)
-  {
-    error = SSLSetCertificate(http->tls, credentials);
-    DEBUG_printf(("4http_set_credentials: SSLSetCertificate, error=%d",
-                 (int)error));
+    if (remaining <= INT_MAX)
+      http->_data_remaining = (int)remaining;
+    else
+      http->_data_remaining = INT_MAX;
   }
-  else
-    DEBUG_puts("4http_set_credentials: No credentials to set.");
 
-  return (error);
+  return (remaining);
 }
-#  endif /* HAVE_CDSASSL && HAVE_SECCERTIFICATECOPYDATA */
-#endif /* HAVE_SSL */
-
 
 /*
  * 'http_set_timeout()' - Set the socket timeout values.
@@ -3853,8 +4537,8 @@ http_set_timeout(int    fd,               /* I - File descriptor */
   DWORD tv = (DWORD)(timeout * 1000);
                                      /* Timeout in milliseconds */
 
-  setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
-  setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv));
+  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 */
@@ -3862,8 +4546,8 @@ http_set_timeout(int    fd,               /* I - File descriptor */
   tv.tv_sec  = (int)timeout;
   tv.tv_usec = (int)(1000000 * fmod(timeout, 1.0));
 
-  setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
-  setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
+  setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, CUPS_SOCAST &tv, sizeof(tv));
+  setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, CUPS_SOCAST &tv, sizeof(tv));
 #endif /* WIN32 */
 }
 
@@ -3873,7 +4557,7 @@ http_set_timeout(int    fd,               /* I - File descriptor */
  */
 
 static void
-http_set_wait(http_t *http)            /* I - Connection to server */
+http_set_wait(http_t *http)            /* I - HTTP connection */
 {
   if (http->blocking)
   {
@@ -3889,526 +4573,17 @@ http_set_wait(http_t *http)            /* I - Connection to server */
 
 #ifdef HAVE_SSL
 /*
- * '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 */
-{
-  int                  any_root;       /* Allow any root */
-  char                 hostname[256],  /* Hostname */
-                       *hostptr;       /* Pointer into hostname */
-  _cups_globals_t      *cg = _cupsGlobals();
-                                       /* Pointer to library globals */
-#  ifdef HAVE_LIBSSL
-  SSL_CTX              *context;       /* Context for encryption */
-  BIO                  *bio;           /* BIO data */
-  const char           *message = NULL;/* Error message */
-#  elif defined(HAVE_GNUTLS)
-  int                  status;         /* Status of handshake */
-  gnutls_certificate_client_credentials *credentials;
-                                       /* TLS credentials */
-#  elif defined(HAVE_CDSASSL)
-  OSStatus             error;          /* Error code */
-  const char           *message = NULL;/* Error message */
-#    ifdef HAVE_SECCERTIFICATECOPYDATA
-  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 */
-#    endif /* HAVE_SECCERTIFICATECOPYDATA */
-#  elif defined(HAVE_SSPISSL)
-  TCHAR                        username[256];  /* Username returned from GetUserName() */
-  TCHAR                        commonName[256];/* Common name for certificate */
-  DWORD                        dwSize;         /* 32 bit size */
-#  endif /* HAVE_LIBSSL */
-
-
-  DEBUG_printf(("7http_setup_ssl(http=%p)", http));
-
- /*
-  * Always allow self-signed certificates for the local loopback address...
-  */
-
-  if (httpAddrLocalhost(http->hostaddr))
-  {
-    any_root = 1;
-    strlcpy(hostname, "localhost", sizeof(hostname));
-  }
-  else
-  {
-   /*
-    * Otherwise use the system-wide setting and make sure the hostname we have
-    * does not end in a trailing dot.
-    */
-
-    any_root = cg->any_root;
-
-    strlcpy(hostname, http->hostname, sizeof(hostname));
-    if ((hostptr = hostname + strlen(hostname) - 1) >= hostname &&
-        *hostptr == '.')
-      *hostptr = '\0';
-  }
-
-#  ifdef HAVE_LIBSSL
-  (void)any_root;
-
-  context = SSL_CTX_new(SSLv23_client_method());
-
-  SSL_CTX_set_options(context, SSL_OP_NO_SSLv2); /* Only use SSLv3 or TLS */
-
-  bio = BIO_new(_httpBIOMethods());
-  BIO_ctrl(bio, BIO_C_SET_FILE_PTR, 0, (char *)http);
-
-  http->tls = SSL_new(context);
-  SSL_set_bio(http->tls, bio, bio);
-
-#   ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME
-  SSL_set_tlsext_host_name(http->tls, hostname);
-#   endif /* HAVE_SSL_SET_TLSEXT_HOST_NAME */
-
-  if (SSL_connect(http->tls) != 1)
-  {
-    unsigned long      error;  /* Error code */
-
-    while ((error = ERR_get_error()) != 0)
-    {
-      message = ERR_error_string(error, NULL);
-      DEBUG_printf(("8http_setup_ssl: %s", message));
-    }
-
-    SSL_CTX_free(context);
-    SSL_free(http->tls);
-    http->tls = NULL;
-
-#    ifdef WIN32
-    http->error  = WSAGetLastError();
-#    else
-    http->error  = errno;
-#    endif /* WIN32 */
-    http->status = HTTP_ERROR;
-
-    if (!message)
-      message = _("Unable to establish a secure connection to host.");
-
-    _cupsSetError(IPP_PKI_ERROR, message, 1);
-
-    return (-1);
-  }
-
-#  elif defined(HAVE_GNUTLS)
-  (void)any_root;
-
-  credentials = (gnutls_certificate_client_credentials *)
-                    malloc(sizeof(gnutls_certificate_client_credentials));
-  if (credentials == NULL)
-  {
-    DEBUG_printf(("8http_setup_ssl: Unable to allocate credentials: %s",
-                  strerror(errno)));
-    http->error  = errno;
-    http->status = HTTP_ERROR;
-    _cupsSetHTTPError(HTTP_ERROR);
-
-    return (-1);
-  }
-
-  gnutls_certificate_allocate_credentials(credentials);
-
-  gnutls_init(&http->tls, GNUTLS_CLIENT);
-  gnutls_set_default_priority(http->tls);
-  gnutls_server_name_set(http->tls, GNUTLS_NAME_DNS, hostname,
-                         strlen(hostname));
-  gnutls_credentials_set(http->tls, GNUTLS_CRD_CERTIFICATE, *credentials);
-  gnutls_transport_set_ptr(http->tls, (gnutls_transport_ptr)http);
-  gnutls_transport_set_pull_function(http->tls, _httpReadGNUTLS);
-  gnutls_transport_set_push_function(http->tls, _httpWriteGNUTLS);
-
-  while ((status = gnutls_handshake(http->tls)) != GNUTLS_E_SUCCESS)
-  {
-    DEBUG_printf(("8http_setup_ssl: gnutls_handshake returned %d (%s)",
-                  status, gnutls_strerror(status)));
-
-    if (gnutls_error_is_fatal(status))
-    {
-      http->error  = EIO;
-      http->status = HTTP_ERROR;
-
-      _cupsSetError(IPP_PKI_ERROR, gnutls_strerror(status), 0);
-
-      gnutls_deinit(http->tls);
-      gnutls_certificate_free_credentials(*credentials);
-      free(credentials);
-      http->tls = NULL;
-
-      return (-1);
-    }
-  }
-
-  http->tls_credentials = credentials;
-
-#  elif defined(HAVE_CDSASSL)
-  if ((error = SSLNewContext(false, &http->tls)))
-  {
-    http->error  = errno;
-    http->status = HTTP_ERROR;
-    _cupsSetHTTPError(HTTP_ERROR);
-
-    return (-1);
-  }
-
-  error = SSLSetConnection(http->tls, http);
-  DEBUG_printf(("4http_setup_ssl: SSLSetConnection, error=%d", (int)error));
-
-  if (!error)
-  {
-    error = SSLSetIOFuncs(http->tls, _httpReadCDSA, _httpWriteCDSA);
-    DEBUG_printf(("4http_setup_ssl: SSLSetIOFuncs, error=%d", (int)error));
-  }
-
-  if (!error)
-  {
-    error = SSLSetAllowsAnyRoot(http->tls, any_root);
-    DEBUG_printf(("4http_setup_ssl: SSLSetAllowsAnyRoot(%d), error=%d",
-                  any_root, (int)error));
-  }
-
-  if (!error)
-  {
-    error = SSLSetAllowsExpiredCerts(http->tls, cg->expired_certs);
-    DEBUG_printf(("4http_setup_ssl: SSLSetAllowsExpiredCerts(%d), error=%d",
-                  cg->expired_certs, (int)error));
-  }
-
-  if (!error)
-  {
-    error = SSLSetAllowsExpiredRoots(http->tls, cg->expired_root);
-    DEBUG_printf(("4http_setup_ssl: SSLSetAllowsExpiredRoots(%d), error=%d",
-                  cg->expired_root, (int)error));
-  }
-
- /*
-  * In general, don't verify certificates since things like the common name
-  * often do not match...
-  */
-
-  if (!error)
-  {
-    error = SSLSetEnableCertVerify(http->tls, false);
-    DEBUG_printf(("4http_setup_ssl: SSLSetEnableCertVerify, error=%d",
-                  (int)error));
-  }
-
-#    ifdef HAVE_SECCERTIFICATECOPYDATA
-  if (!error)
-  {
-    if (cg->client_cert_cb)
-    {
-      error = SSLSetSessionOption(http->tls,
-                                 kSSLSessionOptionBreakOnCertRequested, true);
-      DEBUG_printf(("4http_setup_ssl: kSSLSessionOptionBreakOnCertRequested, "
-                    "error=%d", (int)error));
-    }
-    else
-    {
-      error = http_set_credentials(http);
-      DEBUG_printf(("4http_setup_ssl: http_set_credentials, error=%d",
-                    (int)error));
-    }
-  }
-
- /*
-  * If there's a server certificate callback installed let it evaluate the
-  * certificate(s) during the handshake...
-  */
-
-  if (!error && cg->server_cert_cb != NULL)
-  {
-    error = SSLSetSessionOption(http->tls,
-                               kSSLSessionOptionBreakOnServerAuth, true);
-    DEBUG_printf(("4http_setup_ssl: kSSLSessionOptionBreakOnServerAuth, "
-                 "error=%d", (int)error));
-  }
-#    endif /* HAVE_SECCERTIFICATECOPYDATA */
-
- /*
-  * 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)
-  {
-    error = SSLSetPeerDomainName(http->tls, hostname, strlen(hostname));
-
-    DEBUG_printf(("4http_setup_ssl: SSLSetPeerDomainName, error=%d",
-                  (int)error));
-  }
-
-  if (!error)
-  {
-    int done = 0;                      /* Are we done yet? */
-
-    while (!error && !done)
-    {
-      error = SSLHandshake(http->tls);
-
-      DEBUG_printf(("4http_setup_ssl: 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;
-
-#    ifdef HAVE_SECCERTIFICATECOPYDATA
-       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(("4http_setup_ssl: 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 = 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(("4http_setup_ssl: Client certificate callback "
-                             "returned %d.", (int)error));
-             }
-
-             httpFreeCredentials(names);
-           }
-           break;
-#    endif /* HAVE_SECCERTIFICATECOPYDATA */
-
-       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;
-      }
-    }
-  }
-
-  if (error)
-  {
-    http->error  = error;
-    http->status = HTTP_ERROR;
-    errno        = ECONNREFUSED;
-
-    SSLDisposeContext(http->tls);
-    http->tls = NULL;
-
-   /*
-    * If an error string wasn't set by the callbacks use a generic one...
-    */
-
-    if (!message)
-#ifdef HAVE_CSSMERRORSTRING
-      message = cssmErrorString(error);
-#else
-      message = _("Unable to establish a secure connection to host.");
-#endif /* HAVE_CSSMERRORSTRING */
-
-    _cupsSetError(IPP_PKI_ERROR, message, 1);
-
-    return (-1);
-  }
-
-#  elif defined(HAVE_SSPISSL)
-  http->tls = _sspiAlloc();
-
-  if (!http->tls)
-  {
-    _cupsSetHTTPError(HTTP_ERROR);
-    return (-1);
-  }
-
-  http->tls->sock = http->fd;
-  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_credentials, L"ClientContainer",
-                           commonName, FALSE))
-  {
-    _sspiFree(http->tls_credentials);
-    http->tls_credentials = NULL;
-
-    http->error  = EIO;
-    http->status = HTTP_ERROR;
-
-    _cupsSetError(IPP_PKI_ERROR,
-                  _("Unable to establish a secure connection to host."), 1);
-
-    return (-1);
-  }
-
-  _sspiSetAllowsAnyRoot(http->tls_credentials, any_root);
-  _sspiSetAllowsExpiredCerts(http->tls_credentials, TRUE);
-
-  if (!_sspiConnect(http->tls_credentials, hostname))
-  {
-    _sspiFree(http->tls_credentials);
-    http->tls_credentials = NULL;
-
-    http->error  = EIO;
-    http->status = HTTP_ERROR;
-
-    _cupsSetError(IPP_PKI_ERROR,
-                  _("Unable to establish a secure connection to host."), 1);
-
-    return (-1);
-  }
-#  endif /* HAVE_CDSASSL */
-
-  return (0);
-}
-
-
-/*
- * 'http_shutdown_ssl()' - Shut down SSL/TLS on a connection.
- */
-
-static void
-http_shutdown_ssl(http_t *http)                /* I - Connection to server */
-{
-#  ifdef HAVE_LIBSSL
-  SSL_CTX      *context;               /* Context for encryption */
-
-  context = SSL_get_SSL_CTX(http->tls);
-
-  SSL_shutdown(http->tls);
-  SSL_CTX_free(context);
-  SSL_free(http->tls);
-
-#  elif defined(HAVE_GNUTLS)
-  gnutls_certificate_client_credentials *credentials;
-                                       /* TLS credentials */
-
-  credentials = (gnutls_certificate_client_credentials *)(http->tls_credentials);
-
-  gnutls_bye(http->tls, GNUTLS_SHUT_RDWR);
-  gnutls_deinit(http->tls);
-  gnutls_certificate_free_credentials(*credentials);
-  free(credentials);
-
-#  elif defined(HAVE_CDSASSL)
-  while (SSLClose(http->tls) == errSSLWouldBlock)
-    usleep(1000);
-
-  SSLDisposeContext(http->tls);
-
-  if (http->tls_credentials)
-    CFRelease(http->tls_credentials);
-
-#  elif defined(HAVE_SSPISSL)
-  _sspiFree(http->tls_credentials);
-#  endif /* HAVE_LIBSSL */
-
-  http->tls             = NULL;
-  http->tls_credentials = NULL;
-}
-#endif /* HAVE_SSL */
-
-
-#ifdef HAVE_SSL
-/*
- * 'http_upgrade()' - Force upgrade to TLS encryption.
+ * 'http_tls_upgrade()' - Force upgrade to TLS encryption.
  */
 
 static int                             /* O - Status of connection */
-http_upgrade(http_t *http)             /* I - Connection to server */
+http_tls_upgrade(http_t *http)         /* I - HTTP connection */
 {
   int          ret;                    /* Return value */
   http_t       myhttp;                 /* Local copy of HTTP data */
 
 
-  DEBUG_printf(("7http_upgrade(%p)", http));
+  DEBUG_printf(("7http_tls_upgrade(%p)", http));
 
  /*
   * Flush the connection to make sure any previous "Upgrade" message
@@ -4429,11 +4604,12 @@ http_upgrade(http_t *http)              /* I - Connection to server */
   * encryption on the link...
   */
 
+  http->tls_upgrade         = 1;
   http->field_authorization = NULL;    /* Don't free the auth string */
 
   httpClearFields(http);
   httpSetField(http, HTTP_FIELD_CONNECTION, "upgrade");
-  httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.2, TLS/1.1, TLS/1.0, SSL/3.0");
+  httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.2,TLS/1.1,TLS/1.0");
 
   if ((ret = httpOptions(http, "*")) == 0)
   {
@@ -4441,7 +4617,7 @@ http_upgrade(http_t *http)                /* I - Connection to server */
     * Wait for the secure connection...
     */
 
-    while (httpUpdate(http) == HTTP_CONTINUE);
+    while (httpUpdate(http) == HTTP_STATUS_CONTINUE);
   }
 
  /*
@@ -4455,6 +4631,7 @@ http_upgrade(http_t *http)                /* I - Connection to server */
   http->expect              = myhttp.expect;
   http->field_authorization = myhttp.field_authorization;
   http->digest_tries        = myhttp.digest_tries;
+  http->tls_upgrade         = 0;
 
  /*
   * See if we actually went secure...
@@ -4466,13 +4643,10 @@ http_upgrade(http_t *http)              /* I - Connection to server */
     * Server does not support HTTP upgrade...
     */
 
-    DEBUG_puts("8http_upgrade: Server does not support HTTP upgrade!");
+    DEBUG_puts("8http_tls_upgrade: Server does not support HTTP upgrade!");
 
-#  ifdef WIN32
-    closesocket(http->fd);
-#  else
-    close(http->fd);
-#  endif
+    _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, _("Encryption is not supported."), 1);
+    httpAddrClose(NULL, http->fd);
 
     http->fd = -1;
 
@@ -4488,17 +4662,17 @@ http_upgrade(http_t *http)              /* I - Connection to server */
  * 'http_write()' - Write a buffer to a HTTP connection.
  */
 
-static int                             /* O - Number of bytes written */
-http_write(http_t     *http,           /* I - Connection to server */
+static ssize_t                         /* O - Number of bytes written */
+http_write(http_t     *http,           /* I - HTTP connection */
            const char *buffer,         /* I - Buffer for data */
-          int        length)           /* I - Number of bytes to write */
+          size_t     length)           /* I - Number of bytes to write */
 {
-  int  tbytes,                         /* Total bytes sent */
-       bytes;                          /* Bytes sent */
+  ssize_t      tbytes,                 /* Total bytes sent */
+               bytes;                  /* Bytes sent */
 
 
-  DEBUG_printf(("2http_write(http=%p, buffer=%p, length=%d)", http, buffer,
-                length));
+  DEBUG_printf(("2http_write(http=%p, buffer=%p, length=" CUPS_LLFMT ")", http,
+                buffer, CUPS_LLCAST length));
   http->error = 0;
   tbytes      = 0;
 
@@ -4565,13 +4739,13 @@ http_write(http_t     *http,            /* I - Connection to server */
 
 #ifdef HAVE_SSL
     if (http->tls)
-      bytes = http_write_ssl(http, buffer, length);
+      bytes = _httpTLSWrite(http, buffer, (int)length);
     else
 #endif /* HAVE_SSL */
     bytes = send(http->fd, buffer, length, 0);
 
-    DEBUG_printf(("3http_write: Write of %d bytes returned %d.", (int)length,
-                  (int)bytes));
+    DEBUG_printf(("3http_write: Write of " CUPS_LLFMT " bytes returned "
+                  CUPS_LLFMT ".", CUPS_LLCAST length, CUPS_LLCAST bytes));
 
     if (bytes < 0)
     {
@@ -4619,14 +4793,14 @@ http_write(http_t     *http,            /* I - Connection to server */
 
     buffer += bytes;
     tbytes += bytes;
-    length -= bytes;
+    length -= (size_t)bytes;
   }
 
 #ifdef DEBUG
-  http_debug_hex("http_write", buffer - tbytes, tbytes);
+  http_debug_hex("http_write", buffer - tbytes, (int)tbytes);
 #endif /* DEBUG */
 
-  DEBUG_printf(("3http_write: Returning %d.", tbytes));
+  DEBUG_printf(("3http_write: Returning " CUPS_LLFMT ".", CUPS_LLCAST tbytes));
 
   return (tbytes);
 }
@@ -4636,38 +4810,38 @@ http_write(http_t     *http,            /* I - Connection to server */
  * 'http_write_chunk()' - Write a chunked buffer.
  */
 
-static int                             /* O - Number bytes written */
-http_write_chunk(http_t     *http,     /* I - Connection to server */
+static ssize_t                         /* O - Number bytes written */
+http_write_chunk(http_t     *http,     /* I - HTTP connection */
                  const char *buffer,   /* I - Buffer to write */
-                int        length)     /* I - Length of buffer */
+                size_t        length)  /* I - Length of buffer */
 {
-  char header[255];                    /* Chunk header */
-  int  bytes;                          /* Bytes written */
+  char         header[16];             /* Chunk header */
+  ssize_t      bytes;                  /* Bytes written */
 
 
-  DEBUG_printf(("7http_write_chunk(http=%p, buffer=%p, length=%d)",
-                http, buffer, length));
+  DEBUG_printf(("7http_write_chunk(http=%p, buffer=%p, length=" CUPS_LLFMT ")",
+                http, buffer, CUPS_LLCAST length));
 
  /*
   * Write the chunk header, data, and trailer.
   */
 
-  sprintf(header, "%x\r\n", length);
-  if (http_write(http, header, (int)strlen(header)) < 0)
+  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!");
+    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!");
+    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!");
+    DEBUG_puts("8http_write_chunk: http_write of CR LF failed.");
     return (-1);
   }
 
@@ -4675,96 +4849,6 @@ http_write_chunk(http_t     *http,       /* I - Connection to server */
 }
 
 
-#ifdef HAVE_SSL
-/*
- * 'http_write_ssl()' - Write to a SSL/TLS connection.
- */
-
-static int                             /* O - Bytes written */
-http_write_ssl(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));
-
-#  if defined(HAVE_LIBSSL)
-  result = SSL_write((SSL *)(http->tls), buf, len);
-
-#  elif defined(HAVE_GNUTLS)
-  result = gnutls_record_send(http->tls, buf, 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;
-  }
-
-#  elif defined(HAVE_CDSASSL)
-  OSStatus     error;                  /* Error info */
-  size_t       processed;              /* Number of bytes processed */
-
-
-  error = SSLWrite(http->tls, buf, 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;
-  }
-#  elif defined(HAVE_SSPISSL)
-  return _sspiWrite((_sspi_struct_t *)http->tls, (void *)buf, len);
-#  endif /* HAVE_LIBSSL */
-
-  DEBUG_printf(("3http_write_ssl: Returning %d.", (int)result));
-
-  return ((int)result);
-}
-#endif /* HAVE_SSL */
-
-
 /*
- * End of "$Id: http.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: http.c 12970 2015-11-13 20:02:51Z msweet $".
  */
index a882ff7..a451a2c 100644 (file)
@@ -1,18 +1,18 @@
 /*
- * "$Id: http.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: http.h 12848 2015-08-26 18:51:57Z msweet $"
  *
- *   Hyper-Text Transport Protocol definitions for CUPS.
+ * Hyper-Text Transport Protocol definitions for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_HTTP_H_
@@ -36,9 +36,6 @@ typedef off_t ssize_t;                        /* @private@ */
 #    include <winsock2.h>
 #    include <ws2tcpip.h>
 #  else
-#    ifdef __sgi
-#      define INET6                    /* IRIX IPv6 support... */
-#    endif /* __sgi */
 #    include <unistd.h>
 #    include <sys/time.h>
 #    include <sys/socket.h>
@@ -90,8 +87,6 @@ extern "C" {
 #    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(__osf__)
-#    define s6_addr32  s6_un.sa6_laddr
 #  elif defined(WIN32)
 /*
  * Windows only defines byte and 16-bit word members of the union and
@@ -129,17 +124,30 @@ typedef enum http_auth_e          /**** HTTP authentication types ****/
 
 typedef enum http_encoding_e           /**** HTTP transfer encoding values ****/
 {
-  HTTP_ENCODE_LENGTH,                  /* Data is sent with Content-Length */
-  HTTP_ENCODE_CHUNKED,                 /* Data is chunked */
-  HTTP_ENCODE_FIELDS                   /* Sending HTTP fields */
+  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_ENCRYPT_IF_REQUESTED,           /* Encrypt if requested (TLS upgrade) */
-  HTTP_ENCRYPT_NEVER,                  /* Never encrypt */
-  HTTP_ENCRYPT_REQUIRED,               /* Encryption is required (TLS upgrade) */
-  HTTP_ENCRYPT_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_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 ****/
@@ -172,6 +180,9 @@ typedef enum http_field_e           /**** HTTP field names ****/
   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/OS X 10.9@ */
+  HTTP_FIELD_ALLOW,                    /* Allow field @since CUPS 1.7/OS X 10.9@ */
+  HTTP_FIELD_SERVER,                   /* Server field @since CUPS 1.7/OS X 10.9@ */
   HTTP_FIELD_MAX                       /* Maximum field index */
 } http_field_t;
 
@@ -185,90 +196,191 @@ typedef enum http_state_e                /**** HTTP state values; states
                                         **** are server-oriented...
                                         ****/
 {
-  HTTP_WAITING,                                /* Waiting for command */
-  HTTP_OPTIONS,                                /* OPTIONS command, waiting for blank line */
-  HTTP_GET,                            /* GET command, waiting for blank line */
-  HTTP_GET_SEND,                       /* GET command, sending data */
-  HTTP_HEAD,                           /* HEAD command, waiting for blank line */
-  HTTP_POST,                           /* POST command, waiting for blank line */
-  HTTP_POST_RECV,                      /* POST command, receiving data */
-  HTTP_POST_SEND,                      /* POST command, sending data */
-  HTTP_PUT,                            /* PUT command, waiting for blank line */
-  HTTP_PUT_RECV,                       /* PUT command, receiving data */
-  HTTP_DELETE,                         /* DELETE command, waiting for blank line */
-  HTTP_TRACE,                          /* TRACE command, waiting for blank line */
-  HTTP_CLOSE,                          /* CLOSE command, waiting for blank line */
-  HTTP_STATUS                          /* Command complete, sending status */
+  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/OS X 10.9@ */
+  HTTP_STATE_UNKNOWN_VERSION           /* Unknown request method, waiting for blank line @since CUPS 1.7/OS X 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_ERROR = -1,                     /* An error response from httpXxxx() */
-
-  HTTP_CONTINUE = 100,                 /* Everything OK, keep going... */
-  HTTP_SWITCHING_PROTOCOLS,            /* HTTP upgrade to TLS/SSL */
-
-  HTTP_OK = 200,                       /* OPTIONS/GET/HEAD/POST/TRACE command was successful */
-  HTTP_CREATED,                                /* PUT command was successful */
-  HTTP_ACCEPTED,                       /* DELETE command was successful */
-  HTTP_NOT_AUTHORITATIVE,              /* Information isn't authoritative */
-  HTTP_NO_CONTENT,                     /* Successful command, no new data */
-  HTTP_RESET_CONTENT,                  /* Content was reset/recreated */
-  HTTP_PARTIAL_CONTENT,                        /* Only a partial file was recieved/sent */
-
-  HTTP_MULTIPLE_CHOICES = 300,         /* Multiple files match request */
-  HTTP_MOVED_PERMANENTLY,              /* Document has moved permanently */
-  HTTP_MOVED_TEMPORARILY,              /* Document has moved temporarily */
-  HTTP_SEE_OTHER,                      /* See this other link... */
-  HTTP_NOT_MODIFIED,                   /* File not modified */
-  HTTP_USE_PROXY,                      /* Must use a proxy to access this URI */
-
-  HTTP_BAD_REQUEST = 400,              /* Bad request */
-  HTTP_UNAUTHORIZED,                   /* Unauthorized to access host */
-  HTTP_PAYMENT_REQUIRED,               /* Payment required */
-  HTTP_FORBIDDEN,                      /* Forbidden to access this URI */
-  HTTP_NOT_FOUND,                      /* URI was not found */
-  HTTP_METHOD_NOT_ALLOWED,             /* Method is not allowed */
-  HTTP_NOT_ACCEPTABLE,                 /* Not Acceptable */
-  HTTP_PROXY_AUTHENTICATION,           /* Proxy Authentication is Required */
-  HTTP_REQUEST_TIMEOUT,                        /* Request timed out */
-  HTTP_CONFLICT,                       /* Request is self-conflicting */
-  HTTP_GONE,                           /* Server has gone away */
-  HTTP_LENGTH_REQUIRED,                        /* A content length or encoding is required */
-  HTTP_PRECONDITION,                   /* Precondition failed */
-  HTTP_REQUEST_TOO_LARGE,              /* Request entity too large */
-  HTTP_URI_TOO_LONG,                   /* URI too long */
-  HTTP_UNSUPPORTED_MEDIATYPE,          /* The requested media type is unsupported */
-  HTTP_REQUESTED_RANGE,                        /* The requested range is not satisfiable */
-  HTTP_EXPECTATION_FAILED,             /* The expectation given in an Expect header field was not met */
-  HTTP_UPGRADE_REQUIRED = 426,         /* Upgrade to SSL/TLS required */
-
-  HTTP_SERVER_ERROR = 500,             /* Internal server error */
-  HTTP_NOT_IMPLEMENTED,                        /* Feature not implemented */
-  HTTP_BAD_GATEWAY,                    /* Bad gateway */
-  HTTP_SERVICE_UNAVAILABLE,            /* Service is unavailable */
-  HTTP_GATEWAY_TIMEOUT,                        /* Gateway connection timed out */
-  HTTP_NOT_SUPPORTED,                  /* HTTP version not supported */
-
-  HTTP_AUTHORIZATION_CANCELED = 1000,  /* User canceled authorization @since CUPS 1.4@ */
-  HTTP_PKI_ERROR,                      /* Error negotiating a secure connection @since CUPS 1.5/OS X 10.7@ */
-  HTTP_WEBIF_DISABLED                  /* Web interface is disabled @private@ */
+  HTTP_STATUS_ERROR = -1,              /* An error response from httpXxxx() */
+  HTTP_STATUS_NONE = 0,                        /* No Expect value @since CUPS 1.7/OS X 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_MOVED_TEMPORARILY,       /* Document has moved temporarily */
+  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_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/OS X 10.7@ */
+  HTTP_STATUS_CUPS_WEBIF_DISABLED      /* Web interface is disabled @private@ */
+
+#  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_OVERFLOW = -8,              /* URI buffer for httpAssembleURI is too small */
-  HTTP_URI_BAD_ARGUMENTS = -7,         /* Bad arguments to function (error) */
-  HTTP_URI_BAD_RESOURCE = -6,          /* Bad resource in URI (error) */
-  HTTP_URI_BAD_PORT = -5,              /* Bad port number in URI (error) */
-  HTTP_URI_BAD_HOSTNAME = -4,          /* Bad hostname in URI (error) */
-  HTTP_URI_BAD_USERNAME = -3,          /* Bad username in URI (error) */
-  HTTP_URI_BAD_SCHEME = -2,            /* Bad scheme in URI (error) */
-  HTTP_URI_BAD_URI = -1,               /* Bad/empty URI (error) */
-  HTTP_URI_OK = 0,                     /* URI decoded OK */
-  HTTP_URI_MISSING_SCHEME,             /* Missing scheme in URI (warning) */
-  HTTP_URI_UNKNOWN_SCHEME,             /* Unknown scheme in URI (warning) */
-  HTTP_URI_MISSING_RESOURCE            /* Missing resource in URI (warning) */
+  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 ****/
@@ -285,9 +397,15 @@ typedef enum http_uri_coding_e             /**** URI en/decode flags ****/
 
 typedef enum http_version_e            /**** HTTP version numbers ****/
 {
-  HTTP_0_9 = 9,                                /* HTTP/0.9 */
-  HTTP_1_0 = 100,                      /* HTTP/1.0 */
-  HTTP_1_1 = 101                       /* HTTP/1.1 */
+  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
@@ -338,9 +456,11 @@ extern void                httpBlocking(http_t *http, int b);
 extern int             httpCheck(http_t *http);
 extern void            httpClearFields(http_t *http);
 extern void            httpClose(http_t *http);
-extern http_t          *httpConnect(const char *host, int port);
+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);
+                                           http_encryption_t encryption)
+                                           _CUPS_DEPRECATED_1_7_MSG("Use httpConnect2 instead.");
 extern int             httpDelete(http_t *http, const char *uri);
 extern int             httpEncryption(http_t *http, http_encryption_t e);
 extern int             httpError(http_t *http);
@@ -360,20 +480,20 @@ extern int                httpPost(http_t *http, const char *uri);
 extern int             httpPrintf(http_t *http, const char *format, ...)
                        __attribute__ ((__format__ (__printf__, 2, 3)));
 extern int             httpPut(http_t *http, const char *uri);
-extern int             httpRead(http_t *http, char *buffer, int length) _CUPS_DEPRECATED;
-extern int             httpReconnect(http_t *http);
+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;
+                                    char *resource) _CUPS_DEPRECATED_MSG("Use httpSeparateURI instead.");
 extern void            httpSetField(http_t *http, http_field_t field,
                                     const char *value);
 extern const char      *httpStatus(http_status_t status);
 extern int             httpTrace(http_t *http, const char *uri);
 extern http_status_t   httpUpdate(http_t *http);
-extern int             httpWrite(http_t *http, const char *buffer, int length) _CUPS_DEPRECATED;
-extern char            *httpEncode64(char *out, const char *in) _CUPS_DEPRECATED;
-extern char            *httpDecode64(char *out, const char *in) _CUPS_DEPRECATED;
-extern int             httpGetLength(http_t *http) _CUPS_DEPRECATED;
+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_MSG("Use httpGetLength2 instead.");
 extern char            *httpMD5(const char *, const char *, const char *,
                                 char [33]);
 extern char            *httpMD5Final(const char *, const char *, const char *,
@@ -394,7 +514,7 @@ 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;
+                                     char *resource, int resourcelen) _CUPS_DEPRECATED_MSG("Use httpSeparateURI instead.");
 
 /**** New in CUPS 1.2/OS X 10.5 ****/
 extern int             httpAddrAny(const http_addr_t *addr) _CUPS_API_1_2;
@@ -473,6 +593,59 @@ extern int         httpReconnect2(http_t *http, int msec, int *cancel)
                                       _CUPS_API_1_6;
 
 
+/**** New in CUPS 1.7/OS X 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/OS X 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...
  */
@@ -483,5 +656,5 @@ extern int          httpReconnect2(http_t *http, int msec, int *cancel)
 #endif /* !_CUPS_HTTP_H_ */
 
 /*
- * End of "$Id: http.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: http.h 12848 2015-08-26 18:51:57Z msweet $".
  */
index abf2d23..262baf7 100644 (file)
@@ -1,18 +1,18 @@
 /*
- * "$Id: ipp-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ipp-private.h 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Private IPP definitions for CUPS.
+ * Private IPP definitions for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_IPP_PRIVATE_H_
@@ -54,6 +54,7 @@ typedef struct                                /**** Attribute mapping data ****/
   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;
 
 
@@ -61,9 +62,11 @@ typedef struct                               /**** Attribute mapping data ****/
  * Prototypes for private functions...
  */
 
+#ifdef DEBUG
+extern const char      *_ippCheckOptions(void);
+#endif /* DEBUG */
 extern _ipp_option_t   *_ippFindOption(const char *name);
 
-
 /*
  * C++ magic...
  */
@@ -74,5 +77,5 @@ extern _ipp_option_t  *_ippFindOption(const char *name);
 #endif /* !_CUPS_IPP_H_ */
 
 /*
- * End of "$Id: ipp-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ipp-private.h 11558 2014-02-06 18:33:34Z msweet $".
  */
index 815828b..6a5d940 100644 (file)
@@ -1,34 +1,18 @@
 /*
- * "$Id: ipp-support.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ipp-support.c 12666 2015-05-25 19:38:09Z msweet $"
  *
- *   Internet Printing Protocol support functions for CUPS.
+ * Internet Printing Protocol support functions for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   ippAttributeString() - Convert the attribute's value to a string.
- *   ippEnumString()     - Return a string corresponding to the enum value.
- *   ippEnumValue()      - Return the value associated with a given enum
- *                         string.
- *   ippErrorString()    - Return a name for the given status code.
- *   ippErrorValue()     - Return a status code for the given name.
- *   ippOpString()       - Return a name for the given operation id.
- *   ippOpValue()        - Return an operation id for the given name.
- *   ippPort()           - Return the default IPP port number.
- *   ippSetPort()        - Set the default port number.
- *   ippTagString()      - Return the tag name corresponding to a tag value.
- *   ippTagValue()       - Return the tag value corresponding to a tag name.
- *   ipp_col_string()    - Convert a collection to a string.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
  * 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",
@@ -82,7 +74,48 @@ static const char * const ipp_status_oks[] = /* "OK" status codes */
                  "client-error-document-password-error",
                  "client-error-document-permission-error",
                  "client-error-document-security-error",
-                 "client-error-document-unprintable-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"
+               },
+               * 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 */
                {
@@ -102,15 +135,15 @@ static const char * const ipp_status_oks[] =      /* "OK" status codes */
                },
                * const ipp_status_1000s[] =            /* CUPS internal */
                {
-                 "cups-authorization-canceled",
+                 "cups-authentication-canceled",
                  "cups-pki-error",
                  "cups-upgrade-required"
                };
 static const char * const ipp_std_ops[] =
                {
                  /* 0x0000 - 0x000f */
-                 "0x00",
-                 "0x01",
+                 "0x0000",
+                 "0x0001",
                  "Print-Job",
                  "Print-URI",
                  "Validate-Job",
@@ -124,7 +157,7 @@ static const char * const ipp_std_ops[] =
                  "Hold-Job",
                  "Release-Job",
                  "Restart-Job",
-                 "0x0f",
+                 "0x000f",
 
                  /* 0x0010 - 0x001f */
                  "Pause-Printer",
@@ -133,8 +166,8 @@ static const char * const ipp_std_ops[] =
                  "Set-Printer-Attributes",
                  "Set-Job-Attributes",
                  "Get-Printer-Supported-Values",
-                 "Create-Printer-Subscription",
-                 "Create-Job-Subscription",
+                 "Create-Printer-Subscriptions",
+                 "Create-Job-Subscriptions",
                  "Get-Subscription-Attributes",
                  "Get-Subscriptions",
                  "Renew-Subscription",
@@ -162,10 +195,10 @@ static const char * const ipp_std_ops[] =
                  "Suspend-Current-Job",
                  "Resume-Job",
 
-                 /* 0x0030 - 0x003d */
+                 /* 0x0030 - 0x003f */
                  "Promote-Job",
                  "Schedule-Job-After",
-                 "0x32",
+                 "0x0032",
                  "Cancel-Document",
                  "Get-Document-Attributes",
                  "Get-Documents",
@@ -176,7 +209,22 @@ static const char * const ipp_std_ops[] =
                  "Resubmit-Job",
                  "Close-Job",
                  "Identify-Printer",
-                 "Validate-Document"
+                 "Validate-Document",
+                 "Send-Hardcopy-Document",
+                 "Acknowledge-Document",
+
+                 /* 0x0040 - 0x004a */
+                 "Acknowledge-Identify-Printer",
+                 "Acknowledge-Job",
+                 "Fetch-Document",
+                 "Fetch-Job",
+                 "Get-Output-Device-Attributes",
+                 "Update-Active-Jobs",
+                 "Deregister-Output-Device",
+                 "Update-Document-Status",
+                 "Update-Job-Status",
+                 "Update-Output-Device-Attributes",
+                 "Get-Next-Document-Data"
                },
                * const ipp_cups_ops[] =
                {
@@ -291,7 +339,7 @@ static const char * const ipp_document_states[] =
                  "pending",
                  "4",
                  "processing",
-                 "6",
+                 "processing-stopped", /* IPPSIX */
                  "canceled",
                  "aborted",
                  "completed"
@@ -310,8 +358,8 @@ static const char * const ipp_document_states[] =
                  "bale",
                  "booklet-maker",
                  "jog-offset",
-                 "15",
-                 "16",
+                 "coat",               /* Finishings 2.0 */
+                 "laminate",           /* Finishings 2.0 */
                  "17",
                  "18",
                  "19",
@@ -327,10 +375,10 @@ static const char * const ipp_document_states[] =
                  "staple-dual-top",
                  "staple-dual-right",
                  "staple-dual-bottom",
-                 "32",
-                 "33",
-                 "34",
-                 "35",
+                 "staple-triple-left", /* Finishings 2.0 */
+                 "staple-triple-top",  /* Finishings 2.0 */
+                 "staple-triple-right",/* Finishings 2.0 */
+                 "staple-triple-bottom",/* Finishings 2.0 */
                  "36",
                  "37",
                  "38",
@@ -358,7 +406,155 @@ static const char * const ipp_document_states[] =
                  "trim-after-pages",
                  "trim-after-documents",
                  "trim-after-copies",
-                 "trim-after-job"
+                 "trim-after-job",
+                 "64",
+                 "65",
+                 "66",
+                 "67",
+                 "68",
+                 "69",
+                 "punch-top-left",     /* Finishings 2.0 */
+                 "punch-bottom-left",  /* Finishings 2.0 */
+                 "punch-top-right",    /* Finishings 2.0 */
+                 "punch-bottom-right", /* Finishings 2.0 */
+                 "punch-dual-left",    /* Finishings 2.0 */
+                 "punch-dual-top",     /* Finishings 2.0 */
+                 "punch-dual-right",   /* Finishings 2.0 */
+                 "punch-dual-bottom",  /* Finishings 2.0 */
+                 "punch-triple-left",  /* Finishings 2.0 */
+                 "punch-triple-top",   /* Finishings 2.0 */
+                 "punch-triple-right", /* Finishings 2.0 */
+                 "punch-triple-bottom",/* Finishings 2.0 */
+                 "punch-quad-left",    /* Finishings 2.0 */
+                 "punch-quad-top",     /* Finishings 2.0 */
+                 "punch-quad-right",   /* Finishings 2.0 */
+                 "punch-quad-bottom",  /* Finishings 2.0 */
+                 "86",
+                 "87",
+                 "88",
+                 "89",
+                 "fold-accordian",     /* Finishings 2.0 */
+                 "fold-double-gate",   /* Finishings 2.0 */
+                 "fold-gate",          /* Finishings 2.0 */
+                 "fold-half",          /* Finishings 2.0 */
+                 "fold-half-z",        /* Finishings 2.0 */
+                 "fold-left-gate",     /* Finishings 2.0 */
+                 "fold-letter",        /* Finishings 2.0 */
+                 "fold-parallel",      /* Finishings 2.0 */
+                 "fold-poster",        /* Finishings 2.0 */
+                 "fold-right-gate",    /* Finishings 2.0 */
+                 "fold-z"              /* Finishings 2.0 */
+               },
+               * 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-accordian",
+                 "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 */
@@ -381,7 +577,8 @@ static const char * const ipp_document_states[] =
                  "portrait",
                  "landscape",
                  "reverse-landscape",
-                 "reverse-portrait"
+                 "reverse-portrait",
+                 "none"
                },
                * const ipp_print_qualities[] =
                {                       /* print-quality enums */
@@ -424,7 +621,8 @@ ippAttributeString(
   char         *bufptr,                /* Pointer into buffer */
                *bufend,                /* End of buffer */
                temp[256];              /* Temporary string */
-  const char   *ptr;                   /* Pointer into string */
+  const char   *ptr,                   /* Pointer into string */
+               *end;                   /* Pointer to end of string */
   _ipp_value_t *val;                   /* Current value */
 
 
@@ -452,59 +650,57 @@ ippAttributeString(
         bufptr ++;
     }
 
-    switch (attr->value_tag & ~IPP_TAG_COPY)
+    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, bufend - bufptr + 1);
+            strlcpy(bufptr, ptr, (size_t)(bufend - bufptr + 1));
 
           bufptr += strlen(ptr);
           break;
 
       case IPP_TAG_INTEGER :
           if (buffer && bufptr < bufend)
-            bufptr += snprintf(bufptr, bufend - bufptr + 1, "%d", val->integer);
+            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",
-                    bufend - bufptr + 1);
+            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, bufend - bufptr + 1, "%d-%d",
-                               val->range.lower, val->range.upper);
+            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);
+            bufptr += snprintf(temp, sizeof(temp), "%d-%d", val->range.lower, val->range.upper);
           break;
 
       case IPP_TAG_RESOLUTION :
-          if (buffer && bufptr < bufend)
-            bufptr += snprintf(bufptr, bufend - bufptr + 1, "%dx%d%s",
-                               val->resolution.xres, val->resolution.yres,
-                               val->resolution.units == IPP_RES_PER_INCH ?
-                                   "dpi" : "dpcm");
+         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");
+            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 = (val->date[0] << 8) + val->date[1];
+            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",
@@ -518,7 +714,7 @@ ippAttributeString(
                       val->date[10]);
 
             if (buffer && bufptr < bufend)
-              strlcpy(bufptr, temp, bufend - bufptr + 1);
+              strlcpy(bufptr, temp, (size_t)(bufend - bufptr + 1));
 
             bufptr += strlen(temp);
           }
@@ -562,7 +758,7 @@ ippAttributeString(
             bufptr ++;
 
             if (buffer && bufptr < bufend)
-              strlcpy(bufptr, val->string.language, bufend - bufptr);
+              strlcpy(bufptr, val->string.language, (size_t)(bufend - bufptr));
             bufptr += strlen(val->string.language);
 
             if (buffer && bufptr < bufend)
@@ -573,14 +769,14 @@ ippAttributeString(
 
       case IPP_TAG_BEGIN_COLLECTION :
           if (buffer && bufptr < bufend)
-            bufptr += ipp_col_string(val->collection, bufptr,
-                                     bufend - bufptr + 1);
+            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->string.text; *ptr; ptr ++)
+          for (ptr = val->unknown.data, end = ptr + val->unknown.length;
+               ptr < end; ptr ++)
           {
             if (*ptr == '\\' || _cups_isspace(*ptr))
             {
@@ -595,11 +791,9 @@ ippAttributeString(
             else if (!isprint(*ptr & 255))
             {
               if (buffer && bufptr < bufend)
-                bufptr += snprintf(bufptr, bufend - bufptr + 1, "\\%03o",
-                                   *ptr & 255);
+                bufptr += snprintf(bufptr, (size_t)(bufend - bufptr + 1), "\\%03o", *ptr & 255);
               else
-                bufptr += snprintf(temp, sizeof(temp), "\\%03o",
-                                   *ptr & 255);
+                bufptr += snprintf(temp, sizeof(temp), "\\%03o", *ptr & 255);
             }
             else
             {
@@ -613,7 +807,7 @@ ippAttributeString(
       default :
           ptr = ippTagString(attr->value_tag);
           if (buffer && bufptr < bufend)
-            strlcpy(bufptr, ptr, bufend - bufptr + 1);
+            strlcpy(bufptr, ptr, (size_t)(bufend - bufptr + 1));
           bufptr += strlen(ptr);
           break;
     }
@@ -624,7 +818,954 @@ ippAttributeString(
   else if (bufend)
     *bufend = '\0';
 
-  return (bufptr - buffer);
+  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/OS X 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_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",
+    "errors-count",
+    "finishings-actual",
+    "finishings-col-actual",
+    "force-front-side-actual",
+    "imposition-template-actual",
+    "impressions",
+    "impressions-completed",
+    "impressions-completed-current-copy",
+    "insert-sheet-actual",
+    "k-octets",
+    "k-octets-processed",
+    "last-document",
+    "media-actual",
+    "media-col-actual",
+    "media-input-tray-check-actual",
+    "media-sheets",
+    "media-sheets-completed",
+    "more-info",
+    "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-completed",
+    "pages-completed-current-copy",
+    "presentation-direction-number-up-actual",
+    "print-color-mode-actual",
+    "print-content-optimize-actual",
+    "print-quality-actual",
+    "print-rendering-intent-actual",
+    "print-scaling-actual",            /* IPP Paid Printing */
+    "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 */
+    "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-default",
+    "finishings-col-supported",
+    "finishings-default",
+    "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",
+    "max-stitching-locations-supported",
+    "media",
+    "media-back-coating-supported",
+    "media-bottom-margin-supported",
+    "media-col",
+    "media-col-default",
+    "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-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",
+    "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",
+    "presentation-direction-number-up",
+    "presentation-direction-number-up-default",
+    "presentation-direction-number-up-supported",
+    "print-color-mode",
+    "print-color-mode-default",
+    "print-color-mode-supported",
+    "print-content-optimize",
+    "print-content-optimize-default",
+    "print-content-optimize-supported",
+    "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 */
+    "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 */
+    "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-completed",
+    "job-k-octets",
+    "job-k-octets-processed",
+    "job-mandatory-attributes",
+    "job-media-progress",              /* CUPS extension */
+    "job-media-sheets",
+    "job-media-sheets-completed",
+    "job-message-from-operator",
+    "job-more-info",
+    "job-name",
+    "job-originating-host-name",       /* CUPS extension */
+    "job-originating-user-name",
+    "job-originating-user-uri",
+    "job-pages",
+    "job-pages-completed",
+    "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-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",
+    "media-actual",
+    "media-col-actual",
+    "media-check-input-tray-actual",
+    "multiple-document-handling-actual",
+    "number-of-documents",
+    "number-of-intervening-jobs",
+    "number-up-actual",
+    "orientation-requested-actual",
+    "original-requesting-user-name",
+    "output-bin-actual",
+    "output-device-assigned",
+    "overrides-actual",
+    "page-delivery-actual",
+    "page-order-received-actual",
+    "page-ranges-actual",
+    "presentation-direction-number-up-actual",
+    "print-color-mode-actual",
+    "print-content-optimize-actual",
+    "print-quality-actual",
+    "print-rendering-intent-actual",
+    "print-scaling-actual",            /* IPP Paid Printing */
+    "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 */
+    "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-default",
+    "finishings-col-supported",
+    "finishings-default",
+    "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",
+    "max-save-info-supported",
+    "max-stitching-locations-supported",
+    "media",
+    "media-back-coating-supported",
+    "media-bottom-margin-supported",
+    "media-col",
+    "media-col-default",
+    "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-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",
+    "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-default",
+    "output-device-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",
+    "presentation-direction-number-up",
+    "presentation-direction-number-up-default",
+    "presentation-direction-number-up-supported",
+    "print-color-mode",
+    "print-color-mode-default",
+    "print-color-mode-supported",
+    "print-content-optimize",
+    "print-content-optimize-default",
+    "print-content-optimize-supported",
+    "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 */
+    "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 */
+    "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",
+    "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-quota-period",                        /* CUPS extension */
+    "job-resolvers-supported",
+    "job-settable-attributes-supported",
+    "job-spooling-supported",
+    "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 */
+    "media-col-ready",
+    "media-ready",
+    "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-versions-supported",          /* CUPS extension */
+    "pdl-override-supported",
+    "port-monitor",                    /* CUPS extension */
+    "port-monitor-supported",          /* CUPS extension */
+    "preferred-attributes-supported",
+    "printer-alert",
+    "printer-alert-description",
+    "printer-charge-info",
+    "printer-charge-info-uri",
+    "printer-commands",                        /* CUPS extension */
+    "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-info",
+    "printer-input-tray",              /* IPP JPS3 */
+    "printer-is-accepting-jobs",
+    "printer-is-shared",               /* 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-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",
+    "subordinate-printers-supported",
+    "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 subscription_description[] =
+  {                                    /* subscription-description group */
+    "notify-job-id",
+    "notify-lease-expiration-time",
+    "notify-printer-up-time",
+    "notify-printer-uri",
+    "notify-sequence-number",
+    "notify-subscriber-user-name",
+    "notify-subscriber-user-uri",
+    "notify-subscription-id",
+    "subscriptions-uuid"
+  };
+  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"
+  };
+
+
+ /*
+  * Get the requested-attributes attribute...
+  */
+
+  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 (ippGetOperation(request) == 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"))
+    {
+      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"))
+    {
+      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"))
+    {
+      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"))
+    {
+      for (j = 0;
+           j < (int)(sizeof(printer_description) /
+                     sizeof(printer_description[0]));
+           j ++)
+        cupsArrayAdd(ra, (void *)printer_description[j]);
+
+      added = 1;
+    }
+
+    if (!strcmp(value, "subscription-description") || !strcmp(value, "all"))
+    {
+      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"))
+    {
+      for (j = 0;
+           j < (int)(sizeof(subscription_template) /
+                     sizeof(subscription_template[0]));
+           j ++)
+        cupsArrayAdd(ra, (void *)subscription_template[j]);
+
+      added = 1;
+    }
+
+    if (!added)
+      cupsArrayAdd(ra, (void *)value);
+  }
+
+  return (ra);
 }
 
 
@@ -648,14 +1789,24 @@ ippEnumString(const char *attrname,      /* I - Attribute name */
       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")) &&
-           enumvalue >= 3 &&
-           enumvalue < (3 + (int)(sizeof(ipp_finishings) / sizeof(ipp_finishings[0]))))
-    return (ipp_finishings[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 &&
@@ -663,8 +1814,8 @@ ippEnumString(const char *attrname,        /* I - Attribute name */
                                  sizeof(ipp_job_collation_types[0]))))
     return (ipp_job_collation_types[enumvalue - 3]);
   else if (!strcmp(attrname, "job-state") &&
-          enumvalue >= IPP_JOB_PENDING && enumvalue <= IPP_JOB_COMPLETED)
-    return (ipp_job_states[enumvalue - IPP_JOB_PENDING]);
+          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") ||
@@ -684,8 +1835,8 @@ ippEnumString(const char *attrname,        /* I - Attribute name */
                                  sizeof(ipp_print_qualities[0]))))
     return (ipp_print_qualities[enumvalue - 3]);
   else if (!strcmp(attrname, "printer-state") &&
-           enumvalue >= IPP_PRINTER_IDLE && enumvalue <= IPP_PRINTER_STOPPED)
-    return (ipp_printer_states[enumvalue - IPP_PRINTER_IDLE]);
+           enumvalue >= IPP_PSTATE_IDLE && enumvalue <= IPP_PSTATE_STOPPED)
+    return (ipp_printer_states[enumvalue - IPP_PSTATE_IDLE]);
 
  /*
   * Not a standard enum value, just return the decimal equivalent...
@@ -714,7 +1865,7 @@ ippEnumValue(const char *attrname, /* I - Attribute name */
   */
 
   if (isdigit(*enumstring & 255))
-    return (strtol(enumstring, NULL, 0));
+    return ((int)strtol(enumstring, NULL, 0));
 
  /*
   * Otherwise look up the string...
@@ -731,6 +1882,13 @@ ippEnumValue(const char *attrname,        /* I - Attribute name */
           !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;
   }
@@ -795,18 +1953,25 @@ ippErrorString(ipp_status_t error)       /* I - Error status */
   * See if the error code is a known value...
   */
 
-  if (error >= IPP_OK && error <= IPP_OK_EVENTS_COMPLETE)
+  if (error >= IPP_STATUS_OK && error <= IPP_STATUS_OK_EVENTS_COMPLETE)
     return (ipp_status_oks[error]);
-  else if (error == IPP_REDIRECTION_OTHER_SITE)
+  else if (error == IPP_STATUS_REDIRECTION_OTHER_SITE)
     return ("redirection-other-site");
-  else if (error == CUPS_SEE_OTHER)
+  else if (error == IPP_STATUS_CUPS_SEE_OTHER)
     return ("cups-see-other");
-  else if (error >= IPP_BAD_REQUEST && error <= IPP_PRINT_SUPPORT_FILE_NOT_FOUND)
-    return (ipp_status_400s[error - IPP_BAD_REQUEST]);
-  else if (error >= IPP_INTERNAL_ERROR && error <= IPP_PRINTER_IS_DEACTIVATED)
-    return (ipp_status_500s[error - IPP_INTERNAL_ERROR]);
-  else if (error >= IPP_AUTHENTICATION_CANCELED && error <= IPP_UPGRADE_REQUIRED)
-    return (ipp_status_1000s[error - IPP_AUTHENTICATION_CANCELED]);
+  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...
@@ -827,7 +1992,7 @@ ippErrorString(ipp_status_t error) /* I - Error status */
 ipp_status_t                           /* O - IPP status code */
 ippErrorValue(const char *name)                /* I - Name */
 {
-  int          i;
+  size_t       i;                      /* Looping var */
 
 
   for (i = 0; i < (sizeof(ipp_status_oks) / sizeof(ipp_status_oks[0])); i ++)
@@ -835,15 +2000,19 @@ ippErrorValue(const char *name)          /* I - Name */
       return ((ipp_status_t)i);
 
   if (!_cups_strcasecmp(name, "redirection-other-site"))
-    return (IPP_REDIRECTION_OTHER_SITE);
+    return (IPP_STATUS_REDIRECTION_OTHER_SITE);
 
   if (!_cups_strcasecmp(name, "cups-see-other"))
-    return (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));
@@ -872,13 +2041,13 @@ ippOpString(ipp_op_t op)         /* I - Operation ID */
   * See if the operation ID is a known value...
   */
 
-  if (op >= IPP_PRINT_JOB && op <= IPP_CLOSE_JOB)
+  if (op >= IPP_OP_PRINT_JOB && op <= IPP_OP_VALIDATE_DOCUMENT)
     return (ipp_std_ops[op]);
-  else if (op == IPP_PRIVATE)
+  else if (op == IPP_OP_PRIVATE)
     return ("windows-ext");
-  else if (op >= CUPS_GET_DEFAULT && op <= CUPS_GET_PPD)
-    return (ipp_cups_ops[op - CUPS_GET_DEFAULT]);
-  else if (op == CUPS_GET_DOCUMENT)
+  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)
     return (ipp_cups_ops2[0]);
 
  /*
@@ -900,7 +2069,7 @@ ippOpString(ipp_op_t op)           /* I - Operation ID */
 ipp_op_t                               /* O - Operation ID */
 ippOpValue(const char *name)           /* I - Textual name */
 {
-  int          i;
+  size_t       i;                      /* Looping var */
 
 
   if (!strncmp(name, "0x", 2))
@@ -911,7 +2080,7 @@ ippOpValue(const char *name)               /* I - Textual name */
       return ((ipp_op_t)i);
 
   if (!_cups_strcasecmp(name, "windows-ext"))
-    return (IPP_PRIVATE);
+    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]))
@@ -921,13 +2090,19 @@ ippOpValue(const char *name)             /* I - Textual name */
     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 (CUPS_ADD_MODIFY_CLASS);
+    return (IPP_OP_CUPS_ADD_MODIFY_CLASS);
 
   if (!_cups_strcasecmp(name, "CUPS-Add-Printer"))
-    return (CUPS_ADD_MODIFY_PRINTER);
+    return (IPP_OP_CUPS_ADD_MODIFY_PRINTER);
 
-  return ((ipp_op_t)-1);
+  return (IPP_OP_CUPS_INVALID);
 }
 
 
@@ -966,6 +2141,22 @@ ippSetPort(int p)                 /* I - Port number to use */
 
 
 /*
+ * '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 2911 and 3382.
@@ -976,7 +2167,7 @@ ippSetPort(int p)                  /* I - Port number to use */
 const char *                           /* O - Tag name */
 ippTagString(ipp_tag_t tag)            /* I - Tag value */
 {
-  tag &= IPP_TAG_MASK;
+  tag &= IPP_TAG_CUPS_MASK;
 
   if (tag < (ipp_tag_t)(sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0])))
     return (ipp_tag_names[tag]);
@@ -996,7 +2187,7 @@ ippTagString(ipp_tag_t tag)                /* I - Tag value */
 ipp_tag_t                              /* O - Tag value */
 ippTagValue(const char *name)          /* I - Tag name */
 {
-  int  i;                              /* Looping var */
+  size_t       i;                      /* Looping var */
 
 
   for (i = 0; i < (sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0])); i ++)
@@ -1046,6 +2237,14 @@ ipp_col_string(ipp_t  *col,              /* I - Collection attribute */
   ipp_attribute_t      *attr;          /* Current member attribute */
 
 
+  if (!col)
+  {
+    if (buffer)
+      *buffer = '\0';
+
+    return (0);
+  }
+
   bufptr = buffer;
   bufend = buffer + bufsize - 1;
 
@@ -1060,12 +2259,12 @@ ipp_col_string(ipp_t  *col,             /* I - Collection attribute */
     prefix = ' ';
 
     if (buffer && bufptr < bufend)
-      bufptr += snprintf(bufptr, bufend - bufptr + 1, "%s=", attr->name);
+      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, bufend - bufptr + 1);
+      bufptr += ippAttributeString(attr, bufptr, (size_t)(bufend - bufptr + 1));
     else
       bufptr += ippAttributeString(attr, temp, sizeof(temp));
   }
@@ -1081,10 +2280,10 @@ ipp_col_string(ipp_t  *col,             /* I - Collection attribute */
     *bufptr = '}';
   bufptr ++;
 
-  return (bufptr - buffer);
+  return ((size_t)(bufptr - buffer));
 }
 
 
 /*
- * End of "$Id: ipp-support.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ipp-support.c 12666 2015-05-25 19:38:09Z msweet $".
  */
index 1a8beed..5e7b730 100644 (file)
 /*
- * "$Id: ipp.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- *   Internet Printing Protocol functions for CUPS.
- *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   _cupsBufferGet()      - Get a read/write buffer.
- *   _cupsBufferRelease()   - Release a read/write buffer.
- *   ippAddBoolean()       - Add a boolean attribute to an IPP message.
- *   ippAddBooleans()      - Add an array of boolean values.
- *   ippAddCollection()     - Add a collection value.
- *   ippAddCollections()    - Add an array of collection values.
- *   ippAddDate()          - Add a date attribute to an IPP message.
- *   ippAddInteger()       - Add a integer attribute to an IPP message.
- *   ippAddIntegers()      - Add an array of integer values.
- *   ippAddOctetString()    - Add an octetString value to an IPP message.
- *   ippAddOutOfBand()     - Add an out-of-band value to an IPP message.
- *   ippAddRange()         - Add a range of values to an IPP message.
- *   ippAddRanges()        - Add ranges of values to an IPP message.
- *   ippAddResolution()     - Add a resolution value to an IPP message.
- *   ippAddResolutions()    - Add resolution values to an IPP message.
- *   ippAddSeparator()     - Add a group separator to an IPP message.
- *   ippAddString()        - Add a language-encoded string to an IPP message.
- *   ippAddStrings()       - Add language-encoded strings to an IPP message.
- *   ippCopyAttribute()     - Copy an attribute.
- *   ippCopyAttributes()    - Copy attributes from one IPP message to another.
- *   ippDateToTime()       - Convert from RFC 1903 Date/Time format to UNIX
- *                           time in seconds.
- *   ippDelete()           - Delete an IPP message.
- *   ippDeleteAttribute()   - Delete a single attribute in an IPP message.
- *   ippDeleteValues()     - Delete values in an attribute.
- *   ippFindAttribute()     - Find a named attribute in a request.
- *   ippFindNextAttribute() - Find the next named attribute in a request.
- *   ippFirstAttribute()    - Return the first attribute in the message.
- *   ippGetBoolean()       - Get a boolean value for an attribute.
- *   ippGetCollection()     - Get a collection value for an attribute.
- *   ippGetCount()         - Get the number of values in an attribute.
- *   ippGetDate()           - Get a date value for an attribute.
- *   ippGetGroupTag()      - Get the group associated with an attribute.
- *   ippGetInteger()       - Get the integer/enum value for an attribute.
- *   ippGetName()          - Get the attribute name.
- *   ippGetOperation()     - Get the operation ID in an IPP message.
- *   ippGetRange()          - Get a rangeOfInteger value from an attribute.
- *   ippGetRequestId()     - Get the request ID from an IPP message.
- *   ippGetResolution()     - Get a resolution value for an attribute.
- *   ippGetStatusCode()     - Get the status code from an IPP response or event
- *                           message.
- *   ippGetString()        - Get the string and optionally the language code
- *                           for an attribute.
- *   ippGetValueTag()      - Get the value tag for an attribute.
- *   ippGetVersion()       - Get the major and minor version number from an
- *                           IPP message.
- *   ippLength()           - Compute the length of an IPP message.
- *   ippNextAttribute()     - Return the next attribute in the message.
- *   ippNew()              - Allocate a new IPP message.
- *   ippNewRequest()       - Allocate a new IPP request message.
- *   ippRead()             - Read data for an IPP message from a HTTP
- *                           connection.
- *   ippReadFile()         - Read data for an IPP message from a file.
- *   ippReadIO()           - Read data for an IPP message.
- *   ippSetBoolean()       - Set a boolean value in an attribute.
- *   ippSetCollection()     - Set a collection value in an attribute.
- *   ippSetDate()           - Set a date value in an attribute.
- *   ippSetGroupTag()      - Set the group tag of an attribute.
- *   ippSetInteger()       - Set an integer or enum value in an attribute.
- *   ippSetName()          - Set the name of an attribute.
- *   ippSetOperation()     - Set the operation ID in an IPP request message.
- *   ippSetRange()         - Set a rangeOfInteger value in an attribute.
- *   ippSetRequestId()     - Set the request ID in an IPP message.
- *   ippSetResolution()     - Set a resolution value in an attribute.
- *   ippSetState()          - Set the current state of the IPP message.
- *   ippSetStatusCode()     - Set the status code in an IPP response or event
- *                           message.
- *   ippSetString()        - Set a string value in an attribute.
- *   ippSetValueTag()      - Set the value tag of an attribute.
- *   ippSetVersion()       - Set the version number in an IPP message.
- *   ippTimeToDate()       - Convert from UNIX time to RFC 1903 format.
- *   ippWrite()            - Write data for an IPP message to a HTTP
- *                           connection.
- *   ippWriteFile()        - Write data for an IPP message to a file.
- *   ippWriteIO()          - Write data for an IPP message.
- *   ipp_add_attr()        - Add a new attribute to the message.
- *   ipp_free_values()     - Free attribute values.
- *   ipp_get_code()        - Convert a C locale/charset name into an IPP
- *                           language/charset code.
- *   ipp_lang_code()       - Convert a C locale name into an IPP language
- *                           code.
- *   ipp_length()          - Compute the length of an IPP message or
- *                           collection value.
- *   ipp_read_http()       - Semi-blocking read on a HTTP connection...
- *   ipp_read_file()       - Read IPP data from a file.
- *   ipp_set_value()       - Get the value element from an attribute,
- *                           expanding it as needed.
- *   ipp_write_file()      - Write IPP data to a file.
+ * "$Id: ipp.c 12468 2015-02-01 04:50:43Z msweet $"
+ *
+ * Internet Printing Protocol functions for CUPS.
+ *
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
  */
 
 #include "cups-private.h"
+#include <regex.h>
 #ifdef WIN32
 #  include <io.h>
 #endif /* WIN32 */
@@ -136,6 +46,8 @@ 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,
@@ -196,8 +108,8 @@ _cupsBufferRelease(char *b)         /* I - Buffer to release */
 /*
  * 'ippAddBoolean()' - Add a boolean attribute to an IPP message.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -242,8 +154,8 @@ ippAddBoolean(ipp_t      *ipp,              /* I - IPP message */
 /*
  * 'ippAddBooleans()' - Add an array of boolean values.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -299,8 +211,8 @@ ippAddBooleans(ipp_t      *ipp,             /* I - IPP message */
 /*
  * 'ippAddCollection()' - Add a collection value.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -350,8 +262,8 @@ ippAddCollection(ipp_t      *ipp,   /* I - IPP message */
 /*
  * 'ippAddCollections()' - Add an array of collection values.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -414,8 +326,8 @@ ippAddCollections(
 /*
  * 'ippAddDate()' - Add a date attribute to an IPP message.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -460,8 +372,8 @@ ippAddDate(ipp_t             *ipp,  /* I - IPP message */
 /*
  * 'ippAddInteger()' - Add a integer attribute to an IPP message.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -487,7 +399,7 @@ ippAddInteger(ipp_t      *ipp,              /* I - IPP message */
                 "name=\"%s\", value=%d)", ipp, group, ippTagString(group),
                value_tag, ippTagString(value_tag), name, value));
 
-  value_tag &= IPP_TAG_MASK;
+  value_tag &= IPP_TAG_CUPS_MASK;
 
  /*
   * Special-case for legacy usage: map out-of-band attributes to new ippAddOutOfBand
@@ -528,8 +440,8 @@ ippAddInteger(ipp_t      *ipp,              /* I - IPP message */
 /*
  * 'ippAddIntegers()' - Add an array of integer values.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -559,7 +471,7 @@ ippAddIntegers(ipp_t      *ipp,             /* I - IPP message */
                group, ippTagString(group), value_tag, ippTagString(value_tag), name,
                num_values, values));
 
-  value_tag &= IPP_TAG_MASK;
+  value_tag &= IPP_TAG_CUPS_MASK;
 
  /*
   * Range check input...
@@ -600,8 +512,8 @@ ippAddIntegers(ipp_t      *ipp,             /* I - IPP message */
 /*
  * 'ippAddOctetString()' - Add an octetString value to an IPP message.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -623,7 +535,8 @@ ippAddOctetString(ipp_t      *ipp,  /* I - IPP message */
 
 
   if (!ipp || !name || group < IPP_TAG_ZERO ||
-      group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE)
+      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)
@@ -637,13 +550,13 @@ ippAddOctetString(ipp_t      *ipp,        /* I - IPP message */
 
   if (data)
   {
-    if ((attr->values[0].unknown.data = malloc(datalen)) == NULL)
+    if ((attr->values[0].unknown.data = malloc((size_t)datalen)) == NULL)
     {
       ippDeleteAttribute(ipp, attr);
       return (NULL);
     }
 
-    memcpy(attr->values[0].unknown.data, data, datalen);
+    memcpy(attr->values[0].unknown.data, data, (size_t)datalen);
   }
 
  /*
@@ -657,8 +570,8 @@ ippAddOctetString(ipp_t      *ipp,  /* I - IPP message */
 /*
  * '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@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -685,7 +598,7 @@ ippAddOutOfBand(ipp_t      *ipp,    /* I - IPP message */
                 "name=\"%s\")", ipp, group, ippTagString(group), value_tag,
                 ippTagString(value_tag), name));
 
-  value_tag &= IPP_TAG_MASK;
+  value_tag &= IPP_TAG_CUPS_MASK;
 
  /*
   * Range check input...
@@ -713,8 +626,8 @@ ippAddOutOfBand(ipp_t      *ipp,    /* I - IPP message */
 /*
  * '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@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -764,8 +677,8 @@ ippAddRange(ipp_t      *ipp,                /* I - IPP message */
 /*
  * 'ippAddRanges()' - Add ranges of values to an IPP message.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -825,8 +738,8 @@ ippAddRanges(ipp_t      *ipp,               /* I - IPP message */
 /*
  * 'ippAddResolution()' - Add a resolution value to an IPP message.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -878,8 +791,8 @@ ippAddResolution(ipp_t      *ipp,   /* I - IPP message */
 /*
  * 'ippAddResolutions()' - Add resolution values to an IPP message.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -942,8 +855,8 @@ ippAddResolutions(ipp_t      *ipp,  /* I - IPP message */
 /*
  * 'ippAddSeparator()' - Add a group separator to an IPP message.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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 */
@@ -969,8 +882,8 @@ ippAddSeparator(ipp_t *ipp)         /* I - IPP message */
 /*
  * '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@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -999,7 +912,8 @@ ippAddString(ipp_t      *ipp,               /* I - IPP message */
 {
   ipp_tag_t            temp_tag;       /* Temporary value tag (masked) */
   ipp_attribute_t      *attr;          /* New attribute */
-  char                 code[32];       /* Charset/language code buffer */
+  char                 code[IPP_MAX_LANGUAGE];
+                                       /* Charset/language code buffer */
 
 
   DEBUG_printf(("ippAddString(ipp=%p, group=%02x(%s), value_tag=%02x(%s), "
@@ -1011,7 +925,7 @@ ippAddString(ipp_t      *ipp,              /* I - IPP message */
   * Range check input...
   */
 
-  temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_MASK);
+  temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_CUPS_MASK);
 
 #if 0
   if (!ipp || !name || group < IPP_TAG_ZERO ||
@@ -1033,13 +947,13 @@ ippAddString(ipp_t      *ipp,            /* I - IPP message */
   * See if we need to map charset, language, or locale values...
   */
 
-  if (language && ((int)value_tag & IPP_TAG_COPY) &&
+  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_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_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 */
 
@@ -1054,7 +968,7 @@ ippAddString(ipp_t      *ipp,              /* I - IPP message */
   * Initialize the attribute data...
   */
 
-  if ((int)value_tag & IPP_TAG_COPY)
+  if ((int)value_tag & IPP_TAG_CUPS_CONST)
   {
     attr->values[0].string.language = (char *)language;
     attr->values[0].string.text     = (char *)value;
@@ -1083,10 +997,225 @@ ippAddString(ipp_t      *ipp,           /* I - IPP message */
 
 
 /*
+ * '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/OS X 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/OS X 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@ or @link ippNewRequest@ functions.
+ * 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@),
@@ -1131,7 +1260,7 @@ ippAddStrings(
   * Range check input...
   */
 
-  temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_MASK);
+  temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_CUPS_MASK);
 
 #if 0
   if (!ipp || !name || group < IPP_TAG_ZERO ||
@@ -1155,10 +1284,10 @@ ippAddStrings(
   * See if we need to map charset, language, or locale values...
   */
 
-  if (language && ((int)value_tag & IPP_TAG_COPY) &&
+  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_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))))
@@ -1167,7 +1296,7 @@ ippAddStrings(
         break;
       }
   }
-  else if (values && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_COPY))
+  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))))
@@ -1196,7 +1325,7 @@ ippAddStrings(
     {
       if (value == attr->values)
       {
-        if ((int)value_tag & IPP_TAG_COPY)
+        if ((int)value_tag & IPP_TAG_CUPS_CONST)
           value->string.language = (char *)language;
         else
           value->string.language = _cupsStrAlloc(ipp_lang_code(language, code,
@@ -1208,7 +1337,7 @@ ippAddStrings(
 
     if (values)
     {
-      if ((int)value_tag & IPP_TAG_COPY)
+      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)));
@@ -1224,6 +1353,133 @@ ippAddStrings(
 
 
 /*
+ * '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/OS X 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,
+ * language, mimeMediaType, name, text, URI, or URI scheme value.
+ *
+ * @since CUPS 1.7/OS X 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\")", 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_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 :
+       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);
+         }
+        }
+
+    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.
@@ -1261,9 +1517,9 @@ ippCopyAttribute(
   * Copy it...
   */
 
-  quickcopy = quickcopy ? IPP_TAG_COPY : 0;
+  quickcopy = quickcopy ? IPP_TAG_CUPS_CONST : 0;
 
-  switch (srcattr->value_tag & ~IPP_TAG_COPY)
+  switch (srcattr->value_tag & ~IPP_TAG_CUPS_CONST)
   {
     case IPP_TAG_ZERO :
         dstattr = ippAddSeparator(dst);
@@ -1316,7 +1572,7 @@ ippCopyAttribute(
               i --, srcval ++, dstval ++)
            dstval->string.text = srcval->string.text;
         }
-       else if (srcattr->value_tag & IPP_TAG_COPY)
+       else if (srcattr->value_tag & IPP_TAG_CUPS_CONST)
        {
          for (i = srcattr->num_values, srcval = srcattr->values,
                   dstval = dstattr->values;
@@ -1393,7 +1649,7 @@ ippCopyAttribute(
            dstval->string.text     = srcval->string.text;
           }
         }
-       else if (srcattr->value_tag & IPP_TAG_COPY)
+       else if (srcattr->value_tag & IPP_TAG_CUPS_CONST)
        {
          for (i = srcattr->num_values, srcval = srcattr->values,
                   dstval = dstattr->values;
@@ -1456,10 +1712,10 @@ ippCopyAttribute(
 
          if (dstval->unknown.length > 0)
          {
-           if ((dstval->unknown.data = malloc(dstval->unknown.length)) == NULL)
+           if ((dstval->unknown.data = malloc((size_t)dstval->unknown.length)) == NULL)
              dstval->unknown.length = 0;
            else
-             memcpy(dstval->unknown.data, srcval->unknown.data, dstval->unknown.length);
+             memcpy(dstval->unknown.data, srcval->unknown.data, (size_t)dstval->unknown.length);
          }
        }
         break; /* anti-compiler-warning-code */
@@ -1472,7 +1728,7 @@ ippCopyAttribute(
 /*
  * 'ippCopyAttributes()' - Copy attributes from one IPP message to another.
  *
- * Zero or more attributes are copied from the source IPP message, @code@ src, to the
+ * 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.
@@ -1727,6 +1983,10 @@ ippDeleteValues(
 
 /*
  * '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 */
@@ -1745,6 +2005,7 @@ ippFindAttribute(ipp_t      *ipp, /* I - IPP message */
   */
 
   ipp->current = NULL;
+  ipp->atend   = 0;
 
  /*
   * Search for the attribute...
@@ -1756,6 +2017,10 @@ ippFindAttribute(ipp_t      *ipp,        /* I - IPP message */
 
 /*
  * '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 */
@@ -1763,8 +2028,11 @@ 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 */
+  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))",
@@ -1773,7 +2041,60 @@ ippFindNextAttribute(ipp_t      *ipp,    /* I - IPP message */
   if (!ipp || !name)
     return (NULL);
 
-  if (ipp->current)
+  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;
@@ -1789,21 +2110,36 @@ ippFindNextAttribute(ipp_t      *ipp,   /* I - IPP message */
     DEBUG_printf(("4ippFindAttribute: attr=%p, name=\"%s\"", attr,
                   attr->name));
 
-    value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_MASK);
+    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 ||
+        (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;
 
-      return (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);
 }
@@ -1842,7 +2178,7 @@ ippFirstAttribute(ipp_t *ipp)             /* I - IPP message */
  * @since CUPS 1.6/OS X 10.8@
  */
 
-int                                    /* O - Boolean value or -1 on error */
+int                                    /* O - Boolean value or 0 on error */
 ippGetBoolean(ipp_attribute_t *attr,   /* I - IPP attribute */
               int             element) /* I - Value number (0-based) */
 {
@@ -1852,7 +2188,7 @@ ippGetBoolean(ipp_attribute_t *attr,      /* I - IPP attribute */
 
   if (!attr || attr->value_tag != IPP_TAG_BOOLEAN ||
       element < 0 || element >= attr->num_values)
-    return (-1);
+    return (0);
 
  /*
   * Return the value...
@@ -1898,7 +2234,7 @@ ippGetCollection(
  * @since CUPS 1.6/OS X 10.8@
  */
 
-int                                    /* O - Number of values or -1 on error */
+int                                    /* O - Number of values or 0 on error */
 ippGetCount(ipp_attribute_t *attr)     /* I - IPP attribute */
 {
  /*
@@ -1906,7 +2242,7 @@ ippGetCount(ipp_attribute_t *attr)        /* I - IPP attribute */
   */
 
   if (!attr)
-    return (-1);
+    return (0);
 
  /*
   * Return the number of values...
@@ -1978,7 +2314,7 @@ ippGetGroupTag(ipp_attribute_t *attr)     /* I - IPP attribute */
  * @since CUPS 1.6/OS X 10.8@
  */
 
-int                                    /* O - Value or -1 on error */
+int                                    /* O - Value or 0 on error */
 ippGetInteger(ipp_attribute_t *attr,   /* I - IPP attribute */
               int             element) /* I - Value number (0-based) */
 {
@@ -1988,7 +2324,7 @@ ippGetInteger(ipp_attribute_t *attr,      /* I - IPP attribute */
 
   if (!attr || (attr->value_tag != IPP_TAG_INTEGER && attr->value_tag != IPP_TAG_ENUM) ||
       element < 0 || element >= attr->num_values)
-    return (-1);
+    return (0);
 
  /*
   * Return the value...
@@ -2023,12 +2359,51 @@ ippGetName(ipp_attribute_t *attr)       /* I - IPP attribute */
 
 
 /*
- * 'ippGetOperation()' - Get the operation ID in an IPP message.
+ * 'ippGetOctetString()' - Get an octetString value from an IPP attribute.
  *
- * @since CUPS 1.6/OS X 10.8@
- */
-
-ipp_op_t                               /* O - Operation ID or -1 on error */
+ * The @code element@ parameter specifies which value to get from 0 to
+ * @link ippGetCount(attr)@ - 1.
+ *
+ * @since CUPS 1.7/OS X 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/OS X 10.8@
+ */
+
+ipp_op_t                               /* O - Operation ID or 0 on error */
 ippGetOperation(ipp_t *ipp)            /* I - IPP request message */
 {
  /*
@@ -2036,7 +2411,7 @@ ippGetOperation(ipp_t *ipp)               /* I - IPP request message */
   */
 
   if (!ipp)
-    return ((ipp_op_t)-1);
+    return ((ipp_op_t)0);
 
  /*
   * Return the value...
@@ -2055,7 +2430,7 @@ ippGetOperation(ipp_t *ipp)               /* I - IPP request message */
  * @since CUPS 1.6/OS X 10.8@
  */
 
-int                                    /* O - Lower value of range or -1 */
+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 */
@@ -2068,9 +2443,9 @@ ippGetRange(ipp_attribute_t *attr,        /* I - IPP attribute */
       element < 0 || element >= attr->num_values)
   {
     if (uppervalue)
-      *uppervalue = -1;
+      *uppervalue = 0;
 
-    return (-1);
+    return (0);
   }
 
  /*
@@ -2090,7 +2465,7 @@ ippGetRange(ipp_attribute_t *attr,        /* I - IPP attribute */
  * @since CUPS 1.6/OS X 10.8@
  */
 
-int                                    /* O - Request ID or -1 on error */
+int                                    /* O - Request ID or 0 on error */
 ippGetRequestId(ipp_t *ipp)            /* I - IPP message */
 {
  /*
@@ -2098,7 +2473,7 @@ ippGetRequestId(ipp_t *ipp)               /* I - IPP message */
   */
 
   if (!ipp)
-    return (-1);
+    return (0);
 
  /*
   * Return the request ID...
@@ -2117,7 +2492,7 @@ ippGetRequestId(ipp_t *ipp)               /* I - IPP message */
  * @since CUPS 1.6/OS X 10.8@
  */
 
-int                                    /* O - Horizontal/cross feed resolution or -1 */
+int                                    /* O - Horizontal/cross feed resolution or 0 */
 ippGetResolution(
     ipp_attribute_t *attr,             /* I - IPP attribute */
     int             element,           /* I - Value number (0-based) */
@@ -2130,7 +2505,15 @@ ippGetResolution(
 
   if (!attr || attr->value_tag != IPP_TAG_RESOLUTION ||
       element < 0 || element >= attr->num_values)
-    return (-1);
+  {
+    if (yres)
+      *yres = 0;
+
+    if (units)
+      *units = (ipp_res_t)0;
+
+    return (0);
+  }
 
  /*
   * Return the value...
@@ -2160,7 +2543,7 @@ ippGetState(ipp_t *ipp)                   /* I - IPP message */
   */
 
   if (!ipp)
-    return (IPP_IDLE);
+    return (IPP_STATE_IDLE);
 
  /*
   * Return the value...
@@ -2184,7 +2567,7 @@ ippGetStatusCode(ipp_t *ipp)              /* I - IPP response or event message */
   */
 
   if (!ipp)
-    return (IPP_INTERNAL_ERROR);
+    return (IPP_STATUS_ERROR_INTERNAL);
 
  /*
   * Return the value...
@@ -2248,7 +2631,7 @@ ippGetValueTag(ipp_attribute_t *attr)     /* I - IPP attribute */
   * Return the value...
   */
 
-  return (attr->value_tag);
+  return (attr->value_tag & IPP_TAG_CUPS_MASK);
 }
 
 
@@ -2258,7 +2641,7 @@ ippGetValueTag(ipp_attribute_t *attr)     /* I - IPP attribute */
  * @since CUPS 1.6/OS X 10.8@
  */
 
-int                                    /* O - Major version number or -1 on error */
+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@ */
 {
@@ -2269,9 +2652,9 @@ ippGetVersion(ipp_t *ipp,         /* I - IPP message */
   if (!ipp)
   {
     if (minor)
-      *minor = -1;
+      *minor = 0;
 
-    return (-1);
+    return (0);
   }
 
  /*
@@ -2343,8 +2726,8 @@ ippNew(void)
     if (cg->server_version == 0)
       _cupsSetDefaults();
 
-    temp->request.any.version[0] = cg->server_version / 10;
-    temp->request.any.version[1] = cg->server_version % 10;
+    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;
   }
 
@@ -2419,6 +2802,114 @@ ippNewRequest(ipp_op_t op)              /* I - Operation code */
 
 
 /*
+ * '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/OS X 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.
  */
 
@@ -2430,7 +2921,7 @@ ippRead(http_t *http,                     /* I - HTTP connection */
                 http, ipp, CUPS_LLCAST (http ? http->data_remaining : -1)));
 
   if (!http)
-    return (IPP_ERROR);
+    return (IPP_STATE_ERROR);
 
   DEBUG_printf(("2ippRead: http->state=%d, http->used=%d", http->state,
                 http->used));
@@ -2471,7 +2962,7 @@ ippReadIO(void       *src,                /* I - Data source */
 {
   int                  n;              /* Length of data */
   unsigned char                *buffer,        /* Data buffer */
-                       string[IPP_MAX_NAME],
+                       string[IPP_MAX_TEXT],
                                        /* Small string buffer */
                        *bufptr;        /* Pointer into buffer */
   ipp_attribute_t      *attr;          /* Current attribute */
@@ -2482,23 +2973,23 @@ ippReadIO(void       *src,              /* I - Data source */
 
   DEBUG_printf(("ippReadIO(src=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)",
                 src, cb, blocking, parent, ipp));
-  DEBUG_printf(("2ippReadIO: ipp->state=%d", ipp ? ipp->state : IPP_ERROR));
+  DEBUG_printf(("2ippReadIO: ipp->state=%d", ipp ? ipp->state : IPP_STATE_ERROR));
 
   if (!src || !ipp)
-    return (IPP_ERROR);
+    return (IPP_STATE_ERROR);
 
   if ((buffer = (unsigned char *)_cupsBufferGet(IPP_BUF_SIZE)) == NULL)
   {
     DEBUG_puts("1ippReadIO: Unable to get read buffer.");
-    return (IPP_ERROR);
+    return (IPP_STATE_ERROR);
   }
 
   switch (ipp->state)
   {
-    case IPP_IDLE :
+    case IPP_STATE_IDLE :
         ipp->state ++; /* Avoid common problem... */
 
-    case IPP_HEADER :
+    case IPP_STATE_HEADER :
         if (parent == NULL)
        {
         /*
@@ -2509,7 +3000,7 @@ ippReadIO(void       *src,                /* I - Data source */
          {
            DEBUG_puts("1ippReadIO: Unable to read header.");
            _cupsBufferRelease((char *)buffer);
-           return (IPP_ERROR);
+           return (IPP_STATE_ERROR);
          }
 
         /*
@@ -2529,7 +3020,7 @@ ippReadIO(void       *src,                /* I - Data source */
                        ipp->request.any.request_id));
         }
 
-        ipp->state   = IPP_ATTRIBUTE;
+        ipp->state   = IPP_STATE_ATTRIBUTE;
        ipp->current = NULL;
        ipp->curtag  = IPP_TAG_ZERO;
        ipp->prev    = ipp->last;
@@ -2541,14 +3032,14 @@ ippReadIO(void       *src,              /* I - Data source */
         if (!blocking)
          break;
 
-    case IPP_ATTRIBUTE :
+    case IPP_STATE_ATTRIBUTE :
         for (;;)
        {
          if ((*cb)(src, buffer, 1) < 1)
          {
            DEBUG_puts("1ippReadIO: Callback returned EOF/error");
            _cupsBufferRelease((char *)buffer);
-           return (IPP_ERROR);
+           return (IPP_STATE_ERROR);
          }
 
          DEBUG_printf(("2ippReadIO: ipp->current=%p, ipp->prev=%p",
@@ -2569,22 +3060,22 @@ ippReadIO(void       *src,              /* I - Data source */
            {
              DEBUG_puts("1ippReadIO: Callback returned EOF/error");
              _cupsBufferRelease((char *)buffer);
-             return (IPP_ERROR);
+             return (IPP_STATE_ERROR);
            }
 
            tag = (ipp_tag_t)((((((buffer[0] << 8) | buffer[1]) << 8) |
                                buffer[2]) << 8) | buffer[3]);
 
-            if (tag & IPP_TAG_COPY)
+            if (tag & IPP_TAG_CUPS_CONST)
             {
              /*
               * Fail if the high bit is set in the tag...
               */
 
-             _cupsSetError(IPP_INTERNAL_ERROR, _("IPP extension tag larger than 0x7FFFFFFF."), 1);
+             _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_ERROR);
+             return (IPP_STATE_ERROR);
             }
           }
 
@@ -2596,7 +3087,7 @@ ippReadIO(void       *src,                /* I - Data source */
 
             DEBUG_puts("2ippReadIO: IPP_TAG_END.");
 
-           ipp->state = IPP_DATA;
+           ipp->state = IPP_STATE_DATA;
            break;
          }
           else if (tag < IPP_TAG_UNSUPPORTED_VALUE)
@@ -2628,17 +3119,17 @@ ippReadIO(void       *src,              /* I - Data source */
          {
            DEBUG_puts("1ippReadIO: unable to read name length.");
            _cupsBufferRelease((char *)buffer);
-           return (IPP_ERROR);
+           return (IPP_STATE_ERROR);
          }
 
           n = (buffer[0] << 8) | buffer[1];
 
           if (n >= IPP_BUF_SIZE)
          {
-           _cupsSetError(IPP_INTERNAL_ERROR, _("IPP name larger than 32767 bytes."), 1);
+           _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_ERROR);
+           return (IPP_STATE_ERROR);
          }
 
           DEBUG_printf(("2ippReadIO: name length=%d", n));
@@ -2652,14 +3143,14 @@ ippReadIO(void       *src,              /* I - Data source */
 
             if (ipp->current == NULL)
            {
-             _cupsSetError(IPP_INTERNAL_ERROR, _("IPP attribute has no name."), 1);
+             _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_ERROR);
+             return (IPP_STATE_ERROR);
            }
 
             attr      = ipp->current;
-           value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_MASK);
+           value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_CUPS_MASK);
 
           /*
            * Make sure we aren't adding a new value of a different
@@ -2688,14 +3179,14 @@ ippReadIO(void       *src,              /* I - Data source */
                  (tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE) &&
                  tag != IPP_TAG_NOVALUE)
              {
-               _cupsSetError(IPP_INTERNAL_ERROR,
+               _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_ERROR);
+               return (IPP_STATE_ERROR);
              }
 
               if (value_tag != tag)
@@ -2715,14 +3206,14 @@ ippReadIO(void       *src,              /* I - Data source */
 
              if (tag != IPP_TAG_INTEGER && tag != IPP_TAG_RANGE)
              {
-               _cupsSetError(IPP_INTERNAL_ERROR,
+               _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_ERROR);
+               return (IPP_STATE_ERROR);
              }
 
               if (value_tag == IPP_TAG_INTEGER && tag == IPP_TAG_RANGE)
@@ -2738,14 +3229,14 @@ ippReadIO(void       *src,              /* I - Data source */
             }
            else if (value_tag != tag)
            {
-             _cupsSetError(IPP_INTERNAL_ERROR,
+             _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_ERROR);
+             return (IPP_STATE_ERROR);
             }
 
            /*
@@ -2755,7 +3246,7 @@ ippReadIO(void       *src,                /* I - Data source */
            if ((value = ipp_set_value(ipp, &attr, attr->num_values)) == NULL)
            {
              _cupsBufferRelease((char *)buffer);
-             return (IPP_ERROR);
+             return (IPP_STATE_ERROR);
            }
          }
          else if (tag == IPP_TAG_MEMBERNAME)
@@ -2766,10 +3257,10 @@ ippReadIO(void       *src,              /* I - Data source */
 
            if (n)
            {
-             _cupsSetError(IPP_INTERNAL_ERROR, _("IPP member name is not empty."), 1);
+             _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP member name is not empty."), 1);
              DEBUG_puts("1ippReadIO: member name not empty.");
              _cupsBufferRelease((char *)buffer);
-             return (IPP_ERROR);
+             return (IPP_STATE_ERROR);
            }
 
             if (ipp->current)
@@ -2778,10 +3269,10 @@ ippReadIO(void       *src,              /* I - Data source */
            attr = ipp->current = ipp_add_attr(ipp, NULL, ipp->curtag, IPP_TAG_ZERO, 1);
            if (!attr)
            {
-             _cupsSetHTTPError(HTTP_ERROR);
+             _cupsSetHTTPError(HTTP_STATUS_ERROR);
              DEBUG_puts("1ippReadIO: unable to allocate attribute.");
              _cupsBufferRelease((char *)buffer);
-             return (IPP_ERROR);
+             return (IPP_STATE_ERROR);
            }
 
            DEBUG_printf(("2ippReadIO: membername, ipp->current=%p, ipp->prev=%p",
@@ -2795,11 +3286,11 @@ ippReadIO(void       *src,              /* I - Data source */
            * New attribute; read the name and add it...
            */
 
-           if ((*cb)(src, buffer, n) < n)
+           if ((*cb)(src, buffer, (size_t)n) < n)
            {
              DEBUG_puts("1ippReadIO: unable to read name.");
              _cupsBufferRelease((char *)buffer);
-             return (IPP_ERROR);
+             return (IPP_STATE_ERROR);
            }
 
            buffer[n] = '\0';
@@ -2810,10 +3301,10 @@ ippReadIO(void       *src,              /* I - Data source */
            if ((attr = ipp->current = ipp_add_attr(ipp, (char *)buffer, ipp->curtag, tag,
                                                    1)) == NULL)
            {
-             _cupsSetHTTPError(HTTP_ERROR);
+             _cupsSetHTTPError(HTTP_STATUS_ERROR);
              DEBUG_puts("1ippReadIO: unable to allocate attribute.");
              _cupsBufferRelease((char *)buffer);
-             return (IPP_ERROR);
+             return (IPP_STATE_ERROR);
            }
 
            DEBUG_printf(("2ippReadIO: name=\"%s\", ipp->current=%p, "
@@ -2831,7 +3322,7 @@ ippReadIO(void       *src,                /* I - Data source */
          {
            DEBUG_puts("1ippReadIO: unable to read value length.");
            _cupsBufferRelease((char *)buffer);
-           return (IPP_ERROR);
+           return (IPP_STATE_ERROR);
          }
 
          n = (buffer[0] << 8) | buffer[1];
@@ -2839,11 +3330,11 @@ ippReadIO(void       *src,              /* I - Data source */
 
          if (n >= IPP_BUF_SIZE)
          {
-           _cupsSetError(IPP_INTERNAL_ERROR,
+           _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_ERROR);
+           return (IPP_STATE_ERROR);
          }
 
          switch (tag)
@@ -2853,21 +3344,21 @@ ippReadIO(void       *src,              /* I - Data source */
                if (n != 4)
                {
                  if (tag == IPP_TAG_INTEGER)
-                   _cupsSetError(IPP_INTERNAL_ERROR,
+                   _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
                                  _("IPP integer value not 4 bytes."), 1);
                  else
-                   _cupsSetError(IPP_INTERNAL_ERROR,
+                   _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_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
                if ((*cb)(src, buffer, 4) < 4)
                {
                  DEBUG_puts("1ippReadIO: Unable to read integer value.");
                  _cupsBufferRelease((char *)buffer);
-                 return (IPP_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
                n = (((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) |
@@ -2882,21 +3373,21 @@ ippReadIO(void       *src,              /* I - Data source */
            case IPP_TAG_BOOLEAN :
                if (n != 1)
                {
-                 _cupsSetError(IPP_INTERNAL_ERROR, _("IPP boolean value not 1 byte."),
+                 _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_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
                if ((*cb)(src, buffer, 1) < 1)
                {
                  DEBUG_puts("1ippReadIO: Unable to read boolean value.");
                  _cupsBufferRelease((char *)buffer);
-                 return (IPP_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
-                value->boolean = buffer[0];
+                value->boolean = (char)buffer[0];
                break;
 
             case IPP_TAG_NOVALUE :
@@ -2927,11 +3418,11 @@ ippReadIO(void       *src,              /* I - Data source */
            case IPP_TAG_MIMETYPE :
                if (n > 0)
                {
-                 if ((*cb)(src, buffer, n) < n)
+                 if ((*cb)(src, buffer, (size_t)n) < n)
                  {
                    DEBUG_puts("1ippReadIO: unable to read string value.");
                    _cupsBufferRelease((char *)buffer);
-                   return (IPP_ERROR);
+                   return (IPP_STATE_ERROR);
                  }
                }
 
@@ -2943,35 +3434,35 @@ ippReadIO(void       *src,              /* I - Data source */
            case IPP_TAG_DATE :
                if (n != 11)
                {
-                 _cupsSetError(IPP_INTERNAL_ERROR, _("IPP date value not 11 bytes."), 1);
+                 _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_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
                if ((*cb)(src, value->date, 11) < 11)
                {
                  DEBUG_puts("1ippReadIO: Unable to read date value.");
                  _cupsBufferRelease((char *)buffer);
-                 return (IPP_ERROR);
+                 return (IPP_STATE_ERROR);
                }
                break;
 
            case IPP_TAG_RESOLUTION :
                if (n != 9)
                {
-                 _cupsSetError(IPP_INTERNAL_ERROR,
+                 _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_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
                if ((*cb)(src, buffer, 9) < 9)
                {
                  DEBUG_puts("1ippReadIO: Unable to read resolution value.");
                  _cupsBufferRelease((char *)buffer);
-                 return (IPP_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
                 value->resolution.xres =
@@ -2987,19 +3478,19 @@ ippReadIO(void       *src,              /* I - Data source */
            case IPP_TAG_RANGE :
                if (n != 8)
                {
-                 _cupsSetError(IPP_INTERNAL_ERROR,
+                 _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_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
                if ((*cb)(src, buffer, 8) < 8)
                {
                  DEBUG_puts("1ippReadIO: Unable to read range value.");
                  _cupsBufferRelease((char *)buffer);
-                 return (IPP_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
                 value->range.lower =
@@ -3015,25 +3506,25 @@ ippReadIO(void       *src,              /* I - Data source */
                if (n < 4)
                {
                  if (tag == IPP_TAG_TEXTLANG)
-                   _cupsSetError(IPP_INTERNAL_ERROR,
+                   _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
                                  _("IPP textWithLanguage value less than "
                                    "minimum 4 bytes."), 1);
                  else
-                   _cupsSetError(IPP_INTERNAL_ERROR,
+                   _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_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
-               if ((*cb)(src, buffer, n) < n)
+               if ((*cb)(src, buffer, (size_t)n) < n)
                {
                  DEBUG_puts("1ippReadIO: Unable to read string w/language "
                             "value.");
                  _cupsBufferRelease((char *)buffer);
-                 return (IPP_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
                 bufptr = buffer;
@@ -3050,18 +3541,26 @@ ippReadIO(void       *src,              /* I - Data source */
 
                n = (bufptr[0] << 8) | bufptr[1];
 
-               if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE) ||
-                   n >= sizeof(string))
+               if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE) || n >= (int)sizeof(string))
                {
-                 _cupsSetError(IPP_INTERNAL_ERROR,
+                 _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_ERROR);
+                 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, n);
+               memcpy(string, bufptr + 2, (size_t)n);
                string[n] = '\0';
 
                value->string.language = _cupsStrAlloc((char *)string);
@@ -3071,11 +3570,11 @@ ippReadIO(void       *src,              /* I - Data source */
 
                if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE))
                {
-                 _cupsSetError(IPP_INTERNAL_ERROR,
+                 _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_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
                bufptr[2 + n] = '\0';
@@ -3091,19 +3590,19 @@ ippReadIO(void       *src,              /* I - Data source */
 
                 if (n > 0)
                {
-                 _cupsSetError(IPP_INTERNAL_ERROR,
+                 _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_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
-               if (ippReadIO(src, cb, 1, ipp, value->collection) == IPP_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_ERROR);
+                 return (IPP_STATE_ERROR);
                }
                 break;
 
@@ -3112,15 +3611,15 @@ ippReadIO(void       *src,              /* I - Data source */
 
                 if (n > 0)
                {
-                 _cupsSetError(IPP_INTERNAL_ERROR,
+                 _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
                                _("IPP endCollection value not 0 bytes."), 1);
                  DEBUG_puts("1ippReadIO: endCollection tag with value length "
                             "> 0.");
-                 return (IPP_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
                DEBUG_puts("1ippReadIO: endCollection tag...");
-               return (ipp->state = IPP_DATA);
+               return (ipp->state = IPP_STATE_DATA);
 
             case IPP_TAG_MEMBERNAME :
               /*
@@ -3130,25 +3629,25 @@ ippReadIO(void       *src,              /* I - Data source */
 
                 if (!attr)
                 {
-                 _cupsSetError(IPP_INTERNAL_ERROR,
+                 _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
                                _("IPP memberName with no attribute."), 1);
                  DEBUG_puts("1ippReadIO: Member name without attribute.");
                  _cupsBufferRelease((char *)buffer);
-                 return (IPP_ERROR);
+                 return (IPP_STATE_ERROR);
                 }
                else if (n == 0)
                {
-                 _cupsSetError(IPP_INTERNAL_ERROR,
+                 _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
                                _("IPP memberName value is empty."), 1);
                  DEBUG_puts("1ippReadIO: Empty member name value.");
                  _cupsBufferRelease((char *)buffer);
-                 return (IPP_ERROR);
+                 return (IPP_STATE_ERROR);
                }
-               else if ((*cb)(src, buffer, n) < n)
+               else if ((*cb)(src, buffer, (size_t)n) < n)
                {
                  DEBUG_puts("1ippReadIO: Unable to read member name value.");
                  _cupsBufferRelease((char *)buffer);
-                 return (IPP_ERROR);
+                 return (IPP_STATE_ERROR);
                }
 
                buffer[n] = '\0';
@@ -3166,22 +3665,33 @@ ippReadIO(void       *src,              /* I - Data source */
                break;
 
             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(n)) == NULL)
+                 if ((value->unknown.data = malloc((size_t)n)) == NULL)
                  {
-                   _cupsSetHTTPError(HTTP_ERROR);
+                   _cupsSetHTTPError(HTTP_STATUS_ERROR);
                    DEBUG_puts("1ippReadIO: Unable to allocate value");
                    _cupsBufferRelease((char *)buffer);
-                   return (IPP_ERROR);
+                   return (IPP_STATE_ERROR);
                  }
 
-                 if ((*cb)(src, value->unknown.data, n) < n)
+                 if ((*cb)(src, value->unknown.data, (size_t)n) < n)
                  {
                    DEBUG_puts("1ippReadIO: Unable to read unsupported value.");
                    _cupsBufferRelease((char *)buffer);
-                   return (IPP_ERROR);
+                   return (IPP_STATE_ERROR);
                  }
                }
                else
@@ -3198,7 +3708,7 @@ ippReadIO(void       *src,                /* I - Data source */
        }
         break;
 
-    case IPP_DATA :
+    case IPP_STATE_DATA :
         break;
 
     default :
@@ -3215,8 +3725,8 @@ ippReadIO(void       *src,                /* I - Data source */
 /*
  * 'ippSetBoolean()' - Set a boolean value in an attribute.
  *
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * 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.
  *
@@ -3227,7 +3737,7 @@ ippReadIO(void       *src,                /* I - Data source */
  */
 
 int                                    /* O  - 1 on success, 0 on failure */
-ippSetBoolean(ipp_t           *ipp,    /* IO - IPP message */
+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 */
@@ -3248,7 +3758,7 @@ ippSetBoolean(ipp_t           *ipp,       /* IO - IPP message */
   */
 
   if ((value = ipp_set_value(ipp, attr, element)) != NULL)
-    value->boolean = boolvalue;
+    value->boolean = (char)boolvalue;
 
   return (value != NULL);
 }
@@ -3257,8 +3767,8 @@ ippSetBoolean(ipp_t           *ipp,       /* IO - IPP message */
 /*
  * 'ippSetCollection()' - Set a collection value in an attribute.
  *
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * 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.
  *
@@ -3270,7 +3780,7 @@ ippSetBoolean(ipp_t           *ipp,       /* IO - IPP message */
 
 int                                    /* O  - 1 on success, 0 on failure */
 ippSetCollection(
-    ipp_t           *ipp,              /* IO - IPP message */
+    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 */
@@ -3306,8 +3816,8 @@ ippSetCollection(
 /*
  * 'ippSetDate()' - Set a date value in an attribute.
  *
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * 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.
  *
@@ -3318,7 +3828,7 @@ ippSetCollection(
  */
 
 int                                    /* O  - 1 on success, 0 on failure */
-ippSetDate(ipp_t             *ipp,     /* IO - IPP message */
+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  - Date value */
@@ -3348,8 +3858,8 @@ ippSetDate(ipp_t             *ipp,        /* IO - IPP message */
 /*
  * 'ippSetGroupTag()' - Set the group tag of an attribute.
  *
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * 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.
  *
@@ -3364,7 +3874,7 @@ ippSetDate(ipp_t             *ipp,        /* IO - IPP message */
 
 int                                    /* O  - 1 on success, 0 on failure */
 ippSetGroupTag(
-    ipp_t           *ipp,              /* IO - IPP message */
+    ipp_t           *ipp,              /* I  - IPP message */
     ipp_attribute_t **attr,            /* IO - Attribute */
     ipp_tag_t       group_tag)         /* I  - Group tag */
 {
@@ -3372,7 +3882,8 @@ ippSetGroupTag(
   * Range check input - group tag must be 0x01 to 0x0F, per RFC 2911...
   */
 
-  if (!ipp || !attr || group_tag < IPP_TAG_ZERO || group_tag == IPP_TAG_END ||
+  if (!ipp || !attr || !*attr ||
+      group_tag < IPP_TAG_ZERO || group_tag == IPP_TAG_END ||
       group_tag >= IPP_TAG_UNSUPPORTED_VALUE)
     return (0);
 
@@ -3389,8 +3900,8 @@ ippSetGroupTag(
 /*
  * 'ippSetInteger()' - Set an integer or enum value in an attribute.
  *
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * 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.
  *
@@ -3401,7 +3912,7 @@ ippSetGroupTag(
  */
 
 int                                    /* O  - 1 on success, 0 on failure */
-ippSetInteger(ipp_t           *ipp,    /* IO - IPP message */
+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 */
@@ -3432,8 +3943,8 @@ ippSetInteger(ipp_t           *ipp,       /* IO - IPP message */
 /*
  * 'ippSetName()' - Set the name of an attribute.
  *
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * 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.
  *
@@ -3441,7 +3952,7 @@ ippSetInteger(ipp_t           *ipp,       /* IO - IPP message */
  */
 
 int                                    /* O  - 1 on success, 0 on failure */
-ippSetName(ipp_t           *ipp,       /* IO - IPP message */
+ippSetName(ipp_t           *ipp,       /* I  - IPP message */
           ipp_attribute_t **attr,      /* IO - IPP attribute */
           const char      *name)       /* I  - Attribute name */
 {
@@ -3472,10 +3983,98 @@ ippSetName(ipp_t           *ipp,        /* IO - IPP message */
 
 
 /*
+ * '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
+ * @link ippGetCount(attr)@.
+ *
+ * @since CUPS 1.7/OS X 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 ||
+      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...
+      */
+
+      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@ or @link ippNewRequest@ functions.
+ * 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/OS X 10.8@
  */
@@ -3504,8 +4103,8 @@ ippSetOperation(ipp_t    *ipp,            /* I - IPP request message */
 /*
  * 'ippSetRange()' - Set a rangeOfInteger value in an attribute.
  *
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * 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.
  *
@@ -3516,7 +4115,7 @@ ippSetOperation(ipp_t    *ipp,            /* I - IPP request message */
  */
 
 int                                    /* O  - 1 on success, 0 on failure */
-ippSetRange(ipp_t           *ipp,      /* IO - IPP message */
+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 */
@@ -3550,8 +4149,8 @@ ippSetRange(ipp_t           *ipp, /* IO - IPP message */
 /*
  * 'ippSetRequestId()' - Set the request ID in an IPP message.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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.
  *
@@ -3584,8 +4183,8 @@ ippSetRequestId(ipp_t *ipp,               /* I - IPP message */
 /*
  * 'ippSetResolution()' - Set a resolution value in an attribute.
  *
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * 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.
  *
@@ -3597,7 +4196,7 @@ ippSetRequestId(ipp_t *ipp,               /* I - IPP message */
 
 int                                    /* O  - 1 on success, 0 on failure */
 ippSetResolution(
-    ipp_t           *ipp,              /* IO - IPP message */
+    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 */
@@ -3662,8 +4261,8 @@ ippSetState(ipp_t       *ipp,             /* I - IPP message */
 /*
  * '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@ or @link ippNewRequest@ functions.
+ * 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/OS X 10.8@
  */
@@ -3692,8 +4291,8 @@ ippSetStatusCode(ipp_t        *ipp,       /* I - IPP response or event message */
 /*
  * 'ippSetString()' - Set a string value in an attribute.
  *
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * 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.
  *
@@ -3704,7 +4303,7 @@ ippSetStatusCode(ipp_t        *ipp,       /* I - IPP response or event message */
  */
 
 int                                    /* O  - 1 on success, 0 on failure */
-ippSetString(ipp_t           *ipp,     /* IO - IPP message */
+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 */
@@ -3734,7 +4333,7 @@ ippSetString(ipp_t           *ipp,        /* IO - IPP message */
     if (element > 0)
       value->string.language = (*attr)->values[0].string.language;
 
-    if ((int)((*attr)->value_tag) & IPP_TAG_COPY)
+    if ((int)((*attr)->value_tag) & IPP_TAG_CUPS_CONST)
       value->string.text = (char *)strvalue;
     else if ((temp = _cupsStrAlloc(strvalue)) != NULL)
     {
@@ -3752,81 +4351,267 @@ ippSetString(ipp_t           *ipp,     /* IO - IPP message */
 
 
 /*
- * 'ippSetValueTag()' - Set the value tag of an attribute.
+ * 'ippSetStringf()' - Set a formatted string value of an attribute.
  *
- * The @code ipp@ parameter refers to the IPP message containing the attribute that was
- * previously created using the @link ippNew@ or @link ippNewRequest@ functions.
+ * 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.
+ * The @code element@ parameter specifies which value to set from 0 to
+ * @link ippGetCount(attr)@.
  *
- * 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.
+ * 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.6/OS X 10.8@
+ * @since CUPS 1.7/OS X 10.9@
  */
 
 int                                    /* O  - 1 on success, 0 on failure */
-ippSetValueTag(
-    ipp_t          *ipp,               /* IO - IPP message */
-    ipp_attribute_t **attr,            /* IO - IPP attribute */
-    ipp_tag_t       value_tag)         /* I  - Value tag */
+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          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 */
+  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
+ * @link 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/OS X 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 (!ipp || !attr)
+  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_MIMETYPE ||
+      !format)
     return (0);
 
  /*
-  * If there is no change, return immediately...
+  * Format the string...
   */
 
-  if (value_tag == (*attr)->value_tag)
-    return (1);
+  if (!strcmp(format, "%s"))
+  {
+   /*
+    * Optimize the simple case...
+    */
 
- /*
-  * Otherwise implement changes as needed...
-  */
+    const char *s = va_arg(ap, char *);
 
-  temp_tag = (ipp_tag_t)((int)((*attr)->value_tag) & IPP_TAG_MASK);
+    if (!s)
+      s = "(null)";
 
-  switch (value_tag)
+    bytes = (ssize_t)strlen(s);
+    strlcpy(buffer, s, sizeof(buffer));
+  }
+  else
   {
-    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...
-        */
+   /*
+    * Do a full formatting of the message...
+    */
 
-        if ((*attr)->num_values > 0)
-          ipp_free_values(*attr, 0, (*attr)->num_values);
+    if ((bytes = vsnprintf(buffer, sizeof(buffer), format, ap)) < 0)
+      return (0);
+  }
 
-       /*
-        * Set out-of-band value...
-        */
+ /*
+  * 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';
+  }
+
+ /*
+  * 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/OS X 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;
@@ -3852,7 +4637,7 @@ ippSetValueTag(
             temp_tag != IPP_TAG_MIMETYPE)
           return (0);
 
-        (*attr)->value_tag = (ipp_tag_t)(IPP_TAG_NAME | ((*attr)->value_tag & IPP_TAG_COPY));
+        (*attr)->value_tag = (ipp_tag_t)(IPP_TAG_NAME | ((*attr)->value_tag & IPP_TAG_CUPS_CONST));
         break;
 
     case IPP_TAG_NAMELANG :
@@ -3893,7 +4678,7 @@ ippSetValueTag(
              i --, value ++)
           value->string.language = (*attr)->values[0].string.language;
 
-        if ((int)(*attr)->value_tag & IPP_TAG_COPY)
+        if ((int)(*attr)->value_tag & IPP_TAG_CUPS_CONST)
         {
          /*
           * Make copies of all values...
@@ -3923,8 +4708,8 @@ ippSetValueTag(
 /*
  * 'ippSetVersion()' - Set the version number in an IPP message.
  *
- * The @code ipp@ parameter refers to an IPP message previously created using the
- * @link ippNew@ or @link ippNewRequest@ functions.
+ * 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.
  *
@@ -3947,8 +4732,8 @@ ippSetVersion(ipp_t *ipp,         /* I - IPP message */
   * Set the version number...
   */
 
-  ipp->request.any.version[0] = major;
-  ipp->request.any.version[1] = minor;
+  ipp->request.any.version[0] = (ipp_uchar_t)major;
+  ipp->request.any.version[1] = (ipp_uchar_t)minor;
 
   return (1);
 }
@@ -3986,13 +4771,13 @@ ippTimeToDate(time_t t)                 /* I - UNIX time value */
   unixdate = gmtime(&t);
   unixdate->tm_year += 1900;
 
-  date[0]  = unixdate->tm_year >> 8;
-  date[1]  = unixdate->tm_year;
-  date[2]  = unixdate->tm_mon + 1;
-  date[3]  = unixdate->tm_mday;
-  date[4]  = unixdate->tm_hour;
-  date[5]  = unixdate->tm_min;
-  date[6]  = unixdate->tm_sec;
+  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;
@@ -4003,6 +4788,672 @@ ippTimeToDate(time_t t)                 /* I - UNIX time value */
 
 
 /*
+ * '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, cupsLastErrorString() is set to a human-readable message.
+ *
+ * @since CUPS 1.7/OS X 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 */
+  static const char * const uri_status_strings[] =
+  {                                    /* URI status strings */
+    "URI too large",
+    "Bad arguments to function",
+    "Bad resource in URI",
+    "Bad port number in URI",
+    "Bad hostname/address in URI",
+    "Bad username in URI",
+    "Bad scheme in URI",
+    "Bad/empty URI",
+    "OK",
+    "Missing scheme in URI",
+    "Unknown scheme in URI",
+    "Missing resource in URI"
+  };
+
+
+ /*
+  * 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 2911 section 4.1.3)."), 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 2911 section 4.1.3)."), 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 boolen value %d "
+                           "(RFC 2911 section 4.1.11)."), 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 2911 section 4.1.4)."), 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 2911 section 4.1.10)."), 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 2911 section 4.1.14)."), 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 2911 section 4.1.14)."), attr->name, date[3]);
+           return (0);
+         }
+
+          if (date[4] > 23)
+         {
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+                         _("\"%s\": Bad dateTime hours %u "
+                           "(RFC 2911 section 4.1.14)."), attr->name, date[4]);
+           return (0);
+         }
+
+          if (date[5] > 59)
+         {
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+                         _("\"%s\": Bad dateTime minutes %u "
+                           "(RFC 2911 section 4.1.14)."), attr->name, date[5]);
+           return (0);
+         }
+
+          if (date[6] > 60)
+         {
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+                         _("\"%s\": Bad dateTime seconds %u "
+                           "(RFC 2911 section 4.1.14)."), attr->name, date[6]);
+           return (0);
+         }
+
+          if (date[7] > 9)
+         {
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+                         _("\"%s\": Bad dateTime deciseconds %u "
+                           "(RFC 2911 section 4.1.14)."), 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 2911 section 4.1.14)."), 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 2911 section 4.1.14)."), 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 2911 section 4.1.14)."), 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 2911 section 4.1.15)."), 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 2911 section 4.1.15)."), 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 2911 section 4.1.15)."),
+                         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 2911 section 4.1.13)."),
+                         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)
+           {
+             ptr ++;
+             if ((*ptr & 0xc0) != 0x80)
+               break;
+           }
+           else if ((*ptr & 0xf0) == 0xe0)
+           {
+             ptr ++;
+             if ((*ptr & 0xc0) != 0x80)
+               break;
+             ptr ++;
+             if ((*ptr & 0xc0) != 0x80)
+               break;
+           }
+           else if ((*ptr & 0xf8) == 0xf0)
+           {
+             ptr ++;
+             if ((*ptr & 0xc0) != 0x80)
+               break;
+             ptr ++;
+             if ((*ptr & 0xc0) != 0x80)
+               break;
+             ptr ++;
+             if ((*ptr & 0xc0) != 0x80)
+               break;
+           }
+           else if (*ptr & 0x80)
+             break;
+         }
+
+         if (*ptr)
+         {
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+                         _("\"%s\": Bad text value \"%s\" - bad UTF-8 "
+                           "sequence (RFC 2911 section 4.1.1)."), 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 2911 section 4.1.1)."), 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)
+           {
+             ptr ++;
+             if ((*ptr & 0xc0) != 0x80)
+               break;
+           }
+           else if ((*ptr & 0xf0) == 0xe0)
+           {
+             ptr ++;
+             if ((*ptr & 0xc0) != 0x80)
+               break;
+             ptr ++;
+             if ((*ptr & 0xc0) != 0x80)
+               break;
+           }
+           else if ((*ptr & 0xf8) == 0xf0)
+           {
+             ptr ++;
+             if ((*ptr & 0xc0) != 0x80)
+               break;
+             ptr ++;
+             if ((*ptr & 0xc0) != 0x80)
+               break;
+             ptr ++;
+             if ((*ptr & 0xc0) != 0x80)
+               break;
+           }
+           else if (*ptr & 0x80)
+             break;
+         }
+
+         if (*ptr)
+         {
+           ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
+                         _("\"%s\": Bad name value \"%s\" - bad UTF-8 "
+                           "sequence (RFC 2911 section 4.1.2)."), 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 2911 section 4.1.2)."), 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 2911 section 4.1.3)."),
+                         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 2911 section 4.1.3)."),
+                         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 2911 section 4.1.5)."), attr->name,
+                         attr->values[i].string.text,
+                         uri_status_strings[uri_status -
+                                            HTTP_URI_STATUS_OVERFLOW]);
+           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 2911 section 4.1.5)."), 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 2911 section 4.1.6)."),
+                         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 2911 section 4.1.6)."),
+                         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 2911 section 4.1.7)."),
+                         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 2911 section 4.1.7)."),
+                         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 2911 section 4.1.8)."),
+                         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 2911 section 4.1.8)."),
+                         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 2911 section 4.1.9)."),
+                         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 2911 section 4.1.9)."),
+                         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@, cupsLastErrorString() is set
+ * to a human-readable message on failure.
+ *
+ * @since CUPS 1.7/OS X 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.
  */
 
@@ -4013,7 +5464,7 @@ ippWrite(http_t *http,                    /* I - HTTP connection */
   DEBUG_printf(("ippWrite(http=%p, ipp=%p)", http, ipp));
 
   if (!http)
-    return (IPP_ERROR);
+    return (IPP_STATE_ERROR);
 
   return (ippWriteIO(http, (ipp_iocb_t)httpWrite2, http->blocking, NULL, ipp));
 }
@@ -4031,7 +5482,7 @@ ippWriteFile(int   fd,                    /* I - HTTP data */
 {
   DEBUG_printf(("ippWriteFile(fd=%d, ipp=%p)", fd, ipp));
 
-  ipp->state = IPP_IDLE;
+  ipp->state = IPP_STATE_IDLE;
 
   return (ippWriteIO(&fd, (ipp_iocb_t)ipp_write_file, 1, NULL, ipp));
 }
@@ -4062,20 +5513,20 @@ ippWriteIO(void       *dst,             /* I - Destination */
                 dst, cb, blocking, parent, ipp));
 
   if (!dst || !ipp)
-    return (IPP_ERROR);
+    return (IPP_STATE_ERROR);
 
   if ((buffer = (unsigned char *)_cupsBufferGet(IPP_BUF_SIZE)) == NULL)
   {
     DEBUG_puts("1ippWriteIO: Unable to get write buffer");
-    return (IPP_ERROR);
+    return (IPP_STATE_ERROR);
   }
 
   switch (ipp->state)
   {
-    case IPP_IDLE :
+    case IPP_STATE_IDLE :
         ipp->state ++; /* Avoid common problem... */
 
-    case IPP_HEADER :
+    case IPP_STATE_HEADER :
         if (parent == NULL)
        {
         /*
@@ -4091,12 +5542,12 @@ ippWriteIO(void       *dst,             /* I - Destination */
 
          *bufptr++ = ipp->request.any.version[0];
          *bufptr++ = ipp->request.any.version[1];
-         *bufptr++ = ipp->request.any.op_status >> 8;
-         *bufptr++ = ipp->request.any.op_status;
-         *bufptr++ = ipp->request.any.request_id >> 24;
-         *bufptr++ = ipp->request.any.request_id >> 16;
-         *bufptr++ = ipp->request.any.request_id >> 8;
-         *bufptr++ = ipp->request.any.request_id;
+         *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",
@@ -4104,11 +5555,11 @@ ippWriteIO(void       *dst,             /* I - Destination */
          DEBUG_printf(("2ippWriteIO: request_id=%d",
                        ipp->request.any.request_id));
 
-          if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+          if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
          {
            DEBUG_puts("1ippWriteIO: Could not write IPP header...");
            _cupsBufferRelease((char *)buffer);
-           return (IPP_ERROR);
+           return (IPP_STATE_ERROR);
          }
        }
 
@@ -4117,7 +5568,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
        * in the request/response, with no current group.
        */
 
-        ipp->state   = IPP_ATTRIBUTE;
+        ipp->state   = IPP_STATE_ATTRIBUTE;
        ipp->current = ipp->attrs;
        ipp->curtag  = IPP_TAG_ZERO;
 
@@ -4130,7 +5581,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
         if (!blocking)
          break;
 
-    case IPP_ATTRIBUTE :
+    case IPP_STATE_ATTRIBUTE :
         while (ipp->current != NULL)
        {
         /*
@@ -4157,7 +5608,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
 
              DEBUG_printf(("2ippWriteIO: wrote group tag=%x(%s)",
                            attr->group_tag, ippTagString(attr->group_tag)));
-             *bufptr++ = attr->group_tag;
+             *bufptr++ = (ipp_uchar_t)attr->group_tag;
            }
            else if (attr->group_tag == IPP_TAG_ZERO)
              continue;
@@ -4187,7 +5638,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
            {
              DEBUG_printf(("1ippWriteIO: Attribute name too long (%d)", n));
              _cupsBufferRelease((char *)buffer);
-             return (IPP_ERROR);
+             return (IPP_STATE_ERROR);
            }
 
            /*
@@ -4202,17 +5653,17 @@ ippWriteIO(void       *dst,             /* I - Destination */
             if (attr->value_tag > 0xff)
             {
               *bufptr++ = IPP_TAG_EXTENSION;
-             *bufptr++ = attr->value_tag >> 24;
-             *bufptr++ = attr->value_tag >> 16;
-             *bufptr++ = attr->value_tag >> 8;
-             *bufptr++ = attr->value_tag;
+             *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++ = attr->value_tag;
+             *bufptr++ = (ipp_uchar_t)attr->value_tag;
 
-           *bufptr++ = n >> 8;
-           *bufptr++ = n;
-           memcpy(bufptr, attr->name, n);
+           *bufptr++ = (ipp_uchar_t)(n >> 8);
+           *bufptr++ = (ipp_uchar_t)n;
+           memcpy(bufptr, attr->name, (size_t)n);
            bufptr += n;
           }
          else
@@ -4226,7 +5677,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
            {
              DEBUG_printf(("1ippWriteIO: Attribute name too long (%d)", n));
              _cupsBufferRelease((char *)buffer);
-             return (IPP_ERROR);
+             return (IPP_STATE_ERROR);
            }
 
            /*
@@ -4245,21 +5696,21 @@ ippWriteIO(void       *dst,             /* I - Destination */
             *bufptr++ = IPP_TAG_MEMBERNAME;
            *bufptr++ = 0;
            *bufptr++ = 0;
-           *bufptr++ = n >> 8;
-           *bufptr++ = n;
-           memcpy(bufptr, attr->name, n);
+           *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++ = attr->value_tag >> 24;
-             *bufptr++ = attr->value_tag >> 16;
-             *bufptr++ = attr->value_tag >> 8;
-             *bufptr++ = attr->value_tag;
+             *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++ = attr->value_tag;
+             *bufptr++ = (ipp_uchar_t)attr->value_tag;
 
             *bufptr++ = 0;
             *bufptr++ = 0;
@@ -4269,7 +5720,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
          * Now write the attribute value(s)...
          */
 
-         switch (attr->value_tag & ~IPP_TAG_COPY)
+         switch (attr->value_tag & ~IPP_TAG_CUPS_CONST)
          {
            case IPP_TAG_UNSUPPORTED_VALUE :
            case IPP_TAG_DEFAULT :
@@ -4290,12 +5741,12 @@ ippWriteIO(void       *dst,             /* I - Destination */
                {
                   if ((IPP_BUF_SIZE - (bufptr - buffer)) < 9)
                  {
-                    if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                    if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                    {
                      DEBUG_puts("1ippWriteIO: Could not write IPP "
                                 "attribute...");
                      _cupsBufferRelease((char *)buffer);
-                     return (IPP_ERROR);
+                     return (IPP_STATE_ERROR);
                    }
 
                    bufptr = buffer;
@@ -4308,7 +5759,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                    * values with a zero-length name...
                    */
 
-                    *bufptr++ = attr->value_tag;
+                    *bufptr++ = (ipp_uchar_t)attr->value_tag;
                    *bufptr++ = 0;
                    *bufptr++ = 0;
                  }
@@ -4322,10 +5773,10 @@ ippWriteIO(void       *dst,             /* I - Destination */
 
                  *bufptr++ = 0;
                  *bufptr++ = 4;
-                 *bufptr++ = value->integer >> 24;
-                 *bufptr++ = value->integer >> 16;
-                 *bufptr++ = value->integer >> 8;
-                 *bufptr++ = value->integer;
+                 *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;
 
@@ -4336,12 +5787,12 @@ ippWriteIO(void       *dst,             /* I - Destination */
                {
                   if ((IPP_BUF_SIZE - (bufptr - buffer)) < 6)
                  {
-                    if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                    if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                    {
                      DEBUG_puts("1ippWriteIO: Could not write IPP "
                                 "attribute...");
                      _cupsBufferRelease((char *)buffer);
-                     return (IPP_ERROR);
+                     return (IPP_STATE_ERROR);
                    }
 
                    bufptr = buffer;
@@ -4354,7 +5805,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                    * values with a zero-length name...
                    */
 
-                    *bufptr++ = attr->value_tag;
+                    *bufptr++ = (ipp_uchar_t)attr->value_tag;
                    *bufptr++ = 0;
                    *bufptr++ = 0;
                  }
@@ -4367,7 +5818,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
 
                  *bufptr++ = 0;
                  *bufptr++ = 1;
-                 *bufptr++ = value->boolean;
+                 *bufptr++ = (ipp_uchar_t)value->boolean;
                }
                break;
 
@@ -4397,18 +5848,18 @@ ippWriteIO(void       *dst,             /* I - Destination */
 
                     if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3)
                    {
-                      if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                      if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                      {
                        DEBUG_puts("1ippWriteIO: Could not write IPP "
                                   "attribute...");
                        _cupsBufferRelease((char *)buffer);
-                       return (IPP_ERROR);
+                       return (IPP_STATE_ERROR);
                      }
 
                      bufptr = buffer;
                    }
 
-                    *bufptr++ = attr->value_tag;
+                    *bufptr++ = (ipp_uchar_t)attr->value_tag;
                    *bufptr++ = 0;
                    *bufptr++ = 0;
                  }
@@ -4422,7 +5873,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                  {
                    DEBUG_printf(("1ippWriteIO: String too long (%d)", n));
                    _cupsBufferRelease((char *)buffer);
-                   return (IPP_ERROR);
+                   return (IPP_STATE_ERROR);
                  }
 
                   DEBUG_printf(("2ippWriteIO: writing string=%d,\"%s\"", n,
@@ -4430,12 +5881,12 @@ ippWriteIO(void       *dst,             /* I - Destination */
 
                   if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2))
                  {
-                    if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                    if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                    {
                      DEBUG_puts("1ippWriteIO: Could not write IPP "
                                 "attribute...");
                      _cupsBufferRelease((char *)buffer);
-                     return (IPP_ERROR);
+                     return (IPP_STATE_ERROR);
                    }
 
                    bufptr = buffer;
@@ -4451,12 +5902,12 @@ ippWriteIO(void       *dst,             /* I - Destination */
                  * Put the 2-byte length and string characters in the buffer.
                  */
 
-                 *bufptr++ = n >> 8;
-                 *bufptr++ = n;
+                 *bufptr++ = (ipp_uchar_t)(n >> 8);
+                 *bufptr++ = (ipp_uchar_t)n;
 
                  if (n > 0)
                  {
-                   memcpy(bufptr, value->string.text, n);
+                   memcpy(bufptr, value->string.text, (size_t)n);
                    bufptr += n;
                  }
                }
@@ -4469,12 +5920,12 @@ ippWriteIO(void       *dst,             /* I - Destination */
                {
                   if ((IPP_BUF_SIZE - (bufptr - buffer)) < 16)
                  {
-                    if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                    if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                    {
                      DEBUG_puts("1ippWriteIO: Could not write IPP "
                                 "attribute...");
                      _cupsBufferRelease((char *)buffer);
-                     return (IPP_ERROR);
+                     return (IPP_STATE_ERROR);
                    }
 
                    bufptr = buffer;
@@ -4487,7 +5938,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                    * values with a zero-length name...
                    */
 
-                    *bufptr++ = attr->value_tag;
+                    *bufptr++ = (ipp_uchar_t)attr->value_tag;
                    *bufptr++ = 0;
                    *bufptr++ = 0;
                  }
@@ -4514,12 +5965,12 @@ ippWriteIO(void       *dst,             /* I - Destination */
                {
                   if ((IPP_BUF_SIZE - (bufptr - buffer)) < 14)
                  {
-                    if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                    if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                    {
                      DEBUG_puts("1ippWriteIO: Could not write IPP "
                                 "attribute...");
                      _cupsBufferRelease((char *)buffer);
-                     return (IPP_ERROR);
+                     return (IPP_STATE_ERROR);
                    }
 
                    bufptr = buffer;
@@ -4532,7 +5983,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                    * values with a zero-length name...
                    */
 
-                    *bufptr++ = attr->value_tag;
+                    *bufptr++ = (ipp_uchar_t)attr->value_tag;
                    *bufptr++ = 0;
                    *bufptr++ = 0;
                  }
@@ -4548,15 +5999,15 @@ ippWriteIO(void       *dst,             /* I - Destination */
 
                  *bufptr++ = 0;
                  *bufptr++ = 9;
-                 *bufptr++ = value->resolution.xres >> 24;
-                 *bufptr++ = value->resolution.xres >> 16;
-                 *bufptr++ = value->resolution.xres >> 8;
-                 *bufptr++ = value->resolution.xres;
-                 *bufptr++ = value->resolution.yres >> 24;
-                 *bufptr++ = value->resolution.yres >> 16;
-                 *bufptr++ = value->resolution.yres >> 8;
-                 *bufptr++ = value->resolution.yres;
-                 *bufptr++ = value->resolution.units;
+                 *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;
 
@@ -4567,12 +6018,12 @@ ippWriteIO(void       *dst,             /* I - Destination */
                {
                   if ((IPP_BUF_SIZE - (bufptr - buffer)) < 13)
                  {
-                    if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                    if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                    {
                      DEBUG_puts("1ippWriteIO: Could not write IPP "
                                 "attribute...");
                      _cupsBufferRelease((char *)buffer);
-                     return (IPP_ERROR);
+                     return (IPP_STATE_ERROR);
                    }
 
                    bufptr = buffer;
@@ -4585,7 +6036,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                    * values with a zero-length name...
                    */
 
-                    *bufptr++ = attr->value_tag;
+                    *bufptr++ = (ipp_uchar_t)attr->value_tag;
                    *bufptr++ = 0;
                    *bufptr++ = 0;
                  }
@@ -4600,14 +6051,14 @@ ippWriteIO(void       *dst,             /* I - Destination */
 
                  *bufptr++ = 0;
                  *bufptr++ = 8;
-                 *bufptr++ = value->range.lower >> 24;
-                 *bufptr++ = value->range.lower >> 16;
-                 *bufptr++ = value->range.lower >> 8;
-                 *bufptr++ = value->range.lower;
-                 *bufptr++ = value->range.upper >> 24;
-                 *bufptr++ = value->range.upper >> 16;
-                 *bufptr++ = value->range.upper >> 8;
-                 *bufptr++ = value->range.upper;
+                 *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;
 
@@ -4626,18 +6077,18 @@ ippWriteIO(void       *dst,             /* I - Destination */
 
                     if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3)
                    {
-                      if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                      if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                      {
                        DEBUG_puts("1ippWriteIO: Could not write IPP "
                                   "attribute...");
                        _cupsBufferRelease((char *)buffer);
-                       return (IPP_ERROR);
+                       return (IPP_STATE_ERROR);
                      }
 
                      bufptr = buffer;
                    }
 
-                    *bufptr++ = attr->value_tag;
+                    *bufptr++ = (ipp_uchar_t)attr->value_tag;
                    *bufptr++ = 0;
                    *bufptr++ = 0;
                  }
@@ -4665,25 +6116,25 @@ ippWriteIO(void       *dst,             /* I - Destination */
                    DEBUG_printf(("1ippWriteIO: text/nameWithLanguage value "
                                  "too long (%d)", n));
                    _cupsBufferRelease((char *)buffer);
-                   return (IPP_ERROR);
+                   return (IPP_STATE_ERROR);
                   }
 
                   if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2))
                  {
-                    if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                    if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                    {
                      DEBUG_puts("1ippWriteIO: Could not write IPP "
                                 "attribute...");
                      _cupsBufferRelease((char *)buffer);
-                     return (IPP_ERROR);
+                     return (IPP_STATE_ERROR);
                    }
 
                    bufptr = buffer;
                  }
 
                  /* Length of entire value */
-                 *bufptr++ = n >> 8;
-                 *bufptr++ = n;
+                 *bufptr++ = (ipp_uchar_t)(n >> 8);
+                 *bufptr++ = (ipp_uchar_t)n;
 
                  /* Length of language */
                  if (value->string.language != NULL)
@@ -4691,13 +6142,13 @@ ippWriteIO(void       *dst,             /* I - Destination */
                  else
                    n = 0;
 
-                 *bufptr++ = n >> 8;
-                 *bufptr++ = n;
+                 *bufptr++ = (ipp_uchar_t)(n >> 8);
+                 *bufptr++ = (ipp_uchar_t)n;
 
                  /* Language */
                  if (n > 0)
                  {
-                   memcpy(bufptr, value->string.language, n);
+                   memcpy(bufptr, value->string.language, (size_t)n);
                    bufptr += n;
                  }
 
@@ -4707,13 +6158,13 @@ ippWriteIO(void       *dst,             /* I - Destination */
                  else
                    n = 0;
 
-                 *bufptr++ = n >> 8;
-                 *bufptr++ = n;
+                 *bufptr++ = (ipp_uchar_t)(n >> 8);
+                 *bufptr++ = (ipp_uchar_t)n;
 
                  /* Text */
                  if (n > 0)
                  {
-                   memcpy(bufptr, value->string.text, n);
+                   memcpy(bufptr, value->string.text, (size_t)n);
                    bufptr += n;
                  }
                }
@@ -4733,12 +6184,12 @@ ippWriteIO(void       *dst,             /* I - Destination */
 
                   if ((IPP_BUF_SIZE - (bufptr - buffer)) < 5)
                  {
-                    if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                    if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                    {
                      DEBUG_puts("1ippWriteIO: Could not write IPP "
                                 "attribute...");
                      _cupsBufferRelease((char *)buffer);
-                     return (IPP_ERROR);
+                     return (IPP_STATE_ERROR);
                    }
 
                    bufptr = buffer;
@@ -4751,7 +6202,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                    * values with a zero-length name...
                    */
 
-                    *bufptr++ = attr->value_tag;
+                    *bufptr++ = (ipp_uchar_t)attr->value_tag;
                    *bufptr++ = 0;
                    *bufptr++ = 0;
                  }
@@ -4763,12 +6214,12 @@ ippWriteIO(void       *dst,             /* I - Destination */
                  *bufptr++ = 0;
                  *bufptr++ = 0;
 
-                  if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                  if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                  {
                    DEBUG_puts("1ippWriteIO: Could not write IPP "
                               "attribute...");
                    _cupsBufferRelease((char *)buffer);
-                   return (IPP_ERROR);
+                   return (IPP_STATE_ERROR);
                  }
 
                  bufptr = buffer;
@@ -4777,14 +6228,14 @@ ippWriteIO(void       *dst,             /* I - Destination */
                  * Then write the collection attribute...
                  */
 
-                  value->collection->state = IPP_IDLE;
+                  value->collection->state = IPP_STATE_IDLE;
 
                  if (ippWriteIO(dst, cb, 1, ipp,
-                                value->collection) == IPP_ERROR)
+                                value->collection) == IPP_STATE_ERROR)
                  {
                    DEBUG_puts("1ippWriteIO: Unable to write collection value");
                    _cupsBufferRelease((char *)buffer);
-                   return (IPP_ERROR);
+                   return (IPP_STATE_ERROR);
                  }
                }
                break;
@@ -4803,18 +6254,18 @@ ippWriteIO(void       *dst,             /* I - Destination */
 
                     if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3)
                    {
-                      if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                      if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                      {
                        DEBUG_puts("1ippWriteIO: Could not write IPP "
                                   "attribute...");
                        _cupsBufferRelease((char *)buffer);
-                       return (IPP_ERROR);
+                       return (IPP_STATE_ERROR);
                      }
 
                      bufptr = buffer;
                    }
 
-                    *bufptr++ = attr->value_tag;
+                    *bufptr++ = (ipp_uchar_t)attr->value_tag;
                    *bufptr++ = 0;
                    *bufptr++ = 0;
                  }
@@ -4833,30 +6284,30 @@ ippWriteIO(void       *dst,             /* I - Destination */
                    DEBUG_printf(("1ippWriteIO: Data length too long (%d)",
                                  n));
                    _cupsBufferRelease((char *)buffer);
-                   return (IPP_ERROR);
+                   return (IPP_STATE_ERROR);
                  }
 
                   if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2))
                  {
-                    if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+                    if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
                    {
                      DEBUG_puts("1ippWriteIO: Could not write IPP "
                                 "attribute...");
                      _cupsBufferRelease((char *)buffer);
-                     return (IPP_ERROR);
+                     return (IPP_STATE_ERROR);
                    }
 
                    bufptr = buffer;
                  }
 
                  /* Length of unknown value */
-                 *bufptr++ = n >> 8;
-                 *bufptr++ = n;
+                 *bufptr++ = (ipp_uchar_t)(n >> 8);
+                 *bufptr++ = (ipp_uchar_t)n;
 
                  /* Value */
                  if (n > 0)
                  {
-                   memcpy(bufptr, value->unknown.data, n);
+                   memcpy(bufptr, value->unknown.data, (size_t)n);
                    bufptr += n;
                  }
                }
@@ -4869,11 +6320,11 @@ ippWriteIO(void       *dst,             /* I - Destination */
 
          if (bufptr > buffer)
          {
-           if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+           if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
            {
              DEBUG_puts("1ippWriteIO: Could not write IPP attribute...");
              _cupsBufferRelease((char *)buffer);
-             return (IPP_ERROR);
+             return (IPP_STATE_ERROR);
            }
 
            DEBUG_printf(("2ippWriteIO: wrote %d bytes",
@@ -4881,10 +6332,11 @@ ippWriteIO(void       *dst,             /* I - Destination */
          }
 
         /*
-          * If blocking is disabled, stop here...
+          * If blocking is disabled and we aren't at the end of the attribute
+          * list, stop here...
          */
 
-          if (!blocking)
+          if (!blocking && ipp->current)
            break;
        }
 
@@ -4910,18 +6362,18 @@ ippWriteIO(void       *dst,             /* I - Destination */
            n         = 5;
          }
 
-         if ((*cb)(dst, buffer, n) < 0)
+         if ((*cb)(dst, buffer, (size_t)n) < 0)
          {
            DEBUG_puts("1ippWriteIO: Could not write IPP end-tag...");
            _cupsBufferRelease((char *)buffer);
-           return (IPP_ERROR);
+           return (IPP_STATE_ERROR);
          }
 
-         ipp->state = IPP_DATA;
+         ipp->state = IPP_STATE_DATA;
        }
         break;
 
-    case IPP_DATA :
+    case IPP_STATE_DATA :
         break;
 
     default :
@@ -4969,7 +6421,7 @@ ipp_add_attr(ipp_t      *ipp,             /* I - IPP message */
     alloc_values = (num_values + IPP_MAX_VALUES - 1) & ~(IPP_MAX_VALUES - 1);
 
   attr = calloc(sizeof(ipp_attribute_t) +
-                (alloc_values - 1) * sizeof(_ipp_value_t), 1);
+                (size_t)(alloc_values - 1) * sizeof(_ipp_value_t), 1);
 
   if (attr)
   {
@@ -5019,7 +6471,7 @@ ipp_free_values(ipp_attribute_t *attr,    /* I - Attribute to free values from */
   DEBUG_printf(("4ipp_free_values(attr=%p, element=%d, count=%d)", attr,
                 element, count));
 
-  if (!(attr->value_tag & IPP_TAG_COPY))
+  if (!(attr->value_tag & IPP_TAG_CUPS_CONST))
   {
    /*
     * Free values as needed...
@@ -5101,7 +6553,7 @@ ipp_free_values(ipp_attribute_t *attr,    /* I - Attribute to free values from */
 
   if ((element + count) < attr->num_values)
     memmove(attr->values + element, attr->values + element + count,
-            (attr->num_values - count - element) * sizeof(_ipp_value_t));
+            (size_t)(attr->num_values - count - element) * sizeof(_ipp_value_t));
 
   attr->num_values -= count;
 }
@@ -5133,7 +6585,7 @@ ipp_get_code(const char *value,           /* I - Locale/charset string */
     if (*value == '_')
       *bufptr++ = '-';
     else
-      *bufptr++ = _cups_tolower(*value);
+      *bufptr++ = (char)_cups_tolower(*value);
 
   *bufptr = '\0';
 
@@ -5223,18 +6675,21 @@ ipp_length(ipp_t *ipp,                  /* I - IPP message or collection */
     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_EXTENSION)
-      bytes += attr->num_values;       /* Value tag for each value */
+    if ((attr->value_tag & ~IPP_TAG_CUPS_CONST) < IPP_TAG_EXTENSION)
+      bytes += (size_t)attr->num_values;/* Value tag for each value */
     else
-      bytes += 5 * attr->num_values;   /* Value tag for each value */
-    bytes += 2 * attr->num_values;     /* Name lengths */
-    bytes += (int)strlen(attr->name);  /* Name */
-    bytes += 2 * attr->num_values;     /* Value lengths */
+      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_COPY)
+    switch (attr->value_tag & ~IPP_TAG_CUPS_CONST)
     {
       case IPP_TAG_UNSUPPORTED_VALUE :
       case IPP_TAG_DEFAULT :
@@ -5247,11 +6702,11 @@ ipp_length(ipp_t *ipp,                  /* I - IPP message or collection */
 
       case IPP_TAG_INTEGER :
       case IPP_TAG_ENUM :
-          bytes += 4 * attr->num_values;
+          bytes += (size_t)(4 * attr->num_values);
          break;
 
       case IPP_TAG_BOOLEAN :
-          bytes += attr->num_values;
+          bytes += (size_t)attr->num_values;
          break;
 
       case IPP_TAG_TEXT :
@@ -5270,20 +6725,21 @@ ipp_length(ipp_t *ipp,                  /* I - IPP message or collection */
          break;
 
       case IPP_TAG_DATE :
-          bytes += 11 * attr->num_values;
+          bytes += (size_t)(11 * attr->num_values);
          break;
 
       case IPP_TAG_RESOLUTION :
-          bytes += 9 * attr->num_values;
+          bytes += (size_t)(9 * attr->num_values);
          break;
 
       case IPP_TAG_RANGE :
-          bytes += 8 * attr->num_values;
+          bytes += (size_t)(8 * attr->num_values);
          break;
 
       case IPP_TAG_TEXTLANG :
       case IPP_TAG_NAMELANG :
-          bytes += 4 * attr->num_values;/* Charset + text length */
+          bytes += (size_t)(4 * attr->num_values);
+                                       /* Charset + text length */
 
          for (i = 0, value = attr->values;
               i < attr->num_values;
@@ -5308,7 +6764,7 @@ ipp_length(ipp_t *ipp,                    /* I - IPP message or collection */
          for (i = 0, value = attr->values;
               i < attr->num_values;
               i ++, value ++)
-            bytes += value->unknown.length;
+            bytes += (size_t)value->unknown.length;
          break;
     }
   }
@@ -5338,8 +6794,8 @@ ipp_read_http(http_t      *http,  /* I - Client connection */
               ipp_uchar_t *buffer,     /* O - Buffer for data */
              size_t      length)       /* I - Total length */
 {
-  int  tbytes,                         /* Total bytes read */
-       bytes;                          /* Bytes read this pass */
+  ssize_t      tbytes,                 /* Total bytes read */
+               bytes;                  /* Bytes read this pass */
 
 
   DEBUG_printf(("7ipp_read_http(http=%p, buffer=%p, length=%d)",
@@ -5353,10 +6809,9 @@ ipp_read_http(http_t      *http, /* I - Client connection */
        tbytes < (int)length;
        tbytes += bytes, buffer += bytes)
   {
-    DEBUG_printf(("9ipp_read_http: tbytes=%d, http->state=%d", tbytes,
-                  http->state));
+    DEBUG_printf(("9ipp_read_http: tbytes=" CUPS_LLFMT ", http->state=%d", CUPS_LLCAST tbytes, http->state));
 
-    if (http->state == HTTP_WAITING)
+    if (http->state == HTTP_STATE_WAITING)
       break;
 
     if (http->used == 0 && !http->blocking)
@@ -5375,8 +6830,24 @@ ipp_read_http(http_t      *http, /* I - Client connection */
        break;
       }
     }
+    else if (http->used == 0 && http->timeout_value > 0)
+    {
+     /*
+      * Wait up to timeout seconds for more data on blocking sockets...
+      */
 
-    if ((bytes = httpRead2(http, (char *)buffer, length - tbytes)) < 0)
+      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;
@@ -5398,7 +6869,7 @@ ipp_read_http(http_t      *http,  /* I - Client connection */
   if (tbytes == 0 && bytes < 0)
     tbytes = -1;
 
-  DEBUG_printf(("8ipp_read_http: Returning %d bytes", tbytes));
+  DEBUG_printf(("8ipp_read_http: Returning " CUPS_LLFMT " bytes", CUPS_LLCAST tbytes));
 
   return (tbytes);
 }
@@ -5422,6 +6893,29 @@ ipp_read_file(int         *fd,           /* I - File descriptor */
 
 
 /*
+ * '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.
  */
@@ -5474,10 +6968,9 @@ ipp_set_value(ipp_t           *ipp,      /* IO - IPP message */
   * Reallocate memory...
   */
 
-  if ((temp = realloc(temp, sizeof(ipp_attribute_t) +
-                           (alloc_values - 1) * sizeof(_ipp_value_t))) == NULL)
+  if ((temp = realloc(temp, sizeof(ipp_attribute_t) + (size_t)(alloc_values - 1) * sizeof(_ipp_value_t))) == NULL)
   {
-    _cupsSetHTTPError(HTTP_ERROR);
+    _cupsSetHTTPError(HTTP_STATUS_ERROR);
     DEBUG_puts("4ipp_set_value: Unable to resize attribute.");
     return (NULL);
   }
@@ -5486,8 +6979,7 @@ ipp_set_value(ipp_t           *ipp,       /* IO - IPP message */
   * Zero the new memory...
   */
 
-  memset(temp->values + temp->num_values, 0,
-         (alloc_values - temp->num_values) * sizeof(_ipp_value_t));
+  memset(temp->values + temp->num_values, 0, (size_t)(alloc_values - temp->num_values) * sizeof(_ipp_value_t));
 
   if (temp != *attr)
   {
@@ -5520,7 +7012,7 @@ ipp_set_value(ipp_t           *ipp,       /* IO - IPP message */
        */
 
        *attr = temp;
-       _cupsSetError(IPP_INTERNAL_ERROR,
+       _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);
@@ -5570,5 +7062,5 @@ ipp_write_file(int         *fd,           /* I - File descriptor */
 
 
 /*
- * End of "$Id: ipp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ipp.c 12468 2015-02-01 04:50:43Z msweet $".
  */
index b9de668..9fccd11 100644 (file)
@@ -1,18 +1,18 @@
 /*
- * "$Id: ipp.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ipp.h 12666 2015-05-25 19:38:09Z msweet $"
  *
- *   Internet Printing Protocol definitions for CUPS.
+ * Internet Printing Protocol definitions for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_IPP_H_
@@ -23,6 +23,7 @@
  */
 
 #  include "http.h"
+#  include <stdarg.h>
 
 
 /*
@@ -54,10 +55,25 @@ extern "C" {
  * 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_NAME         256     /* Maximum length of common name values */
+#  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...
@@ -65,14 +81,22 @@ extern "C" {
 
 typedef enum ipp_dstate_e              /**** Document states ****/
 {
-  IPP_DOCUMENT_PENDING = 3,
-  IPP_DOCUMENT_PROCESSING = 5,
-  IPP_DOCUMENT_CANCELED = 7,
-  IPP_DOCUMENT_ABORTED,
-  IPP_DOCUMENT_COMPLETED
+  IPP_DOCUMENT_PENDING = 3,            /* Document is pending */
+  IPP_DOCUMENT_PROCESSING = 5,         /* Document is processing */
+  IPP_DOCUMENT_CANCELED = 7,           /* Document is canceled */
+  IPP_DOCUMENT_ABORTED,                        /* Document is aborted */
+  IPP_DOCUMENT_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_finish_e              /**** Finishings ****/
+typedef enum ipp_finishings_e          /**** Finishings ****/
 {
   IPP_FINISHINGS_NONE = 3,             /* No finishing */
   IPP_FINISHINGS_STAPLE,               /* Staple (any location) */
@@ -85,7 +109,9 @@ typedef enum ipp_finish_e            /**** Finishings ****/
   IPP_FINISHINGS_TRIM,                 /* Trim (any type) */
   IPP_FINISHINGS_BALE,                 /* Bale (any type) */
   IPP_FINISHINGS_BOOKLET_MAKER,                /* Fold to make booklet */
-  IPP_FINISHINGS_JOB_OFFSET,           /* Offset for binding (any type) */
+  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 */
@@ -98,6 +124,10 @@ typedef enum ipp_finish_e           /**** Finishings ****/
   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 */
@@ -105,126 +135,319 @@ typedef enum ipp_finish_e               /**** Finishings ****/
   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_finish_t;
+  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_FOLD_ACCORDIAN = 90,  /* Accordian-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 */
+
+  /* CUPS extensions for finishings (pre-standard versions of values above) */
+  IPP_FINISHINGS_CUPS_PUNCH_TOP_LEFT = 0x40000046,
+                                       /* Punch 1 hole top left */
+  IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_LEFT,/* Punch 1 hole bottom left */
+  IPP_FINISHINGS_CUPS_PUNCH_TOP_RIGHT, /* Punch 1 hole top right */
+  IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_RIGHT,
+                                       /* Punch 1 hole bottom right */
+  IPP_FINISHINGS_CUPS_PUNCH_DUAL_LEFT, /* Punch 2 holes left side */
+  IPP_FINISHINGS_CUPS_PUNCH_DUAL_TOP,  /* Punch 2 holes top edge */
+  IPP_FINISHINGS_CUPS_PUNCH_DUAL_RIGHT,        /* Punch 2 holes right side */
+  IPP_FINISHINGS_CUPS_PUNCH_DUAL_BOTTOM,/* Punch 2 holes bottom edge */
+  IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_LEFT,/* Punch 3 holes left side */
+  IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_TOP,        /* Punch 3 holes top edge */
+  IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_RIGHT,
+                                       /* Punch 3 holes right side */
+  IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_BOTTOM,
+                                       /* Punch 3 holes bottom edge */
+  IPP_FINISHINGS_CUPS_PUNCH_QUAD_LEFT, /* Punch 4 holes left side */
+  IPP_FINISHINGS_CUPS_PUNCH_QUAD_TOP,  /* Punch 4 holes top edge */
+  IPP_FINISHINGS_CUPS_PUNCH_QUAD_RIGHT,        /* Punch 4 holes right side */
+  IPP_FINISHINGS_CUPS_PUNCH_QUAD_BOTTOM,/* Punch 4 holes bottom edge */
+
+  IPP_FINISHINGS_CUPS_FOLD_ACCORDIAN = 0x4000005A,
+                                       /* Accordian-fold the paper vertically into four sections */
+  IPP_FINISHINGS_CUPS_FOLD_DOUBLE_GATE,        /* Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically */
+  IPP_FINISHINGS_CUPS_FOLD_GATE,       /* Fold the top and bottom quarters of the paper towards the midline */
+  IPP_FINISHINGS_CUPS_FOLD_HALF,       /* Fold the paper in half vertically */
+  IPP_FINISHINGS_CUPS_FOLD_HALF_Z,     /* Fold the paper in half horizontally, then Z-fold the paper vertically */
+  IPP_FINISHINGS_CUPS_FOLD_LEFT_GATE,  /* Fold the top quarter of the paper towards the midline */
+  IPP_FINISHINGS_CUPS_FOLD_LETTER,     /* Fold the paper into three sections vertically; sometimes also known as a C fold*/
+  IPP_FINISHINGS_CUPS_FOLD_PARALLEL,   /* Fold the paper in half vertically two times, yielding four sections */
+  IPP_FINISHINGS_CUPS_FOLD_POSTER,     /* Fold the paper in half horizontally and vertically; sometimes also called a cross fold */
+  IPP_FINISHINGS_CUPS_FOLD_RIGHT_GATE, /* Fold the bottom quarter of the paper towards the midline */
+  IPP_FINISHINGS_CUPS_FOLD_Z           /* Fold the paper vertically into three sections, forming a Z */
+} ipp_finishings_t;
+#  ifndef _CUPS_NO_DEPRECATED
+#    define IPP_FINISHINGS_JOB_OFFSET  IPP_FINISHINGS_JOG_OFFSET
+                                       /* Long-time misspelling... */
+typedef enum ipp_finishings_e ipp_finish_t;
+#  endif /* !_CUPS_NO_DEPRECATED */
 
 typedef enum ipp_jcollate_e            /**** Job collation types ****/
 {
-  IPP_JOB_UNCOLLATED_SHEETS = 3,
-  IPP_JOB_COLLATED_DOCUMENTS,
-  IPP_JOB_UNCOLLATED_DOCUMENTS
+  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_JOB_PENDING = 3,                 /* Job is waiting to be printed */
-  IPP_JOB_HELD,                                /* Job is held for printing */
-  IPP_JOB_PROCESSING,                  /* Job is currently printing */
-  IPP_JOB_STOPPED,                     /* Job has been stopped */
-  IPP_JOB_CANCELED,                    /* Job has been canceled */
-  IPP_JOB_ABORTED,                     /* Job has aborted due to error */
-  IPP_JOB_COMPLETED                    /* Job has completed successfully */
+  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_JOB_CANCELED
+#    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_PRINT_JOB = 0x0002,              /* Print a single file */
-  IPP_PRINT_URI,                       /* Print a single URL @private@ */
-  IPP_VALIDATE_JOB,                    /* Validate job options */
-  IPP_CREATE_JOB,                      /* Create an empty print job */
-  IPP_SEND_DOCUMENT,                   /* Add a file to a job */
-  IPP_SEND_URI,                                /* Add a URL to a job @private@ */
-  IPP_CANCEL_JOB,                      /* Cancel a job */
-  IPP_GET_JOB_ATTRIBUTES,              /* Get job attributes */
-  IPP_GET_JOBS,                                /* Get a list of jobs */
-  IPP_GET_PRINTER_ATTRIBUTES,          /* Get printer attributes */
-  IPP_HOLD_JOB,                                /* Hold a job for printing */
-  IPP_RELEASE_JOB,                     /* Release a job for printing */
-  IPP_RESTART_JOB,                     /* Reprint a job */
-  IPP_PAUSE_PRINTER = 0x0010,          /* Stop a printer */
-  IPP_RESUME_PRINTER,                  /* Start a printer */
-  IPP_PURGE_JOBS,                      /* Cancel all jobs */
-  IPP_SET_PRINTER_ATTRIBUTES,          /* Set printer attributes @private@ */
-  IPP_SET_JOB_ATTRIBUTES,              /* Set job attributes */
-  IPP_GET_PRINTER_SUPPORTED_VALUES,    /* Get supported attribute values */
-  IPP_CREATE_PRINTER_SUBSCRIPTION,     /* Create a printer subscription @since CUPS 1.2/OS X 10.5@ */
-  IPP_CREATE_JOB_SUBSCRIPTION,         /* Create a job subscription @since CUPS 1.2/OS X 10.5@ */
-  IPP_GET_SUBSCRIPTION_ATTRIBUTES,     /* Get subscription attributes @since CUPS 1.2/OS X 10.5@ */
-  IPP_GET_SUBSCRIPTIONS,               /* Get list of subscriptions @since CUPS 1.2/OS X 10.5@ */
-  IPP_RENEW_SUBSCRIPTION,              /* Renew a printer subscription @since CUPS 1.2/OS X 10.5@ */
-  IPP_CANCEL_SUBSCRIPTION,             /* Cancel a subscription @since CUPS 1.2/OS X 10.5@ */
-  IPP_GET_NOTIFICATIONS,               /* Get notification events @since CUPS 1.2/OS X 10.5@ */
-  IPP_SEND_NOTIFICATIONS,              /* Send notification events @private@ */
-  IPP_GET_RESOURCE_ATTRIBUTES,         /* Get resource attributes @private@ */
-  IPP_GET_RESOURCE_DATA,               /* Get resource data @private@ */
-  IPP_GET_RESOURCES,                   /* Get list of resources @private@ */
-  IPP_GET_PRINT_SUPPORT_FILES,         /* Get printer support files @private@ */
-  IPP_ENABLE_PRINTER,                  /* Start a printer */
-  IPP_DISABLE_PRINTER,                 /* Stop a printer */
-  IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB, /* Stop printer after the current job @private@ */
-  IPP_HOLD_NEW_JOBS,                   /* Hold new jobs @private@ */
-  IPP_RELEASE_HELD_NEW_JOBS,           /* Release new jobs @private@ */
-  IPP_DEACTIVATE_PRINTER,              /* Stop a printer @private@ */
-  IPP_ACTIVATE_PRINTER,                        /* Start a printer @private@ */
-  IPP_RESTART_PRINTER,                 /* Restart a printer @private@ */
-  IPP_SHUTDOWN_PRINTER,                        /* Turn a printer off @private@ */
-  IPP_STARTUP_PRINTER,                 /* Turn a printer on @private@ */
-  IPP_REPROCESS_JOB,                   /* Reprint a job @private@ */
-  IPP_CANCEL_CURRENT_JOB,              /* Cancel the current job @private@ */
-  IPP_SUSPEND_CURRENT_JOB,             /* Suspend the current job @private@ */
-  IPP_RESUME_JOB,                      /* Resume the current job @private@ */
-  IPP_PROMOTE_JOB,                     /* Promote a job to print sooner @private@ */
-  IPP_SCHEDULE_JOB_AFTER,              /* Schedule a job to print after another @private@ */
-  IPP_CANCEL_DOCUMENT = 0x0033,                /* Cancel-Document @private@ */
-  IPP_GET_DOCUMENT_ATTRIBUTES,         /* Get-Document-Attributes @private@ */
-  IPP_GET_DOCUMENTS,                   /* Get-Documents @private@ */
-  IPP_DELETE_DOCUMENT,                 /* Delete-Document @private@ */
-  IPP_SET_DOCUMENT_ATTRIBUTES,         /* Set-Document-Attributes @private@ */
-  IPP_CANCEL_JOBS,                     /* Cancel-Jobs */
-  IPP_CANCEL_MY_JOBS,                  /* Cancel-My-Jobs */
-  IPP_RESUBMIT_JOB,                    /* Resubmit-Job */
-  IPP_CLOSE_JOB,                       /* Close-Job */
-  IPP_IDENTIFY_PRINTER,                        /* Identify-Printer (proposed IPP JPS3) */
-  IPP_VALIDATE_DOCUMENT,               /* Validate-Document (proposed IPP JPS3) */
-  IPP_PRIVATE = 0x4000,                        /* Reserved @private@ */
-  CUPS_GET_DEFAULT,                    /* Get the default printer */
-  CUPS_GET_PRINTERS,                   /* Get a list of printers and/or classes */
-  CUPS_ADD_MODIFY_PRINTER,             /* Add or modify a printer */
-  CUPS_DELETE_PRINTER,                 /* Delete a printer */
-  CUPS_GET_CLASSES,                    /* Get a list of classes @deprecated@ */
-  CUPS_ADD_MODIFY_CLASS,               /* Add or modify a class */
-  CUPS_DELETE_CLASS,                   /* Delete a class */
-  CUPS_ACCEPT_JOBS,                    /* Accept new jobs on a printer */
-  CUPS_REJECT_JOBS,                    /* Reject new jobs on a printer */
-  CUPS_SET_DEFAULT,                    /* Set the default printer */
-  CUPS_GET_DEVICES,                    /* Get a list of supported devices */
-  CUPS_GET_PPDS,                       /* Get a list of supported drivers */
-  CUPS_MOVE_JOB,                       /* Move a job to a different printer */
-  CUPS_AUTHENTICATE_JOB,               /* Authenticate a job @since CUPS 1.2/OS X 10.5@ */
-  CUPS_GET_PPD,                                /* Get a PPD file @since CUPS 1.3/OS X 10.5@ */
-  CUPS_GET_DOCUMENT = 0x4027           /* Get a document file @since CUPS 1.4/OS X 10.6@ */
-
-  /* Legacy names for the add operations */
-#define CUPS_ADD_PRINTER       CUPS_ADD_MODIFY_PRINTER
-#define CUPS_ADD_CLASS         CUPS_ADD_MODIFY_CLASS
+  IPP_OP_CUPS_NONE = 0,                        /* No operation @private@ */
+  IPP_OP_PRINT_JOB = 0x0002,           /* Print a single file */
+  IPP_OP_PRINT_URI,                    /* Print a single URL */
+  IPP_OP_VALIDATE_JOB,                 /* Validate job options */
+  IPP_OP_CREATE_JOB,                   /* Create an empty print job */
+  IPP_OP_SEND_DOCUMENT,                        /* Add a file to a job */
+  IPP_OP_SEND_URI,                     /* Add a URL to a job */
+  IPP_OP_CANCEL_JOB,                   /* Cancel a job */
+  IPP_OP_GET_JOB_ATTRIBUTES,           /* Get job attributes */
+  IPP_OP_GET_JOBS,                     /* Get a list of jobs */
+  IPP_OP_GET_PRINTER_ATTRIBUTES,       /* Get printer attributes */
+  IPP_OP_HOLD_JOB,                     /* Hold a job for printing */
+  IPP_OP_RELEASE_JOB,                  /* Release a job for printing */
+  IPP_OP_RESTART_JOB,                  /* Reprint a job */
+  IPP_OP_PAUSE_PRINTER = 0x0010,       /* Stop a printer */
+  IPP_OP_RESUME_PRINTER,               /* Start a printer */
+  IPP_OP_PURGE_JOBS,                   /* Cancel all jobs */
+  IPP_OP_SET_PRINTER_ATTRIBUTES,       /* Set printer attributes */
+  IPP_OP_SET_JOB_ATTRIBUTES,           /* Set job attributes */
+  IPP_OP_GET_PRINTER_SUPPORTED_VALUES, /* Get supported attribute values */
+  IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS, /* Create one or more printer subscriptions @since CUPS 1.2/OS X 10.5@ */
+  IPP_OP_CREATE_JOB_SUBSCRIPTIONS,     /* Create one of more job subscriptions @since CUPS 1.2/OS X 10.5@ */
+  IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES,  /* Get subscription attributes @since CUPS 1.2/OS X 10.5@ */
+  IPP_OP_GET_SUBSCRIPTIONS,            /* Get list of subscriptions @since CUPS 1.2/OS X 10.5@ */
+  IPP_OP_RENEW_SUBSCRIPTION,           /* Renew a printer subscription @since CUPS 1.2/OS X 10.5@ */
+  IPP_OP_CANCEL_SUBSCRIPTION,          /* Cancel a subscription @since CUPS 1.2/OS X 10.5@ */
+  IPP_OP_GET_NOTIFICATIONS,            /* Get notification events @since CUPS 1.2/OS X 10.5@ */
+  IPP_OP_SEND_NOTIFICATIONS,           /* Send notification events @private@ */
+  IPP_OP_GET_RESOURCE_ATTRIBUTES,      /* Get resource attributes @private@ */
+  IPP_OP_GET_RESOURCE_DATA,            /* Get resource data @private@ */
+  IPP_OP_GET_RESOURCES,                        /* Get list of resources @private@ */
+  IPP_OP_GET_PRINT_SUPPORT_FILES,      /* Get printer support files @private@ */
+  IPP_OP_ENABLE_PRINTER,               /* Start a printer */
+  IPP_OP_DISABLE_PRINTER,              /* Stop a printer */
+  IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB,
+                                       /* Stop printer after the current job */
+  IPP_OP_HOLD_NEW_JOBS,                        /* Hold new jobs */
+  IPP_OP_RELEASE_HELD_NEW_JOBS,                /* Release new jobs */
+  IPP_OP_DEACTIVATE_PRINTER,           /* Stop a printer */
+  IPP_OP_ACTIVATE_PRINTER,             /* Start a printer */
+  IPP_OP_RESTART_PRINTER,              /* Restart a printer */
+  IPP_OP_SHUTDOWN_PRINTER,             /* Turn a printer off */
+  IPP_OP_STARTUP_PRINTER,              /* Turn a printer on */
+  IPP_OP_REPROCESS_JOB,                        /* Reprint a job */
+  IPP_OP_CANCEL_CURRENT_JOB,           /* Cancel the current job */
+  IPP_OP_SUSPEND_CURRENT_JOB,          /* Suspend the current job */
+  IPP_OP_RESUME_JOB,                   /* Resume the current job */
+  IPP_OP_PROMOTE_JOB,                  /* Promote a job to print sooner */
+  IPP_OP_SCHEDULE_JOB_AFTER,           /* Schedule a job to print after another */
+  IPP_OP_CANCEL_DOCUMENT = 0x0033,     /* Cancel-Document */
+  IPP_OP_GET_DOCUMENT_ATTRIBUTES,      /* Get-Document-Attributes */
+  IPP_OP_GET_DOCUMENTS,                        /* Get-Documents */
+  IPP_OP_DELETE_DOCUMENT,              /* Delete-Document */
+  IPP_OP_SET_DOCUMENT_ATTRIBUTES,      /* Set-Document-Attributes */
+  IPP_OP_CANCEL_JOBS,                  /* Cancel-Jobs */
+  IPP_OP_CANCEL_MY_JOBS,               /* Cancel-My-Jobs */
+  IPP_OP_RESUBMIT_JOB,                 /* Resubmit-Job */
+  IPP_OP_CLOSE_JOB,                    /* Close-Job */
+  IPP_OP_IDENTIFY_PRINTER,             /* Identify-Printer */
+  IPP_OP_VALIDATE_DOCUMENT,            /* Validate-Document */
+  IPP_OP_SEND_HARDCOPY_DOCUMENT,       /* Send-Hardcopy-Document */
+  IPP_OP_ACKNOWLEDGE_DOCUMENT,         /* Acknowledge-Document */
+  IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER, /* Acknowledge-Identify-Printer */
+  IPP_OP_ACKNOWLEDGE_JOB,              /* Acknowledge-Job */
+  IPP_OP_FETCH_DOCUMENT,               /* Fetch-Document */
+  IPP_OP_FETCH_JOB,                    /* Fetch-Job */
+  IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES, /* Get-Output-Device-Attributes */
+  IPP_OP_UPDATE_ACTIVE_JOBS,           /* Update-Active-Jobs */
+  IPP_OP_DEREGISTER_OUTPUT_DEVICE,     /* Deregister-Output-Device */
+  IPP_OP_UPDATE_DOCUMENT_STATUS,       /* Update-Document-Status */
+  IPP_OP_UPDATE_JOB_STATUS,            /* Update-Job-Status */
+  IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES,
+                                       /* Update-Output-Device-Attributes */
+  IPP_OP_GET_NEXT_DOCUMENT_DATA,       /* Get-Next-Document-Data */
+
+  IPP_OP_PRIVATE = 0x4000,             /* Reserved @private@ */
+  IPP_OP_CUPS_GET_DEFAULT,             /* Get the default printer */
+  IPP_OP_CUPS_GET_PRINTERS,            /* Get a list of printers and/or classes */
+  IPP_OP_CUPS_ADD_MODIFY_PRINTER,      /* Add or modify a printer */
+  IPP_OP_CUPS_DELETE_PRINTER,          /* Delete a printer */
+  IPP_OP_CUPS_GET_CLASSES,             /* Get a list of classes @deprecated@ */
+  IPP_OP_CUPS_ADD_MODIFY_CLASS,                /* Add or modify a class */
+  IPP_OP_CUPS_DELETE_CLASS,            /* Delete a class */
+  IPP_OP_CUPS_ACCEPT_JOBS,             /* Accept new jobs on a printer */
+  IPP_OP_CUPS_REJECT_JOBS,             /* Reject new jobs on a printer */
+  IPP_OP_CUPS_SET_DEFAULT,             /* Set the default printer */
+  IPP_OP_CUPS_GET_DEVICES,             /* Get a list of supported devices */
+  IPP_OP_CUPS_GET_PPDS,                        /* Get a list of supported drivers */
+  IPP_OP_CUPS_MOVE_JOB,                        /* Move a job to a different printer */
+  IPP_OP_CUPS_AUTHENTICATE_JOB,                /* Authenticate a job @since CUPS 1.2/OS X 10.5@ */
+  IPP_OP_CUPS_GET_PPD,                 /* Get a PPD file @since CUPS 1.3/OS X 10.5@ */
+  IPP_OP_CUPS_GET_DOCUMENT = 0x4027    /* Get a document file @since CUPS 1.4/OS X 10.6@ */
+
+#  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_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_PORTRAIT = 3,                    /* No rotation */
-  IPP_LANDSCAPE,                       /* 90 degrees counter-clockwise */
-  IPP_REVERSE_LANDSCAPE,               /* 90 degrees clockwise */
-  IPP_REVERSE_PORTRAIT                 /* 180 degrees */
+  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 states ****/
 {
-  IPP_PRINTER_IDLE = 3,                        /* Printer is idle */
-  IPP_PRINTER_PROCESSING,              /* Printer is working */
-  IPP_PRINTER_STOPPED                  /* Printer is stopped */
+  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             /**** Qualities ****/
@@ -242,76 +465,169 @@ typedef enum ipp_res_e                   /**** Resolution units ****/
 
 typedef enum ipp_state_e               /**** IPP states ****/
 {
-  IPP_ERROR = -1,                      /* An error occurred */
-  IPP_IDLE,                            /* Nothing is happening/request completed */
-  IPP_HEADER,                          /* The request header needs to be sent/received */
-  IPP_ATTRIBUTE,                       /* One or more attributes need to be sent/received */
-  IPP_DATA                             /* IPP request data needs to be sent/received */
+  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 codes ****/
 {
   IPP_STATUS_CUPS_INVALID = -1,                /* Invalid status name for @link ippErrorValue@ */
-  IPP_OK = 0x0000,                     /* successful-ok */
-  IPP_OK_SUBST,                                /* successful-ok-ignored-or-substituted-attributes */
-  IPP_OK_CONFLICT,                     /* successful-ok-conflicting-attributes */
-  IPP_OK_IGNORED_SUBSCRIPTIONS,                /* successful-ok-ignored-subscriptions */
-  IPP_OK_IGNORED_NOTIFICATIONS,                /* successful-ok-ignored-notifications @private@ */
-  IPP_OK_TOO_MANY_EVENTS,              /* successful-ok-too-many-events */
-  IPP_OK_BUT_CANCEL_SUBSCRIPTION,      /* successful-ok-but-cancel-subscription @private@ */
-  IPP_OK_EVENTS_COMPLETE,              /* successful-ok-events-complete */
-  IPP_REDIRECTION_OTHER_SITE = 0x200,  /* redirection-other-site @private@ */
-  CUPS_SEE_OTHER = 0x280,              /* cups-see-other */
-  IPP_BAD_REQUEST = 0x0400,            /* client-error-bad-request */
-  IPP_FORBIDDEN,                       /* client-error-forbidden */
-  IPP_NOT_AUTHENTICATED,               /* client-error-not-authenticated */
-  IPP_NOT_AUTHORIZED,                  /* client-error-not-authorized */
-  IPP_NOT_POSSIBLE,                    /* client-error-not-possible */
-  IPP_TIMEOUT,                         /* client-error-timeout */
-  IPP_NOT_FOUND,                       /* client-error-not-found */
-  IPP_GONE,                            /* client-error-gone */
-  IPP_REQUEST_ENTITY,                  /* client-error-request-entity-too-large */
-  IPP_REQUEST_VALUE,                   /* client-error-request-value-too-long */
-  IPP_DOCUMENT_FORMAT,                 /* client-error-document-format-not-supported */
-  IPP_ATTRIBUTES,                      /* client-error-attributes-or-values-not-supported */
-  IPP_URI_SCHEME,                      /* client-error-uri-scheme-not-supported */
-  IPP_CHARSET,                         /* client-error-charset-not-supported */
-  IPP_CONFLICT,                                /* client-error-conflicting-attributes */
-  IPP_COMPRESSION_NOT_SUPPORTED,       /* client-error-compression-not-supported */
-  IPP_COMPRESSION_ERROR,               /* client-error-compression-error */
-  IPP_DOCUMENT_FORMAT_ERROR,           /* client-error-document-format-error */
-  IPP_DOCUMENT_ACCESS_ERROR,           /* client-error-document-access-error */
-  IPP_ATTRIBUTES_NOT_SETTABLE,         /* client-error-attributes-not-settable */
-  IPP_IGNORED_ALL_SUBSCRIPTIONS,       /* client-error-ignored-all-subscriptions */
-  IPP_TOO_MANY_SUBSCRIPTIONS,          /* client-error-too-many-subscriptions */
-  IPP_IGNORED_ALL_NOTIFICATIONS,       /* client-error-ignored-all-notifications @private@ */
-  IPP_PRINT_SUPPORT_FILE_NOT_FOUND,    /* client-error-print-support-file-not-found @private@ */
-  IPP_DOCUMENT_PASSWORD_ERROR,         /* client-error-document-password-error */
-  IPP_DOCUMENT_PERMISSION_ERROR,       /* client-error-document-permission-error */
-  IPP_DOCUMENT_SECURITY_ERROR,         /* client-error-document-security-error */
-  IPP_DOCUMENT_UNPRINTABLE_ERROR,      /* client-error-document-unprintable-error */
-
-  IPP_INTERNAL_ERROR = 0x0500,         /* server-error-internal-error */
-  IPP_OPERATION_NOT_SUPPORTED,         /* server-error-operation-not-supported */
-  IPP_SERVICE_UNAVAILABLE,             /* server-error-service-unavailable */
-  IPP_VERSION_NOT_SUPPORTED,           /* server-error-version-not-supported */
-  IPP_DEVICE_ERROR,                    /* server-error-device-error */
-  IPP_TEMPORARY_ERROR,                 /* server-error-temporary-error */
-  IPP_NOT_ACCEPTING,                   /* server-error-not-accepting-jobs */
-  IPP_PRINTER_BUSY,                    /* server-error-busy */
-  IPP_ERROR_JOB_CANCELED,              /* server-error-job-canceled */
-  IPP_MULTIPLE_JOBS_NOT_SUPPORTED,     /* server-error-multiple-document-jobs-not-supported */
-  IPP_PRINTER_IS_DEACTIVATED,          /* server-error-printer-is-deactivated */
-  IPP_TOO_MANY_JOBS,                   /* server-error-too-many-jobs */
-  IPP_TOO_MANY_DOCUMENTS,              /* server-error-too-many-documents */
-
-  IPP_AUTHENTICATION_CANCELED = 0x1000,        /* Authentication canceled by user @since CUPS 1.5/OS X 10.7@ */
-  IPP_PKI_ERROR,                       /* Error negotiating a secure connection @since CUPS 1.5/OS X 10.7@ */
-  IPP_UPGRADE_REQUIRED                 /* TLS upgrade required */
-
-  /* Legacy name for canceled status */
-#define IPP_ERROR_JOB_CANCELLED IPP_ERROR_JOB_CANCELED
-
+  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 */
+  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 */
+
+  /* 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/OS X 10.7@ */
+  IPP_STATUS_ERROR_CUPS_PKI,           /* cups-pki-error - Error negotiating a secure connection @since CUPS 1.5/OS X 10.7@ */
+  IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED/* cups-upgrade-required - TLS upgrade required */
+
+#  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                 /**** Format tags for attributes ****/
@@ -356,9 +672,14 @@ typedef enum ipp_tag_e                     /**** Format tags for attributes ****/
   IPP_TAG_MIMETYPE,                    /* MIME media type value */
   IPP_TAG_MEMBERNAME,                  /* Collection member name value */
   IPP_TAG_EXTENSION = 0x7f,            /* Extension point for 32-bit tags */
-  IPP_TAG_MASK = 0x7fffffff,           /* Mask for copied attribute values @private@ */
+  IPP_TAG_CUPS_MASK = 0x7fffffff,      /* Mask for copied attribute values @private@ */
   /* The following expression is used to avoid compiler warnings with +/-0x80000000 */
-  IPP_TAG_COPY = -0x7fffffff-1         /* Bitflag for copied attribute values @private@ */
+  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 ****/
@@ -379,12 +700,18 @@ typedef int (*ipp_copycb_t)(void *context, ipp_t *dst, ipp_attribute_t *attr);
  * Please use the new accessor functions available in CUPS 1.6 and later, as
  * these definitions will be moved to a private header file in a future release.
  *
- * Define _IPP_PRIVATE_STRUCTURES to cause the private IPP structures to be
+ * Define _IPP_PRIVATE_STRUCTURES to 1 to cause the private IPP structures to be
  * exposed in CUPS 1.6.  This happens automatically on OS X when compiling for
  * a deployment target of 10.7 or earlier.
+ *
+ * Define _IPP_PRIVATE_STRUCTURES to 0 to prevent the private IPP structures
+ * from being exposed.  This is useful when migrating existing code to the new
+ * accessors.
  */
 
-#  if defined(_CUPS_SOURCE) || defined(_CUPS_IPP_PRIVATE_H_)
+#  ifdef _IPP_PRIVATE_STRUCTURES
+     /* Somebody has overridden the value */
+#  elif defined(_CUPS_SOURCE) || defined(_CUPS_IPP_PRIVATE_H_)
      /* Building CUPS */
 #    define _IPP_PRIVATE_STRUCTURES 1
 #  elif defined(__APPLE__)
@@ -395,9 +722,11 @@ typedef int (*ipp_copycb_t)(void *context, ipp_t *dst, ipp_attribute_t *attr);
        /* Building for 10.7 and earlier */
 #      define _IPP_PRIVATE_STRUCTURES 1
 #    endif /* MAC_OS_X_VERSION_10_8 && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_8 */
+#  else
+#    define _IPP_PRIVATE_STRUCTURES 0
 #  endif /* _CUPS_SOURCE || _CUPS_IPP_PRIVATE_H_ */
 
-#  ifdef _IPP_PRIVATE_STRUCTURES
+#  if _IPP_PRIVATE_STRUCTURES
 typedef union _ipp_request_u           /**** Request Header ****/
 {
   struct                               /* Any Header */
@@ -494,6 +823,9 @@ struct _ipp_s                               /**** IPP Request/Response/Notification ****/
 
 /**** New in CUPS 1.4.4 ****/
   int                  use;            /* Use count @since CUPS 1.4.4/OS X 10.6.?@ */
+/**** New in CUPS 2.0 ****/
+  int                  atend,          /* At end of list? */
+                       curindex;       /* Current attribute index for hierarchical search */
 };
 #  endif /* _IPP_PRIVATE_STRUCTURES */
 
@@ -656,6 +988,41 @@ extern int         ippSetValueTag(ipp_t *ipp, ipp_attribute_t **attr,
 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...
@@ -667,5 +1034,5 @@ extern int         ippSetVersion(ipp_t *ipp, int major, int minor)
 #endif /* !_CUPS_IPP_H_ */
 
 /*
- * End of "$Id: ipp.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ipp.h 12666 2015-05-25 19:38:09Z msweet $".
  */
index 54cef2c..420ca7e 100644 (file)
@@ -1,27 +1,18 @@
 /*
- * "$Id: langprintf.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: langprintf.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Localized printf/puts functions for CUPS.
+ * Localized printf/puts functions for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 2002-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2002-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   _cupsLangPrintError()  - Print a message followed by a standard error.
- *   _cupsLangPrintFilter() - Print a formatted filter message string to a file.
- *   _cupsLangPrintf()      - Print a formatted message string to a file.
- *   _cupsLangPuts()        - Print a static message string to a file.
- *   _cupsSetLocale()       - Set the current locale and transcode the
- *                            command-line.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -39,7 +30,7 @@ void
 _cupsLangPrintError(const char *prefix,        /* I - Non-localized message prefix */
                     const char *message)/* I - Message */
 {
-  int          bytes;                  /* Number of bytes formatted */
+  ssize_t      bytes;                  /* Number of bytes formatted */
   int          last_errno;             /* Last error */
   char         buffer[2048],           /* Message buffer */
                *bufptr,                /* Pointer into buffer */
@@ -81,7 +72,7 @@ _cupsLangPrintError(const char *prefix,       /* I - Non-localized message prefix */
   else
     bufptr = buffer;
 
-  snprintf(bufptr, sizeof(buffer) - (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));
@@ -95,7 +86,7 @@ _cupsLangPrintError(const char *prefix,       /* I - Non-localized message prefix */
                             cg->lang_default->encoding);
 
   if (bytes > 0)
-    fwrite(output, 1, bytes, stderr);
+    fwrite(output, 1, (size_t)bytes, stderr);
 }
 
 
@@ -110,7 +101,7 @@ _cupsLangPrintFilter(
     const char *message,               /* I - Message string to use */
     ...)                               /* I - Additional arguments as needed */
 {
-  int          bytes;                  /* Number of bytes formatted */
+  ssize_t      bytes;                  /* Number of bytes formatted */
   char         temp[2048],             /* Temporary format buffer */
                buffer[2048],           /* Message buffer */
                output[8192];           /* Output buffer */
@@ -152,9 +143,9 @@ _cupsLangPrintFilter(
   */
 
   if (bytes > 0)
-    return ((int)fwrite(output, 1, bytes, fp));
+    return ((int)fwrite(output, 1, (size_t)bytes, fp));
   else
-    return (bytes);
+    return ((int)bytes);
 }
 
 
@@ -167,7 +158,7 @@ _cupsLangPrintf(FILE       *fp,             /* I - File to write to */
                const char *message,    /* I - Message string to use */
                ...)                    /* I - Additional arguments as needed */
 {
-  int          bytes;                  /* Number of bytes formatted */
+  ssize_t      bytes;                  /* Number of bytes formatted */
   char         buffer[2048],           /* Message buffer */
                output[8192];           /* Output buffer */
   va_list      ap;                     /* Pointer to additional arguments */
@@ -209,9 +200,9 @@ _cupsLangPrintf(FILE       *fp,             /* I - File to write to */
   */
 
   if (bytes > 0)
-    return ((int)fwrite(output, 1, bytes, fp));
+    return ((int)fwrite(output, 1, (size_t)bytes, fp));
   else
-    return (bytes);
+    return ((int)bytes);
 }
 
 
@@ -223,7 +214,7 @@ int                                 /* O - Number of bytes written */
 _cupsLangPuts(FILE       *fp,          /* I - File to write to */
               const char *message)     /* I - Message string to use */
 {
-  int          bytes;                  /* Number of bytes formatted */
+  ssize_t      bytes;                  /* Number of bytes formatted */
   char         output[8192];           /* Message buffer */
   _cups_globals_t *cg;                 /* Global data */
 
@@ -248,18 +239,16 @@ _cupsLangPuts(FILE       *fp,             /* I - File to write to */
                            (cups_utf8_t *)_cupsLangString(cg->lang_default,
                                                           message),
                            sizeof(output) - 4, cg->lang_default->encoding);
-  bytes += cupsUTF8ToCharset(output + bytes, (cups_utf8_t *)"\n",
-                             sizeof(output) - bytes,
-                            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, bytes, fp));
+    return ((int)fwrite(output, 1, (size_t)bytes, fp));
   else
-    return (bytes);
+    return ((int)bytes);
 }
 
 
@@ -301,10 +290,10 @@ _cupsSetLocale(char *argv[])              /* IO - Command-line arguments */
     if ((charset = strchr(new_lc_time, '.')) == NULL)
       charset = new_lc_time + strlen(new_lc_time);
 
-    strlcpy(charset, ".UTF-8", sizeof(new_lc_time) - (charset - new_lc_time));
+    strlcpy(charset, ".UTF-8", sizeof(new_lc_time) - (size_t)(charset - new_lc_time));
   }
   else
-    strcpy(new_lc_time, "C");
+    strlcpy(new_lc_time, "C", sizeof(new_lc_time));
 
   setlocale(LC_TIME, new_lc_time);
 #endif /* LC_TIME */
@@ -348,5 +337,5 @@ _cupsSetLocale(char *argv[])                /* IO - Command-line arguments */
 
 
 /*
- * End of "$Id: langprintf.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: langprintf.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 8b44b8b..93cdf08 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: language-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: language-private.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Private localization support for CUPS.
  *
@@ -82,5 +82,5 @@ extern void           _cupsSetLocale(char *argv[]);
 #endif /* !_CUPS_LANGUAGE_PRIVATE_H_ */
 
 /*
- * End of "$Id: language-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: language-private.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index b35a865..8579787 100644 (file)
@@ -1,43 +1,18 @@
 /*
- * "$Id: language.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: language.c 12841 2015-08-10 17:07:30Z msweet $"
  *
- *   I18N/language support for CUPS.
+ * I18N/language support for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   _cupsAppleLanguage()   - Get the Apple language identifier associated with
- *                           a locale ID.
- *   _cupsEncodingName()    - Return the character encoding name string for the
- *                           given encoding enumeration.
- *   cupsLangDefault()     - Return the default language.
- *   cupsLangEncoding()     - Return the character encoding (us-ascii, etc.)
- *                           for the given language.
- *   cupsLangFlush()       - Flush all language data out of the cache.
- *   cupsLangFree()        - Free language data.
- *   cupsLangGet()         - Get a language.
- *   _cupsLangString()     - Get a message string.
- *   _cupsMessageFree()     - Free a messages array.
- *   _cupsMessageLoad()     - Load a .po file into a messages array.
- *   _cupsMessageLookup()   - Lookup a message string.
- *   _cupsMessageNew()     - Make a new message catalog array.
- *   appleLangDefault()     - Get the default locale string.
- *   appleMessageLoad()     - Load a message catalog from a localizable bundle.
- *   cups_cache_lookup()    - Lookup a language in the cache...
- *   cups_message_compare() - Compare two messages.
- *   cups_message_free()    - Free a message.
- *   cups_message_load()    - Load the message catalog for a language.
- *   cups_unquote()        - Unquote characters in strings...
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -134,7 +109,7 @@ static const char * const lang_encodings[] =
                          "unknown",            "unknown",
                          "euc-cn",             "euc-jp",
                          "euc-kr",             "euc-tw",
-                         "jis-x0213"
+                         "shift_jisx0213"
                        };
 
 #ifdef __APPLE__
@@ -227,8 +202,8 @@ _cupsAppleLanguage(const char *locale,      /* I - Locale ID */
          */
 
          language[2] = '_';
-         language[3] = toupper(language[3] & 255);
-         language[4] = toupper(language[4] & 255);
+         language[3] = (char)toupper(language[3] & 255);
+         language[4] = (char)toupper(language[4] & 255);
        }
        break;
   }
@@ -253,7 +228,7 @@ _cupsAppleLanguage(const char *locale,      /* I - Locale ID */
     if ((langid = CFLocaleCreateCanonicalLanguageIdentifierFromString(
                       kCFAllocatorDefault, localeid)) != NULL)
     {
-      CFStringGetCString(langid, language, langsize, kCFStringEncodingASCII);
+      CFStringGetCString(langid, language, (CFIndex)langsize, kCFStringEncodingASCII);
       CFRelease(langid);
     }
 
@@ -278,8 +253,8 @@ const char *                                /* O - Character encoding */
 _cupsEncodingName(
     cups_encoding_t encoding)          /* I - Encoding value */
 {
-  if (encoding < 0 ||
-      encoding >= (sizeof(lang_encodings) / sizeof(const char *)))
+  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]));
@@ -446,7 +421,7 @@ cupsLangGet(const char *language)   /* I - Language or locale */
   * Set the character set to UTF-8...
   */
 
-  strcpy(charset, "UTF8");
+  strlcpy(charset, "UTF8", sizeof(charset));
 
  /*
   * Apple's setlocale doesn't give us the user's localization
@@ -582,7 +557,7 @@ cupsLangGet(const char *language)   /* I - Language or locale */
   */
 
   if (!charset[0])
-    strcpy(charset, "UTF8");
+    strlcpy(charset, "UTF8", sizeof(charset));
 
  /*
   * Parse the language string passed in to a locale string. "C" is the
@@ -597,7 +572,7 @@ cupsLangGet(const char *language)   /* I - Language or locale */
 
   if (language == NULL || !language[0] ||
       !strcmp(language, "POSIX"))
-    strcpy(langname, "C");
+    strlcpy(langname, "C", sizeof(langname));
   else
   {
    /*
@@ -608,7 +583,7 @@ cupsLangGet(const char *language)   /* I - Language or locale */
       if (*language == '_' || *language == '-' || *language == '.')
        break;
       else if (ptr < (langname + sizeof(langname) - 1))
-        *ptr++ = tolower(*language & 255);
+        *ptr++ = (char)tolower(*language & 255);
 
     *ptr = '\0';
 
@@ -622,7 +597,7 @@ cupsLangGet(const char *language)   /* I - Language or locale */
        if (*language == '.')
          break;
        else if (ptr < (country + sizeof(country) - 1))
-          *ptr++ = toupper(*language & 255);
+          *ptr++ = (char)toupper(*language & 255);
 
       *ptr = '\0';
     }
@@ -635,7 +610,7 @@ cupsLangGet(const char *language)   /* I - Language or locale */
 
       for (language ++, ptr = charset; *language; language ++)
         if (_cups_isalnum(*language) && ptr < (charset + sizeof(charset) - 1))
-          *ptr++ = toupper(*language & 255);
+          *ptr++ = (char)toupper(*language & 255);
 
       *ptr = '\0';
     }
@@ -646,7 +621,7 @@ cupsLangGet(const char *language)   /* I - Language or locale */
 
     if (strlen(langname) != 2)
     {
-      strcpy(langname, "C");
+      strlcpy(langname, "C", sizeof(langname));
       country[0] = '\0';
       charset[0] = '\0';
     }
@@ -701,7 +676,7 @@ cupsLangGet(const char *language)   /* I - Language or locale */
   if (country[0])
     snprintf(real, sizeof(real), "%s_%s", langname, country);
   else
-    strcpy(real, langname);
+    strlcpy(real, langname, sizeof(real));
 
   _cupsMutexLock(&lang_mutex);
 
@@ -846,7 +821,8 @@ _cupsMessageLoad(const char *filename,      /* I - Message catalog to load */
   char                 s[4096],        /* String buffer */
                        *ptr,           /* Pointer into buffer */
                        *temp;          /* New string */
-  int                  length;         /* Length of combined strings */
+  size_t               length,         /* Length of combined strings */
+                       ptrlen;         /* Length of string */
 
 
   DEBUG_printf(("4_cupsMessageLoad(filename=\"%s\")", filename));
@@ -977,10 +953,10 @@ _cupsMessageLoad(const char *filename,    /* I - Message catalog to load */
       * Append to current string...
       */
 
-      length = (int)strlen(m->str ? m->str : m->id);
+      length = strlen(m->str ? m->str : m->id);
+      ptrlen = strlen(ptr);
 
-      if ((temp = realloc(m->str ? m->str : m->id,
-                          length + strlen(ptr) + 1)) == NULL)
+      if ((temp = realloc(m->str ? m->str : m->id, length + ptrlen + 1)) == NULL)
       {
         if (m->str)
          free(m->str);
@@ -995,25 +971,25 @@ _cupsMessageLoad(const char *filename,    /* I - Message catalog to load */
       {
        /*
         * Copy the new portion to the end of the msgstr string - safe
-       * to use strcpy because the buffer is allocated to the correct
+       * to use memcpy because the buffer is allocated to the correct
        * size...
        */
 
         m->str = temp;
 
-       strcpy(m->str + length, ptr);
+       memcpy(m->str + 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
+       * to use memcpy because the buffer is allocated to the correct
        * size...
        */
 
         m->id = temp;
 
-       strcpy(m->id + length, ptr);
+       memcpy(m->id + length, ptr, ptrlen + 1);
       }
     }
     else if (!strncmp(s, "msgstr", 6) && m)
@@ -1163,7 +1139,7 @@ appleLangDefault(void)
   int                  i;              /* Looping var */
   CFBundleRef          bundle;         /* Main bundle (if any) */
   CFArrayRef           bundleList;     /* List of localizations in bundle */
-  CFPropertyListRef    localizationList;
+  CFPropertyListRef    localizationList = NULL;
                                        /* List of localization data */
   CFStringRef          languageName;   /* Current name */
   CFStringRef          localeName;     /* Canonical from of name */
@@ -1182,24 +1158,67 @@ appleLangDefault(void)
   {
     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)
     {
-      localizationList =
-         CFBundleCopyPreferredLocalizationsFromArray(bundleList);
+      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);
     }
-    else
+
+    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)
       {
@@ -1217,7 +1236,7 @@ appleLangDefault(void)
                               kCFStringEncodingASCII);
            CFRelease(localeName);
 
-           DEBUG_printf(("9appleLangDefault: cg->language=\"%s\"",
+           DEBUG_printf(("3appleLangDefault: cg->language=\"%s\"",
                          cg->language));
 
           /*
@@ -1231,7 +1250,7 @@ appleLangDefault(void)
            {
              if (!strcmp(cg->language, apple_language_locale[i].language))
              {
-               DEBUG_printf(("9appleLangDefault: mapping \"%s\" to \"%s\"...",
+               DEBUG_printf(("3appleLangDefault: mapping \"%s\" to \"%s\"...",
                              cg->language, apple_language_locale[i].locale));
                strlcpy(cg->language, apple_language_locale[i].locale,
                        sizeof(cg->language));
@@ -1249,6 +1268,8 @@ appleLangDefault(void)
            if (!strchr(cg->language, '.'))
              strlcat(cg->language, ".UTF-8", sizeof(cg->language));
          }
+         else
+           DEBUG_puts("3appleLangDefault: Unable to get localeName.");
        }
       }
 
@@ -1260,8 +1281,13 @@ appleLangDefault(void)
     */
 
     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...
@@ -1280,7 +1306,8 @@ 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 */
+                       applelang[256], /* Apple language ID */
+                       baselang[3];    /* Base language */
   CFURLRef             url;            /* URL to cups.strings file */
   CFReadStreamRef      stream = NULL;  /* File stream */
   CFPropertyListRef    plist = NULL;   /* Localization file */
@@ -1298,6 +1325,18 @@ appleMessageLoad(const char *locale)     /* I - Locale ID */
   snprintf(filename, sizeof(filename),
            CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings",
           _cupsAppleLanguage(locale, applelang, sizeof(applelang)));
+
+  if (access(filename, 0))
+  {
+   /*
+    * <rdar://problem/22086642>
+    *
+    * Try with original locale string...
+    */
+
+    snprintf(filename, sizeof(filename), CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", locale);
+  }
+
   DEBUG_printf(("1appleMessageLoad: filename=\"%s\"", filename));
 
   if (access(filename, 0))
@@ -1320,6 +1359,28 @@ appleMessageLoad(const char *locale)     /* I - Locale ID */
       locale = "Japanese";
     else if (!strncmp(locale, "es", 2))
       locale = "Spanish";
+    else if (!strcmp(locale, "zh_HK"))
+    {
+     /*
+      * <rdar://problem/22130168>
+      *
+      * 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));
+      locale = baselang;
+    }
 
     snprintf(filename, sizeof(filename),
             CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", locale);
@@ -1328,7 +1389,7 @@ appleMessageLoad(const char *locale)      /* I - Locale ID */
 
   url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
                                                 (UInt8 *)filename,
-                                               strlen(filename), false);
+                                               (CFIndex)strlen(filename), false);
   if (url)
   {
     stream = CFReadStreamCreateWithFile(kCFAllocatorDefault, url);
@@ -1563,5 +1624,5 @@ cups_unquote(char       *d,               /* O - Unquoted string */
 
 
 /*
- * End of "$Id: language.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: language.c 12841 2015-08-10 17:07:30Z msweet $".
  */
index d2ad208..4fcf9e8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: language.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: language.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Multi-language support for CUPS.
  *
@@ -111,5 +111,5 @@ extern cups_lang_t  *cupsLangGet(const char *language);
 #endif /* !_CUPS_LANGUAGE_H_ */
 
 /*
- * End of "$Id: language.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: language.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index ef22daa..66ab4ad 100644 (file)
-LIBRARY libcups2\r
-VERSION 2.9\r
-EXPORTS\r
-_cupsBufferGet\r
-_cupsBufferRelease\r
-_cupsGet1284Values\r
-_cupsGetDests\r
-_cupsGetPassword\r
-_cupsGlobals\r
-_cupsLangPrintError\r
-_cupsLangPrintf\r
-_cupsLangPuts\r
-_cupsLangString\r
-_cupsMD5Append\r
-_cupsMD5Finish\r
-_cupsMD5Init\r
-_cupsMessageFree\r
-_cupsMessageLoad\r
-_cupsMessageLookup\r
-_cupsMutexLock\r
-_cupsMutexUnlock\r
-_cupsNextDelay\r
-_cupsSetError\r
-_cupsSetLocale\r
-_cupsStrAlloc\r
-_cupsStrFlush\r
-_cupsStrFormatd\r
-_cupsStrFree\r
-_cupsStrRetain\r
-_cupsStrScand\r
-_cupsStrStatistics\r
-_cups_strcasecmp\r
-_cups_strncasecmp\r
-_cups_strcpy\r
-_cups_strlcat\r
-_cups_strlcpy\r
-_httpAddrPort\r
-_httpAddrSetPort\r
-_httpAssembleUUID\r
-_httpCreate\r
-_httpEncodeURI\r
-_httpPeek\r
-_httpResolveURI\r
-_httpWait\r
-_ippFindOption\r
-_ppdCacheCreateWithFile\r
-_ppdCacheCreateWithPPD\r
-_ppdCacheDestroy\r
-_ppdCacheGetBin\r
-_ppdCacheGetInputSlot\r
-_ppdCacheGetMediaType\r
-_ppdCacheGetOutputBin\r
-_ppdCacheGetPageSize\r
-_ppdCacheGetSize\r
-_ppdCacheGetSource\r
-_ppdCacheGetType\r
-_ppdCacheWriteFile\r
-_ppdFreeLanguages\r
-_ppdGetEncoding\r
-_ppdGetLanguages\r
-_ppdHashName\r
-_ppdLocalizedAttr\r
-_ppdNormalizeMakeAndModel\r
-_ppdOpen\r
-_ppdOpenFile\r
-_ppdParseOptions\r
-_pwgGenerateSize\r
-_pwgInitSize\r
-_pwgMediaForLegacy\r
-_pwgMediaForPPD\r
-_pwgMediaForPWG\r
-_pwgMediaForSize\r
-_pwgMediaTypeForType\r
-_pwgPageSizeForMedia\r
-cupsAddDest\r
-cupsAddOption\r
-cupsAdminCreateWindowsPPD\r
-cupsAdminExportSamba\r
-cupsArrayAdd\r
-cupsArrayClear\r
-cupsArrayCount\r
-cupsArrayCurrent\r
-cupsArrayDelete\r
-cupsArrayDup\r
-cupsArrayFind\r
-cupsArrayFirst\r
-cupsArrayGetIndex\r
-cupsArrayGetInsert\r
-cupsArrayIndex\r
-cupsArrayInsert\r
-cupsArrayLast\r
-cupsArrayNew\r
-cupsArrayNew2\r
-cupsArrayNew3\r
-cupsArrayNext\r
-cupsArrayPrev\r
-cupsArrayRemove\r
-cupsArrayRestore\r
-cupsArraySave\r
-cupsArrayUserData\r
-cupsCancelJob\r
-cupsCharsetToUTF8\r
-cupsDirClose\r
-cupsDirOpen\r
-cupsDirRead\r
-cupsDirRewind\r
-cupsDoAuthentication\r
-cupsDoFileRequest\r
-cupsDoIORequest\r
-cupsDoRequest\r
-cupsEncodeOptions\r
-cupsEncodeOptions2\r
-cupsEncryption\r
-cupsFileClose\r
-cupsFileCompression\r
-cupsFileEOF\r
-cupsFileFind\r
-cupsFileFlush\r
-cupsFileGetChar\r
-cupsFileGetConf\r
-cupsFileGetLine\r
-cupsFileGets\r
-cupsFileLock\r
-cupsFileNumber\r
-cupsFileOpen\r
-cupsFileOpenFd\r
-cupsFilePeekChar\r
-cupsFilePrintf\r
-cupsFilePutChar\r
-cupsFilePuts\r
-cupsFileRead\r
-cupsFileRewind\r
-cupsFileSeek\r
-cupsFileStderr\r
-cupsFileStdin\r
-cupsFileStdout\r
-cupsFileTell\r
-cupsFileUnlock\r
-cupsFileWrite\r
-cupsFreeDests\r
-cupsFreeJobs\r
-cupsFreeOptions\r
-cupsGetClasses\r
-cupsGetDefault\r
-cupsGetDefault2\r
-cupsGetDest\r
-cupsGetDests\r
-cupsGetDests2\r
-cupsGetFd\r
-cupsGetFile\r
-cupsGetJobs\r
-cupsGetJobs2\r
-cupsGetOption\r
-cupsGetPPD\r
-cupsGetPPD2\r
-cupsGetPassword\r
-cupsGetPrinters\r
-cupsGetResponse\r
-cupsLangDefault\r
-cupsLangEncoding\r
-cupsLangFlush\r
-cupsLangFree\r
-cupsLangGet\r
-cupsLastError\r
-cupsLastErrorString\r
-cupsMarkOptions\r
-cupsNotifySubject\r
-cupsNotifyText\r
-cupsParseOptions\r
-cupsPrintFile\r
-cupsPrintFile2\r
-cupsPrintFiles\r
-cupsPrintFiles2\r
-cupsPutFd\r
-cupsPutFile\r
-cupsRemoveOption\r
-cupsResolveConflicts\r
-cupsSendRequest\r
-cupsServer\r
-cupsSetClientCertCB\r
-cupsSetCredentials\r
-cupsSetDests\r
-cupsSetDests2\r
-cupsSetEncryption\r
-cupsSetPasswordCB\r
-cupsSetServer\r
-cupsSetServerCertCB\r
-cupsSetUser\r
-cupsTempFd\r
-cupsTempFile\r
-cupsTempFile2\r
-cupsUTF32ToUTF8\r
-cupsUTF8ToCharset\r
-cupsUTF8ToUTF32\r
-cupsUser\r
-cupsWriteRequestData\r
-httpAddCredential\r
-httpAddrAny\r
-httpAddrConnect\r
-httpAddrEqual\r
-httpAddrFreeList\r
-httpAddrGetList\r
-httpAddrLength\r
-httpAddrLocalhost\r
-httpAddrLookup\r
-httpAddrString\r
-httpAssembleURI\r
-httpAssembleURIf\r
-httpBlocking\r
-httpCheck\r
-httpClearCookie\r
-httpClearFields\r
-httpClose\r
-httpConnect\r
-httpConnectEncrypt\r
-httpCopyCredentials\r
-httpDecode64\r
-httpDecode64_2\r
-httpDelete\r
-httpEncode64\r
-httpEncode64_2\r
-httpEncryption\r
-httpError\r
-httpFlush\r
-httpFlushWrite\r
-httpFreeCredentials\r
-httpGet\r
-httpGetBlocking\r
-httpGetCookie\r
-httpGetDateString\r
-httpGetDateString2\r
-httpGetDateTime\r
-httpGetFd\r
-httpGetField\r
-httpGetHostByName\r
-httpGetHostname\r
-httpGetLength\r
-httpGetLength2\r
-httpGetStatus\r
-httpGetSubField\r
-httpGetSubField2\r
-httpGets\r
-httpHead\r
-httpInitialize\r
-httpMD5\r
-httpMD5Final\r
-httpMD5String\r
-httpOptions\r
-httpPost\r
-httpPrintf\r
-httpPut\r
-httpRead\r
-httpRead2\r
-httpReconnect\r
-httpSeparate\r
-httpSeparate2\r
-httpSeparateURI\r
-httpSetCookie\r
-httpSetCredentials\r
-httpSetExpect\r
-httpSetField\r
-httpSetLength\r
-httpSetTimeout\r
-httpStatus\r
-httpTrace\r
-httpUpdate\r
-httpWait\r
-httpWrite\r
-httpWrite2\r
-ippAddBoolean\r
-ippAddBooleans\r
-ippAddCollection\r
-ippAddCollections\r
-ippAddDate\r
-ippAddInteger\r
-ippAddIntegers\r
-ippAddOctetString\r
-ippAddOutOfBand\r
-ippAddRange\r
-ippAddRanges\r
-ippAddResolution\r
-ippAddResolutions\r
-ippAddSeparator\r
-ippAddString\r
-ippAddStrings\r
-ippAttributeString\r
-ippCopyAttribute\r
-ippCopyAttributes\r
-ippDateToTime\r
-ippDelete\r
-ippDeleteAttribute\r
-ippDeleteValues\r
-ippEnumString\r
-ippEnumValue\r
-ippErrorString\r
-ippErrorValue\r
-ippFindAttribute\r
-ippFindNextAttribute\r
-ippFirstAttribute\r
-ippGetBoolean\r
-ippGetCollection\r
-ippGetCount\r
-ippGetDate\r
-ippGetGroupTag\r
-ippGetInteger\r
-ippGetName\r
-ippGetOperation\r
-ippGetRange\r
-ippGetRequestId\r
-ippGetResolution\r
-ippGetState\r
-ippGetStatusCode\r
-ippGetString\r
-ippGetValueTag\r
-ippGetVersion\r
-ippLength\r
-ippNew\r
-ippNewRequest\r
-ippNextAttribute\r
-ippOpString\r
-ippOpValue\r
-ippPort\r
-ippRead\r
-ippReadFile\r
-ippReadIO\r
-ippSetPort\r
-ippSetBoolean\r
-ippSetCollection\r
-ippSetDate\r
-ippSetGroupTag\r
-ippSetInteger\r
-ippSetName\r
-ippSetOperation\r
-ippSetRange\r
-ippSetRequestId\r
-ippSetResolution\r
-ippSetState\r
-ippSetStatusCode\r
-ippSetString\r
-ippSetValueTag\r
-ippSetVersion\r
-ippTagString\r
-ippTagValue\r
-ippTimeToDate\r
-ippWrite\r
-ippWriteFile\r
-ippWriteIO\r
-ppdClose\r
-ppdCollect\r
-ppdCollect2\r
-ppdConflicts\r
-ppdEmit\r
-ppdEmitAfterOrder\r
-ppdEmitFd\r
-ppdEmitJCL\r
-ppdEmitJCLEnd\r
-ppdEmitString\r
-ppdErrorString\r
-ppdFindAttr\r
-ppdFindChoice\r
-ppdFindCustomOption\r
-ppdFindCustomParam\r
-ppdFindMarkedChoice\r
-ppdFindNextAttr\r
-ppdFindOption\r
-ppdFirstCustomParam\r
-ppdFirstOption\r
-ppdIsMarked\r
-ppdLastError\r
-ppdLocalize\r
-ppdMarkDefaults\r
-ppdMarkOption\r
-ppdNextCustomParam\r
-ppdNextOption\r
-ppdOpen\r
-ppdOpen2\r
-ppdOpenFd\r
-ppdOpenFile\r
-ppdPageLength\r
-ppdPageSize\r
-ppdPageWidth\r
-ppdSetConformance\r
+LIBRARY libcups2
+VERSION 2.11
+EXPORTS
+_cupsArrayAddStrings
+_cupsArrayNewStrings
+_cupsBufferGet
+_cupsBufferRelease
+_cupsCharmapFlush
+_cupsConnect
+_cupsEncodingName
+_cupsGet1284Values
+_cupsGetDestResource
+_cupsGetDests
+_cupsGetPassword
+_cupsGlobalLock
+_cupsGlobalUnlock
+_cupsGlobals
+_cupsLangPrintError
+_cupsLangPrintf
+_cupsLangPuts
+_cupsLangString
+_cupsMD5Append
+_cupsMD5Finish
+_cupsMD5Init
+_cupsMessageFree
+_cupsMessageLoad
+_cupsMessageLookup
+_cupsMessageNew
+_cupsMutexInit
+_cupsMutexLock
+_cupsMutexUnlock
+_cupsNextDelay
+_cupsRWInit
+_cupsRWLockRead
+_cupsRWLockWrite
+_cupsRWUnlock
+_cupsSNMPClose
+_cupsSNMPCopyOID
+_cupsSNMPDefaultCommunity
+_cupsSNMPIsOID
+_cupsSNMPIsOIDPrefixed
+_cupsSNMPOIDToString
+_cupsSNMPOpen
+_cupsSNMPRead
+_cupsSNMPSetDebug
+_cupsSNMPStringToOID
+_cupsSNMPWalk
+_cupsSNMPWrite
+_cupsSetDefaults
+_cupsSetError
+_cupsSetHTTPError
+_cupsSetLocale
+_cupsStrAlloc
+_cupsStrDate
+_cupsStrFlush
+_cupsStrFormatd
+_cupsStrFree
+_cupsStrRetain
+_cupsStrScand
+_cupsStrStatistics
+_cupsThreadCreate
+_cupsUserDefault
+_cups_strcasecmp
+_cups_strcpy
+_cups_strcpy
+_cups_strlcat
+_cups_strlcpy
+_cups_strncasecmp
+_httpAddrSetPort
+_httpCreateCredentials
+_httpDecodeURI
+_httpDisconnect
+_httpEncodeURI
+_httpFreeCredentials
+_httpResolveURI
+_httpStatus
+_httpTLSInitialize
+_httpTLSPending
+_httpTLSRead
+_httpTLSStart
+_httpTLSStop
+_httpTLSWrite
+_httpUpdate
+_httpWait
+_ippCheckOptions
+_ippFindOption
+_ppdCacheCreateWithFile
+_ppdCacheCreateWithPPD
+_ppdCacheDestroy
+_ppdCacheGetBin
+_ppdCacheGetFinishingOptions
+_ppdCacheGetFinishingValues
+_ppdCacheGetInputSlot
+_ppdCacheGetMediaType
+_ppdCacheGetOutputBin
+_ppdCacheGetPageSize
+_ppdCacheGetSize
+_ppdCacheGetSource
+_ppdCacheGetType
+_ppdCacheWriteFile
+_ppdFreeLanguages
+_ppdGetEncoding
+_ppdGetLanguages
+_ppdHashName
+_ppdLocalizedAttr
+_ppdNormalizeMakeAndModel
+_ppdOpen
+_ppdOpenFile
+_ppdParseOptions
+_pwgGenerateSize
+_pwgInitSize
+_pwgInputSlotForSource
+_pwgMediaForLegacy
+_pwgMediaForPPD
+_pwgMediaForPWG
+_pwgMediaForSize
+_pwgMediaNearSize
+_pwgMediaTable
+_pwgMediaTypeForType
+_pwgPageSizeForMedia
+cupsAddDest
+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
+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
+cupsGetJobs
+cupsGetJobs2
+cupsGetNamedDest
+cupsGetOption
+cupsGetPPD
+cupsGetPPD2
+cupsGetPPD3
+cupsGetPassword
+cupsGetPassword2
+cupsGetPrinters
+cupsGetResponse
+cupsGetServerPPD
+cupsLangDefault
+cupsLangEncoding
+cupsLangFlush
+cupsLangFree
+cupsLangGet
+cupsLastError
+cupsLastErrorString
+cupsLocalizeDestMedia
+cupsLocalizeDestOption
+cupsLocalizeDestValue
+cupsMakeServerCredentials
+cupsMarkOptions
+cupsNotifySubject
+cupsNotifyText
+cupsParseOptions
+cupsPrintFile
+cupsPrintFile2
+cupsPrintFiles
+cupsPrintFiles2
+cupsPutFd
+cupsPutFile
+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
diff --git a/cups/libcups_s.exp b/cups/libcups_s.exp
deleted file mode 100644 (file)
index b8b2207..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-_cups_debug_fd
-_cupsBufferGet
-_cupsBufferRelease
-_cupsGet1284Values
-_cupsGetDests
-_cupsGetPassword
-_cupsGlobals
-_cupsLangPrintError
-_cupsLangPrintf
-_cupsLangPuts
-_cupsLangString
-_cupsMD5Append
-_cupsMD5Finish
-_cupsMD5Init
-_cupsMessageFree
-_cupsMessageLoad
-_cupsMessageLookup
-_cupsNextDelay
-_cupsSetError
-_cupsSetLocale
-_cupsSNMPClose
-_cupsSNMPCopyOID
-_cupsSNMPDefaultCommunity
-_cupsSNMPIsOID
-_cupsSNMPIsOIDPrefixed
-_cupsSNMPOIDToString
-_cupsSNMPOpen
-_cupsSNMPRead
-_cupsSNMPSetDebug
-_cupsSNMPStringToOID
-_cupsSNMPWalk
-_cupsSNMPWrite
-_cupsStrAlloc
-_cupsStrFlush
-_cupsStrFormatd
-_cupsStrFree
-_cupsStrRetain
-_cupsStrScand
-_cupsStrStatistics
-_cups_getifaddrs
-_cups_freeifaddrs
-_cups_strcpy
-_cups_strlcat
-_cups_strlcpy
-_httpAddrPort
-_httpAddrSetPort
-_httpAssembleUUID
-_httpBIOMethods
-_httpCreate
-_httpEncodeURI
-_httpPeek
-_httpResolveURI
-_httpSetTimeout
-_httpWait
-_ippFindOption
-_ppdFreeLanguages
-_ppdGetEncoding
-_ppdGetLanguages
-_ppdHashName
-_ppdLocalizedAttr
-_ppdNormalizeMakeAndModel
-_ppdOpen
-_ppdOpenFile
-_ppdParseOptions
-_pwgCreateWithFile
-_pwgDestroy
-_pwgWriteFile
-_pwgGenerateSize
-_pwgInitSize
-_pwgMediaForLegacy
-_pwgMediaForPPD
-_pwgMediaForPWG
-_pwgMediaForSize
-_pwgCreateWithPPD
-_pwgGetBin
-_pwgGetInputSlot
-_pwgGetMediaType
-_pwgGetOutputBin
-_pwgGetPageSize
-_pwgGetSize
-_pwgGetSource
-_pwgGetType
-_pwgInputSlotForSource
-_pwgMediaTypeForType
-_pwgPageSizeForMedia
index 30ccda4..23faa55 100644 (file)
@@ -1,42 +1,27 @@
 /*
- * "$Id: localize.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: localize.c 12834 2015-08-06 13:56:32Z msweet $"
  *
- *   PPD localization routines for CUPS.
+ * PPD localization routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   PostScript is a trademark of Adobe Systems, Inc.
+ * PostScript is a trademark of Adobe Systems, Inc.
  *
- *   This code and any derivative of it may be used and distributed
- *   freely under the terms of the GNU General Public License when
- *   used with GNU Ghostscript or its derivatives.  Use of the code
- *   (or any derivative of it) with software other than GNU
- *   GhostScript (or its derivatives) is governed by the CUPS license
- *   agreement.
+ * This code and any derivative of it may be used and distributed
+ * freely under the terms of the GNU General Public License when
+ * used with GNU Ghostscript or its derivatives.  Use of the code
+ * (or any derivative of it) with software other than GNU
+ * GhostScript (or its derivatives) is governed by the CUPS license
+ * agreement.
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   ppdLocalize()           - Localize the PPD file to the current locale.
- *   ppdLocalizeAttr()       - Localize an attribute.
- *   ppdLocalizeIPPReason()  - Get the localized version of a cupsIPPReason
- *                             attribute.
- *   ppdLocalizeMarkerName() - Get the localized version of a marker-names
- *                             attribute value.
- *   _ppdFreeLanguages()     - Free an array of languages from _ppdGetLanguages.
- *   _ppdGetLanguages()      - Get an array of languages from a PPD file.
- *   _ppdHashName()          - Generate a hash value for a device or profile
- *                             name.
- *   _ppdLocalizedAttr()     - Find a localized attribute.
- *   ppd_ll_CC()             - Get the current locale names.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -51,7 +36,7 @@
  * Local functions...
  */
 
-static cups_lang_t     *ppd_ll_CC(char *ll_CC, int ll_CC_size);
+static cups_lang_t     *ppd_ll_CC(char *ll_CC, size_t ll_CC_size);
 
 
 /*
@@ -263,8 +248,8 @@ ppdLocalizeIPPReason(
                *bufptr,                /* Pointer into buffer */
                *bufend,                /* Pointer to end of buffer */
                *valptr;                /* Pointer into value */
-  int          ch,                     /* Hex-encoded character */
-               schemelen;              /* Length of scheme name */
+  int          ch;                     /* Hex-encoded character */
+  size_t       schemelen;              /* Length of scheme name */
 
 
  /*
@@ -303,14 +288,14 @@ ppdLocalizeIPPReason(
       const char *message = NULL;      /* Localized message */
 
       if (!strncmp(reason, "media-needed", 12))
-       message = _("The paper tray needs to be filled.");
+       message = _("Load paper.");
       else if (!strncmp(reason, "media-jam", 9))
-       message = _("There is a paper jam.");
+       message = _("Paper jam.");
       else if (!strncmp(reason, "offline", 7) ||
                       !strncmp(reason, "shutdown", 8))
        message = _("The printer is not connected.");
       else if (!strncmp(reason, "toner-low", 9))
-       message = _("The printer is running low on toner.");
+       message = _("The printer is low on toner.");
       else if (!strncmp(reason, "toner-empty", 11))
        message = _("The printer may be out of toner.");
       else if (!strncmp(reason, "cover-open", 10))
@@ -320,19 +305,19 @@ ppdLocalizeIPPReason(
       else if (!strncmp(reason, "door-open", 9))
        message = _("The printer's door is open.");
       else if (!strncmp(reason, "input-tray-missing", 18))
-       message = _("The paper tray is missing.");
+       message = _("Paper tray is missing.");
       else if (!strncmp(reason, "media-low", 9))
-       message = _("The paper tray is almost empty.");
+       message = _("Paper tray is almost empty.");
       else if (!strncmp(reason, "media-empty", 11))
-       message = _("The paper tray is empty.");
+       message = _("Paper tray is empty.");
       else if (!strncmp(reason, "output-tray-missing", 19))
-       message = _("The output bin is missing.");
+       message = _("Output bin is missing.");
       else if (!strncmp(reason, "output-area-almost-full", 23))
-       message = _("The output bin is almost full.");
+       message = _("Output bin is almost full.");
       else if (!strncmp(reason, "output-area-full", 16))
-       message = _("The output bin is full.");
+       message = _("Output bin is full.");
       else if (!strncmp(reason, "marker-supply-low", 17))
-       message = _("The printer is running low on ink.");
+       message = _("The printer is low on ink.");
       else if (!strncmp(reason, "marker-supply-empty", 19))
        message = _("The printer may be out of ink.");
       else if (!strncmp(reason, "marker-waste-almost-full", 24))
@@ -405,9 +390,9 @@ ppdLocalizeIPPReason(
            valptr ++;
 
            if (isdigit(*valptr & 255))
-             *bufptr++ = ch | (*valptr - '0');
+             *bufptr++ = (char)(ch | (*valptr - '0'));
            else
-             *bufptr++ = ch | (tolower(*valptr) - 'a' + 10);
+             *bufptr++ = (char)(ch | (tolower(*valptr) - 'a' + 10));
            valptr ++;
          }
          else if (*valptr == '+')
@@ -644,8 +629,8 @@ _ppdGetLanguages(ppd_file_t *ppd)   /* I - PPD file */
 unsigned                               /* O - Hash value */
 _ppdHashName(const char *name)         /* I - Name to hash */
 {
-  int          mult;                   /* Multiplier */
-  unsigned     hash = 0;               /* Hash value */
+  unsigned     mult,                   /* Multiplier */
+               hash = 0;               /* Hash value */
 
 
   for (mult = 1; *name && mult <= 128; mult ++, name ++)
@@ -679,8 +664,23 @@ _ppdLocalizedAttr(ppd_file_t *ppd, /* I - PPD file */
   snprintf(lkeyword, sizeof(lkeyword), "%s.%s", ll_CC, keyword);
   if ((attr = ppdFindAttr(ppd, lkeyword, spec)) == NULL)
   {
-    snprintf(lkeyword, sizeof(lkeyword), "%2.2s.%s", ll_CC, keyword);
-    attr = ppdFindAttr(ppd, lkeyword, spec);
+   /*
+    * <rdar://problem/22130168>
+    *
+    * Hong Kong locale needs 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)
     {
@@ -727,8 +727,8 @@ _ppdLocalizedAttr(ppd_file_t *ppd,  /* I - PPD file */
  */
 
 static cups_lang_t *                   /* O - Current language */
-ppd_ll_CC(char *ll_CC,                 /* O - Country-specific locale name */
-          int  ll_CC_size)             /* I - Size of country-specific name */
+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 */
 
@@ -775,5 +775,5 @@ ppd_ll_CC(char *ll_CC,                      /* O - Country-specific locale name */
 
 
 /*
- * End of "$Id: localize.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: localize.c 12834 2015-08-06 13:56:32Z msweet $".
  */
index 86bcc09..0c27628 100644 (file)
@@ -1,39 +1,20 @@
 /*
- * "$Id: mark.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: mark.c 12258 2014-11-19 12:38:44Z msweet $"
  *
- *   Option marking routines for CUPS.
+ * Option marking routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   PostScript is a trademark of Adobe Systems, Inc.
+ * PostScript is a trademark of Adobe Systems, Inc.
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsMarkOptions()     - Mark command-line options in a PPD file.
- *   ppdFindChoice()       - Return a pointer to an option choice.
- *   ppdFindMarkedChoice() - Return the marked choice for the specified option.
- *   ppdFindOption()       - Return a pointer to the specified option.
- *   ppdIsMarked()         - Check to see if an option is marked.
- *   ppdMarkDefaults()     - Mark all default options in the PPD file.
- *   ppdMarkOption()       - Mark an option in a PPD file and return the number
- *                           of conflicts.
- *   ppdFirstOption()      - Return the first option in the PPD file.
- *   ppdNextOption()       - Return the next option in the PPD file.
- *   _ppdParseOptions()    - Parse options from a PPD file.
- *   ppd_debug_marked()    - Output the marked array to stdout...
- *   ppd_defaults()        - Set the defaults for this group and all sub-groups.
- *   ppd_mark_choices()    - Mark one or more option choices from a string.
- *   ppd_mark_option()     - Quickly mark an option without checking for
- *                           conflicts.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -143,7 +124,7 @@ cupsMarkOptions(
       * Extract the sub-option from the string...
       */
 
-      for (ptr = s; *val && *val != ',' && (ptr - s) < (sizeof(s) - 1);)
+      for (ptr = s; *val && *val != ',' && (size_t)(ptr - s) < (sizeof(s) - 1);)
        *ptr++ = *val++;
       *ptr++ = '\0';
 
@@ -195,7 +176,7 @@ cupsMarkOptions(
 
       if (print_quality)
       {
-       pwg_pq = atoi(print_quality) - IPP_QUALITY_DRAFT;
+       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)
@@ -316,7 +297,7 @@ cupsMarkOptions(
         if (!isdigit(*ptr & 255))
          break;
 
-        if ((j = strtol(ptr, &ptr, 10)) < 3)
+        if ((j = (int)strtol(ptr, &ptr, 10)) < 3)
          break;
 
        /*
@@ -533,6 +514,12 @@ ppdMarkDefaults(ppd_file_t *ppd)   /* I - PPD file record */
 
   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);
 }
 
 
@@ -729,7 +716,7 @@ ppd_defaults(ppd_file_t  *ppd,              /* I - PPD file */
 
   for (i = g->num_options, o = g->options; i > 0; i --, o ++)
     if (_cups_strcasecmp(o->keyword, "PageRegion") != 0)
-      ppdMarkOption(ppd, o->keyword, o->defchoice);
+      ppd_mark_option(ppd, o->keyword, o->defchoice);
 
   for (i = g->num_subgroups, sg = g->subgroups; i > 0; i --, sg ++)
     ppd_defaults(ppd, sg);
@@ -1097,5 +1084,5 @@ ppd_mark_option(ppd_file_t *ppd,  /* I - PPD file */
 
 
 /*
- * End of "$Id: mark.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: mark.c 12258 2014-11-19 12:38:44Z msweet $".
  */
index 5fe826c..7b94642 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: md5-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: md5-private.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Private MD5 definitions for CUPS.
  *
@@ -75,5 +75,5 @@ void _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16]);
 #endif /* !_CUPS_MD5_PRIVATE_H_ */
 
 /*
- * End of "$Id: md5-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: md5-private.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index 9078938..8c87ac7 100644 (file)
@@ -1,31 +1,30 @@
 /*
- * "$Id: md5.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: md5.c 12124 2014-08-28 15:37:22Z msweet $"
  *
- *   Private MD5 implementation for CUPS.
+ * Private MD5 implementation for CUPS.
  *
- *   Copyright 2007-2010 by Apple Inc.
- *   Copyright 2005 by Easy Software Products
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2005 by Easy Software Products
+ * Copyright (C) 1999 Aladdin Enterprises.  All rights reserved.
  *
- *   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.
  *
- *   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:
  *
- *   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.
  *
- *   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
+ * L. Peter Deutsch
+ * ghost@aladdin.com
  */
 /*
   Independent implementation of MD5 (RFC 1321).
@@ -133,7 +132,8 @@ _cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/)
     int i;
 
     for (i = 0; i < 16; ++i, xp += 4)
-       X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
+       X[i] = (unsigned)xp[0] + ((unsigned)xp[1] << 8) +
+              ((unsigned)xp[2] << 16) + ((unsigned)xp[3] << 24);
 
 #else  /* !ARCH_IS_BIG_ENDIAN */
 
@@ -291,7 +291,7 @@ _cupsMD5Append(_cups_md5_state_t *pms, const unsigned char *data, int nbytes)
        return;
 
     /* Update the message length. */
-    pms->count[1] += nbytes >> 29;
+    pms->count[1] += (unsigned)nbytes >> 29;
     pms->count[0] += nbits;
     if (pms->count[0] < nbits)
        pms->count[1]++;
@@ -300,7 +300,7 @@ _cupsMD5Append(_cups_md5_state_t *pms, const unsigned char *data, int nbytes)
     if (offset) {
        int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
 
-       memcpy(pms->buf + offset, p, copy);
+       memcpy(pms->buf + offset, p, (size_t)copy);
        if (offset + copy < 64)
            return;
        p += copy;
@@ -314,7 +314,7 @@ _cupsMD5Append(_cups_md5_state_t *pms, const unsigned char *data, int nbytes)
 
     /* Process a final partial block. */
     if (left)
-       memcpy(pms->buf, p, left);
+       memcpy(pms->buf, p, (size_t)left);
 }
 
 void
@@ -333,7 +333,7 @@ _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16])
     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, ((55 - (pms->count[0] >> 3)) & 63) + 1);
+    _cupsMD5Append(pms, pad, (int)((55 - (pms->count[0] >> 3)) & 63) + 1);
     /* Append the length. */
     _cupsMD5Append(pms, data, 8);
     for (i = 0; i < 16; ++i)
@@ -342,5 +342,5 @@ _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16])
 
 
 /*
- * End of "$Id: md5.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: md5.c 12124 2014-08-28 15:37:22Z msweet $".
  */
index b18e384..135282c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: md5passwd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: md5passwd.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   MD5 password support for CUPS.
  *
@@ -138,5 +138,5 @@ httpMD5String(const unsigned char *sum,     /* I - MD5 sum data */
 
 
 /*
- * End of "$Id: md5passwd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: md5passwd.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index d07745d..7e5cebb 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: notify.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: notify.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Notification routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
+ *   Copyright 2007-2013 by Apple Inc.
  *   Copyright 2005-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -83,25 +83,25 @@ cupsNotifySubject(cups_lang_t *lang,        /* I - Language data */
 
     switch (job_state->values[0].integer)
     {
-      case IPP_JOB_PENDING :
+      case IPP_JSTATE_PENDING :
           state = _cupsLangString(lang, _("pending"));
          break;
-      case IPP_JOB_HELD :
+      case IPP_JSTATE_HELD :
           state = _cupsLangString(lang, _("held"));
          break;
-      case IPP_JOB_PROCESSING :
+      case IPP_JSTATE_PROCESSING :
           state = _cupsLangString(lang, _("processing"));
          break;
-      case IPP_JOB_STOPPED :
+      case IPP_JSTATE_STOPPED :
           state = _cupsLangString(lang, _("stopped"));
          break;
-      case IPP_JOB_CANCELED :
+      case IPP_JSTATE_CANCELED :
           state = _cupsLangString(lang, _("canceled"));
          break;
-      case IPP_JOB_ABORTED :
+      case IPP_JSTATE_ABORTED :
           state = _cupsLangString(lang, _("aborted"));
          break;
-      case IPP_JOB_COMPLETED :
+      case IPP_JSTATE_COMPLETED :
           state = _cupsLangString(lang, _("completed"));
          break;
       default :
@@ -127,13 +127,13 @@ cupsNotifySubject(cups_lang_t *lang,      /* I - Language data */
 
     switch (printer_state->values[0].integer)
     {
-      case IPP_PRINTER_IDLE :
+      case IPP_PSTATE_IDLE :
           state = _cupsLangString(lang, _("idle"));
          break;
-      case IPP_PRINTER_PROCESSING :
+      case IPP_PSTATE_PROCESSING :
           state = _cupsLangString(lang, _("processing"));
          break;
-      case IPP_PRINTER_STOPPED :
+      case IPP_PSTATE_STOPPED :
           state = _cupsLangString(lang, _("stopped"));
          break;
       default :
@@ -198,5 +198,5 @@ cupsNotifyText(cups_lang_t *lang,   /* I - Language data */
 
 
 /*
- * End of "$Id: notify.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: notify.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index b1b2d41..49b16f1 100644 (file)
@@ -1,29 +1,18 @@
 /*
- * "$Id: options.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: options.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Option routines for CUPS.
+ * Option routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsAddOption()        - Add an option to an option array.
- *   cupsFreeOptions()      - Free all memory used by options.
- *   cupsGetOption()        - Get an option value.
- *   cupsParseOptions()     - Parse options from a command-line argument.
- *   cupsRemoveOption()     - Remove an option from an option array.
- *   _cupsGet1284Values()   - Get 1284 device ID keys and values.
- *   cups_compare_options() - Compare two options.
- *   cups_find_option()     - Find an option using a binary search.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -99,10 +88,9 @@ cupsAddOption(const char    *name,   /* I  - Name of option */
     if (num_options == 0)
       temp = (cups_option_t *)malloc(sizeof(cups_option_t));
     else
-      temp = (cups_option_t *)realloc(*options, sizeof(cups_option_t) *
-                                               (num_options + 1));
+      temp = (cups_option_t *)realloc(*options, sizeof(cups_option_t) * (size_t)(num_options + 1));
 
-    if (temp == NULL)
+    if (!temp)
     {
       DEBUG_puts("3cupsAddOption: Unable to expand option array, returning 0");
       return (0);
@@ -114,8 +102,7 @@ cupsAddOption(const char    *name,  /* I  - Name of option */
     {
       DEBUG_printf(("4cupsAddOption: Shifting %d options...",
                     (int)(num_options - insert)));
-      memmove(temp + insert + 1, temp + insert,
-             (num_options - insert) * sizeof(cups_option_t));
+      memmove(temp + insert + 1, temp + insert, (size_t)(num_options - insert) * sizeof(cups_option_t));
     }
 
     temp        += insert;
@@ -487,7 +474,7 @@ cupsRemoveOption(
     _cupsStrFree(option->value);
 
     if (i > 0)
-      memmove(option, option + 1, i * sizeof(cups_option_t));
+      memmove(option, option + 1, (size_t)i * sizeof(cups_option_t));
   }
 
  /*
@@ -707,5 +694,5 @@ cups_find_option(
 
 
 /*
- * End of "$Id: options.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: options.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index ab3eec4..7c496c6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: page.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: page.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Page size functions for CUPS.
  *
@@ -392,5 +392,5 @@ ppdPageLength(ppd_file_t *ppd,      /* I - PPD file */
 
 
 /*
- * End of "$Id: page.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: page.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 2905051..49589f2 100644 (file)
@@ -1,49 +1,17 @@
 /*
- * "$Id: ppd-cache.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ppd-cache.c 12980 2015-11-17 21:23:32Z msweet $"
  *
- *   PPD cache implementation for CUPS.
+ * PPD cache implementation for CUPS.
  *
- *   Copyright 2010-2012 by Apple Inc.
+ * Copyright 2010-2015 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   _ppdCacheCreateWithFile() - Create PPD cache and mapping data from a
- *                               written file.
- *   _ppdCacheCreateWithPPD()  - Create PWG mapping data from a PPD file.
- *   _ppdCacheDestroy()        - Free all memory used for PWG mapping data.
- *   _ppdCacheGetBin()         - Get the PWG output-bin keyword associated with
- *                               a PPD OutputBin.
- *   _ppdCacheGetInputSlot()   - Get the PPD InputSlot associated with the job
- *                               attributes or a keyword string.
- *   _ppdCacheGetMediaType()   - Get the PPD MediaType associated with the job
- *                               attributes or a keyword string.
- *   _ppdCacheGetOutputBin()   - Get the PPD OutputBin associated with the
- *                               keyword string.
- *   _ppdCacheGetPageSize()    - Get the PPD PageSize associated with the job
- *                               attributes or a keyword string.
- *   _ppdCacheGetSize()        - Get the PWG size associated with a PPD
- *                               PageSize.
- *   _ppdCacheGetSource()      - Get the PWG media-source associated with a PPD
- *                               InputSlot.
- *   _ppdCacheGetType()        - Get the PWG media-type associated with a PPD
- *                               MediaType.
- *   _ppdCacheWriteFile()      - Write PWG mapping data to a file.
- *   _pwgInputSlotForSource()  - Get the InputSlot name for the given PWG
- *                               media-source.
- *   _pwgMediaTypeForType()    - Get the MediaType name for the given PWG
- *                               media-type.
- *   _pwgPageSizeForMedia()    - Get the PageSize name for the given media.
- *   pwg_ppdize_name()         - Convert an IPP keyword to a PPD keyword.
- *   pwg_unppdize_name()       - Convert a PPD keyword to a lowercase IPP
- *                               keyword.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
 static int     pwg_compare_finishings(_pwg_finishings_t *a,
                                       _pwg_finishings_t *b);
 static void    pwg_free_finishings(_pwg_finishings_t *f);
+static void    pwg_free_material(_pwg_material_t *m);
 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 */
+  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 */
+  int          num_finishings = 0,     /* Number of finishing values */
+               finishings[10];         /* Finishing enum values */
+  ppd_choice_t *choice;                /* Marked choice */
+
+
+ /*
+  * Send standard IPP attributes...
+  */
+
+  if (pc->password && (keyword = cupsGetOption("job-password", num_options, options)) != NULL && ippGetOperation(request) != IPP_OP_VALIDATE_JOB)
+  {
+    ippAddOctetString(request, IPP_TAG_OPERATION, "job-password", keyword, (int)strlen(keyword));
+
+    if ((keyword = cupsGetOption("job-password-encryption", num_options, options)) == NULL)
+      keyword = "none";
+
+    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, "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);
+
+  if ((size = _ppdCacheGetSize(pc, keyword)) != NULL)
+  {
+   /*
+    * Add a media-col value...
+    */
+
+    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);
+
+    media_col = ippNew();
+    ippAddCollection(media_col, IPP_TAG_ZERO, "media-size", media_size);
+
+    media_source = _ppdCacheGetSource(pc, cupsGetOption("InputSlot",
+                                                       num_options,
+                                                       options));
+    media_type   = _ppdCacheGetType(pc, cupsGetOption("MediaType",
+                                                     num_options,
+                                                     options));
+
+    for (i = 0; i < media_col_sup->num_values; i ++)
+    {
+      if (!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 (!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 (!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 (!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 (!strcmp(media_col_sup->values[i].string.text, "media-source") && media_source)
+       ippAddString(media_col, IPP_TAG_ZERO, IPP_TAG_KEYWORD, "media-source", NULL, media_source);
+      else if (!strcmp(media_col_sup->values[i].string.text, "media-type") && 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 (!_cups_strcasecmp(choice->choice, pc->sides_1sided))
+      ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", NULL, "one-sided");
+    else if (!_cups_strcasecmp(choice->choice, pc->sides_2sided_long))
+      ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", NULL, "two-sided-long-edge");
+    if (!_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...
+  */
+
+  num_finishings = _ppdCacheGetFinishingValues(pc, num_options, options, (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 > 1 && (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) / copies);
+    }
+  }
+
+  return (copies);
+}
+
+
+/*
  * '_ppdCacheCreateWithFile()' - Create PPD cache and mapping data from a
  *                               written file.
  *
@@ -88,8 +373,8 @@ _ppdCacheCreateWithFile(
 {
   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_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 */
@@ -118,7 +403,7 @@ _ppdCacheCreateWithFile(
 
   if (!filename)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     return (NULL);
   }
 
@@ -128,7 +413,7 @@ _ppdCacheCreateWithFile(
 
   if ((fp = cupsFileOpen(filename, "r")) == NULL)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
     return (NULL);
   }
 
@@ -138,7 +423,7 @@ _ppdCacheCreateWithFile(
 
   if (!cupsFileGets(fp, line, sizeof(line)))
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
     DEBUG_puts("_ppdCacheCreateWithFile: Unable to read first line.");
     cupsFileClose(fp);
     return (NULL);
@@ -146,7 +431,7 @@ _ppdCacheCreateWithFile(
 
   if (strncmp(line, "#CUPS-PPD-CACHE-", 16))
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
     DEBUG_printf(("_ppdCacheCreateWithFile: Wrong first line \"%s\".", line));
     cupsFileClose(fp);
     return (NULL);
@@ -154,7 +439,7 @@ _ppdCacheCreateWithFile(
 
   if (atoi(line + 16) != _PPD_CACHE_VERSION)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, _("Out of date PPD cache file."), 1);
+    _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);
@@ -167,7 +452,7 @@ _ppdCacheCreateWithFile(
 
   if ((pc = calloc(1, sizeof(_ppd_cache_t))) == NULL)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
     DEBUG_puts("_ppdCacheCreateWithFile: Unable to allocate _ppd_cache_t.");
     goto create_error;
   }
@@ -193,9 +478,56 @@ _ppdCacheCreateWithFile(
     {
       DEBUG_printf(("_ppdCacheCreateWithFile: Missing value on line %d.",
                     linenum));
-      _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
       goto create_error;
     }
+    else if (!_cups_strcasecmp(line, "3D"))
+    {
+      pc->cups_3d = _cupsStrAlloc(value);
+    }
+    else if (!_cups_strcasecmp(line, "LayerOrder"))
+    {
+      pc->cups_layer_order = _cupsStrAlloc(value);
+    }
+    else if (!_cups_strcasecmp(line, "Accuracy"))
+    {
+      sscanf(value, "%d%d%d", pc->cups_accuracy + 0, pc->cups_accuracy + 1, pc->cups_accuracy + 2);
+    }
+    else if (!_cups_strcasecmp(line, "Volume"))
+    {
+      sscanf(value, "%d%d%d", pc->cups_volume + 0, pc->cups_volume + 1, pc->cups_volume + 2);
+    }
+    else if (!_cups_strcasecmp(line, "Material"))
+    {
+     /*
+      * Material key "name" name=value ... name=value
+      */
+
+      if ((valueptr = strchr(value, ' ')) != NULL)
+      {
+       _pwg_material_t *material = (_pwg_material_t *)calloc(1, sizeof(_pwg_material_t));
+
+        *valueptr++ = '\0';
+
+        material->key = _cupsStrAlloc(value);
+
+        if (*valueptr == '\"')
+       {
+         value = valueptr + 1;
+         if ((valueptr = strchr(value, '\"')) != NULL)
+         {
+           *valueptr++ = '\0';
+           material->name = _cupsStrAlloc(value);
+           material->num_props = cupsParseOptions(valueptr, 0, &material->props);
+         }
+       }
+
+       if (!pc->materials)
+         pc->materials = cupsArrayNew3(NULL, NULL, NULL, 0, NULL, (cups_afree_func_t)pwg_free_material);
+
+        cupsArrayAdd(pc->materials, material);
+      }
+    }
     else if (!_cups_strcasecmp(line, "Filter"))
     {
       if (!pc->filters)
@@ -231,13 +563,13 @@ _ppdCacheCreateWithFile(
       if (attrs && *attrs)
       {
         DEBUG_puts("_ppdCacheCreateWithFile: IPP listed multiple times.");
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _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_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -250,10 +582,10 @@ _ppdCacheCreateWithFile(
         *attrs = ippNew();
 
         if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL,
-                     *attrs) != IPP_DATA)
+                     *attrs) != IPP_STATE_DATA)
        {
          DEBUG_puts("_ppdCacheCreateWithFile: Bad IPP data.");
-         _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+         _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
          goto create_error;
        }
       }
@@ -269,7 +601,7 @@ _ppdCacheCreateWithFile(
       if (cupsFileTell(fp) != (pos + length))
       {
         DEBUG_puts("_ppdCacheCreateWithFile: Bad IPP data.");
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
     }
@@ -278,7 +610,7 @@ _ppdCacheCreateWithFile(
       if (num_bins > 0)
       {
         DEBUG_puts("_ppdCacheCreateWithFile: NumBins listed multiple times.");
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -286,15 +618,15 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumBins value %d on line "
                      "%d.", num_sizes, linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
-      if ((pc->bins = calloc(num_bins, sizeof(_pwg_map_t))) == NULL)
+      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_INTERNAL_ERROR, strerror(errno), 0);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
        goto create_error;
       }
     }
@@ -303,7 +635,7 @@ _ppdCacheCreateWithFile(
       if (sscanf(value, "%127s%40s", pwg_keyword, ppd_keyword) != 2)
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Bad Bin on line %d.", linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -311,7 +643,7 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Too many Bin's on line %d.",
                      linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -326,7 +658,7 @@ _ppdCacheCreateWithFile(
       if (num_sizes > 0)
       {
         DEBUG_puts("_ppdCacheCreateWithFile: NumSizes listed multiple times.");
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -334,17 +666,17 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumSizes value %d on line "
                      "%d.", num_sizes, linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
       if (num_sizes > 0)
       {
-       if ((pc->sizes = calloc(num_sizes, sizeof(_pwg_size_t))) == NULL)
+       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_INTERNAL_ERROR, strerror(errno), 0);
+         _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
          goto create_error;
        }
       }
@@ -355,7 +687,7 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Too many Size's on line %d.",
                      linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -367,7 +699,7 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Bad Size on line %d.",
                      linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -382,7 +714,7 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Too many CustomSize's on line "
                      "%d.", linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -394,16 +726,16 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Bad CustomSize on line %d.",
                      linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
-      _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), "custom", "max",
-                      pc->custom_max_width, pc->custom_max_length);
+      pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "max",
+                       pc->custom_max_width, pc->custom_max_length, NULL);
       pc->custom_max_keyword = _cupsStrAlloc(pwg_keyword);
 
-      _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), "custom", "min",
-                      pc->custom_min_width, pc->custom_min_length);
+      pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), "custom", "min",
+                       pc->custom_min_width, pc->custom_min_length, NULL);
       pc->custom_min_keyword = _cupsStrAlloc(pwg_keyword);
     }
     else if (!_cups_strcasecmp(line, "SourceOption"))
@@ -416,7 +748,7 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_puts("_ppdCacheCreateWithFile: NumSources listed multiple "
                   "times.");
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -424,15 +756,15 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumSources value %d on "
                      "line %d.", num_sources, linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
-      if ((pc->sources = calloc(num_sources, sizeof(_pwg_map_t))) == NULL)
+      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_INTERNAL_ERROR, strerror(errno), 0);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
        goto create_error;
       }
     }
@@ -442,7 +774,7 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Bad Source on line %d.",
                      linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -450,7 +782,7 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Too many Source's on line %d.",
                      linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -465,7 +797,7 @@ _ppdCacheCreateWithFile(
       if (num_types > 0)
       {
         DEBUG_puts("_ppdCacheCreateWithFile: NumTypes listed multiple times.");
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -473,15 +805,15 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumTypes value %d on "
                      "line %d.", num_types, linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
-      if ((pc->types = calloc(num_types, sizeof(_pwg_map_t))) == NULL)
+      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_INTERNAL_ERROR, strerror(errno), 0);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
        goto create_error;
       }
     }
@@ -491,7 +823,7 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Bad Type on line %d.",
                      linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -499,7 +831,7 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Too many Type's on line %d.",
                      linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -526,7 +858,7 @@ _ppdCacheCreateWithFile(
       {
         DEBUG_printf(("_ppdCacheCreateWithFile: Bad Preset on line %d.",
                      linenum));
-       _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
        goto create_error;
       }
 
@@ -553,7 +885,7 @@ _ppdCacheCreateWithFile(
       if ((finishings = calloc(1, sizeof(_pwg_finishings_t))) == NULL)
         goto create_error;
 
-      finishings->value       = strtol(value, &valueptr, 10);
+      finishings->value       = (ipp_finishings_t)strtol(value, &valueptr, 10);
       finishings->num_options = cupsParseOptions(valueptr, 0,
                                                  &(finishings->options));
 
@@ -561,6 +893,30 @@ _ppdCacheCreateWithFile(
     }
     else if (!_cups_strcasecmp(line, "MaxCopies"))
       pc->max_copies = atoi(value);
+    else if (!_cups_strcasecmp(line, "ChargeInfoURI"))
+      pc->charge_info_uri = _cupsStrAlloc(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 = _cupsStrAlloc(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)_cupsStrAlloc,
+                                          (cups_afree_func_t)_cupsStrFree);
+
+      cupsArrayAdd(pc->support_files, value);
+    }
     else
     {
       DEBUG_printf(("_ppdCacheCreateWithFile: Unknown %s on line %d.", line,
@@ -572,7 +928,7 @@ _ppdCacheCreateWithFile(
   {
     DEBUG_printf(("_ppdCacheCreateWithFile: Not enough sizes (%d < %d).",
                   pc->num_sizes, num_sizes));
-    _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
     goto create_error;
   }
 
@@ -580,7 +936,7 @@ _ppdCacheCreateWithFile(
   {
     DEBUG_printf(("_ppdCacheCreateWithFile: Not enough sources (%d < %d).",
                   pc->num_sources, num_sources));
-    _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
     goto create_error;
   }
 
@@ -588,7 +944,7 @@ _ppdCacheCreateWithFile(
   {
     DEBUG_printf(("_ppdCacheCreateWithFile: Not enough types (%d < %d).",
                   pc->num_types, num_types));
-    _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad PPD cache file."), 1);
     goto create_error;
   }
 
@@ -630,24 +986,24 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)   /* I - PPD file */
                        *color_model,   /* ColorModel option */
                        *duplex;        /* Duplex option */
   ppd_choice_t         *choice;        /* Current InputSlot/MediaType */
-  _pwg_map_t           *map;           /* Current source/type map */
+  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 */
+  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_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 */
+  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 */
@@ -660,7 +1016,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)    /* I - PPD file */
                        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 */
+  pwg_size_t           *new_size;      /* New size to add, if any */
   const char           *filter;        /* Current filter */
   _pwg_finishings_t    *finishings;    /* Current finishings value */
 
@@ -690,10 +1046,10 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)  /* I - PPD file */
 
   if (ppd->num_sizes > 0)
   {
-    if ((pc->sizes = calloc(ppd->num_sizes, sizeof(_pwg_size_t))) == NULL)
+    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));
+                   "pwg_size_t's.", ppd->num_sizes));
       goto create_error;
     }
 
@@ -712,7 +1068,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)    /* I - PPD file */
       * Convert the PPD size name to the corresponding PWG keyword name.
       */
 
-      if ((pwg_media = _pwgMediaForPPD(ppd_size->name)) != NULL)
+      if ((pwg_media = pwgMediaForPPD(ppd_size->name)) != NULL)
       {
        /*
        * Standard name, do we have conflicts?
@@ -747,9 +1103,9 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)    /* I - PPD file */
        new_known_pwg = 0;
 
        pwg_unppdize_name(ppd_size->name, ppd_name, sizeof(ppd_name), "_.");
-       _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), NULL, ppd_name,
-                        _PWG_FROMPTS(ppd_size->width),
-                        _PWG_FROMPTS(ppd_size->length));
+       pwgFormatSizeName(pwg_keyword, sizeof(pwg_keyword), NULL, ppd_name,
+                         PWG_FROM_POINTS(ppd_size->width),
+                         PWG_FROM_POINTS(ppd_size->length), NULL);
       }
 
      /*
@@ -758,16 +1114,17 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)  /* I - PPD file */
       * dimensions that are <= 0...
       */
 
-      if ((pwg_media = _pwgMediaForSize(_PWG_FROMPTS(ppd_size->width),
-                                       _PWG_FROMPTS(ppd_size->length))) == NULL)
+      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_FROMPTS(ppd_size->left);
-      new_bottom     = _PWG_FROMPTS(ppd_size->bottom);
-      new_right      = _PWG_FROMPTS(ppd_size->width - ppd_size->right);
-      new_top        = _PWG_FROMPTS(ppd_size->length - ppd_size->top);
+      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;
@@ -836,24 +1193,24 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)  /* I - PPD file */
     * Generate custom size data...
     */
 
-    _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), "custom", "max",
-                    _PWG_FROMPTS(ppd->custom_max[0]),
-                    _PWG_FROMPTS(ppd->custom_max[1]));
+    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 = _cupsStrAlloc(pwg_keyword);
-    pc->custom_max_width   = _PWG_FROMPTS(ppd->custom_max[0]);
-    pc->custom_max_length  = _PWG_FROMPTS(ppd->custom_max[1]);
+    pc->custom_max_width   = PWG_FROM_POINTS(ppd->custom_max[0]);
+    pc->custom_max_length  = PWG_FROM_POINTS(ppd->custom_max[1]);
 
-    _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), "custom", "min",
-                    _PWG_FROMPTS(ppd->custom_min[0]),
-                    _PWG_FROMPTS(ppd->custom_min[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 = _cupsStrAlloc(pwg_keyword);
-    pc->custom_min_width   = _PWG_FROMPTS(ppd->custom_min[0]);
-    pc->custom_min_length  = _PWG_FROMPTS(ppd->custom_min[1]);
+    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_FROMPTS(ppd->custom_margins[0]);
-    pc->custom_size.bottom = _PWG_FROMPTS(ppd->custom_margins[1]);
-    pc->custom_size.right  = _PWG_FROMPTS(ppd->custom_margins[2]);
-    pc->custom_size.top    = _PWG_FROMPTS(ppd->custom_margins[3]);
+    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]);
   }
 
  /*
@@ -867,11 +1224,10 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)  /* I - PPD file */
   {
     pc->source_option = _cupsStrAlloc(input_slot->keyword);
 
-    if ((pc->sources = calloc(input_slot->num_choices,
-                               sizeof(_pwg_map_t))) == NULL)
+    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));
+                    "pwg_map_t's for InputSlot.", input_slot->num_choices));
       goto create_error;
     }
 
@@ -929,11 +1285,10 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)  /* I - PPD file */
 
   if ((media_type = ppdFindOption(ppd, "MediaType")) != NULL)
   {
-    if ((pc->types = calloc(media_type->num_choices,
-                             sizeof(_pwg_map_t))) == 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));
+                    "pwg_map_t's for MediaType.", media_type->num_choices));
       goto create_error;
     }
 
@@ -994,11 +1349,10 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)  /* I - PPD file */
 
   if ((output_bin = ppdFindOption(ppd, "OutputBin")) != NULL)
   {
-    if ((pc->bins = calloc(output_bin->num_choices,
-                             sizeof(_pwg_map_t))) == 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));
+                    "pwg_map_t's for OutputBin.", output_bin->num_choices));
       goto create_error;
     }
 
@@ -1178,7 +1532,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)   /* I - PPD file */
 
          num_options = pc->num_presets[_PWG_PRINT_COLOR_MODE_COLOR]
                                        [pwg_print_quality];
-         options     = calloc(sizeof(cups_option_t), num_options);
+         options     = calloc(sizeof(cups_option_t), (size_t)num_options);
 
          if (options)
          {
@@ -1347,7 +1701,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)   /* I - PPD file */
       if ((finishings = calloc(1, sizeof(_pwg_finishings_t))) == NULL)
         goto create_error;
 
-      finishings->value       = atoi(ppd_attr->spec);
+      finishings->value       = (ipp_finishings_t)atoi(ppd_attr->spec);
       finishings->num_options = _ppdParseOptions(ppd_attr->value, 0,
                                                  &(finishings->options),
                                                  _PPD_PARSE_OPTIONS);
@@ -1370,6 +1724,78 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)  /* I - PPD file */
     pc->max_copies = 9999;
 
  /*
+  * cupsChargeInfoURI, cupsJobAccountId, cupsJobAccountingUserId,
+  * cupsJobPassword, and cupsMandatory.
+  */
+
+  if ((ppd_attr = ppdFindAttr(ppd, "cupsChargeInfoURI", NULL)) != NULL)
+    pc->charge_info_uri = _cupsStrAlloc(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 = _cupsStrAlloc(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)_cupsStrAlloc,
+                                   (cups_afree_func_t)_cupsStrFree);
+
+  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);
+
+ /*
+  * 3D stuff...
+  */
+
+  if ((ppd_attr = ppdFindAttr(ppd, "cups3D", NULL)) != NULL)
+    pc->cups_3d = _cupsStrAlloc(ppd_attr->value);
+
+  if ((ppd_attr = ppdFindAttr(ppd, "cupsLayerOrder", NULL)) != NULL)
+    pc->cups_layer_order = _cupsStrAlloc(ppd_attr->value);
+
+  if ((ppd_attr = ppdFindAttr(ppd, "cupsAccuracy", NULL)) != NULL)
+    sscanf(ppd_attr->value, "%d%d%d", pc->cups_accuracy + 0, pc->cups_accuracy + 1, pc->cups_accuracy + 2);
+
+  if ((ppd_attr = ppdFindAttr(ppd, "cupsVolume", NULL)) != NULL)
+    sscanf(ppd_attr->value, "%d%d%d", pc->cups_volume + 0, pc->cups_volume + 1, pc->cups_volume + 2);
+
+  for (ppd_attr = ppdFindAttr(ppd, "cupsMaterial", NULL);
+       ppd_attr;
+       ppd_attr = ppdFindNextAttr(ppd, "cupsMaterial", NULL))
+  {
+   /*
+    * *cupsMaterial key/name: "name=value ... name=value"
+    */
+
+    _pwg_material_t    *material = (_pwg_material_t *)calloc(1, sizeof(_pwg_material_t));
+
+    material->key = _cupsStrAlloc(ppd_attr->name);
+    material->name = _cupsStrAlloc(ppd_attr->text);
+    material->num_props = cupsParseOptions(ppd_attr->value, 0, &material->props);
+
+    if (!pc->materials)
+      pc->materials = cupsArrayNew3(NULL, NULL, NULL, 0, NULL, (cups_afree_func_t)pwg_free_material);
+
+    cupsArrayAdd(pc->materials, material);
+  }
+
+ /*
   * Return the cache data...
   */
 
@@ -1381,7 +1807,7 @@ _ppdCacheCreateWithPPD(ppd_file_t *ppd)   /* I - PPD file */
 
   create_error:
 
-  _cupsSetError(IPP_INTERNAL_ERROR, _("Out of memory."), 1);
+  _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Out of memory."), 1);
   _ppdCacheDestroy(pc);
 
   return (NULL);
@@ -1396,8 +1822,8 @@ 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 */
+  pwg_map_t    *map;                   /* Current map */
+  pwg_size_t   *size;                  /* Current size */
 
 
  /*
@@ -1469,6 +1895,18 @@ _ppdCacheDestroy(_ppd_cache_t *pc)       /* I - PPD cache and mapping data */
   cupsArrayDelete(pc->prefilters);
   cupsArrayDelete(pc->finishings);
 
+  _cupsStrFree(pc->charge_info_uri);
+  _cupsStrFree(pc->password);
+
+  cupsArrayDelete(pc->mandatory);
+
+  cupsArrayDelete(pc->support_files);
+
+  _cupsStrFree(pc->cups_3d);
+  _cupsStrFree(pc->cups_layer_order);
+
+  cupsArrayDelete(pc->materials);
+
   free(pc);
 }
 
@@ -1513,11 +1951,11 @@ _ppdCacheGetBin(
 
 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_finish_t  value,               /* I  - IPP finishings value of IPP_FINISHINGS_NONE */
-    int           num_options,         /* I  - Number of options */
-    cups_option_t **options)           /* IO - Options */
+    _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 */
@@ -1544,7 +1982,7 @@ _ppdCacheGetFinishingOptions(
 
     for (i = 0; i < num_values; i ++)
     {
-      key.value = ippGetInteger(attr, i);
+      key.value = (ipp_finishings_t)ippGetInteger(attr, i);
 
       if ((f = cupsArrayFind(pc->finishings, &key)) != NULL)
       {
@@ -1598,8 +2036,13 @@ _ppdCacheGetFinishingValues(
   * Range check input...
   */
 
+  DEBUG_printf(("_ppdCacheGetFinishingValues(pc=%p, num_options=%d, options=%p, max_values=%d, values=%p)", pc, num_options, options, max_values, values));
+
   if (!pc || !pc->finishings || num_options < 1 || max_values < 1 || !values)
+  {
+    DEBUG_puts("_ppdCacheGetFinishingValues: Bad arguments, returning 0.");
     return (0);
+  }
 
  /*
   * Go through the finishings options and see what is set...
@@ -1609,13 +2052,24 @@ _ppdCacheGetFinishingValues(
        f;
        f = (_pwg_finishings_t *)cupsArrayNext(pc->finishings))
   {
+    DEBUG_printf(("_ppdCacheGetFinishingValues: Checking %d (%s)", f->value, ippEnumString("finishings", f->value)));
+
     for (i = f->num_options, option = f->options; i > 0; i --, option ++)
+    {
+      DEBUG_printf(("_ppdCacheGetFinishingValues: %s=%s?", option->name, option->value));
+
       if ((val = cupsGetOption(option->name, num_options, options)) == NULL ||
           _cups_strcasecmp(option->value, val))
+      {
+        DEBUG_puts("_ppdCacheGetFinishingValues: NO");
         break;
+      }
+    }
 
     if (i == 0)
     {
+      DEBUG_printf(("_ppdCacheGetFinishingValues: Adding %d.", f->value));
+
       values[num_values ++] = f->value;
 
       if (num_values >= max_values)
@@ -1623,6 +2077,8 @@ _ppdCacheGetFinishingValues(
     }
   }
 
+  DEBUG_printf(("_ppdCacheGetFinishingValues: Returning %d.", num_values));
+
   return (num_values);
 }
 
@@ -1653,7 +2109,7 @@ _ppdCacheGetInputSlot(
 
     ipp_attribute_t    *media_col,     /* media-col attribute */
                        *media_source;  /* media-source attribute */
-    _pwg_size_t                size;           /* Dimensional size */
+    pwg_size_t         size;           /* Dimensional size */
     int                        margins_set;    /* Were the margins set? */
 
     media_col = ippFindAttribute(job, "media-col", IPP_TAG_BEGIN_COLLECTION);
@@ -1668,7 +2124,7 @@ _ppdCacheGetInputSlot(
 
       keyword = ippGetString(media_source, 0, NULL);
     }
-    else if (_pwgInitSize(&size, job, &margins_set))
+    else if (pwgInitSize(&size, job, &margins_set))
     {
      /*
       * For media <= 5x7, look for a photo tray...
@@ -1792,7 +2248,7 @@ _ppdCacheGetPageSize(
     int          *exact)               /* O - 1 if exact match, 0 otherwise */
 {
   int          i;                      /* Looping var */
-  _pwg_size_t  *size,                  /* Current size */
+  pwg_size_t   *size,                  /* Current size */
                *closest,               /* Closest size */
                jobsize;                /* Size data from job */
   int          margins_set,            /* Were the margins set? */
@@ -1880,7 +2336,7 @@ _ppdCacheGetPageSize(
     * media-col.
     */
 
-    if (!_pwgInitSize(&jobsize, job, &margins_set))
+    if (!pwgInitSize(&jobsize, job, &margins_set))
       return (NULL);
   }
   else
@@ -1889,12 +2345,12 @@ _ppdCacheGetPageSize(
     * Get the size using a media keyword...
     */
 
-    _pwg_media_t       *media;         /* Media definition */
+    pwg_media_t        *media;         /* Media definition */
 
 
-    if ((media = _pwgMediaForPWG(keyword)) == NULL)
-      if ((media = _pwgMediaForLegacy(keyword)) == NULL)
-        if ((media = _pwgMediaForPPD(keyword)) == NULL)
+    if ((media = pwgMediaForPWG(keyword)) == NULL)
+      if ((media = pwgMediaForLegacy(keyword)) == NULL)
+        if ((media = pwgMediaForPPD(keyword)) == NULL)
          return (NULL);
 
     jobsize.width  = media->width;
@@ -1987,7 +2443,7 @@ _ppdCacheGetPageSize(
     */
 
     snprintf(pc->custom_ppd_size, sizeof(pc->custom_ppd_size), "Custom.%dx%d",
-             (int)_PWG_TOPTS(jobsize.width), (int)_PWG_TOPTS(jobsize.length));
+             (int)PWG_TO_POINTS(jobsize.width), (int)PWG_TO_POINTS(jobsize.length));
 
     if (margins_set && exact)
     {
@@ -2023,14 +2479,14 @@ _ppdCacheGetPageSize(
  * '_ppdCacheGetSize()' - Get the PWG size associated with a PPD PageSize.
  */
 
-_pwg_size_t *                          /* O - PWG size or NULL */
+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 */
+  pwg_media_t  *media;                 /* Media */
+  pwg_size_t   *size;                  /* Current size */
 
 
  /*
@@ -2116,9 +2572,9 @@ _ppdCacheGetSize(
   * Look up standard sizes...
   */
 
-  if ((media = _pwgMediaForPPD(page_size)) == NULL)
-    if ((media = _pwgMediaForLegacy(page_size)) == NULL)
-      media = _pwgMediaForPWG(page_size);
+  if ((media = pwgMediaForPPD(page_size)) == NULL)
+    if ((media = pwgMediaForLegacy(page_size)) == NULL)
+      media = pwgMediaForPWG(page_size);
 
   if (media)
   {
@@ -2143,7 +2599,7 @@ _ppdCacheGetSource(
     const char   *input_slot)          /* I - PPD InputSlot */
 {
   int          i;                      /* Looping var */
-  _pwg_map_t   *source;                /* Current source */
+  pwg_map_t    *source;                /* Current source */
 
 
  /*
@@ -2172,7 +2628,7 @@ _ppdCacheGetType(
     const char   *media_type)          /* I - PPD MediaType */
 {
   int          i;                      /* Looping var */
-  _pwg_map_t   *type;                  /* Current type */
+  pwg_map_t    *type;                  /* Current type */
 
 
  /*
@@ -2202,12 +2658,13 @@ _ppdCacheWriteFile(
 {
   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_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;         /* Filter/pre-filter value */
   char                 newfile[1024];  /* New filename */
+  _pwg_material_t      *m;             /* Material */
 
 
  /*
@@ -2216,7 +2673,7 @@ _ppdCacheWriteFile(
 
   if (!pc || !filename)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     return (0);
   }
 
@@ -2227,7 +2684,7 @@ _ppdCacheWriteFile(
   snprintf(newfile, sizeof(newfile), "%s.N", filename);
   if ((fp = cupsFileOpen(newfile, "w9")) == NULL)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
     return (0);
   }
 
@@ -2361,6 +2818,60 @@ _ppdCacheWriteFile(
   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, "AccountId %s\n", pc->account_id ? "true" : "false");
+  cupsFilePrintf(fp, "AccountingUserId %s\n",
+                 pc->accounting_user_id ? "true" : "false");
+
+  if (pc->password)
+    cupsFilePutConf(fp, "Password", 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);
+
+ /*
+  * 3D stuff...
+  */
+
+  if (pc->cups_3d)
+    cupsFilePutConf(fp, "3D", pc->cups_3d);
+
+  if (pc->cups_layer_order)
+    cupsFilePutConf(fp, "LayerOrder", pc->cups_layer_order);
+
+  if (pc->cups_accuracy[0] || pc->cups_accuracy[0] || pc->cups_accuracy[2])
+    cupsFilePrintf(fp, "Accuracy %d %d %d\n", pc->cups_accuracy[0], pc->cups_accuracy[1], pc->cups_accuracy[2]);
+
+  if (pc->cups_volume[0] || pc->cups_volume[0] || pc->cups_volume[2])
+    cupsFilePrintf(fp, "Volume %d %d %d\n", pc->cups_volume[0], pc->cups_volume[1], pc->cups_volume[2]);
+
+  for (m = (_pwg_material_t *)cupsArrayFirst(pc->materials);
+       m;
+       m = (_pwg_material_t *)cupsArrayNext(pc->materials))
+  {
+    cupsFilePrintf(fp, "Material %s \"%s\"", m->key, m->name);
+    for (i = 0; i < m->num_props; i ++)
+      cupsFilePrintf(fp, " %s=%s", m->props[i].name, m->props[i].value);
+    cupsFilePuts(fp, "\n");
+  }
+
+ /*
   * IPP attributes, if any...
   */
 
@@ -2368,7 +2879,7 @@ _ppdCacheWriteFile(
   {
     cupsFilePrintf(fp, "IPP " CUPS_LLFMT "\n", CUPS_LLCAST ippLength(attrs));
 
-    attrs->state = IPP_IDLE;
+    attrs->state = IPP_STATE_IDLE;
     ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL, attrs);
   }
 
@@ -2388,6 +2899,604 @@ _ppdCacheWriteFile(
 
 
 /*
+ * '_ppdCreateFromIPP()' - Create a PPD file describing the capabilities
+ *                         of an IPP printer.
+ */
+
+char *                                 /* O - PPD filename or 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 */
+  ipp_attribute_t      *attr,          /* xxx-supported */
+                       *defattr,       /* xxx-default */
+                       *x_dim, *y_dim; /* Media dimensions */
+  ipp_t                        *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 */
+  pwg_media_t          *pwg;           /* PWG media size */
+  int                  xres, yres;     /* Resolution values */
+  struct lconv         *loc = localeconv();
+                                       /* Locale data */
+
+
+ /*
+  * Range check input...
+  */
+
+  if (buffer)
+    *buffer = '\0';
+
+  if (!buffer || bufsize < 1 || !response)
+    return (NULL);
+
+ /*
+  * Open a temporary file for the PPD...
+  */
+
+  if ((fp = cupsTempFile2(buffer, (int)bufsize)) == NULL)
+    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\"\n", model);
+  cupsFilePrintf(fp, "*ShortNickName: \"%s\"\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");
+  cupsFilePuts(fp, "*cupsLanguages: \"en\"\n");
+
+ /*
+  * Filters...
+  */
+
+  if ((attr = ippFindAttribute(response, "document-format-supported", IPP_TAG_MIMETYPE)) != NULL)
+  {
+    for (i = 0, count = ippGetCount(attr); i < count; i ++)
+    {
+      const char *format = ippGetString(attr, i, NULL);
+                                       /* PDL */
+
+      if (!_cups_strcasecmp(format, "application/pdf"))
+        cupsFilePuts(fp, "*cupsFilter2: \"application/vnd.cups-pdf application/pdf 10 -\"\n");
+      else if (!_cups_strcasecmp(format, "application/postscript"))
+        cupsFilePuts(fp, "*cupsFilter2: \"application/vnd.cups-postscript application/postscript 10 -\"\n");
+      else if (_cups_strcasecmp(format, "application/octet-stream") && _cups_strcasecmp(format, "application/vnd.hp-pcl") && _cups_strcasecmp(format, "text/plain"))
+        cupsFilePrintf(fp, "*cupsFilter2: \"%s %s 10 -\"\n", format, format);
+    }
+  }
+
+ /*
+  * 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));
+       strlcpy(ppdname, pwg->ppd, sizeof(ppdname));
+      }
+      else
+       strlcpy(ppdname, "Unknown", sizeof(ppdname));
+    }
+    else
+      strlcpy(ppdname, "Unknown", sizeof(ppdname));
+  }
+
+  if ((attr = ippFindAttribute(response, "media-size-supported", IPP_TAG_BEGIN_COLLECTION)) != NULL)
+  {
+    cupsFilePrintf(fp, "*OpenUI *PageSize: PickOne\n"
+                      "*OrderDependency: 10 AnySetup *PageSize\n"
+                       "*DefaultPageSize: %s\n", ppdname);
+    for (i = 0, count = ippGetCount(attr); i < count; i ++)
+    {
+      media_size = ippGetCollection(attr, i);
+      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)
+      {
+        char   twidth[256],            /* Width string */
+               tlength[256];           /* Length string */
+
+        pwg = pwgMediaForSize(ippGetInteger(x_dim, 0), ippGetInteger(y_dim, 0));
+
+        _cupsStrFormatd(twidth, twidth + sizeof(twidth), pwg->width * 72.0 / 2540.0, loc);
+        _cupsStrFormatd(tlength, tlength + sizeof(tlength), pwg->length * 72.0 / 2540.0, loc);
+
+        cupsFilePrintf(fp, "*PageSize %s: \"<</PageSize[%s %s]>>setpagedevice\"\n", pwg->ppd, twidth, tlength);
+      }
+    }
+    cupsFilePuts(fp, "*CloseUI: *PageSize\n");
+
+    cupsFilePrintf(fp, "*OpenUI *PageRegion: PickOne\n"
+                       "*OrderDependency: 10 AnySetup *PageRegion\n"
+                       "*DefaultPageRegion: %s\n", ppdname);
+    for (i = 0, count = ippGetCount(attr); i < count; i ++)
+    {
+      media_size = ippGetCollection(attr, i);
+      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)
+      {
+        char   twidth[256],            /* Width string */
+               tlength[256];           /* Length string */
+
+        pwg = pwgMediaForSize(ippGetInteger(x_dim, 0), ippGetInteger(y_dim, 0));
+
+        _cupsStrFormatd(twidth, twidth + sizeof(twidth), pwg->width * 72.0 / 2540.0, loc);
+        _cupsStrFormatd(tlength, tlength + sizeof(tlength), pwg->length * 72.0 / 2540.0, loc);
+
+        cupsFilePrintf(fp, "*PageRegion %s: \"<</PageSize[%s %s]>>setpagedevice\"\n", pwg->ppd, twidth, tlength);
+      }
+    }
+    cupsFilePuts(fp, "*CloseUI: *PageRegion\n");
+
+    cupsFilePrintf(fp, "*DefaultImageableArea: %s\n"
+                      "*DefaultPaperDimension: %s\n", ppdname, ppdname);
+    for (i = 0, count = ippGetCount(attr); i < count; i ++)
+    {
+      media_size = ippGetCollection(attr, i);
+      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)
+      {
+        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 */
+
+        pwg = pwgMediaForSize(ippGetInteger(x_dim, 0), ippGetInteger(y_dim, 0));
+
+        _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), (pwg->width - right) * 72.0 / 2540.0, loc);
+        _cupsStrFormatd(ttop, ttop + sizeof(ttop), (pwg->length - top) * 72.0 / 2540.0, loc);
+        _cupsStrFormatd(twidth, twidth + sizeof(twidth), pwg->width * 72.0 / 2540.0, loc);
+        _cupsStrFormatd(tlength, tlength + sizeof(tlength), pwg->length * 72.0 / 2540.0, loc);
+
+        cupsFilePrintf(fp, "*ImageableArea %s: \"%s %s %s %s\"\n", pwg->ppd, tleft, tbottom, tright, ttop);
+        cupsFilePrintf(fp, "*PaperDimension %s: \"%s %s\"\n", pwg->ppd, twidth, tlength);
+      }
+    }
+  }
+
+ /*
+  * InputSlot...
+  */
+
+  if ((attr = ippFindAttribute(ippGetCollection(defattr, 0), "media-source", IPP_TAG_KEYWORD)) != 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_KEYWORD)) != NULL && (count = ippGetCount(attr)) > 1)
+  {
+    static const char * const sources[][2] =
+    {
+      { "Auto", "Automatic" },
+      { "Main", "Main" },
+      { "Alternate", "Alternate" },
+      { "LargeCapacity", "Large Capacity" },
+      { "Manual", "Manual" },
+      { "Envelope", "Envelope" },
+      { "Disc", "Disc" },
+      { "Photo", "Photo" },
+      { "Hagaki", "Hagaki" },
+      { "MainRoll", "Main Roll" },
+      { "AlternateRoll", "Alternate Roll" },
+      { "Top", "Top" },
+      { "Middle", "Middle" },
+      { "Bottom", "Bottom" },
+      { "Side", "Side" },
+      { "Left", "Left" },
+      { "Right", "Right" },
+      { "Center", "Center" },
+      { "Rear", "Rear" },
+      { "ByPassTray", "Multipurpose" },
+      { "Tray1", "Tray 1" },
+      { "Tray2", "Tray 2" },
+      { "Tray3", "Tray 3" },
+      { "Tray4", "Tray 4" },
+      { "Tray5", "Tray 5" },
+      { "Tray6", "Tray 6" },
+      { "Tray7", "Tray 7" },
+      { "Tray8", "Tray 8" },
+      { "Tray9", "Tray 9" },
+      { "Tray10", "Tray 10" },
+      { "Tray11", "Tray 11" },
+      { "Tray12", "Tray 12" },
+      { "Tray13", "Tray 13" },
+      { "Tray14", "Tray 14" },
+      { "Tray15", "Tray 15" },
+      { "Tray16", "Tray 16" },
+      { "Tray17", "Tray 17" },
+      { "Tray18", "Tray 18" },
+      { "Tray19", "Tray 19" },
+      { "Tray20", "Tray 20" },
+      { "Roll1", "Roll 1" },
+      { "Roll2", "Roll 2" },
+      { "Roll3", "Roll 3" },
+      { "Roll4", "Roll 4" },
+      { "Roll5", "Roll 5" },
+      { "Roll6", "Roll 6" },
+      { "Roll7", "Roll 7" },
+      { "Roll8", "Roll 8" },
+      { "Roll9", "Roll 9" },
+      { "Roll10", "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 ++)
+    {
+      pwg_ppdize_name(ippGetString(attr, i, NULL), ppdname, sizeof(ppdname));
+
+      for (j = 0; j < (int)(sizeof(sources) / sizeof(sources[0])); j ++)
+        if (!strcmp(sources[j][0], ppdname))
+       {
+         cupsFilePrintf(fp, "*InputSlot %s/%s: \"<</MediaPosition %d>>setpagedevice\"\n", ppdname, sources[j][1], j);
+         break;
+       }
+    }
+    cupsFilePuts(fp, "*CloseUI: *InputSlot\n");
+  }
+
+ /*
+  * MediaType...
+  */
+
+  if ((attr = ippFindAttribute(ippGetCollection(defattr, 0), "media-type", IPP_TAG_KEYWORD)) != 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_KEYWORD)) != NULL && (count = ippGetCount(attr)) > 1)
+  {
+    static const char * const types[][2] =
+    {                                  /* Media type strings (far from complete) */
+      { "Auto", "Automatic" },
+      { "Cardstock", "Cardstock" },
+      { "Disc", "CD/DVD/Bluray" },
+      { "Envelope", "Envelope" },
+      { "Labels", "Label" },
+      { "Other", "Other" },
+      { "Photographic", "Photo" },
+      { "PhotographicGlossy", "Glossy Photo" },
+      { "PhotographicHighGloss", "High-Gloss Photo" },
+      { "PhotographicMatte", "Matte Photo" },
+      { "PhotographicSatin", "Satin Photo" },
+      { "PhotographicSemiGloss", "Semi-Gloss Photo" },
+      { "Stationery", "Plain Paper" },
+      { "StationeryLetterhead", "Letterhead" },
+      { "Transparency", "Transparency" }
+    };
+
+    cupsFilePrintf(fp, "*OpenUI *MediaType: PickOne\n"
+                       "*OrderDependency: 10 AnySetup *MediaType\n"
+                       "*DefaultMediaType: %s\n", ppdname);
+    for (i = 0, count = ippGetCount(attr); i < count; i ++)
+    {
+      pwg_ppdize_name(ippGetString(attr, i, NULL), ppdname, sizeof(ppdname));
+
+      for (j = 0; j < (int)(sizeof(types) / sizeof(types[0])); j ++)
+        if (!strcmp(types[j][0], ppdname))
+       {
+         cupsFilePrintf(fp, "*MediaType %s/%s: \"<</MediaType(%s)>>setpagedevice\"\n", ppdname, types[j][1], ppdname);
+         break;
+       }
+
+      if (j >= (int)(sizeof(types) / sizeof(types[0])))
+       cupsFilePrintf(fp, "*MediaType %s: \"<</MediaType(%s)>>setpagedevice\"\n", ppdname, ppdname);
+
+    }
+    cupsFilePuts(fp, "*CloseUI: *MediaType\n");
+  }
+
+ /*
+  * ColorModel...
+  */
+
+  if ((attr = ippFindAttribute(response, "pwg-raster-document-type-supported", IPP_TAG_KEYWORD)) == NULL)
+    attr = ippFindAttribute(response, "print-color-mode-supported", IPP_TAG_KEYWORD);
+
+  if (attr)
+  {
+    const char *default_color = NULL;  /* Default */
+
+    for (i = 0, count = ippGetCount(attr); i < count; i ++)
+    {
+      const char *keyword = ippGetString(attr, i, NULL);
+                                       /* Keyword for color/bit depth */
+
+      if (!strcmp(keyword, "black_1") || !strcmp(keyword, "bi-level") || !strcmp(keyword, "process-bi-level"))
+      {
+        if (!default_color)
+         cupsFilePuts(fp, "*OpenUI *ColorModel/Color Mode: PickOne\n"
+                          "*OrderDependency: 10 AnySetup *ColorModel\n");
+
+        cupsFilePuts(fp, "*ColorModel FastGray/Fast Grayscale: \"<</cupsColorSpace 3/cupsBitsPerColor 1/cupsColorOrder 0/cupsCompression 0>>setpagedevice\"\n");
+
+        if (!default_color)
+         default_color = "FastGray";
+      }
+      else if (!strcmp(keyword, "sgray_8") || !strcmp(keyword, "monochrome") || !strcmp(keyword, "process-monochrome"))
+      {
+        if (!default_color)
+         cupsFilePuts(fp, "*OpenUI *ColorModel/Color Mode: PickOne\n"
+                          "*OrderDependency: 10 AnySetup *ColorModel\n");
+
+        cupsFilePuts(fp, "*ColorModel Gray/Grayscale: \"<</cupsColorSpace 18/cupsBitsPerColor 8/cupsColorOrder 0/cupsCompression 0>>setpagedevice\"\n");
+
+        if (!default_color || !strcmp(default_color, "FastGray"))
+         default_color = "Gray";
+      }
+      else if (!strcmp(keyword, "srgb_8") || !strcmp(keyword, "color"))
+      {
+        if (!default_color)
+         cupsFilePuts(fp, "*OpenUI *ColorModel/Color Mode: PickOne\n"
+                          "*OrderDependency: 10 AnySetup *ColorModel\n");
+
+        cupsFilePuts(fp, "*ColorModel RGB/Color: \"<</cupsColorSpace 19/cupsBitsPerColor 8/cupsColorOrder 0/cupsCompression 0>>setpagedevice\"\n");
+
+       default_color = "RGB";
+      }
+    }
+
+    if (default_color)
+    {
+      cupsFilePrintf(fp, "*DefaultColorModel: %s\n", default_color);
+      cupsFilePuts(fp, "*CloseUI: *ColorModel\n");
+    }
+  }
+
+ /*
+  * Duplex...
+  */
+
+  if ((attr = ippFindAttribute(response, "sides-supported", IPP_TAG_KEYWORD)) != NULL && ippContainsString(attr, "two-sided-long-edge"))
+  {
+    cupsFilePuts(fp, "*OpenUI *Duplex/2-Sided Printing: PickOne\n"
+                     "*OrderDependency: 10 AnySetup *Duplex\n"
+                     "*DefaultDuplex: None\n"
+                     "*Duplex None/Off (1-Sided): \"<</Duplex false>>setpagedevice\"\n"
+                     "*Duplex DuplexNoTumble/Long-Edge (Portrait): \"<</Duplex true/Tumble false>>setpagedevice\"\n"
+                     "*Duplex DuplexTumble/Short-Edge (Landscape): \"<</Duplex true/Tumble true>>setpagedevice\"\n"
+                     "*CloseUI: *Duplex\n");
+
+    if ((attr = ippFindAttribute(response, "pwg-raster-document-sheet-back", IPP_TAG_KEYWORD)) != NULL)
+    {
+      const char *keyword = ippGetString(attr, 0, NULL);
+                                       /* Keyword value */
+
+      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");
+    }
+    else 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;
+       }
+      }
+    }
+  }
+
+ /*
+  * cupsPrintQuality and DefaultResolution...
+  */
+
+  if ((attr = ippFindAttribute(response, "pwg-raster-document-resolution-supported", IPP_TAG_RESOLUTION)) != NULL)
+  {
+    count = ippGetCount(attr);
+
+    pwg_ppdize_resolution(attr, count / 2, &xres, &yres, ppdname, sizeof(ppdname));
+    cupsFilePrintf(fp, "*DefaultResolution: %s\n", ppdname);
+
+    cupsFilePuts(fp, "*OpenUI *cupsPrintQuality/Print Quality: PickOne\n"
+                     "*OrderDependency: 10 AnySetup *cupsPrintQuality\n"
+                     "*DefaultcupsPrintQuality: Normal\n");
+    if (count > 2)
+    {
+      pwg_ppdize_resolution(attr, 0, &xres, &yres, NULL, 0);
+      cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<</HWResolution[%d %d]>>setpagedevice\"\n", xres, yres);
+    }
+    pwg_ppdize_resolution(attr, count / 2, &xres, &yres, NULL, 0);
+    cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<</HWResolution[%d %d]>>setpagedevice\"\n", xres, yres);
+    if (count > 1)
+    {
+      pwg_ppdize_resolution(attr, count - 1, &xres, &yres, NULL, 0);
+      cupsFilePrintf(fp, "*cupsPrintQuality High: \"<</HWResolution[%d %d]>>setpagedevice\"\n", xres, yres);
+    }
+
+    cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n");
+  }
+  else 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...
+      */
+
+      cupsFilePuts(fp, "*DefaultResolution: 300dpi\n");
+    }
+    else
+    {
+     /*
+      * Generate print qualities based on low and high DPIs...
+      */
+
+      cupsFilePrintf(fp, "*DefaultResolution: %ddpi\n", lowdpi);
+
+      cupsFilePuts(fp, "*OpenUI *cupsPrintQuality/Print Quality: PickOne\n"
+                      "*OrderDependency: 10 AnySetup *cupsPrintQuality\n"
+                      "*DefaultcupsPrintQuality: Normal\n");
+      if ((lowdpi & 1) == 0)
+       cupsFilePrintf(fp, "*cupsPrintQuality Draft: \"<</HWResolution[%d %d]>>setpagedevice\"\n", lowdpi, lowdpi / 2);
+      cupsFilePrintf(fp, "*cupsPrintQuality Normal: \"<</HWResolution[%d %d]>>setpagedevice\"\n", lowdpi, lowdpi);
+      if (hidpi > lowdpi)
+       cupsFilePrintf(fp, "*cupsPrintQuality High: \"<</HWResolution[%d %d]>>setpagedevice\"\n", hidpi, hidpi);
+      cupsFilePuts(fp, "*CloseUI: *cupsPrintQuality\n");
+    }
+  }
+  else if ((attr = ippFindAttribute(response, "printer-resolution-default", IPP_TAG_RESOLUTION)) != NULL)
+  {
+    pwg_ppdize_resolution(attr, 0, &xres, &yres, ppdname, sizeof(ppdname));
+    cupsFilePrintf(fp, "*DefaultResolution: %s\n", ppdname);
+  }
+  else
+    cupsFilePuts(fp, "*DefaultResolution: 300dpi\n");
+
+ /*
+  * Close up and return...
+  */
+
+  cupsFileClose(fp);
+
+  return (buffer);
+}
+
+
+/*
  * '_pwgInputSlotForSource()' - Get the InputSlot name for the given PWG
  *                              media-source.
  */
@@ -2489,7 +3598,7 @@ _pwgMediaTypeForType(
 
 const char *                           /* O - PageSize name */
 _pwgPageSizeForMedia(
-    _pwg_media_t *media,               /* I - Media */
+    pwg_media_t *media,                /* I - Media */
     char         *name,                        /* I - PageSize name buffer */
     size_t       namesize)             /* I - Size of name buffer */
 {
@@ -2525,8 +3634,8 @@ _pwgPageSizeForMedia(
     * Use a name of the form "wNNNhNNN"...
     */
 
-    snprintf(name, namesize, "w%dh%d", (int)_PWG_TOPTS(media->width),
-             (int)_PWG_TOPTS(media->length));
+    snprintf(name, namesize, "w%dh%d", (int)PWG_TO_POINTS(media->width),
+             (int)PWG_TO_POINTS(media->length));
   }
   else
   {
@@ -2534,7 +3643,7 @@ _pwgPageSizeForMedia(
     * Copy the size name from class_sizename_dimensions...
     */
 
-    memcpy(name, sizeptr + 1, dimptr - sizeptr - 1);
+    memcpy(name, sizeptr + 1, (size_t)(dimptr - sizeptr - 1));
     name[dimptr - sizeptr - 1] = '\0';
   }
 
@@ -2551,7 +3660,7 @@ pwg_compare_finishings(
     _pwg_finishings_t *a,              /* I - First finishings value */
     _pwg_finishings_t *b)              /* I - Second finishings value */
 {
-  return (b->value - a->value);
+  return ((int)b->value - (int)a->value);
 }
 
 
@@ -2569,6 +3678,22 @@ pwg_free_finishings(
 
 
 /*
+ * 'pwg_free_material()' - Free a material value.
+ */
+
+static void
+pwg_free_material(_pwg_material_t *m)  /* I - Material value */
+{
+  _cupsStrFree(m->key);
+  _cupsStrFree(m->name);
+
+  cupsFreeOptions(m->num_props, m->props);
+
+  free(m);
+}
+
+
+/*
  * 'pwg_ppdize_name()' - Convert an IPP keyword to a PPD keyword.
  */
 
@@ -2581,14 +3706,14 @@ pwg_ppdize_name(const char *ipp,        /* I - IPP keyword */
        *end;                           /* End of name buffer */
 
 
-  *name = toupper(*ipp++);
+  *name = (char)toupper(*ipp++);
 
   for (ptr = name + 1, end = name + namesize - 1; *ipp && ptr < end;)
   {
     if (*ipp == '-' && _cups_isalpha(ipp[1]))
     {
       ipp ++;
-      *ptr++ = toupper(*ipp++ & 255);
+      *ptr++ = (char)toupper(*ipp++ & 255);
     }
     else
       *ptr++ = *ipp++;
@@ -2599,6 +3724,40 @@ pwg_ppdize_name(const char *ipp, /* I - IPP keyword */
 
 
 /*
+ * '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.
  */
 
@@ -2612,10 +3771,29 @@ pwg_unppdize_name(const char *ppd,      /* I - PPD keyword */
        *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++ = tolower(*ppd & 255);
+      *ptr++ = (char)tolower(*ppd & 255);
     else if (strchr(dashchars, *ppd))
       *ptr++ = '-';
     else
@@ -2624,6 +3802,8 @@ pwg_unppdize_name(const char *ppd,        /* I - PPD keyword */
     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';
@@ -2631,5 +3811,5 @@ pwg_unppdize_name(const char *ppd,        /* I - PPD keyword */
 
 
 /*
- * End of "$Id: ppd-cache.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ppd-cache.c 12980 2015-11-17 21:23:32Z msweet $".
  */
index 2a2696c..126ae49 100644 (file)
@@ -1,27 +1,27 @@
 /*
- * "$Id: ppd-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ppd-private.h 12733 2015-06-12 01:21:05Z msweet $"
  *
- *   Private PPD definitions for CUPS.
+ * Private PPD definitions for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   PostScript is a trademark of Adobe Systems, Inc.
+ * PostScript is a trademark of Adobe Systems, Inc.
  *
- *   This code and any derivative of it may be used and distributed
- *   freely under the terms of the GNU General Public License when
- *   used with GNU Ghostscript or its derivatives.  Use of the code
- *   (or any derivative of it) with software other than GNU
- *   GhostScript (or its derivatives) is governed by the CUPS license
- *   agreement.
+ * This code and any derivative of it may be used and distributed
+ * freely under the terms of the GNU General Public License when
+ * used with GNU Ghostscript or its derivatives.  Use of the code
+ * (or any derivative of it) with software other than GNU
+ * GhostScript (or its derivatives) is governed by the CUPS license
+ * agreement.
  *
- *   This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_PPD_PRIVATE_H_
@@ -49,7 +49,7 @@ extern "C" {
  * Constants...
  */
 
-#  define _PPD_CACHE_VERSION   3       /* Version number in cache file */
+#  define _PPD_CACHE_VERSION   7       /* Version number in cache file */
 
 
 /*
@@ -104,17 +104,25 @@ typedef enum _pwg_print_quality_e /**** PWG print-quality values ****/
 
 typedef struct _pwg_finishings_s       /**** PWG finishings mapping data ****/
 {
-  ipp_finish_t value;                  /* finishings value */
-  int          num_options;            /* Number of options to apply */
-  cups_option_t        *options;               /* Options to apply */
+  ipp_finishings_t     value;          /* finishings value */
+  int                  num_options;    /* Number of options to apply */
+  cups_option_t                *options;       /* Options to apply */
 } _pwg_finishings_t;
 
+typedef struct _pwg_material_s         /**** PWG material mapping data ****/
+{
+  char         *key,                   /* material-key value */
+               *name;                  /* material-name value */
+  int          num_props;              /* Number of properties */
+  cups_option_t        *props;                 /* Material properties */
+} _pwg_material_t;
+
 struct _ppd_cache_s                    /**** PPD cache and PWG conversion data ****/
 {
   int          num_bins;               /* Number of output bins */
-  _pwg_map_t   *bins;                  /* Output bins */
+  pwg_map_t    *bins;                  /* Output bins */
   int          num_sizes;              /* Number of media sizes */
-  _pwg_size_t  *sizes;                 /* 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 */
@@ -122,12 +130,12 @@ struct _ppd_cache_s                       /**** PPD cache and PWG conversion data ****/
   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 */
+  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 */
+  pwg_map_t    *sources;               /* Media sources */
   int          num_types;              /* Number of media types */
-  _pwg_map_t   *types;                 /* 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];
@@ -141,7 +149,18 @@ struct _ppd_cache_s                        /**** PPD cache and PWG conversion data ****/
                *prefilters;            /* cupsPreFilter values */
   int          single_file;            /* cupsSingleFile value */
   cups_array_t *finishings;            /* cupsIPPFinishings values */
-  int          max_copies;             /* cupsMaxCopies value */
+  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 *support_files;         /* Support files - ICC profiles, etc. */
+  char         *cups_3d,               /* cups3D value */
+               *cups_layer_order;      /* cupsLayerOrder value */
+  int          cups_accuracy[3];       /* cupsAccuracy value - x, y, and z in nanometers */
+  int          cups_volume[3];         /* cupsVolume value - x, y, and z in millimeters */
+  cups_array_t *materials;             /* cupsMaterial values */
 };
 
 
@@ -149,18 +168,23 @@ struct _ppd_cache_s                       /**** PPD cache and PWG conversion data ****/
  * 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);
 extern _ppd_cache_t    *_ppdCacheCreateWithFile(const char *filename,
                                                 ipp_t **attrs);
 extern _ppd_cache_t    *_ppdCacheCreateWithPPD(ppd_file_t *ppd);
 extern void            _ppdCacheDestroy(_ppd_cache_t *pc);
 extern const char      *_ppdCacheGetBin(_ppd_cache_t *pc,
                                         const char *output_bin);
-extern int             _ppdCacheGetFinishingOptions(_ppd_cache_t *pc, ipp_t *job,
-                                                    ipp_finish_t value, int num_options,
+extern int             _ppdCacheGetFinishingOptions(_ppd_cache_t *pc,
+                                                    ipp_t *job,
+                                                    ipp_finishings_t value,
+                                                    int num_options,
                                                     cups_option_t **options);
-extern int             _ppdCacheGetFinishingValues(_ppd_cache_t *pc, int num_options,
+extern int             _ppdCacheGetFinishingValues(_ppd_cache_t *pc,
+                                                   int num_options,
                                                    cups_option_t *options,
-                                                   int max_values, int *values);
+                                                   int max_values,
+                                                   int *values);
 extern const char      *_ppdCacheGetInputSlot(_ppd_cache_t *pc, ipp_t *job,
                                               const char *keyword);
 extern const char      *_ppdCacheGetMediaType(_ppd_cache_t *pc, ipp_t *job,
@@ -169,7 +193,7 @@ extern const char   *_ppdCacheGetOutputBin(_ppd_cache_t *pc,
                                               const char *keyword);
 extern const char      *_ppdCacheGetPageSize(_ppd_cache_t *pc, ipp_t *job,
                                              const char *keyword, int *exact);
-extern _pwg_size_t     *_ppdCacheGetSize(_ppd_cache_t *pc,
+extern pwg_size_t      *_ppdCacheGetSize(_ppd_cache_t *pc,
                                          const char *page_size);
 extern const char      *_ppdCacheGetSource(_ppd_cache_t *pc,
                                            const char *input_slot);
@@ -177,6 +201,7 @@ extern const char   *_ppdCacheGetType(_ppd_cache_t *pc,
                                          const char *media_type);
 extern int             _ppdCacheWriteFile(_ppd_cache_t *pc,
                                           const char *filename, ipp_t *attrs);
+extern char            *_ppdCreateFromIPP(char *buffer, size_t bufsize, ipp_t *response);
 extern void            _ppdFreeLanguages(cups_array_t *languages);
 extern cups_encoding_t _ppdGetEncoding(const char *name);
 extern cups_array_t    *_ppdGetLanguages(ppd_file_t *ppd);
@@ -197,7 +222,7 @@ extern const char   *_pwgInputSlotForSource(const char *media_source,
                                                char *name, size_t namesize);
 extern const char      *_pwgMediaTypeForType(const char *media_type,
                                              char *name, size_t namesize);
-extern const char      *_pwgPageSizeForMedia(_pwg_media_t *media,
+extern const char      *_pwgPageSizeForMedia(pwg_media_t *media,
                                              char *name, size_t namesize);
 
 
@@ -211,5 +236,5 @@ extern const char   *_pwgPageSizeForMedia(_pwg_media_t *media,
 #endif /* !_CUPS_PPD_PRIVATE_H_ */
 
 /*
- * End of "$Id: ppd-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ppd-private.h 12733 2015-06-12 01:21:05Z msweet $".
  */
index dd8097d..4afc4bb 100644 (file)
@@ -1,61 +1,27 @@
 /*
- * "$Id: ppd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ppd.c 12848 2015-08-26 18:51:57Z msweet $"
  *
- *   PPD file routines for CUPS.
+ * PPD file routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   PostScript is a trademark of Adobe Systems, Inc.
+ * PostScript is a trademark of Adobe Systems, Inc.
  *
- *   This code and any derivative of it may be used and distributed
- *   freely under the terms of the GNU General Public License when
- *   used with GNU Ghostscript or its derivatives.  Use of the code
- *   (or any derivative of it) with software other than GNU
- *   GhostScript (or its derivatives) is governed by the CUPS license
- *   agreement.
+ * This code and any derivative of it may be used and distributed
+ * freely under the terms of the GNU General Public License when
+ * used with GNU Ghostscript or its derivatives.  Use of the code
+ * (or any derivative of it) with software other than GNU
+ * GhostScript (or its derivatives) is governed by the CUPS license
+ * agreement.
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   ppdClose()             - Free all memory used by the PPD file.
- *   ppdErrorString()       - Returns the text assocated with a status.
- *   _ppdGetEncoding()      - Get the CUPS encoding value for the given
- *                            LanguageEncoding.
- *   ppdLastError()         - Return the status from the last ppdOpen*().
- *   ppdOpen()              - Read a PPD file into memory.
- *   _ppdOpen()             - Read a PPD file into memory.
- *   ppdOpen2()             - Read a PPD file into memory.
- *   ppdOpenFd()            - Read a PPD file into memory.
- *   _ppdOpenFile()         - Read a PPD file into memory.
- *   ppdOpenFile()          - Read a PPD file into memory.
- *   ppdSetConformance()    - Set the conformance level for PPD files.
- *   ppd_add_attr()         - Add an attribute to the PPD data.
- *   ppd_add_choice()       - Add a choice to an option.
- *   ppd_add_size()         - Add a page size.
- *   ppd_compare_attrs()    - Compare two attributes.
- *   ppd_compare_choices()  - Compare two choices...
- *   ppd_compare_coptions() - Compare two custom options.
- *   ppd_compare_options()  - Compare two options.
- *   ppd_decode()           - Decode a string value...
- *   ppd_free_filters()     - Free the filters array.
- *   ppd_free_group()       - Free a single UI group.
- *   ppd_free_option()      - Free a single option.
- *   ppd_get_coption()      - Get a custom option record.
- *   ppd_get_cparam()       - Get a custom parameter record.
- *   ppd_get_group()        - Find or create the named group as needed.
- *   ppd_get_option()       - Find or create the named option as needed.
- *   ppd_hash_option()      - Generate a hash of the option name...
- *   ppd_read()             - Read a line from a PPD file, skipping comment
- *                            lines as necessary.
- *   ppd_update_filters()   - Update the filters array as needed.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
  * Definitions...
  */
 
-#if defined(WIN32) || defined(__EMX__)
-#  define READ_BINARY  "rb"            /* Open a binary file for reading */
-#  define WRITE_BINARY "wb"            /* Open a binary file for writing */
-#else
-#  define READ_BINARY  "r"             /* Open a binary file for reading */
-#  define WRITE_BINARY "w"             /* Open a binary file for writing */
-#endif /* WIN32 || __EMX__ */
-
 #define ppd_free(p)    if (p) free(p)  /* Safe free macro */
 
 #define PPD_KEYWORD    1               /* Line contained a keyword */
@@ -325,7 +283,7 @@ ppdClose(ppd_file_t *ppd)           /* I - PPD file record */
 
 
 /*
- * 'ppdErrorString()' - Returns the text assocated with a status.
+ * 'ppdErrorString()' - Returns the text associated with a status.
  *
  * @since CUPS 1.1.19/OS X 10.3@
  */
@@ -460,10 +418,10 @@ _ppdOpen(
   char                 custom_name[PPD_MAX_NAME];
                                        /* CustomFoo attribute name */
   ppd_attr_t           *custom_attr;   /* CustomFoo attribute */
-  char                 ll[4],          /* Language + '.' */
-                       ll_CC[7];       /* Language country + '.' */
-  size_t               ll_len = 0,     /* Language length */
-                       ll_CC_len = 0;  /* Language country length */
+  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
@@ -561,7 +519,17 @@ _ppdOpen(
       return (NULL);
 
     snprintf(ll_CC, sizeof(ll_CC), "%s.", lang->language);
-    snprintf(ll, sizeof(ll), "%2.2s.", lang->language);
+
+   /*
+    * <rdar://problem/22130168>
+    *
+    * Need to use a different base language for some locales...
+    */
+
+    if (!strcmp(lang->language, "zh_HK"))
+      strlcpy(ll, "zh_TW.", sizeof(ll));
+    else
+      snprintf(ll, sizeof(ll), "%2.2s.", lang->language);
 
     ll_CC_len = strlen(ll_CC);
     ll_len    = strlen(ll);
@@ -872,8 +840,7 @@ _ppdOpen(
       if (ppd->num_profiles == 0)
         profile = malloc(sizeof(ppd_profile_t));
       else
-        profile = realloc(ppd->profiles, sizeof(ppd_profile_t) *
-                                        (ppd->num_profiles + 1));
+        profile = realloc(ppd->profiles, sizeof(ppd_profile_t) * (size_t)(ppd->num_profiles + 1));
 
       if (!profile)
       {
@@ -907,7 +874,7 @@ _ppdOpen(
       if (ppd->num_filters == 0)
         filter = malloc(sizeof(char *));
       else
-        filter = realloc(ppd->filters, sizeof(char *) * (ppd->num_filters + 1));
+        filter = realloc(ppd->filters, sizeof(char *) * (size_t)(ppd->num_filters + 1));
 
       if (filter == NULL)
       {
@@ -937,8 +904,7 @@ _ppdOpen(
       if (ppd->num_fonts == 0)
         tempfonts = (char **)malloc(sizeof(char *));
       else
-        tempfonts = (char **)realloc(ppd->fonts,
-                                    sizeof(char *) * (ppd->num_fonts + 1));
+        tempfonts = (char **)realloc(ppd->fonts, sizeof(char *) * (size_t)(ppd->num_fonts + 1));
 
       if (tempfonts == NULL)
       {
@@ -1173,7 +1139,7 @@ _ppdOpen(
        }
 
       ppd->num_emulations = count;
-      if ((ppd->emulations = calloc(count, sizeof(ppd_emul_t))) == NULL)
+      if ((ppd->emulations = calloc((size_t)count, sizeof(ppd_emul_t))) == NULL)
       {
         cg->ppd_status = PPD_ALLOC_ERROR;
 
@@ -1264,7 +1230,7 @@ _ppdOpen(
 
         ppd->patches = temp;
 
-        strcpy(ppd->patches + strlen(ppd->patches), string);
+        memcpy(ppd->patches + strlen(ppd->patches), string, strlen(string) + 1);
       }
     }
     else if (!strcmp(keyword, "OpenUI"))
@@ -1378,7 +1344,7 @@ _ppdOpen(
       */
 
       if (!_cups_strcasecmp(name, "PageRegion"))
-        strcpy(custom_name, "CustomPageSize");
+        strlcpy(custom_name, "CustomPageSize", sizeof(custom_name));
       else
         snprintf(custom_name, sizeof(custom_name), "Custom%s", name);
 
@@ -1697,8 +1663,7 @@ _ppdOpen(
       if (ppd->num_consts == 0)
        constraint = calloc(2, sizeof(ppd_const_t));
       else
-       constraint = realloc(ppd->consts,
-                            (ppd->num_consts + 2) * sizeof(ppd_const_t));
+       constraint = realloc(ppd->consts, (size_t)(ppd->num_consts + 2) * sizeof(ppd_const_t));
 
       if (constraint == NULL)
       {
@@ -1944,9 +1909,9 @@ _ppdOpen(
         cupsCharsetToUTF8((cups_utf8_t *)choice->text, text,
                           sizeof(choice->text), encoding);
       else if (!strcmp(name, "True"))
-        strcpy(choice->text, _("Yes"));
+        strlcpy(choice->text, _("Yes"), sizeof(choice->text));
       else if (!strcmp(name, "False"))
-        strcpy(choice->text, _("No"));
+        strlcpy(choice->text, _("No"), sizeof(choice->text));
       else
         strlcpy(choice->text, name, sizeof(choice->text));
 
@@ -2282,7 +2247,7 @@ ppd_add_attr(ppd_file_t *ppd,             /* I - PPD file data */
   if (ppd->num_attrs == 0)
     ptr = malloc(sizeof(ppd_attr_t *));
   else
-    ptr = realloc(ppd->attrs, (ppd->num_attrs + 1) * sizeof(ppd_attr_t *));
+    ptr = realloc(ppd->attrs, (size_t)(ppd->num_attrs + 1) * sizeof(ppd_attr_t *));
 
   if (ptr == NULL)
     return (NULL);
@@ -2334,8 +2299,7 @@ ppd_add_choice(ppd_option_t *option,      /* I - Option */
   if (option->num_choices == 0)
     choice = malloc(sizeof(ppd_choice_t));
   else
-    choice = realloc(option->choices,
-                    sizeof(ppd_choice_t) * (option->num_choices + 1));
+    choice = realloc(option->choices, sizeof(ppd_choice_t) * (size_t)(option->num_choices + 1));
 
   if (choice == NULL)
     return (NULL);
@@ -2365,7 +2329,7 @@ ppd_add_size(ppd_file_t *ppd,             /* I - PPD file */
   if (ppd->num_sizes == 0)
     size = malloc(sizeof(ppd_size_t));
   else
-    size = realloc(ppd->sizes, sizeof(ppd_size_t) * (ppd->num_sizes + 1));
+    size = realloc(ppd->sizes, sizeof(ppd_size_t) * (size_t)(ppd->num_sizes + 1));
 
   if (size == NULL)
     return (NULL);
@@ -2454,9 +2418,9 @@ ppd_decode(char *string)          /* I - String to decode */
       while (isxdigit(*inptr & 255))
       {
        if (_cups_isalpha(*inptr))
-         *outptr = (tolower(*inptr) - 'a' + 10) << 4;
+         *outptr = (char)((tolower(*inptr) - 'a' + 10) << 4);
        else
-         *outptr = (*inptr - '0') << 4;
+         *outptr = (char)((*inptr - '0') << 4);
 
        inptr ++;
 
@@ -2464,9 +2428,9 @@ ppd_decode(char *string)          /* I - String to decode */
          break;
 
        if (_cups_isalpha(*inptr))
-         *outptr |= tolower(*inptr) - 'a' + 10;
+         *outptr |= (char)(tolower(*inptr) - 'a' + 10);
        else
-         *outptr |= *inptr - '0';
+         *outptr |= (char)(*inptr - '0');
 
        inptr ++;
        outptr ++;
@@ -2687,8 +2651,7 @@ ppd_get_group(ppd_file_t      *ppd,       /* I - PPD file */
     if (ppd->num_groups == 0)
       group = malloc(sizeof(ppd_group_t));
     else
-      group = realloc(ppd->groups,
-                     (ppd->num_groups + 1) * sizeof(ppd_group_t));
+      group = realloc(ppd->groups, (size_t)(ppd->num_groups + 1) * sizeof(ppd_group_t));
 
     if (group == NULL)
     {
@@ -2736,8 +2699,7 @@ ppd_get_option(ppd_group_t *group,        /* I - Group */
     if (group->num_options == 0)
       option = malloc(sizeof(ppd_option_t));
     else
-      option = realloc(group->options,
-                      (group->num_options + 1) * sizeof(ppd_option_t));
+      option = realloc(group->options, (size_t)(group->num_options + 1) * sizeof(ppd_option_t));
 
     if (option == NULL)
       return (NULL);
@@ -2917,7 +2879,7 @@ ppd_read(cups_file_t    *fp,              /* I - File to read from */
        * Any other character...
        */
 
-       *lineptr++ = ch;
+       *lineptr++ = (char)ch;
        col ++;
 
        if (col > (PPD_MAX_LINE - 1))
@@ -3370,7 +3332,7 @@ ppd_update_filters(ppd_file_t      *ppd,/* I - PPD file */
     if (ppd->num_filters == 0)
       filter = malloc(sizeof(char *));
     else
-      filter = realloc(ppd->filters, sizeof(char *) * (ppd->num_filters + 1));
+      filter = realloc(ppd->filters, sizeof(char *) * (size_t)(ppd->num_filters + 1));
 
     if (filter == NULL)
     {
@@ -3394,5 +3356,5 @@ ppd_update_filters(ppd_file_t      *ppd,/* I - PPD file */
 
 
 /*
- * End of "$Id: ppd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ppd.c 12848 2015-08-26 18:51:57Z msweet $".
  */
index b8fa365..d234a59 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: ppd.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ppd.h 11056 2013-06-25 14:27:30Z msweet $"
  *
  *   PostScript Printer Description definitions for CUPS.
  *
@@ -7,7 +7,7 @@
  *   -D_PPD_DEPRECATED="" TO YOUR COMPILE OPTIONS.  THIS HEADER AND THESE
  *   FUNCTIONS WILL BE REMOVED IN A FUTURE RELEASE OF CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
+ *   Copyright 2007-2013 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -56,19 +56,7 @@ extern "C" {
  */
 
 #  ifndef _PPD_DEPRECATED
-#    if defined(__APPLE__)
-#      if defined(MAC_OS_X_VERSION_10_8) && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_8
-         /* Building for OS X 10.7 and earlier */
-#        define _PPD_DEPRECATED
-#      elif !defined(MAC_OS_X_VERSION_10_8)
-        /* Building for OS X 10.7 and earlier */
-#        define _PPD_DEPRECATED
-#      else
-#        define _PPD_DEPRECATED _CUPS_DEPRECATED
-#      endif /* MAC_OS_X_VERSION_10_8 && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_8 */
-#    else
-#      define _PPD_DEPRECATED _CUPS_DEPRECATED
-#    endif /* __APPLE__ */
+#    define _PPD_DEPRECATED _CUPS_DEPRECATED_1_6_MSG("Use cupsCopyDestInfo and friends instead.")
 #  endif /* !_PPD_DEPRECATED */
 
 
@@ -375,32 +363,39 @@ typedef struct ppd_file_s         /**** PPD File ****/
  */
 
 extern int             cupsMarkOptions(ppd_file_t *ppd, int num_options,
-                                       cups_option_t *options);
-extern void            ppdClose(ppd_file_t *ppd);
+                                       cups_option_t *options) _PPD_DEPRECATED;
+extern void            ppdClose(ppd_file_t *ppd) _PPD_DEPRECATED;
 extern int             ppdCollect(ppd_file_t *ppd, ppd_section_t section,
-                                  ppd_choice_t  ***choices);
-extern int             ppdConflicts(ppd_file_t *ppd);
+                                  ppd_choice_t  ***choices) _PPD_DEPRECATED;
+extern int             ppdConflicts(ppd_file_t *ppd) _PPD_DEPRECATED;
 extern int             ppdEmit(ppd_file_t *ppd, FILE *fp,
-                               ppd_section_t section);
+                               ppd_section_t section) _PPD_DEPRECATED;
 extern int             ppdEmitFd(ppd_file_t *ppd, int fd,
-                                 ppd_section_t section);
+                                 ppd_section_t section) _PPD_DEPRECATED;
 extern int             ppdEmitJCL(ppd_file_t *ppd, FILE *fp, int job_id,
-                                  const char *user, const char *title);
-extern ppd_choice_t    *ppdFindChoice(ppd_option_t *o, const char *option);
+                                  const char *user, const char *title)
+                                  _PPD_DEPRECATED;
+extern ppd_choice_t    *ppdFindChoice(ppd_option_t *o, const char *option)
+                                      _PPD_DEPRECATED;
 extern ppd_choice_t    *ppdFindMarkedChoice(ppd_file_t *ppd,
-                                            const char *keyword);
-extern ppd_option_t    *ppdFindOption(ppd_file_t *ppd, const char *keyword);
+                                            const char *keyword)
+                                            _PPD_DEPRECATED;
+extern ppd_option_t    *ppdFindOption(ppd_file_t *ppd, const char *keyword)
+                                      _PPD_DEPRECATED;
 extern int             ppdIsMarked(ppd_file_t *ppd, const char *keyword,
-                                   const char *option);
-extern void            ppdMarkDefaults(ppd_file_t *ppd);
+                                   const char *option) _PPD_DEPRECATED;
+extern void            ppdMarkDefaults(ppd_file_t *ppd) _PPD_DEPRECATED;
 extern int             ppdMarkOption(ppd_file_t *ppd, const char *keyword,
-                                     const char *option);
-extern ppd_file_t      *ppdOpen(FILE *fp);
-extern ppd_file_t      *ppdOpenFd(int fd);
-extern ppd_file_t      *ppdOpenFile(const char *filename);
-extern float           ppdPageLength(ppd_file_t *ppd, const char *name);
-extern ppd_size_t      *ppdPageSize(ppd_file_t *ppd, const char *name);
-extern float           ppdPageWidth(ppd_file_t *ppd, const char *name);
+                                     const char *option) _PPD_DEPRECATED;
+extern ppd_file_t      *ppdOpen(FILE *fp) _PPD_DEPRECATED;
+extern ppd_file_t      *ppdOpenFd(int fd) _PPD_DEPRECATED;
+extern ppd_file_t      *ppdOpenFile(const char *filename) _PPD_DEPRECATED;
+extern float           ppdPageLength(ppd_file_t *ppd, const char *name)
+                                     _PPD_DEPRECATED;
+extern ppd_size_t      *ppdPageSize(ppd_file_t *ppd, const char *name)
+                                    _PPD_DEPRECATED;
+extern float           ppdPageWidth(ppd_file_t *ppd, const char *name)
+                                    _PPD_DEPRECATED;
 
 /**** New in CUPS 1.1.19 ****/
 extern const char      *ppdErrorString(ppd_status_t status) _PPD_DEPRECATED;
@@ -420,14 +415,17 @@ extern int                ppdCollect2(ppd_file_t *ppd, ppd_section_t section,
 extern int             ppdEmitAfterOrder(ppd_file_t *ppd, FILE *fp,
                                          ppd_section_t section, int limit,
                                          float min_order) _PPD_DEPRECATED;
-extern int             ppdEmitJCLEnd(ppd_file_t *ppd, FILE *fp) _PPD_DEPRECATED;
+extern int             ppdEmitJCLEnd(ppd_file_t *ppd, FILE *fp)
+                                     _PPD_DEPRECATED;
 extern char            *ppdEmitString(ppd_file_t *ppd, ppd_section_t section,
                                       float min_order) _PPD_DEPRECATED;
 extern ppd_coption_t   *ppdFindCustomOption(ppd_file_t *ppd,
-                                            const char *keyword) _PPD_DEPRECATED;
+                                            const char *keyword)
+                                            _PPD_DEPRECATED;
 extern ppd_cparam_t    *ppdFindCustomParam(ppd_coption_t *opt,
                                            const char *name) _PPD_DEPRECATED;
-extern ppd_cparam_t    *ppdFirstCustomParam(ppd_coption_t *opt) _PPD_DEPRECATED;
+extern ppd_cparam_t    *ppdFirstCustomParam(ppd_coption_t *opt)
+                                            _PPD_DEPRECATED;
 extern ppd_option_t    *ppdFirstOption(ppd_file_t *ppd) _PPD_DEPRECATED;
 extern ppd_cparam_t    *ppdNextCustomParam(ppd_coption_t *opt) _PPD_DEPRECATED;
 extern ppd_option_t    *ppdNextOption(ppd_file_t *ppd) _PPD_DEPRECATED;
@@ -445,7 +443,7 @@ extern const char   *ppdLocalizeIPPReason(ppd_file_t *ppd,
 extern int             cupsGetConflicts(ppd_file_t *ppd, const char *option,
                                         const char *choice,
                                         cups_option_t **options)
-                                            _PPD_DEPRECATED;
+                                        _PPD_DEPRECATED;
 extern int             cupsResolveConflicts(ppd_file_t *ppd,
                                             const char *option,
                                             const char *choice,
@@ -455,7 +453,7 @@ extern int          cupsResolveConflicts(ppd_file_t *ppd,
 extern int             ppdInstallableConflict(ppd_file_t *ppd,
                                               const char *option,
                                               const char *choice)
-                                                  _PPD_DEPRECATED;
+                                              _PPD_DEPRECATED;
 extern ppd_attr_t      *ppdLocalizeAttr(ppd_file_t *ppd, const char *keyword,
                                         const char *spec) _PPD_DEPRECATED;
 extern const char      *ppdLocalizeMarkerName(ppd_file_t *ppd,
@@ -476,5 +474,5 @@ extern int          ppdPageSizeLimits(ppd_file_t *ppd,
 #endif /* !_CUPS_PPD_H_ */
 
 /*
- * End of "$Id: ppd.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ppd.h 11056 2013-06-25 14:27:30Z msweet $".
  */
index 54574f1..f1e2b0f 100644 (file)
@@ -1,33 +1,17 @@
 /*
- * "$Id: pwg-media.c 11241 2013-08-14 20:41:32Z msweet $"
+ * "$Id: pwg-media.c 11881 2014-05-16 20:59:22Z msweet $"
  *
- *   PWG media name API implementation for CUPS.
+ * PWG media name API implementation for CUPS.
  *
- *   Copyright 2009-2013 by Apple Inc.
+ * Copyright 2009-2014 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   _pwgFormatInches()      - Convert and format PWG units as inches.
- *   _pwgFormatMillimeters() - Convert and format PWG units as millimeters.
- *   _pwgGenerateSize()      - Generate a PWG size keyword.
- *   _pwgInitSize()         - Initialize a PWG size using IPP job template
- *                            attributes.
- *   _pwgMediaForLegacy()    - Find a PWG media size by ISO/IPP legacy name.
- *   _pwgMediaForPPD()      - Find a PWG media size by Adobe PPD name.
- *   _pwgMediaForPWG()      - Find a PWG media size by 5101.1 self-describing
- *                            name.
- *   _pwgMediaForSize()      - Get the PWG media name for a given size.
- *   pwg_compare_legacy()    - Compare two sizes using the legacy names.
- *   pwg_compare_ppd()      - Compare two sizes using the PPD names.
- *   pwg_compare_pwg()      - Compare two sizes using the PWG names.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
  * 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 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[] =
+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),
@@ -87,6 +75,7 @@ static _pwg_media_t const cups_pwg_media[] =
   _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),
@@ -117,10 +106,6 @@ static _pwg_media_t const cups_pwg_media[] =
   _PWG_MEDIA_IN("na_arch-e_36x48in", "arch-e", "ARCHE", 36, 48),
   _PWG_MEDIA_IN("na_f_44x68in", NULL, "AnsiF", 44, 68),
 
-  /* 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),
-
   /* 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),
@@ -183,6 +168,10 @@ static _pwg_media_t const cups_pwg_media[] =
   _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", NULL, 215, 305),
+  _PWG_MEDIA_MM("iso_sra4_225x320mm", "iso-sra4", NULL, 225, 320),
+  _PWG_MEDIA_MM("iso_ra3_305x430mm", "iso-ra3", NULL, 305, 430),
+  _PWG_MEDIA_MM("iso_sra3_320x450mm", "iso-sra3", NULL, 320, 450),
   _PWG_MEDIA_MM("iso_ra2_430x610mm", "iso-ra2", NULL, 430, 610),
   _PWG_MEDIA_MM("iso_sra2_450x640mm", "iso-sra2", NULL, 450, 640),
   _PWG_MEDIA_MM("iso_ra1_610x860mm", "iso-ra1", NULL, 610, 860),
@@ -203,22 +192,27 @@ static _pwg_media_t const cups_pwg_media[] =
   _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, NULL, 216, 330),
+  _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, NULL, 240, 322.1),
-  _PWG_MEDIA_MM("jpn_kaku2_240x332mm", NULL, "EnvKaku2", 240, 332),
 
   /* 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_5_110x220mm", NULL, "EnvPRC5", 110, 220),
   _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),
@@ -227,6 +221,10 @@ static _pwg_media_t const cups_pwg_media[] =
   _PWG_MEDIA_MM("om_pa-kai_267x389mm", NULL, NULL, 267, 389),
   _PWG_MEDIA_MM("om_dai-pa-kai_275x395mm", NULL, NULL, 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),
 
@@ -236,136 +234,133 @@ static _pwg_media_t const cups_pwg_media[] =
   _PWG_MEDIA_MM("om_large-photo_200x300", NULL, "om_large-photo", 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_invite_220x220mm", NULL, "EnvInvite", 220, 220),
+  _PWG_MEDIA_MM("om_small-photo_100x200mm", NULL, "om_wide-photo", 100, 200)
 };
 
 
 /*
- * '_pwgFormatInches()' - Convert and format PWG units as inches.
+ * '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/OS X 10.9@
  */
 
-char *                                 /* O - String */
-_pwgFormatInches(char   *buf,          /* I - Buffer */
-                 size_t bufsize,       /* I - Size of buffer */
-                 int    val)           /* I - Value in hundredths of millimeters */
+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 */
 {
-  int  thousandths,                    /* Thousandths of inches */
-       integer,                        /* Integer portion */
-       fraction;                       /* Fractional portion */
+  char         usize[12 + 1 + 12 + 3], /* Unit size: NNNNNNNNNNNNxNNNNNNNNNNNNuu */
+               *uptr;                  /* Pointer into unit size */
+  char         *(*format)(char *, size_t, int);
+                                       /* Formatting function */
 
 
  /*
-  * Convert hundredths of millimeters to thousandths of inches and round to
-  * the nearest thousandth.
+  * Range check input...
   */
 
-  thousandths = (val * 1000 + 1270) / 2540;
-  integer     = thousandths / 1000;
-  fraction    = thousandths % 1000;
+  DEBUG_printf(("pwgFormatSize(keyword=%p, keysize=" CUPS_LLFMT
+                ", prefix=\"%s\", name=\"%s\", width=%d, length=%d, "
+                "units=\"%s\")", keyword, CUPS_LLCAST keysize, prefix, name,
+                width, length, units));
 
- /*
-  * Format as a pair of integers (avoids locale stuff), avoiding trailing
-  * zeros...
-  */
+  if (keyword)
+    *keyword = '\0';
 
-  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);
-}
-
-
-/*
- * '_pwgFormatMillimeters()' - Convert and format PWG units as millimeters.
- */
-
-char *                                 /* O - String */
-_pwgFormatMillimeters(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.
-  */
+  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);
+  }
 
-  integer     = val / 100;
-  fraction    = val % 100;
+  if (name)
+  {
+   /*
+    * Validate name...
+    */
 
- /*
-  * Format as a pair of integers (avoids locale stuff), avoiding trailing
-  * zeros...
-  */
+    const char *nameptr;               /* Pointer into name */
 
-  if (fraction == 0)
-    snprintf(buf, bufsize, "%d", integer);
-  else if (fraction % 10)
-    snprintf(buf, bufsize, "%d.%02d", integer, fraction);
+    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
-    snprintf(buf, bufsize, "%d.%01d", integer, fraction / 10);
-
-  return (buf);
-}
+    name = usize;
 
 
-/*
- * '_pwgGenerateSize()' - Generate a PWG size keyword.
- */
+  if (!units)
+  {
+    if ((width % 635) == 0 && (length % 635) == 0)
+    {
+     /*
+      * Use inches since the size is a multiple of 1/4 inch.
+      */
 
-void
-_pwgGenerateSize(char       *keyword,  /* I - Keyword buffer */
-                 size_t     keysize,   /* I - Size of keyword buffer */
-                const char *prefix,    /* I - Prefix for PWG size or NULL */
-                const char *name,      /* I - Size name or NULL */
-                int        width,      /* I - Width of page in 2540ths */
-                int        length)     /* I - Length of page in 2540ths */
-{
-  const char   *units;                 /* Units to report */
-  char         usize[12 + 1 + 12 + 3], /* Unit size: NNNNNNNNNNNNxNNNNNNNNNNNNuu */
-               *uptr;                  /* Pointer into unit size */
-  char         *(*format)(char *, size_t, int);
-                                       /* Formatting function */
+      units = "in";
+    }
+    else
+    {
+     /*
+      * Use millimeters since the size is not a multiple of 1/4 inch.
+      */
 
+      units = "mm";
+    }
+  }
 
-  if ((width % 635) == 0 && (length % 635) == 0)
+  if (!strcmp(units, "in"))
   {
-   /*
-    * Use inches since the size is a multiple of 1/4 inch.
-    */
-
-    units   = "in";
-    format  = _pwgFormatInches;
+    format = pwg_format_inches;
 
     if (!prefix)
       prefix = "oe";
   }
   else
   {
-   /*
-    * Use millimeters since the size is not a multiple of 1/4 inch.
-    */
-
-    units   = "mm";
-    format  = _pwgFormatMillimeters;
+    format = pwg_format_millimeters;
 
     if (!prefix)
       prefix = "om";
   }
 
+ /*
+  * Format the size string...
+  */
+
   uptr = usize;
-  (*format)(uptr, sizeof(usize) - (uptr - usize), width);
+  (*format)(uptr, sizeof(usize) - (size_t)(uptr - usize), width);
   uptr += strlen(uptr);
   *uptr++ = 'x';
-  (*format)(uptr, sizeof(usize) - (uptr - usize), length);
+  (*format)(uptr, sizeof(usize) - (size_t)(uptr - usize), length);
   uptr += strlen(uptr);
 
  /*
@@ -374,25 +369,40 @@ _pwgGenerateSize(char       *keyword,     /* I - Keyword buffer */
 
   memcpy(uptr, units, 3);
 
-  if (!name)
-    name = usize;
-
  /*
   * Format the name...
   */
 
   snprintf(keyword, keysize, "%s_%s_%s", prefix, name, usize);
+
+  return (1);
 }
 
+/* For OS X 10.8 and earlier... */
+void _pwgGenerateSize(char *keyword, size_t keysize, const char *prefix,
+                     const char *name, int width, int length)
+{ pwgFormatSizeName(keyword, keysize, prefix, name, width, length, NULL); }
+
 
 /*
- * '_pwgInitSize()' - Initialize a PWG size using IPP job template attributes.
+ * '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/OS X 10.9@
  */
 
-int                                    /* O - 1 if size was initialize, 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 */
+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 */
@@ -403,7 +413,7 @@ _pwgInitSize(_pwg_size_t *size,             /* I - Size to initialize */
                *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 */
+  pwg_media_t  *pwg;                   /* PWG media value */
 
 
  /*
@@ -417,7 +427,7 @@ _pwgInitSize(_pwg_size_t *size,             /* I - Size to initialize */
   * Look for media-col and then media...
   */
 
-  memset(size, 0, sizeof(_pwg_size_t));
+  memset(size, 0, sizeof(pwg_size_t));
   *margins_set = 0;
 
   if ((media_col = ippFindAttribute(job, "media-col",
@@ -448,20 +458,20 @@ _pwgInitSize(_pwg_size_t *size,           /* I - Size to initialize */
       }
       else if (!x_dimension)
       {
-       _cupsSetError(IPP_INTERNAL_ERROR,
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
                      _("Missing x-dimension in media-size."), 1);
         return (0);
       }
       else if (!y_dimension)
       {
-       _cupsSetError(IPP_INTERNAL_ERROR,
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
                      _("Missing y-dimension in media-size."), 1);
         return (0);
       }
     }
     else
     {
-      _cupsSetError(IPP_INTERNAL_ERROR, _("Missing media-size in media-col."),
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Missing media-size in media-col."),
                     1);
       return (0);
     }
@@ -496,18 +506,18 @@ _pwgInitSize(_pwg_size_t *size,           /* I - Size to initialize */
         if ((media = ippFindAttribute(job, "PageSize", IPP_TAG_NAME)) == NULL)
          media = ippFindAttribute(job, "PageRegion", IPP_TAG_NAME);
 
-    if (media)
+    if (media && media->values[0].string.text)
     {
       const char *name = media->values[0].string.text;
                                        /* Name string */
 
-      if ((pwg = _pwgMediaForPWG(name)) == NULL)
+      if ((pwg = pwgMediaForPWG(name)) == NULL)
       {
        /*
         * Not a PWG name, try a legacy name...
        */
 
-       if ((pwg = _pwgMediaForLegacy(name)) == NULL)
+       if ((pwg = pwgMediaForLegacy(name)) == NULL)
        {
         /*
          * Not a legacy name, try a PPD name...
@@ -515,7 +525,7 @@ _pwgInitSize(_pwg_size_t *size,             /* I - Size to initialize */
 
          const char    *suffix;        /* Suffix on media string */
 
-         pwg = _pwgMediaForPPD(name);
+         pwg = pwgMediaForPPD(name);
          if (pwg &&
              (suffix = name + strlen(name) - 10 /* .FullBleed */) > name &&
              !_cups_strcasecmp(suffix, ".FullBleed"))
@@ -536,13 +546,13 @@ _pwgInitSize(_pwg_size_t *size,           /* I - Size to initialize */
       }
       else
       {
-        _cupsSetError(IPP_INTERNAL_ERROR, _("Unsupported media value."), 1);
+        _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unsupported media value."), 1);
        return (0);
       }
     }
     else
     {
-      _cupsSetError(IPP_INTERNAL_ERROR, _("Missing media or media-col."), 1);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Missing media or media-col."), 1);
       return (0);
     }
   }
@@ -550,16 +560,24 @@ _pwgInitSize(_pwg_size_t *size,           /* I - Size to initialize */
   return (1);
 }
 
+/* For OS X 10.8 and earlier */
+int _pwgInitSize(pwg_size_t *size, ipp_t *job, int *margins_set)
+{ return (pwgInitSize(size, job, margins_set)); }
+
 
 /*
- * '_pwgMediaForLegacy()' - Find a PWG media size by ISO/IPP legacy name.
+ * '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/OS X 10.9@
  */
 
-_pwg_media_t *                         /* O - Matching size or NULL */
-_pwgMediaForLegacy(
-    const char *legacy)                        /* I - Legacy size name */
+pwg_media_t *                          /* O - Matching size or NULL */
+pwgMediaForLegacy(const char *legacy)  /* I - Legacy size name */
 {
-  _pwg_media_t key;                    /* Search key */
+  pwg_media_t  key;                    /* Search key */
   _cups_globals_t *cg = _cupsGlobals();        /* Global data */
 
 
@@ -577,13 +595,13 @@ _pwgMediaForLegacy(
   if (!cg->leg_size_lut)
   {
     int                        i;              /* Looping var */
-    _pwg_media_t       *size;          /* Current size */
+    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;
+             size = (pwg_media_t *)cups_pwg_media;
         i > 0;
         i --, size ++)
       if (size->legacy)
@@ -595,18 +613,33 @@ _pwgMediaForLegacy(
   */
 
   key.legacy = legacy;
-  return ((_pwg_media_t *)cupsArrayFind(cg->leg_size_lut, &key));
+  return ((pwg_media_t *)cupsArrayFind(cg->leg_size_lut, &key));
 }
 
+/* For OS X 10.8 and earlier */
+pwg_media_t *_pwgMediaForLegacy(const char *legacy)
+{ return (pwgMediaForLegacy(legacy)); }
+
 
 /*
- * '_pwgMediaForPPD()' - Find a PWG media size by Adobe PPD name.
+ * '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/OS X 10.9@
  */
 
-_pwg_media_t *                         /* O - Matching size or NULL */
-_pwgMediaForPPD(const char *ppd)       /* I - PPD size name */
+pwg_media_t *                          /* O - Matching size or NULL */
+pwgMediaForPPD(const char *ppd)                /* I - PPD size name */
 {
-  _pwg_media_t key,                    /* Search key */
+  pwg_media_t  key,                    /* Search key */
                *size;                  /* Matching size */
   _cups_globals_t *cg = _cupsGlobals();        /* Global data */
 
@@ -629,7 +662,7 @@ _pwgMediaForPPD(const char *ppd)    /* I - PPD size name */
     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;
+             size = (pwg_media_t *)cups_pwg_media;
         i > 0;
         i --, size ++)
       if (size->ppd)
@@ -641,7 +674,7 @@ _pwgMediaForPPD(const char *ppd)    /* I - PPD size name */
   */
 
   key.ppd = ppd;
-  if ((size = (_pwg_media_t *)cupsArrayFind(cg->ppd_size_lut, &key)) == NULL)
+  if ((size = (pwg_media_t *)cupsArrayFind(cg->ppd_size_lut, &key)) == NULL)
   {
    /*
     * See if the name is of the form:
@@ -655,77 +688,101 @@ _pwgMediaForPPD(const char *ppd) /* I - PPD size name */
     *   [Custom.]WIDTHxLENGTHpt[.FullBleed]  - Size in points [borderless]
     */
 
-    double             w, l,           /* Width and length of page */
-                       factor;         /* Unit scaling factor */
+    int                        w, l,           /* Width and length of page */
+                       numer,          /* Unit scaling factor */
+                       denom;          /* ... */
     char               *ptr;           /* Pointer into name */
-    struct lconv       *loc;           /* Locale data */
+    const char         *units;         /* Pointer to units */
     int                        custom;         /* Custom page size? */
 
+
     if (!_cups_strncasecmp(ppd, "Custom.", 7))
     {
       custom = 1;
-      factor = 2540.0 / 72.0;
+      numer  = 2540;
+      denom  = 72;
       ptr    = (char *)ppd + 7;
     }
     else
     {
       custom = 0;
-      factor = 2540.0;
+      numer  = 2540;
+      denom  = 1;
       ptr    = (char *)ppd;
     }
 
-    loc = localeconv();
-    w   = _cupsStrScand(ptr, &ptr, loc);
+   /*
+    * Find any units in the size...
+    */
 
-    if (ptr && ptr > ppd && *ptr == 'x')
+    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)
     {
-      l = _cupsStrScand(ptr + 1, &ptr, loc);
-
-      if (ptr &&
-         (!*ptr ||
-          !_cups_strcasecmp(ptr, "FullBleed") ||
-          !_cups_strcasecmp(ptr, ".FullBleed") ||
-          !_cups_strcasecmp(ptr, "cm") ||
-          !_cups_strcasecmp(ptr, "cm.FullBleed") ||
-          !_cups_strcasecmp(ptr, "ft") ||
-          !_cups_strcasecmp(ptr, "ft.FullBleed") ||
-          !_cups_strcasecmp(ptr, "in") ||
-          !_cups_strcasecmp(ptr, "in.FullBleed") ||
-          !_cups_strcasecmp(ptr, "m") ||
-          !_cups_strcasecmp(ptr, "m.FullBleed") ||
-          !_cups_strcasecmp(ptr, "mm") ||
-          !_cups_strcasecmp(ptr, "mm.FullBleed") ||
-          !_cups_strcasecmp(ptr, "pt") ||
-          !_cups_strcasecmp(ptr, "pt.FullBleed")))
+      if (isdigit(*units & 255) || *units == '.')
+        units ++;
+
+      if (!_cups_strncasecmp(units, "cm", 2))
       {
-       size = &(cg->pwg_media);
-
-       if (!_cups_strncasecmp(ptr, "cm", 2))
-         factor = 1000.0;
-       else if (!_cups_strncasecmp(ptr, "ft", 2))
-         factor = 2540.0 * 12.0;
-       else if (!_cups_strncasecmp(ptr, "in", 2))
-         factor = 2540.0;
-       else if (!_cups_strncasecmp(ptr, "mm", 2))
-         factor = 100.0;
-       else if (*ptr == 'm' || *ptr == 'M')
-         factor = 100000.0;
-       else if (!_cups_strncasecmp(ptr, "pt", 2))
-         factor = 2540.0 / 72.0;
+        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
        */
 
-       size->width  = (int)(w * factor);
-       size->length = (int)(l * factor);
+       size         = &(cg->pwg_media);
+       size->width  = w;
+       size->length = l;
        size->pwg    = cg->pwg_name;
 
-       _pwgGenerateSize(cg->pwg_name, sizeof(cg->pwg_name),
-                        custom ? "custom" : NULL, custom ? ppd + 7 : NULL,
-                        size->width, size->length);
+       pwgFormatSizeName(cg->pwg_name, sizeof(cg->pwg_name),
+                         custom ? "custom" : NULL, custom ? ppd + 7 : NULL,
+                         size->width, size->length, NULL);
       }
     }
   }
@@ -733,16 +790,29 @@ _pwgMediaForPPD(const char *ppd)  /* I - PPD size name */
   return (size);
 }
 
+/* For OS X 10.8 and earlier */
+pwg_media_t *_pwgMediaForPPD(const char *ppd)
+{ return (pwgMediaForPPD(ppd)); }
+
 
 /*
- * '_pwgMediaForPWG()' - Find a PWG media size by 5101.1 self-describing name.
+ * '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/OS X 10.9@
  */
 
-_pwg_media_t *                         /* O - Matching size or NULL */
-_pwgMediaForPWG(const char *pwg)       /* I - PWG size name */
+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 */
+  pwg_media_t  key,                    /* Search key */
                *size;                  /* Matching size */
   _cups_globals_t *cg = _cupsGlobals();        /* Global data */
 
@@ -765,7 +835,7 @@ _pwgMediaForPWG(const char *pwg)    /* I - PWG size name */
     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;
+             size = (pwg_media_t *)cups_pwg_media;
         i > 0;
         i --, size ++)
       cupsArrayAdd(cg->pwg_size_lut, size);
@@ -776,7 +846,7 @@ _pwgMediaForPWG(const char *pwg)    /* I - PWG size name */
   */
 
   key.pwg = pwg;
-  if ((size = (_pwg_media_t *)cupsArrayFind(cg->pwg_size_lut, &key)) == NULL &&
+  if ((size = (pwg_media_t *)cupsArrayFind(cg->pwg_size_lut, &key)) == NULL &&
       (ptr = (char *)strchr(pwg, '_')) != NULL &&
       (ptr = (char *)strchr(ptr + 1, '_')) != NULL)
   {
@@ -787,31 +857,29 @@ _pwgMediaForPWG(const char *pwg)  /* I - PWG size name */
     * class_name_WWWxHHHmm
     */
 
-    double             w, l;           /* Width and length of page */
-    struct lconv       *loc;           /* Locale data */
+    int                w, l;                   /* Width and length of page */
+    int                numer;                  /* Scale factor for units */
+    const char *units = ptr + strlen(ptr) - 2;
+                                       /* Units from size */
 
     ptr ++;
-    loc = localeconv();
-    w   = _cupsStrScand(ptr, &ptr, loc);
+
+    if (units >= ptr && !strcmp(units, "in"))
+      numer = 2540;
+    else
+      numer = 100;
+
+    w = pwg_scan_measurement(ptr, &ptr, numer, 1);
 
     if (ptr && *ptr == 'x')
     {
-      l = _cupsStrScand(ptr + 1, &ptr, loc);
+      l = pwg_scan_measurement(ptr + 1, &ptr, numer, 1);
 
-      if (ptr && (!strcmp(ptr, "in") || !strcmp(ptr, "mm")))
+      if (ptr)
       {
-       size = &(cg->pwg_media);
-
-       if (!strcmp(ptr, "mm"))
-       {
-         size->width  = (int)(w * 100 + 0.5);
-         size->length = (int)(l * 100 + 0.5);
-       }
-       else
-       {
-         size->width  = (int)(w * 2540 + 0.5);
-         size->length = (int)(l * 2540 + 0.5);
-       }
+        size         = &(cg->pwg_media);
+        size->width  = w;
+        size->length = l;
 
         strlcpy(cg->pwg_name, pwg, sizeof(cg->pwg_name));
        size->pwg = cg->pwg_name;
@@ -822,17 +890,48 @@ _pwgMediaForPWG(const char *pwg)  /* I - PWG size name */
   return (size);
 }
 
+/* For OS X 10.8 and earlier */
+pwg_media_t *_pwgMediaForPWG(const char *pwg)
+{ return (pwgMediaForPWG(pwg)); }
+
+
+/*
+ * '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/OS X 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...
+  */
+
+  return (_pwgMediaNearSize(width, length, 176));
+}
+
 
 /*
- * '_pwgMediaForSize()' - Get the PWG media name for a given size.
+ * '_pwgMediaNearSize()' - Get the PWG media size within the given tolerance.
  */
 
-_pwg_media_t *                         /* O - PWG media name */
-_pwgMediaForSize(int width,            /* I - Width in 2540ths */
-                int length)            /* I - Length in 2540ths */
+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 */
+  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 */
@@ -852,21 +951,17 @@ _pwgMediaForSize(int width,               /* I - Width in 2540ths */
   */
 
   for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])),
-          media = (_pwg_media_t *)cups_pwg_media;
+          media = (pwg_media_t *)cups_pwg_media;
        i > 0;
        i --, media ++)
   {
-   /*
-    * Adobe uses a size matching algorithm with an epsilon of 5 points, which
-    * is just about 176/2540ths...
-    */
 
     dw = abs(media->width - width);
     dl = abs(media->length - length);
 
     if (!dw && !dl)
       return (media);
-    else if (dw < 176 && dl < 176)
+    else if (dw <= epsilon && dl <= epsilon)
     {
       if (dw <= best_dw && dl <= best_dl)
       {
@@ -886,8 +981,8 @@ _pwgMediaForSize(int width,         /* I - Width in 2540ths */
   *     custom_WIDTHxHEIGHTuu_WIDTHxHEIGHTuu
   */
 
-  _pwgGenerateSize(cg->pwg_name, sizeof(cg->pwg_name), "custom", NULL, width,
-                   length);
+  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;
@@ -896,14 +991,31 @@ _pwgMediaForSize(int width,               /* I - Width in 2540ths */
   return (&(cg->pwg_media));
 }
 
+/* For OS X 10.8 and earlier */
+pwg_media_t *_pwgMediaForSize(int width, int length)
+{ return (pwgMediaForSize(width, length)); }
+
+
+/*
+ * '_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 */
+pwg_compare_legacy(pwg_media_t *a,     /* I - First size */
+                   pwg_media_t *b)     /* I - Second size */
 {
   return (strcmp(a->legacy, b->legacy));
 }
@@ -914,8 +1026,8 @@ pwg_compare_legacy(_pwg_media_t *a,        /* I - First size */
  */
 
 static int                             /* O - Result of comparison */
-pwg_compare_ppd(_pwg_media_t *a,       /* I - First size */
-                _pwg_media_t *b)       /* I - Second size */
+pwg_compare_ppd(pwg_media_t *a,        /* I - First size */
+                pwg_media_t *b)        /* I - Second size */
 {
   return (strcmp(a->ppd, b->ppd));
 }
@@ -926,13 +1038,147 @@ pwg_compare_ppd(_pwg_media_t *a,        /* I - First size */
  */
 
 static int                             /* O - Result of comparison */
-pwg_compare_pwg(_pwg_media_t *a,       /* I - First size */
-                _pwg_media_t *b)       /* I - Second size */
+pwg_compare_pwg(pwg_media_t *a,        /* I - First size */
+                pwg_media_t *b)        /* I - Second size */
 {
   return (strcmp(a->pwg, b->pwg));
 }
 
 
 /*
- * End of "$Id: pwg-media.c 11241 2013-08-14 20:41:32Z msweet $".
+ * '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);
+}
+
+
+/*
+ * End of "$Id: pwg-media.c 11881 2014-05-16 20:59:22Z msweet $".
  */
index 113a1e7..3e086db 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: pwg-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: pwg-private.h 11826 2014-04-23 00:38:21Z msweet $"
  *
  *   Private PWG media API definitions for CUPS.
  *
- *   Copyright 2009-2012 by Apple Inc.
+ *   Copyright 2009-2013 by Apple Inc.
  *
  *   These coded instructions, statements, and computer programs are the
  *   property of Apple Inc. and are protected by Federal copyright
@@ -35,63 +35,38 @@ extern "C" {
 
 
 /*
- * Macros...
+ * Deprecated stuff for prior users of the private PWG media API...
  */
 
-/* Convert from points to 2540ths */
-#  define _PWG_FROMPTS(n)      (int)(((n) * 2540 + 36) / 72)
-/* Convert from 2540ths to points */
-#  define _PWG_TOPTS(n)                ((n) * 72.0 / 2540.0)
-
-
-/*
- * Types and structures...
- */
-
-typedef struct _pwg_map_s              /**** Map element - PPD to/from PWG */
-{
-  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 */
-{
-  _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;
+#  ifndef _CUPS_NO_DEPRECATED
+typedef struct pwg_map_s _pwg_map_t;
+typedef struct pwg_media_s _pwg_media_t;
+typedef struct pwg_size_s _pwg_size_t;
+#  endif /* _CUPS_NO_DEPRECATED */
 
 
 /*
  * Functions...
  */
 
-extern char            *_pwgFormatInches(char *buf, size_t bufsize, int val);
-extern char            *_pwgFormatMillimeters(char *buf, size_t bufsize,
-                                              int val);
 extern void            _pwgGenerateSize(char *keyword, size_t keysize,
                                         const char *prefix,
                                         const char *name,
-                                        int width, int length);
-extern int             _pwgInitSize(_pwg_size_t *size, ipp_t *job,
-                                    int *margins_set);
-extern _pwg_media_t    *_pwgMediaForLegacy(const char *legacy);
-extern _pwg_media_t    *_pwgMediaForPPD(const char *ppd);
-extern _pwg_media_t    *_pwgMediaForPWG(const char *pwg);
-extern _pwg_media_t    *_pwgMediaForSize(int width, int length);
+                                        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 pwg_media_t     *_pwgMediaForLegacy(const char *legacy)
+                           _CUPS_INTERNAL_MSG("Use pwgMediaForLegacy instead.");
+extern pwg_media_t     *_pwgMediaForPPD(const char *ppd)
+                           _CUPS_INTERNAL_MSG("Use pwgMediaForPPD instead.");
+extern pwg_media_t     *_pwgMediaForPWG(const char *pwg)
+                           _CUPS_INTERNAL_MSG("Use pwgMediaForPWG instead.");
+extern pwg_media_t     *_pwgMediaForSize(int width, int length)
+                           _CUPS_INTERNAL_MSG("Use pwgMediaForSize instead.");
+extern const pwg_media_t *_pwgMediaTable(size_t *num_media);
+extern pwg_media_t *_pwgMediaNearSize(int width, int length, int epsilon);
 
 #  ifdef __cplusplus
 }
@@ -100,5 +75,5 @@ extern _pwg_media_t  *_pwgMediaForSize(int width, int length);
 #endif /* !_CUPS_PWG_PRIVATE_H_ */
 
 /*
- * End of "$Id: pwg-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: pwg-private.h 11826 2014-04-23 00:38:21Z msweet $".
  */
diff --git a/cups/pwg.h b/cups/pwg.h
new file mode 100644 (file)
index 0000000..43e0e1c
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * "$Id: pwg.h 4274 2013-04-09 20:10:23Z msweet $"
+ *
+ *   PWG media API definitions for CUPS.
+ *
+ *   Copyright 2009-2013 by Apple Inc.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ *   This file is subject to the Apple OS-Developed Software exception.
+ */
+
+#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 */
+{
+  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 */
+{
+  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_ */
+
+/*
+ * End of "$Id: pwg.h 4274 2013-04-09 20:10:23Z msweet $".
+ */
index 77ec7c2..ebd5d72 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: raster-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: raster-private.h 3794 2012-04-23 22:44:16Z msweet $"
  *
  *   Private image library definitions for CUPS.
  *
@@ -62,5 +62,5 @@ extern void           _cupsRasterClearError(void);
 #endif /* !_CUPS_RASTER_PRIVATE_H_ */
 
 /*
- * End of "$Id: raster-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: raster-private.h 3794 2012-04-23 22:44:16Z msweet $".
  */
index c638f5a..dde34f2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: raster.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: raster.h 4027 2012-11-16 01:00:05Z msweet $"
  *
  *   Raster file definitions for CUPS.
  *
@@ -368,11 +368,11 @@ typedef ssize_t (*cups_raster_iocb_t)(void *ctx, unsigned char *buffer, size_t l
 extern void            cupsRasterClose(cups_raster_t *r);
 extern cups_raster_t   *cupsRasterOpen(int fd, cups_mode_t mode);
 extern unsigned                cupsRasterReadHeader(cups_raster_t *r,
-                                            cups_page_header_t *h) _CUPS_DEPRECATED;
+                                            cups_page_header_t *h) _CUPS_DEPRECATED_MSG("Use cupsRasterReadHeader2 instead.");
 extern unsigned                cupsRasterReadPixels(cups_raster_t *r,
                                             unsigned char *p, unsigned len);
 extern unsigned                cupsRasterWriteHeader(cups_raster_t *r,
-                                             cups_page_header_t *h) _CUPS_DEPRECATED;
+                                             cups_page_header_t *h) _CUPS_DEPRECATED_MSG("Use cupsRasterWriteHeader2 instead.");
 extern unsigned                cupsRasterWritePixels(cups_raster_t *r,
                                              unsigned char *p, unsigned len);
 
@@ -401,5 +401,5 @@ extern cups_raster_t        *cupsRasterOpenIO(cups_raster_iocb_t iocb, void *ctx,
 #endif /* !_CUPS_RASTER_H_ */
 
 /*
- * End of "$Id: raster.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: raster.h 4027 2012-11-16 01:00:05Z msweet $".
  */
index 9afe1e5..8f51317 100644 (file)
@@ -1,34 +1,18 @@
 /*
- * "$Id: request.c 11176 2013-07-23 13:24:57Z msweet $"
+ * "$Id: request.c 11866 2014-05-09 20:20:16Z msweet $"
  *
- *   IPP utilities for CUPS.
+ * IPP utilities for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsDoFileRequest()    - Do an IPP request with a file.
- *   cupsDoIORequest()      - Do an IPP request with file descriptors.
- *   cupsDoRequest()        - Do an IPP request.
- *   cupsGetResponse()      - Get a response to an IPP request.
- *   cupsLastError()        - Return the last IPP status code.
- *   cupsLastErrorString()  - Return the last IPP status-message.
- *   _cupsNextDelay()       - Return the next retry delay value.
- *   cupsReadResponseData() - Read additional data after the IPP response.
- *   cupsSendRequest()      - Send an IPP request.
- *   cupsWriteRequestData() - Write additional data after an IPP request.
- *   _cupsConnect()         - Get the default server connection...
- *   _cupsSetError()        - Set the last IPP status code and status-message.
- *   _cupsSetHTTPError()    - Set the last error using the HTTP status.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -46,6 +30,9 @@
 #ifndef O_BINARY
 #  define O_BINARY 0
 #endif /* O_BINARY */
+#ifndef MSG_DONTWAIT
+#  define MSG_DONTWAIT 0
+#endif /* !MSG_DONTWAIT */
 
 
 /*
@@ -79,7 +66,7 @@ cupsDoFileRequest(http_t     *http,   /* I - Connection to server or @code CUPS_HT
       * Can't get file information!
       */
 
-      _cupsSetError(errno == ENOENT ? IPP_NOT_FOUND : IPP_NOT_AUTHORIZED,
+      _cupsSetError(errno == ENOENT ? IPP_STATUS_ERROR_NOT_FOUND : IPP_STATUS_ERROR_NOT_AUTHORIZED,
                     NULL, 0);
 
       ippDelete(request);
@@ -126,7 +113,7 @@ cupsDoIORequest(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
   size_t       length = 0;             /* Content-Length value */
   http_status_t        status;                 /* Status of HTTP request */
   struct stat  fileinfo;               /* File information */
-  int          bytes;                  /* Number of bytes read/written */
+  ssize_t      bytes;                  /* Number of bytes read/written */
   char         buffer[32768];          /* Output buffer */
 
 
@@ -143,7 +130,7 @@ cupsDoIORequest(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
   {
     ippDelete(request);
 
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
 
     return (NULL);
   }
@@ -172,7 +159,7 @@ cupsDoIORequest(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
       * Can't get file information!
       */
 
-      _cupsSetError(errno == EBADF ? IPP_NOT_FOUND : IPP_NOT_AUTHORIZED,
+      _cupsSetError(errno == EBADF ? IPP_STATUS_ERROR_NOT_FOUND : IPP_STATUS_ERROR_NOT_AUTHORIZED,
                     NULL, 0);
 
       ippDelete(request);
@@ -192,7 +179,7 @@ cupsDoIORequest(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
 
       ippDelete(request);
 
-      _cupsSetError(IPP_NOT_POSSIBLE, strerror(EISDIR), 0);
+      _cupsSetError(IPP_STATUS_ERROR_NOT_POSSIBLE, strerror(EISDIR), 0);
 
       return (NULL);
     }
@@ -202,7 +189,7 @@ cupsDoIORequest(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
       length = 0;                      /* Chunk when piping */
     else
 #endif /* !WIN32 */
-    length = ippLength(request) + fileinfo.st_size;
+    length = ippLength(request) + (size_t)fileinfo.st_size;
   }
   else
     length = ippLength(request);
@@ -233,7 +220,7 @@ cupsDoIORequest(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
 
     DEBUG_printf(("2cupsDoIORequest: status=%d", status));
 
-    if (status == HTTP_CONTINUE && request->state == IPP_DATA && infile >= 0)
+    if (status == HTTP_STATUS_CONTINUE && request->state == IPP_STATE_DATA && infile >= 0)
     {
       DEBUG_puts("2cupsDoIORequest: file write...");
 
@@ -246,10 +233,10 @@ cupsDoIORequest(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
 #endif /* WIN32 */
       lseek(infile, 0, SEEK_SET);
 
-      while ((bytes = (int)read(infile, buffer, sizeof(buffer))) > 0)
+      while ((bytes = read(infile, buffer, sizeof(buffer))) > 0)
       {
-        if ((status = cupsWriteRequestData(http, buffer, bytes))
-                != HTTP_CONTINUE)
+        if ((status = cupsWriteRequestData(http, buffer, (size_t)bytes))
+                != HTTP_STATUS_CONTINUE)
          break;
       }
     }
@@ -258,7 +245,7 @@ cupsDoIORequest(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
     * Get the server's response...
     */
 
-    if (status != HTTP_ERROR)
+    if (status <= HTTP_STATUS_CONTINUE || status == HTTP_STATUS_OK)
     {
       response = cupsGetResponse(http, resource);
       status   = httpGetStatus(http);
@@ -266,9 +253,9 @@ cupsDoIORequest(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
 
     DEBUG_printf(("2cupsDoIORequest: status=%d", status));
 
-    if (status == HTTP_ERROR ||
-        (status >= HTTP_BAD_REQUEST && status != HTTP_UNAUTHORIZED &&
-        status != HTTP_UPGRADE_REQUIRED))
+    if (status == HTTP_STATUS_ERROR ||
+        (status >= HTTP_STATUS_BAD_REQUEST && status != HTTP_STATUS_UNAUTHORIZED &&
+        status != HTTP_STATUS_UPGRADE_REQUIRED))
     {
       _cupsSetHTTPError(status);
       break;
@@ -280,12 +267,12 @@ cupsDoIORequest(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
       * Write trailing data to file...
       */
 
-      while ((bytes = (int)httpRead2(http, buffer, sizeof(buffer))) > 0)
-       if (write(outfile, buffer, bytes) < bytes)
+      while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
+       if (write(outfile, buffer, (size_t)bytes) < bytes)
          break;
     }
 
-    if (http->state != HTTP_WAITING)
+    if (http->state != HTTP_STATE_WAITING)
     {
      /*
       * Flush any remaining data...
@@ -347,22 +334,37 @@ cupsGetResponse(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
 
 
   DEBUG_printf(("cupsGetResponse(http=%p, resource=\"%s\")", http, resource));
+  DEBUG_printf(("1cupsGetResponse: http->state=%d", http ? http->state : HTTP_STATE_ERROR));
 
  /*
   * Connect to the default server as needed...
   */
 
   if (!http)
-    http = _cupsConnect();
+  {
+    _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 || (http->state != HTTP_POST_RECV && http->state != HTTP_POST_SEND))
+  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_ENCODE_CHUNKED)
+  if (http->data_encoding == HTTP_ENCODING_CHUNKED)
   {
    /*
     * Send a 0-length chunk to finish off the request...
@@ -385,11 +387,11 @@ cupsGetResponse(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
   {
     status = httpUpdate(http);
   }
-  while (status != HTTP_ERROR && http->state == HTTP_POST_RECV);
+  while (status == HTTP_STATUS_CONTINUE);
 
   DEBUG_printf(("2cupsGetResponse: status=%d", status));
 
-  if (status == HTTP_OK)
+  if (status == HTTP_STATUS_OK)
   {
    /*
     * Get the IPP response...
@@ -397,11 +399,11 @@ cupsGetResponse(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
 
     response = ippNew();
 
-    while ((state = ippRead(http, response)) != IPP_DATA)
-      if (state == IPP_ERROR)
+    while ((state = ippRead(http, response)) != IPP_STATE_DATA)
+      if (state == IPP_STATE_ERROR)
        break;
 
-    if (state == IPP_ERROR)
+    if (state == IPP_STATE_ERROR)
     {
      /*
       * Flush remaining data and delete the response...
@@ -414,11 +416,11 @@ cupsGetResponse(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
       ippDelete(response);
       response = NULL;
 
-      http->status = status = HTTP_ERROR;
+      http->status = status = HTTP_STATUS_ERROR;
       http->error  = EINVAL;
     }
   }
-  else if (status != HTTP_ERROR)
+  else if (status != HTTP_STATUS_ERROR)
   {
    /*
     * Flush any error message...
@@ -430,7 +432,7 @@ cupsGetResponse(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
     * Then handle encryption and authentication...
     */
 
-    if (status == HTTP_UNAUTHORIZED)
+    if (status == HTTP_STATUS_UNAUTHORIZED)
     {
      /*
       * See if we can do authentication...
@@ -439,13 +441,13 @@ cupsGetResponse(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
       DEBUG_puts("2cupsGetResponse: Need authorization...");
 
       if (!cupsDoAuthentication(http, "POST", resource))
-        httpReconnect(http);
+        httpReconnect2(http, 30000, NULL);
       else
-        http->status = status = HTTP_AUTHORIZATION_CANCELED;
+        http->status = status = HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED;
     }
 
 #ifdef HAVE_SSL
-    else if (status == HTTP_UPGRADE_REQUIRED)
+    else if (status == HTTP_STATUS_UPGRADE_REQUIRED)
     {
      /*
       * Force a reconnect with encryption...
@@ -453,8 +455,8 @@ cupsGetResponse(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
 
       DEBUG_puts("2cupsGetResponse: Need encryption...");
 
-      if (!httpReconnect(http))
-        httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
+      if (!httpReconnect2(http, 30000, NULL))
+        httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
     }
 #endif /* HAVE_SSL */
   }
@@ -565,7 +567,7 @@ cupsReadResponseData(
 
     if ((http = cg->http) == NULL)
     {
-      _cupsSetError(IPP_INTERNAL_ERROR, _("No active connection"), 1);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No active connection"), 1);
       return (-1);
     }
   }
@@ -587,7 +589,7 @@ cupsReadResponseData(
  * 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_CONTINUE@
+ * 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
@@ -602,10 +604,10 @@ cupsSendRequest(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
                 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 */
+  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 */
 
 
   DEBUG_printf(("cupsSendRequest(http=%p, request=%p(%s), resource=\"%s\", "
@@ -619,9 +621,9 @@ cupsSendRequest(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
 
   if (!request || !resource)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
 
-    return (HTTP_ERROR);
+    return (HTTP_STATUS_ERROR);
   }
 
  /*
@@ -630,24 +632,24 @@ cupsSendRequest(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
 
   if (!http)
     if ((http = _cupsConnect()) == NULL)
-      return (HTTP_SERVICE_UNAVAILABLE);
+      return (HTTP_STATUS_SERVICE_UNAVAILABLE);
 
  /*
   * If the prior request was not flushed out, do so now...
   */
 
-  if (http->state == HTTP_GET_SEND ||
-      http->state == HTTP_POST_SEND)
+  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_WAITING)
+  else if (http->state != HTTP_STATE_WAITING)
   {
     DEBUG_printf(("1cupsSendRequest: Unknown HTTP state (%d), "
                   "reconnecting.", http->state));
-    if (httpReconnect(http))
-      return (HTTP_ERROR);
+    if (httpReconnect2(http, 30000, NULL))
+      return (HTTP_STATUS_ERROR);
   }
 
 #ifdef HAVE_SSL
@@ -659,10 +661,10 @@ cupsSendRequest(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
 
   if (ippFindAttribute(request, "auth-info", IPP_TAG_TEXT) &&
       !httpAddrLocalhost(http->hostaddr) && !http->tls &&
-      httpEncryption(http, HTTP_ENCRYPT_REQUIRED))
+      httpEncryption(http, HTTP_ENCRYPTION_REQUIRED))
   {
     DEBUG_puts("1cupsSendRequest: Unable to encrypt connection.");
-    return (HTTP_SERVICE_UNAVAILABLE);
+    return (HTTP_STATUS_SERVICE_UNAVAILABLE);
   }
 #endif /* HAVE_SSL */
 
@@ -674,10 +676,10 @@ cupsSendRequest(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
   {
     DEBUG_puts("2cupsSendRequest: Connection: close");
     httpClearFields(http);
-    if (httpReconnect(http))
+    if (httpReconnect2(http, 30000, NULL))
     {
       DEBUG_puts("1cupsSendRequest: Unable to reconnect.");
-      return (HTTP_SERVICE_UNAVAILABLE);
+      return (HTTP_STATUS_SERVICE_UNAVAILABLE);
     }
   }
 
@@ -685,7 +687,7 @@ cupsSendRequest(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
   * Loop until we can send the request without authorization problems.
   */
 
-  expect = HTTP_CONTINUE;
+  expect = HTTP_STATUS_CONTINUE;
 
   for (;;)
   {
@@ -725,10 +727,10 @@ cupsSendRequest(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
     if (httpPost(http, resource))
     {
       DEBUG_puts("2cupsSendRequest: POST failed, reconnecting.");
-      if (httpReconnect(http))
+      if (httpReconnect2(http, 30000, NULL))
       {
         DEBUG_puts("1cupsSendRequest: Unable to reconnect.");
-        return (HTTP_SERVICE_UNAVAILABLE);
+        return (HTTP_STATUS_SERVICE_UNAVAILABLE);
       }
       else
         continue;
@@ -740,30 +742,44 @@ cupsSendRequest(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
 
     DEBUG_puts("2cupsSendRequest: Writing IPP request...");
 
-    request->state = IPP_IDLE;
-    status         = HTTP_CONTINUE;
+    request->state = IPP_STATE_IDLE;
+    status         = HTTP_STATUS_CONTINUE;
     got_status     = 0;
 
-    while ((state = ippWrite(http, request)) != IPP_DATA)
-      if (state == IPP_ERROR)
-       break;
-      else if (httpCheck(http))
+    while ((state = ippWrite(http, request)) != IPP_STATE_DATA)
+    {
+      if (httpCheck(http))
       {
         got_status = 1;
 
         _httpUpdate(http, &status);
-       if (status >= HTTP_MULTIPLE_CHOICES)
+       if (status >= HTTP_STATUS_MULTIPLE_CHOICES)
          break;
       }
+      else if (state == IPP_STATE_ERROR)
+       break;
+    }
 
-    if (state == IPP_ERROR)
+    if (state == IPP_STATE_ERROR)
     {
-      DEBUG_puts("1cupsSendRequest: Unable to send IPP request.");
+     /*
+      * We weren't able to send the IPP request. But did we already get a HTTP
+      * error status?
+      */
 
-      http->status = HTTP_ERROR;
-      http->state  = HTTP_WAITING;
+      if (!got_status || status < HTTP_STATUS_MULTIPLE_CHOICES)
+      {
+       /*
+        * No, something else went wrong.
+       */
+
+       DEBUG_puts("1cupsSendRequest: Unable to send IPP request.");
 
-      return (HTTP_ERROR);
+       http->status = HTTP_STATUS_ERROR;
+       http->state  = HTTP_STATE_WAITING;
+
+       return (HTTP_STATUS_ERROR);
+      }
     }
 
    /*
@@ -772,7 +788,7 @@ cupsSendRequest(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
 
     if (!got_status)
     {
-      if (expect == HTTP_CONTINUE)
+      if (expect == HTTP_STATUS_CONTINUE)
       {
        DEBUG_puts("2cupsSendRequest: Waiting for 100-continue...");
 
@@ -789,69 +805,72 @@ cupsSendRequest(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
     * Process the current HTTP status...
     */
 
-    if (status >= HTTP_MULTIPLE_CHOICES)
+    if (status >= HTTP_STATUS_MULTIPLE_CHOICES)
     {
+      int temp_status;                 /* Temporary status */
+
       _cupsSetHTTPError(status);
 
       do
       {
-       status = httpUpdate(http);
+       temp_status = httpUpdate(http);
       }
-      while (status != HTTP_ERROR && http->state == HTTP_POST_RECV);
+      while (temp_status != HTTP_STATUS_ERROR &&
+             http->state == HTTP_STATE_POST_RECV);
 
       httpFlush(http);
     }
 
     switch (status)
     {
-      case HTTP_ERROR :
-      case HTTP_CONTINUE :
-      case HTTP_OK :
+      case HTTP_STATUS_CONTINUE :
+      case HTTP_STATUS_OK :
+      case HTTP_STATUS_ERROR :
           DEBUG_printf(("1cupsSendRequest: Returning %d.", status));
           return (status);
 
-      case HTTP_UNAUTHORIZED :
+      case HTTP_STATUS_UNAUTHORIZED :
           if (cupsDoAuthentication(http, "POST", resource))
          {
-            DEBUG_puts("1cupsSendRequest: Returning HTTP_AUTHORIZATION_CANCELED.");
-           return (HTTP_AUTHORIZATION_CANCELED);
+            DEBUG_puts("1cupsSendRequest: Returning HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED.");
+           return (HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED);
          }
 
-          DEBUG_puts("2cupsSendRequest: Reconnecting after HTTP_UNAUTHORIZED.");
+          DEBUG_puts("2cupsSendRequest: Reconnecting after HTTP_STATUS_UNAUTHORIZED.");
 
-         if (httpReconnect(http))
+         if (httpReconnect2(http, 30000, NULL))
          {
            DEBUG_puts("1cupsSendRequest: Unable to reconnect.");
-           return (HTTP_SERVICE_UNAVAILABLE);
+           return (HTTP_STATUS_SERVICE_UNAVAILABLE);
          }
          break;
 
 #ifdef HAVE_SSL
-      case HTTP_UPGRADE_REQUIRED :
+      case HTTP_STATUS_UPGRADE_REQUIRED :
         /*
          * Flush any error message, reconnect, and then upgrade with
          * encryption...
          */
 
           DEBUG_puts("2cupsSendRequest: Reconnecting after "
-                    "HTTP_UPGRADE_REQUIRED.");
+                    "HTTP_STATUS_UPGRADE_REQUIRED.");
 
-         if (httpReconnect(http))
+         if (httpReconnect2(http, 30000, NULL))
          {
            DEBUG_puts("1cupsSendRequest: Unable to reconnect.");
-           return (HTTP_SERVICE_UNAVAILABLE);
+           return (HTTP_STATUS_SERVICE_UNAVAILABLE);
          }
 
          DEBUG_puts("2cupsSendRequest: Upgrading to TLS.");
-         if (httpEncryption(http, HTTP_ENCRYPT_REQUIRED))
+         if (httpEncryption(http, HTTP_ENCRYPTION_REQUIRED))
          {
            DEBUG_puts("1cupsSendRequest: Unable to encrypt connection.");
-           return (HTTP_SERVICE_UNAVAILABLE);
+           return (HTTP_STATUS_SERVICE_UNAVAILABLE);
          }
          break;
 #endif /* HAVE_SSL */
 
-      case HTTP_EXPECTATION_FAILED :
+      case HTTP_STATUS_EXPECTATION_FAILED :
         /*
          * Don't try using the Expect: header the next time around...
          */
@@ -861,10 +880,10 @@ cupsSendRequest(http_t     *http, /* I - Connection to server or @code CUPS_HTTP
           DEBUG_puts("2cupsSendRequest: Reconnecting after "
                     "HTTP_EXPECTATION_FAILED.");
 
-         if (httpReconnect(http))
+         if (httpReconnect2(http, 30000, NULL))
          {
            DEBUG_puts("1cupsSendRequest: Unable to reconnect.");
-           return (HTTP_SERVICE_UNAVAILABLE);
+           return (HTTP_STATUS_SERVICE_UNAVAILABLE);
          }
          break;
 
@@ -888,7 +907,7 @@ cupsSendRequest(http_t     *http,   /* I - Connection to server or @code CUPS_HTTP
  * @since CUPS 1.4/OS X 10.6@
  */
 
-http_status_t                          /* O - @code HTTP_CONTINUE@ if OK or HTTP status on error */
+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 */
@@ -911,9 +930,9 @@ cupsWriteRequestData(
 
     if ((http = cg->http) == NULL)
     {
-      _cupsSetError(IPP_INTERNAL_ERROR, _("No active connection"), 1);
-      DEBUG_puts("1cupsWriteRequestData: Returning HTTP_ERROR.");
-      return (HTTP_ERROR);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No active connection"), 1);
+      DEBUG_puts("1cupsWriteRequestData: Returning HTTP_STATUS_ERROR.");
+      return (HTTP_STATUS_ERROR);
     }
   }
 
@@ -925,9 +944,9 @@ cupsWriteRequestData(
 
   if (httpWrite2(http, buffer, length) < 0)
   {
-    DEBUG_puts("1cupsWriteRequestData: Returning HTTP_ERROR.");
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(http->error), 0);
-    return (HTTP_ERROR);
+    DEBUG_puts("1cupsWriteRequestData: Returning HTTP_STATUS_ERROR.");
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(http->error), 0);
+    return (HTTP_STATUS_ERROR);
   }
 
  /*
@@ -936,7 +955,7 @@ cupsWriteRequestData(
 
   if (length >= HTTP_MAX_BUFFER ||
       http->wused < wused ||
-      (wused > 0 && http->wused == length))
+      (wused > 0 && (size_t)http->wused == length))
   {
    /*
     * We've written something to the server, so check for response data...
@@ -947,7 +966,7 @@ cupsWriteRequestData(
       http_status_t    status;         /* Status from _httpUpdate */
 
       _httpUpdate(http, &status);
-      if (status >= HTTP_MULTIPLE_CHOICES)
+      if (status >= HTTP_STATUS_MULTIPLE_CHOICES)
       {
         _cupsSetHTTPError(status);
 
@@ -955,7 +974,7 @@ cupsWriteRequestData(
        {
          status = httpUpdate(http);
        }
-       while (status != HTTP_ERROR && http->state == HTTP_POST_RECV);
+       while (status != HTTP_STATUS_ERROR && http->state == HTTP_STATE_POST_RECV);
 
         httpFlush(http);
       }
@@ -965,8 +984,8 @@ cupsWriteRequestData(
     }
   }
 
-  DEBUG_puts("1cupsWriteRequestData: Returning HTTP_CONTINUE.");
-  return (HTTP_CONTINUE);
+  DEBUG_puts("1cupsWriteRequestData: Returning HTTP_STATUS_CONTINUE.");
+  return (HTTP_STATUS_CONTINUE);
 }
 
 
@@ -993,9 +1012,9 @@ _cupsConnect(void)
     */
 
     if (strcmp(cg->http->hostname, cg->server) ||
-        cg->ipp_port != _httpAddrPort(cg->http->hostaddr) ||
+        cg->ipp_port != httpAddrPort(cg->http->hostaddr) ||
         (cg->http->encryption != cg->encryption &&
-        cg->http->encryption == HTTP_ENCRYPT_NEVER))
+        cg->http->encryption == HTTP_ENCRYPTION_NEVER))
     {
      /*
       * Need to close the current connection because something has changed...
@@ -1037,13 +1056,13 @@ _cupsConnect(void)
 
   if (!cg->http)
   {
-    if ((cg->http = httpConnectEncrypt(cupsServer(), ippPort(),
-                                       cupsEncryption())) == NULL)
+    if ((cg->http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC,
+                                cupsEncryption(), 1, 30000, NULL)) == NULL)
     {
       if (errno)
-        _cupsSetError(IPP_SERVICE_UNAVAILABLE, NULL, 0);
+        _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, NULL, 0);
       else
-        _cupsSetError(IPP_SERVICE_UNAVAILABLE,
+        _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE,
                      _("Unable to connect to host."), 1);
     }
   }
@@ -1116,59 +1135,59 @@ _cupsSetHTTPError(http_status_t status) /* I - HTTP status code */
 {
   switch (status)
   {
-    case HTTP_NOT_FOUND :
-       _cupsSetError(IPP_NOT_FOUND, httpStatus(status), 0);
+    case HTTP_STATUS_NOT_FOUND :
+       _cupsSetError(IPP_STATUS_ERROR_NOT_FOUND, httpStatus(status), 0);
        break;
 
-    case HTTP_UNAUTHORIZED :
-       _cupsSetError(IPP_NOT_AUTHENTICATED, httpStatus(status), 0);
+    case HTTP_STATUS_UNAUTHORIZED :
+       _cupsSetError(IPP_STATUS_ERROR_NOT_AUTHENTICATED, httpStatus(status), 0);
        break;
 
-    case HTTP_AUTHORIZATION_CANCELED :
-       _cupsSetError(IPP_AUTHENTICATION_CANCELED, httpStatus(status), 0);
+    case HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED :
+       _cupsSetError(IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED, httpStatus(status), 0);
        break;
 
-    case HTTP_FORBIDDEN :
-       _cupsSetError(IPP_FORBIDDEN, httpStatus(status), 0);
+    case HTTP_STATUS_FORBIDDEN :
+       _cupsSetError(IPP_STATUS_ERROR_FORBIDDEN, httpStatus(status), 0);
        break;
 
-    case HTTP_BAD_REQUEST :
-       _cupsSetError(IPP_BAD_REQUEST, httpStatus(status), 0);
+    case HTTP_STATUS_BAD_REQUEST :
+       _cupsSetError(IPP_STATUS_ERROR_BAD_REQUEST, httpStatus(status), 0);
        break;
 
-    case HTTP_REQUEST_TOO_LARGE :
-       _cupsSetError(IPP_REQUEST_VALUE, httpStatus(status), 0);
+    case HTTP_STATUS_REQUEST_TOO_LARGE :
+       _cupsSetError(IPP_STATUS_ERROR_REQUEST_VALUE, httpStatus(status), 0);
        break;
 
-    case HTTP_NOT_IMPLEMENTED :
-       _cupsSetError(IPP_OPERATION_NOT_SUPPORTED, httpStatus(status), 0);
+    case HTTP_STATUS_NOT_IMPLEMENTED :
+       _cupsSetError(IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED, httpStatus(status), 0);
        break;
 
-    case HTTP_NOT_SUPPORTED :
-       _cupsSetError(IPP_VERSION_NOT_SUPPORTED, httpStatus(status), 0);
+    case HTTP_STATUS_NOT_SUPPORTED :
+       _cupsSetError(IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED, httpStatus(status), 0);
        break;
 
-    case HTTP_UPGRADE_REQUIRED :
-       _cupsSetError(IPP_UPGRADE_REQUIRED, httpStatus(status), 0);
+    case HTTP_STATUS_UPGRADE_REQUIRED :
+       _cupsSetError(IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED, httpStatus(status), 0);
         break;
 
-    case HTTP_PKI_ERROR :
-       _cupsSetError(IPP_PKI_ERROR, httpStatus(status), 0);
+    case HTTP_STATUS_CUPS_PKI_ERROR :
+       _cupsSetError(IPP_STATUS_ERROR_CUPS_PKI, httpStatus(status), 0);
         break;
 
-    case HTTP_ERROR :
-       _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0);
+    case HTTP_STATUS_ERROR :
+       _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
         break;
 
     default :
        DEBUG_printf(("4_cupsSetHTTPError: HTTP error %d mapped to "
-                     "IPP_SERVICE_UNAVAILABLE!", status));
-       _cupsSetError(IPP_SERVICE_UNAVAILABLE, httpStatus(status), 0);
+                     "IPP_STATUS_ERROR_SERVICE_UNAVAILABLE!", status));
+       _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, httpStatus(status), 0);
        break;
   }
 }
 
 
 /*
- * End of "$Id: request.c 11176 2013-07-23 13:24:57Z msweet $".
+ * End of "$Id: request.c 11866 2014-05-09 20:20:16Z msweet $".
  */
index 169d721..d9517e9 100644 (file)
@@ -1,27 +1,18 @@
 /*
- * "$Id: sidechannel.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: sidechannel.c 12124 2014-08-28 15:37:22Z msweet $"
  *
- *   Side-channel API code for CUPS.
+ * Side-channel API code for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsSideChannelDoRequest() - Send a side-channel command to a backend and
- *                                wait for a response.
- *   cupsSideChannelRead()      - Read a side-channel message.
- *   cupsSideChannelSNMPGet()   - Query a SNMP OID's value.
- *   cupsSideChannelSNMPWalk()  - Query multiple SNMP OID values.
- *   cupsSideChannelWrite()     - Write a side-channel message.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
 #else
 #  include <unistd.h>
 #endif /* WIN32 */
-#ifdef __hpux
-#  include <sys/time.h>
-#elif !defined(WIN32)
-#  include <sys/select.h>
-#endif /* __hpux */
 #ifndef WIN32
+#  include <sys/select.h>
 #  include <sys/time.h>
 #endif /* !WIN32 */
 #ifdef HAVE_POLL
@@ -120,7 +107,7 @@ cupsSideChannelRead(
     double            timeout)         /* I  - Timeout in seconds */
 {
   char         *buffer;                /* Message buffer */
-  int          bytes;                  /* Bytes read */
+  ssize_t      bytes;                  /* Bytes read */
   int          templen;                /* Data length from message */
   int          nfds;                   /* Number of file descriptors */
 #ifdef HAVE_POLL
@@ -151,7 +138,7 @@ cupsSideChannelRead(
   pfd.events = POLLIN;
 
   while ((nfds = poll(&pfd, 1,
-                     timeout < 0.0 ? -1 : (long)(timeout * 1000))) < 0 &&
+                     timeout < 0.0 ? -1 : (int)(timeout * 1000))) < 0 &&
         (errno == EINTR || errno == EAGAIN))
     ;
 
@@ -214,7 +201,7 @@ cupsSideChannelRead(
 
   if (bytes < 4)
   {
-    DEBUG_printf(("1cupsSideChannelRead: Short read of %d bytes", bytes));
+    DEBUG_printf(("1cupsSideChannelRead: Short read of " CUPS_LLFMT " bytes", CUPS_LLCAST bytes));
 
     _cupsBufferRelease(buffer);
 
@@ -277,7 +264,7 @@ cupsSideChannelRead(
     *status  = (cups_sc_status_t)buffer[1];
     *datalen = templen;
 
-    memcpy(data, buffer + 4, templen);
+    memcpy(data, buffer + 4, (size_t)templen);
   }
 
   _cupsBufferRelease(buffer);
@@ -368,7 +355,7 @@ cupsSideChannelSNMPGet(
     * Parse the response of the form "oid\0value"...
     */
 
-    real_oidlen  = strlen(real_data) + 1;
+    real_oidlen  = (int)strlen(real_data) + 1;
     real_datalen -= real_oidlen;
 
     if ((real_datalen + 1) > *datalen)
@@ -377,7 +364,7 @@ cupsSideChannelSNMPGet(
       return (CUPS_SC_STATUS_TOO_BIG);
     }
 
-    memcpy(data, real_data + real_oidlen, real_datalen);
+    memcpy(data, real_data + real_oidlen, (size_t)real_datalen);
     data[real_datalen] = '\0';
 
     *datalen = real_datalen;
@@ -427,8 +414,8 @@ cupsSideChannelSNMPWalk(
   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 */
+  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 */
@@ -452,7 +439,7 @@ cupsSideChannelSNMPWalk(
   */
 
   current_oid = oid;
-  oidlen      = (int)strlen(oid);
+  oidlen      = strlen(oid);
   last_oid[0] = '\0';
 
   do
@@ -499,11 +486,11 @@ cupsSideChannelSNMPWalk(
         return (CUPS_SC_STATUS_OK);
       }
 
-      if (real_datalen < sizeof(real_data))
+      if ((size_t)real_datalen < sizeof(real_data))
         real_data[real_datalen] = '\0';
 
       real_oidlen  = strlen(real_data) + 1;
-      real_datalen -= real_oidlen;
+      real_datalen -= (int)real_oidlen;
 
      /*
       * Call the callback with the OID and data...
@@ -545,7 +532,7 @@ cupsSideChannelWrite(
     double            timeout)         /* I - Timeout in seconds */
 {
   char         *buffer;                /* Message buffer */
-  int          bytes;                  /* Bytes written */
+  ssize_t      bytes;                  /* Bytes written */
 #ifdef HAVE_POLL
   struct pollfd        pfd;                    /* Poll structure for poll() */
 #else /* select() */
@@ -575,7 +562,7 @@ cupsSideChannelWrite(
     if (poll(&pfd, 1, -1) < 1)
       return (-1);
   }
-  else if (poll(&pfd, 1, (long)(timeout * 1000)) < 1)
+  else if (poll(&pfd, 1, (int)(timeout * 1000)) < 1)
     return (-1);
 
 #else /* select() */
@@ -608,23 +595,23 @@ cupsSideChannelWrite(
   * 4-N      Data
   */
 
-  if ((buffer = _cupsBufferGet(datalen + 4)) == NULL)
+  if ((buffer = _cupsBufferGet((size_t)datalen + 4)) == NULL)
     return (-1);
 
   buffer[0] = command;
   buffer[1] = status;
-  buffer[2] = datalen >> 8;
-  buffer[3] = datalen & 255;
+  buffer[2] = (char)(datalen >> 8);
+  buffer[3] = (char)(datalen & 255);
 
   bytes = 4;
 
   if (datalen > 0)
   {
-    memcpy(buffer + 4, data, datalen);
+    memcpy(buffer + 4, data, (size_t)datalen);
     bytes += datalen;
   }
 
-  while (write(CUPS_SC_FD, buffer, bytes) < 0)
+  while (write(CUPS_SC_FD, buffer, (size_t)bytes) < 0)
     if (errno != EINTR && errno != EAGAIN)
     {
       _cupsBufferRelease(buffer);
@@ -638,5 +625,5 @@ cupsSideChannelWrite(
 
 
 /*
- * End of "$Id: sidechannel.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: sidechannel.c 12124 2014-08-28 15:37:22Z msweet $".
  */
index 19494b2..4694bb9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: sidechannel.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: sidechannel.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Side-channel API definitions for CUPS.
  *
@@ -143,5 +143,5 @@ extern cups_sc_status_t     cupsSideChannelSNMPWalk(const char *oid, double timeout,
 #endif /* !_CUPS_SIDECHANNEL_H_ */
 
 /*
- * End of "$Id: sidechannel.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: sidechannel.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index e0c3608..21698e0 100644 (file)
@@ -1,18 +1,18 @@
 /*
- * "$Id: snmp-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: snmp-private.h 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Private SNMP definitions for CUPS.
+ * Private SNMP definitions for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_SNMP_PRIVATE_H_
@@ -66,14 +66,14 @@ typedef struct cups_snmp_string_s   /**** String value ****/
 {
   unsigned char        bytes[CUPS_SNMP_MAX_STRING];
                                        /* Bytes in string */
-  int          num_bytes;              /* Number of bytes */
+  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 */
-  unsigned     counter;                /* Counter value */
+  int          counter;                /* Counter value */
   unsigned     gauge;                  /* Gauge value */
   unsigned     timeticks;              /* Timeticks  value */
   int          oid[CUPS_SNMP_MAX_OID]; /* OID value */
@@ -88,7 +88,7 @@ typedef struct cups_snmp_s            /**** SNMP data packet ****/
   char         community[CUPS_SNMP_MAX_COMMUNITY];
                                        /* Community name */
   cups_asn1_t  request_type;           /* Request type */
-  int          request_id;             /* request-id value */
+  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];
@@ -142,5 +142,5 @@ extern int          _cupsSNMPWrite(int fd, http_addr_t *address, int version,
 
 
 /*
- * End of "$Id: snmp-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: snmp-private.h 11558 2014-02-06 18:33:34Z msweet $".
  */
index 419bcfb..86d4598 100644 (file)
@@ -1,57 +1,18 @@
 /*
- * "$Id: snmp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: snmp.c 11594 2014-02-14 20:09:01Z msweet $"
  *
- *   SNMP functions for CUPS.
+ * SNMP functions for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   _cupsSNMPClose()            - Close a SNMP socket.
- *   _cupsSNMPCopyOID()          - Copy an OID.
- *   _cupsSNMPDefaultCommunity() - Get the default SNMP community name.
- *   _cupsSNMPIsOID()            - Test whether a SNMP response contains the
- *                                 specified OID.
- *   _cupsSNMPIsOIDPrefixed()    - Test whether a SNMP response uses the
- *                                 specified OID prefix.
- *   _cupsSNMPOIDToString()      - Convert an OID to a string.
- *   _cupsSNMPOpen()             - Open a SNMP socket.
- *   _cupsSNMPRead()             - Read and parse a SNMP response.
- *   _cupsSNMPSetDebug()         - Enable/disable debug logging to stderr.
- *   _cupsSNMPStringToOID()      - Convert a numeric OID string to an OID array.
- *   _cupsSNMPWalk()             - Enumerate a group of OIDs.
- *   _cupsSNMPWrite()            - Send an SNMP query packet.
- *   asn1_debug()                - Decode an ASN1-encoded message.
- *   asn1_decode_snmp()          - Decode a SNMP packet.
- *   asn1_encode_snmp()          - Encode a SNMP packet.
- *   asn1_get_integer()          - Get an integer value.
- *   asn1_get_length()           - Get a value length.
- *   asn1_get_oid()              - Get an OID value.
- *   asn1_get_packed()           - Get a packed integer value.
- *   asn1_get_string()           - Get a string value.
- *   asn1_get_type()             - Get a value type.
- *   asn1_set_integer()          - Set an integer value.
- *   asn1_set_length()           - Set a value length.
- *   asn1_set_oid()              - Set an OID value.
- *   asn1_set_packed()           - Set a packed integer value.
- *   asn1_size_integer()         - Figure out the number of bytes needed for an
- *                                 integer value.
- *   asn1_size_length()          - Figure out the number of bytes needed for a
- *                                 length value.
- *   asn1_size_oid()             - Figure out the numebr of bytes needed for an
- *                                 OID value.
- *   asn1_size_packed()          - Figure out the number of bytes needed for a
- *                                 packed integer value.
- *   snmp_set_error()            - Set the localized error for a packet.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -77,16 +38,16 @@ 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,
-                                        int length);
+                                        unsigned length);
 static int             asn1_get_oid(unsigned char **buffer,
                                     unsigned char *bufend,
-                                    int length, int *oid, int oidsize);
+                                    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,
-                                        int length, char *string,
-                                        int strsize);
+                                        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,
@@ -99,10 +60,10 @@ static void         asn1_set_oid(unsigned char **buffer,
                                     const int *oid);
 static void            asn1_set_packed(unsigned char **buffer,
                                        int integer);
-static int             asn1_size_integer(int integer);
-static int             asn1_size_length(int length);
-static int             asn1_size_oid(const int *oid);
-static int             asn1_size_packed(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);
 
@@ -116,11 +77,7 @@ _cupsSNMPClose(int fd)                      /* I - SNMP socket file descriptor */
 {
   DEBUG_printf(("4_cupsSNMPClose(fd=%d)", fd));
 
-#ifdef WIN32
-  closesocket(fd);
-#else
-  close(fd);
-#endif /* WIN32 */
+  httpAddrClose(NULL, fd);
 }
 
 
@@ -323,7 +280,7 @@ _cupsSNMPOIDToString(const int *src,        /* I - OID */
   for (dstptr = dst, dstend = dstptr + dstsize - 1;
        *src >= 0 && dstptr < dstend;
        src ++, dstptr += strlen(dstptr))
-    snprintf(dstptr, dstend - dstptr + 1, ".%d", *src);
+    snprintf(dstptr, (size_t)(dstend - dstptr + 1), ".%d", *src);
 
   if (*src >= 0)
     return (NULL);
@@ -362,11 +319,7 @@ _cupsSNMPOpen(int family)          /* I - Address family - @code AF_INET@ or @code AF_IN
 
   val = 1;
 
-#ifdef WIN32
-  if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *)&val, sizeof(val)))
-#else
-  if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val)))
-#endif /* WIN32 */
+  if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, CUPS_SOCAST &val, sizeof(val)))
   {
     DEBUG_printf(("5_cupsSNMPOpen: Returning -1 (%s)", strerror(errno)));
 
@@ -395,7 +348,7 @@ _cupsSNMPRead(int         fd,               /* I - SNMP socket file descriptor */
 {
   unsigned char        buffer[CUPS_SNMP_MAX_PACKET];
                                        /* Data packet */
-  int          bytes;                  /* Number of bytes received */
+  ssize_t      bytes;                  /* Number of bytes received */
   socklen_t    addrlen;                /* Source address length */
   http_addr_t  address;                /* Source address */
 
@@ -481,9 +434,9 @@ _cupsSNMPRead(int         fd,               /* I - SNMP socket file descriptor */
   * Look for the response status code in the SNMP message header...
   */
 
-  asn1_debug("DEBUG: IN ", buffer, bytes, 0);
+  asn1_debug("DEBUG: IN ", buffer, (size_t)bytes, 0);
 
-  asn1_decode_snmp(buffer, bytes, packet);
+  asn1_decode_snmp(buffer, (size_t)bytes, packet);
 
   memcpy(&(packet->address), &address, sizeof(packet->address));
 
@@ -604,7 +557,7 @@ _cupsSNMPWalk(int            fd,    /* I - SNMP socket */
              void           *data)     /* I - User data pointer that is passed to the callback function */
 {
   int          count = 0;              /* Number of OIDs found */
-  int          request_id = 0;         /* Current request ID */
+  unsigned     request_id = 0;         /* Current request ID */
   cups_snmp_t  packet;                 /* Current response packet */
   int          lastoid[CUPS_SNMP_MAX_OID];
                                        /* Last OID we got */
@@ -697,7 +650,7 @@ _cupsSNMPWrite(
   cups_snmp_t  packet;                 /* SNMP message packet */
   unsigned char        buffer[CUPS_SNMP_MAX_PACKET];
                                        /* SNMP message buffer */
-  int          bytes;                  /* Size of message */
+  ssize_t      bytes;                  /* Size of message */
   http_addr_t  temp;                   /* Copy of address */
 
 
@@ -753,7 +706,7 @@ _cupsSNMPWrite(
     return (0);
   }
 
-  asn1_debug("DEBUG: OUT ", buffer, bytes, 0);
+  asn1_debug("DEBUG: OUT ", buffer, (size_t)bytes, 0);
 
  /*
   * Send the message...
@@ -763,8 +716,7 @@ _cupsSNMPWrite(
 
   _httpAddrSetPort(&temp, CUPS_SNMP_PORT);
 
-  return (sendto(fd, buffer, bytes, 0, (void *)&temp,
-                 httpAddrLength(&temp)) == bytes);
+  return (sendto(fd, buffer, (size_t)bytes, 0, (void *)&temp, (socklen_t)httpAddrLength(&temp)) == bytes);
 }
 
 
@@ -778,14 +730,14 @@ asn1_debug(const char    *prefix, /* I - Prefix string */
            size_t        len,          /* I - Length of buffer */
            int           indent)       /* I - Indentation */
 {
-  int          i;                      /* Looping var */
+  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 */
-  int          value_length;           /* Length of value */
+  unsigned     value_length;           /* Length of value */
   _cups_globals_t *cg = _cupsGlobals();        /* Global data */
 
 
@@ -798,15 +750,15 @@ asn1_debug(const char    *prefix, /* I - Prefix string */
     * Do a hex dump of the packet...
     */
 
-    int j;
+    size_t j;
 
     fprintf(stderr, "%sHex Dump (%d bytes):\n", prefix, (int)len);
 
-    for (i = 0; i < (int)len; i += 16)
+    for (i = 0; i < len; i += 16)
     {
-      fprintf(stderr, "%s%04x:", prefix, i);
+      fprintf(stderr, "%s%04x:", prefix, (unsigned)i);
 
-      for (j = 0; j < 16 && (i + j) < (int)len; j ++)
+      for (j = 0; j < 16 && (i + j) < len; j ++)
       {
         if (j && !(j & 3))
          fprintf(stderr, "  %02x", buffer[i + j]);
@@ -826,7 +778,7 @@ asn1_debug(const char    *prefix,   /* I - Prefix string */
 
       fputs("    ", stderr);
 
-      for (j = 0; j < 16 && (i + j) < (int)len; j ++)
+      for (j = 0; j < 16 && (i + j) < len; j ++)
         if (buffer[i + j] < ' ' || buffer[i + j] >= 0x7f)
          putc('.', stderr);
        else
@@ -847,7 +799,7 @@ asn1_debug(const char    *prefix,   /* I - Prefix string */
     * Get value type...
     */
 
-    value_type   = asn1_get_type(&buffer, bufend);
+    value_type   = (unsigned char)asn1_get_type(&buffer, bufend);
     value_length = asn1_get_length(&buffer, bufend);
 
     switch (value_type)
@@ -917,7 +869,7 @@ asn1_debug(const char    *prefix,   /* I - Prefix string */
 
           fprintf(stderr, "%s%*sOID %d bytes ", prefix, indent, "",
                  value_length);
-         for (i = 0; i < integer; i ++)
+         for (i = 0; i < (unsigned)integer; i ++)
            fprintf(stderr, ".%d", oid[i]);
          putc('\n', stderr);
           break;
@@ -976,7 +928,7 @@ asn1_decode_snmp(unsigned char *buffer,     /* I - Buffer */
 {
   unsigned char        *bufptr,                /* Pointer into the data */
                *bufend;                /* End of data */
-  int          length;                 /* Length of value */
+  unsigned     length;                 /* Length of value */
 
 
  /*
@@ -1009,7 +961,7 @@ asn1_decode_snmp(unsigned char *buffer,    /* I - Buffer */
     asn1_get_string(&bufptr, bufend, length, packet->community,
                     sizeof(packet->community));
 
-    if ((packet->request_type = asn1_get_type(&bufptr, bufend))
+    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)
@@ -1020,7 +972,7 @@ asn1_decode_snmp(unsigned char *buffer,    /* I - Buffer */
       snmp_set_error(packet, _("request-id uses indefinite length"));
     else
     {
-      packet->request_id = asn1_get_integer(&bufptr, bufend, length);
+      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"));
@@ -1056,7 +1008,7 @@ asn1_decode_snmp(unsigned char *buffer,   /* I - Buffer */
            asn1_get_oid(&bufptr, bufend, length, packet->object_name,
                         CUPS_SNMP_MAX_OID);
 
-            packet->object_type = asn1_get_type(&bufptr, bufend);
+            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 &&
@@ -1100,12 +1052,12 @@ asn1_decode_snmp(unsigned char *buffer, /* I - Buffer */
 
                case CUPS_ASN1_GAUGE :
                    packet->object_value.gauge =
-                       asn1_get_integer(&bufptr, bufend, length);
+                       (unsigned)asn1_get_integer(&bufptr, bufend, length);
                    break;
 
                case CUPS_ASN1_TIMETICKS :
                    packet->object_value.timeticks =
-                       asn1_get_integer(&bufptr, bufend, length);
+                       (unsigned)asn1_get_integer(&bufptr, bufend, length);
                    break;
 
                 default :
@@ -1133,7 +1085,7 @@ asn1_encode_snmp(unsigned char *buffer,   /* I - Buffer */
                  cups_snmp_t   *packet)        /* I - SNMP packet */
 {
   unsigned char        *bufptr;                /* Pointer into buffer */
-  int          total,                  /* Total length */
+  unsigned     total,                  /* Total length */
                msglen,                 /* Length of entire message */
                commlen,                /* Length of community string */
                reqlen,                 /* Length of request */
@@ -1180,17 +1132,17 @@ asn1_encode_snmp(unsigned char *buffer, /* I - Buffer */
   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(packet->request_id) +
+  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 = strlen(packet->community);
+  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 > (int)bufsize)
+  if (total > bufsize)
   {
     packet->error = "Message too large for buffer";
     return (-1);
@@ -1216,7 +1168,7 @@ asn1_encode_snmp(unsigned char *buffer,   /* I - Buffer */
   *bufptr++ = packet->request_type;    /* Get-Request-PDU/Get-Next-Request-PDU */
   asn1_set_length(&bufptr, reqlen);
 
-  asn1_set_integer(&bufptr, packet->request_id);
+  asn1_set_integer(&bufptr, (int)packet->request_id);
 
   asn1_set_integer(&bufptr, packet->error_status);
 
@@ -1262,7 +1214,7 @@ asn1_encode_snmp(unsigned char *buffer,   /* I - Buffer */
         break;
   }
 
-  return (bufptr - buffer);
+  return ((int)(bufptr - buffer));
 }
 
 
@@ -1274,7 +1226,7 @@ static int                                /* O  - Integer value */
 asn1_get_integer(
     unsigned char **buffer,            /* IO - Pointer in buffer */
     unsigned char *bufend,             /* I  - End of buffer */
-    int           length)              /* I  - Length of value */
+    unsigned      length)              /* I  - Length of value */
 {
   int  value;                          /* Integer value */
 
@@ -1337,7 +1289,7 @@ static int                                /* O  - Number of OIDs */
 asn1_get_oid(
     unsigned char **buffer,            /* IO - Pointer in buffer */
     unsigned char *bufend,             /* I  - End of buffer */
-    int           length,              /* I  - Length of value */
+    unsigned      length,              /* I  - Length of value */
     int           *oid,                        /* I  - OID buffer */
     int           oidsize)             /* I  - Size of OID buffer */
 {
@@ -1379,7 +1331,7 @@ asn1_get_oid(
 
   *oidptr = -1;
 
-  return (oidptr - oid);
+  return ((int)(oidptr - oid));
 }
 
 
@@ -1421,22 +1373,14 @@ static char *                           /* O  - String */
 asn1_get_string(
     unsigned char **buffer,            /* IO - Pointer in buffer */
     unsigned char *bufend,             /* I  - End of buffer */
-    int           length,              /* I  - Value length */
+    unsigned      length,              /* I  - Value length */
     char          *string,             /* I  - String buffer */
-    int           strsize)             /* I  - String buffer size */
+    size_t        strsize)             /* I  - String buffer size */
 {
-  if (length > (bufend - *buffer))
-    length = bufend - *buffer;
-
-  if (length < 0)
-  {
-   /*
-    * Disallow negative lengths!
-    */
+  if (length > (unsigned)(bufend - *buffer))
+    length = (unsigned)(bufend - *buffer);
 
-    *string = '\0';
-  }
-  else if (length < strsize)
+  if (length < strsize)
   {
    /*
     * String is smaller than the buffer...
@@ -1460,7 +1404,7 @@ asn1_get_string(
   if (length > 0)
     (*buffer) += length;
 
-  return (length < 0 ? NULL : string);
+  return (string);
 }
 
 
@@ -1500,40 +1444,40 @@ asn1_set_integer(unsigned char **buffer,/* IO - Pointer in buffer */
   {
     **buffer = 4;
     (*buffer) ++;
-    **buffer = integer >> 24;
+    **buffer = (unsigned char)(integer >> 24);
     (*buffer) ++;
-    **buffer = integer >> 16;
+    **buffer = (unsigned char)(integer >> 16);
     (*buffer) ++;
-    **buffer = integer >> 8;
+    **buffer = (unsigned char)(integer >> 8);
     (*buffer) ++;
-    **buffer = integer;
+    **buffer = (unsigned char)integer;
     (*buffer) ++;
   }
   else if (integer > 0x7fff || integer < -0x8000)
   {
     **buffer = 3;
     (*buffer) ++;
-    **buffer = integer >> 16;
+    **buffer = (unsigned char)(integer >> 16);
     (*buffer) ++;
-    **buffer = integer >> 8;
+    **buffer = (unsigned char)(integer >> 8);
     (*buffer) ++;
-    **buffer = integer;
+    **buffer = (unsigned char)integer;
     (*buffer) ++;
   }
   else if (integer > 0x7f || integer < -0x80)
   {
     **buffer = 2;
     (*buffer) ++;
-    **buffer = integer >> 8;
+    **buffer = (unsigned char)(integer >> 8);
     (*buffer) ++;
-    **buffer = integer;
+    **buffer = (unsigned char)integer;
     (*buffer) ++;
   }
   else
   {
     **buffer = 1;
     (*buffer) ++;
-    **buffer = integer;
+    **buffer = (unsigned char)integer;
     (*buffer) ++;
   }
 }
@@ -1551,21 +1495,21 @@ asn1_set_length(unsigned char **buffer, /* IO - Pointer in buffer */
   {
     **buffer = 0x82;                   /* 2-byte length */
     (*buffer) ++;
-    **buffer = length >> 8;
+    **buffer = (unsigned char)(length >> 8);
     (*buffer) ++;
-    **buffer = length;
+    **buffer = (unsigned char)length;
     (*buffer) ++;
   }
   else if (length > 127)
   {
     **buffer = 0x81;                   /* 1-byte length */
     (*buffer) ++;
-    **buffer = length;
+    **buffer = (unsigned char)length;
     (*buffer) ++;
   }
   else
   {
-    **buffer = length;                 /* Length */
+    **buffer = (unsigned char)length;  /* Length */
     (*buffer) ++;
   }
 }
@@ -1639,7 +1583,7 @@ asn1_set_packed(unsigned char **buffer,   /* IO - Pointer in buffer */
  *                         integer value.
  */
 
-static int                             /* O - Size in bytes */
+static unsigned                                /* O - Size in bytes */
 asn1_size_integer(int integer)         /* I - Integer value */
 {
   if (integer > 0x7fffff || integer < -0x800000)
@@ -1658,8 +1602,8 @@ asn1_size_integer(int integer)            /* I - Integer value */
  *                        length value.
  */
 
-static int                             /* O - Size in bytes */
-asn1_size_length(int length)           /* I - Length value */
+static unsigned                                /* O - Size in bytes */
+asn1_size_length(unsigned length)      /* I - Length value */
 {
   if (length > 0xff)
     return (3);
@@ -1675,10 +1619,10 @@ asn1_size_length(int length)            /* I - Length value */
  *                     OID value.
  */
 
-static int                             /* O - Size in bytes */
+static unsigned                                /* O - Size in bytes */
 asn1_size_oid(const int *oid)          /* I - OID value */
 {
-  int  length;                         /* Length of value */
+  unsigned     length;                 /* Length of value */
 
 
   if (oid[1] < 0)
@@ -1698,7 +1642,7 @@ asn1_size_oid(const int *oid)             /* I - OID value */
  *                        packed integer value.
  */
 
-static int                             /* O - Size in bytes */
+static unsigned                                /* O - Size in bytes */
 asn1_size_packed(int integer)          /* I - Integer value */
 {
   if (integer > 0xfffffff)
@@ -1733,5 +1677,5 @@ snmp_set_error(cups_snmp_t *packet,       /* I - Packet */
 
 
 /*
- * End of "$Id: snmp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: snmp.c 11594 2014-02-14 20:09:01Z msweet $".
  */
index 4e4d91f..4029d2c 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: snprintf.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: snprintf.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   snprintf functions for CUPS.
  *
- *   Copyright 2007-2010 by Apple Inc.
+ *   Copyright 2007-2013 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -48,6 +48,7 @@ _cups_vsnprintf(char       *buffer,   /* O - Output buffer */
   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 */
@@ -183,20 +184,21 @@ _cups_vsnprintf(char       *buffer,       /* O - Output buffer */
              break;
 
            sprintf(temp, tformat, va_arg(ap, double));
+           templen = strlen(temp):
 
-            bytes += (int)strlen(temp);
+            bytes += (int)templen;
 
             if (bufptr)
            {
-             if ((bufptr + strlen(temp)) > bufend)
+             if ((bufptr + templen) > bufend)
              {
-               strncpy(bufptr, temp, (size_t)(bufend - bufptr));
+               strlcpy(bufptr, temp, (size_t)(bufend - bufptr));
                bufptr = bufend;
              }
              else
              {
-               strcpy(bufptr, temp);
-               bufptr += strlen(temp);
+               memcpy(bufptr, temp, templen + 1);
+               bufptr += templen;
              }
            }
            break;
@@ -213,20 +215,21 @@ _cups_vsnprintf(char       *buffer,       /* O - Output buffer */
              break;
 
            sprintf(temp, tformat, va_arg(ap, int));
+           templen = strlen(temp):
 
-            bytes += (int)strlen(temp);
+            bytes += (int)templen;
 
            if (bufptr)
            {
-             if ((bufptr + strlen(temp)) > bufend)
+             if ((bufptr + templen) > bufend)
              {
-               strncpy(bufptr, temp, (size_t)(bufend - bufptr));
+               strlcpy(bufptr, temp, (size_t)(bufend - bufptr));
                bufptr = bufend;
              }
              else
              {
-               strcpy(bufptr, temp);
-               bufptr += strlen(temp);
+               memcpy(bufptr, temp, templen + 1);
+               bufptr += templen;
              }
            }
            break;
@@ -236,20 +239,21 @@ _cups_vsnprintf(char       *buffer,       /* O - Output buffer */
              break;
 
            sprintf(temp, tformat, va_arg(ap, void *));
+           templen = strlen(temp):
 
-            bytes += (int)strlen(temp);
+            bytes += (int)templen;
 
            if (bufptr)
            {
-             if ((bufptr + strlen(temp)) > bufend)
+             if ((bufptr + templen) > bufend)
              {
-               strncpy(bufptr, temp, (size_t)(bufend - bufptr));
+               strlcpy(bufptr, temp, (size_t)(bufend - bufptr));
                bufptr = bufend;
              }
              else
              {
-               strcpy(bufptr, temp);
-               bufptr += strlen(temp);
+               memcpy(bufptr, temp, templen + 1);
+               bufptr += templen;
              }
            }
            break;
@@ -292,13 +296,13 @@ _cups_vsnprintf(char       *buffer,       /* O - Output buffer */
 
              if (sign == '-')
              {
-               strncpy(bufptr, s, (size_t)slen);
+               memcpy(bufptr, s, (size_t)slen);
                memset(bufptr + slen, ' ', (size_t)(width - slen));
              }
              else
              {
                memset(bufptr, ' ', (size_t)(width - slen));
-               strncpy(bufptr + width - slen, s, (size_t)slen);
+               memcpy(bufptr + width - slen, s, (size_t)slen);
              }
 
              bufptr += width;
@@ -357,6 +361,6 @@ _cups_snprintf(char       *buffer,  /* O - Output buffer */
 
 
 /*
- * End of "$Id: snprintf.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: snprintf.c 10996 2013-05-29 11:51:34Z msweet $".
  */
 
diff --git a/cups/sspi-private.h b/cups/sspi-private.h
deleted file mode 100644 (file)
index e8f36c2..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *   Private SSPI definitions for CUPS.
- *
- *   Copyright 2010 by Apple Inc.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- */
-
-#ifndef _CUPS_SSPI_PRIVATE_H_
-#      define _CUPS_SSPI_PRIVATE_H_
-
-/*
- * Include necessary headers...
- */
-
-#  include <config.h>
-#  include <winsock2.h>
-#  include <ws2tcpip.h>
-#  include <wincrypt.h>
-#  include <wintrust.h>
-#  include <schannel.h>
-#  define SECURITY_WIN32
-#  include <security.h>
-#  include <sspi.h>
-
-/*
- * C++ magic...
- */
-
-#      ifdef __cplusplus
-extern "C" {
-#      endif /* __cplusplus */
-
-
-typedef struct                                         /**** SSPI/SSL data structure ****/
-{
-  SOCKET                       sock;                   /* TCP/IP socket */
-  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 */
-  size_t                       readBufferLength;       /* Length of read buffer */
-  size_t                       readBufferUsed;         /* Bytes used in buffer */
-  DWORD                                certFlags;              /* Cert verification flags */
-} _sspi_struct_t;
-
-
-/*
- * Prototypes...
- */
-_sspi_struct_t *_sspiAlloc(void);
-BOOL           _sspiAccept(_sspi_struct_t *conn);
-BOOL           _sspiConnect(_sspi_struct_t *conn,
-                            const CHAR *hostname);
-void           _sspiFree(_sspi_struct_t *conn);
-BOOL           _sspiGetCredentials(_sspi_struct_t *conn,
-                                   const LPWSTR containerName,
-                                   const TCHAR  *commonName,
-                                   BOOL server);
-int            _sspiPending(_sspi_struct_t *conn);
-int            _sspiRead(_sspi_struct_t *conn,
-                         void *buf, size_t len);
-void           _sspiSetAllowsAnyRoot(_sspi_struct_t *conn,
-                                     BOOL allow);
-void           _sspiSetAllowsExpiredCerts(_sspi_struct_t *conn,
-                                          BOOL allow);
-int            _sspiWrite(_sspi_struct_t *conn,
-                          void *buf, size_t len);
-
-
-#  ifdef __cplusplus
-}
-#  endif /* __cplusplus */
-#endif /* !_CUPS_SSPI_PRIVATE_H_ */
diff --git a/cups/sspi.c b/cups/sspi.c
deleted file mode 100644 (file)
index 97e9654..0000000
+++ /dev/null
@@ -1,1485 +0,0 @@
-/*
- * "$Id: sspi.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- *   Windows SSPI SSL implementation for CUPS.
- *
- *   Copyright 2010-2011 by Apple Inc.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   sspi_alloc()                 - Allocate SSPI ssl object
- *   _sspiGetCredentials()        - Retrieve an SSL/TLS certificate from the
- *                                  system store If one cannot be found, one is
- *                                  created.
- *   _sspiConnect()               - Make an SSL connection. This function
- *                                  assumes a TCP/IP connection has already been
- *                                  successfully made
- *   _sspiAccept()                - Accept an SSL/TLS connection
- *   _sspiSetAllowsAnyRoot()      - Set the client cert policy for untrusted
- *                                  root certs
- *   _sspiSetAllowsExpiredCerts() - Set the client cert policy for expired root
- *                                  certs
- *   _sspiWrite()                 - Write a buffer to an ssl socket
- *   _sspiRead()                  - Read a buffer from an ssl socket
- *   _sspiPending()               - Returns the number of available bytes
- *   _sspiFree()                  - Close a connection and free resources
- *   sspi_verify_certificate()    - Verify a server certificate
- */
-
-/*
- * Include necessary headers...
- */
-
-#include "sspi-private.h"
-#include "debug-private.h"
-
-
-/* required to link this library for certificate functions */
-#pragma comment(lib, "Crypt32.lib")
-#pragma comment(lib, "Secur32.lib")
-#pragma comment(lib, "Ws2_32.lib")
-
-
-#if !defined(SECURITY_FLAG_IGNORE_UNKNOWN_CA)
-#  define SECURITY_FLAG_IGNORE_UNKNOWN_CA         0x00000100 /* Untrusted root */
-#endif
-
-#if !defined(SECURITY_FLAG_IGNORE_CERT_DATE_INVALID)
-#  define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID  0x00002000 /* Expired X509 Cert. */
-#endif
-
-static DWORD sspi_verify_certificate(PCCERT_CONTEXT  serverCert,
-                                     const CHAR      *serverName,
-                                     DWORD           dwCertFlags);
-
-
-/*
- * 'sspi_alloc()' - Allocate SSPI ssl object
- */
-_sspi_struct_t*                                /* O  - New SSPI/SSL object */
-_sspiAlloc(void)
-{
-  _sspi_struct_t *conn = calloc(sizeof(_sspi_struct_t), 1);
-
-  if (conn)
-    conn->sock = INVALID_SOCKET;
-
-  return (conn);
-}
-
-
-/*
- * '_sspiGetCredentials()' - Retrieve an SSL/TLS certificate from the system store
- *                              If one cannot be found, one is created.
- */
-BOOL                                   /* O - 1 on success, 0 on failure */
-_sspiGetCredentials(_sspi_struct_t *conn,
-                                       /* I - Client connection */
-                    const LPWSTR   container,
-                                       /* I - Cert container name */
-                    const TCHAR    *cn,        /* I - Common name of certificate */
-                    BOOL           isServer)
-                                       /* I - Is caller a server? */
-{
-  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 */
-
-  if (!conn)
-    return (FALSE);
-  if (!cn)
-    return (FALSE);
-
-  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(("_sspiGetCredentials: CryptAcquireContext failed: %x\n",
-                      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(("_sspiGetCredentials: CertOpenSystemStore failed: %x\n",
-                  GetLastError()));
-    ok = FALSE;
-    goto cleanup;
-  }
-
-  dwSize = 0;
-
-  if (!CertStrToName(X509_ASN_ENCODING, cn, CERT_OID_NAME_STR,
-                     NULL, NULL, &dwSize, NULL))
-  {
-    DEBUG_printf(("_sspiGetCredentials: CertStrToName failed: %x\n",
-                   GetLastError()));
-    ok = FALSE;
-    goto cleanup;
-  }
-
-  p = (PBYTE) malloc(dwSize);
-
-  if (!p)
-  {
-    DEBUG_printf(("_sspiGetCredentials: malloc failed for %d bytes", dwSize));
-    ok = FALSE;
-    goto cleanup;
-  }
-
-  if (!CertStrToName(X509_ASN_ENCODING, cn, CERT_OID_NAME_STR, NULL,
-                     p, &dwSize, NULL))
-  {
-    DEBUG_printf(("_sspiGetCredentials: CertStrToName failed: %x",
-                 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)
-  {
-   /*
-    * If we couldn't find the context, then we'll
-    * create a new one
-    */
-    if (!CryptGenKey(hProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hKey))
-    {
-      DEBUG_printf(("_sspiGetCredentials: CryptGenKey failed: %x",
-                    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 += 10;
-
-    ZeroMemory(&exts, sizeof(exts));
-
-    createdContext = CertCreateSelfSignCertificate(hProv, &sib, 0, &kpi, NULL, NULL,
-                                                   &et, &exts);
-
-    if (!createdContext)
-    {
-      DEBUG_printf(("_sspiGetCredentials: CertCreateSelfSignCertificate failed: %x",
-                   GetLastError()));
-      ok = FALSE;
-      goto cleanup;
-    }
-
-    if (!CertAddCertificateContextToStore(store, createdContext,
-                                          CERT_STORE_ADD_REPLACE_EXISTING,
-                                          &storedContext))
-    {
-      DEBUG_printf(("_sspiGetCredentials: CertAddCertificateContextToStore failed: %x",
-                    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(("_sspiGetCredentials: CertSetCertificateContextProperty failed: %x",
-                    GetLastError()));
-      ok = FALSE;
-      goto cleanup;
-    }
-  }
-
-  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 (isServer)
-    SchannelCred.grbitEnabledProtocols = SP_PROT_SSL3TLS1;
-
- /*
-  * Create an SSPI credential.
-  */
-  Status = AcquireCredentialsHandle(NULL, UNISP_NAME,
-                                    isServer ? SECPKG_CRED_INBOUND:SECPKG_CRED_OUTBOUND,
-                                    NULL, &SchannelCred, NULL, NULL, &conn->creds,
-                                    &tsExpiry);
-  if (Status != SEC_E_OK)
-  {
-    DEBUG_printf(("_sspiGetCredentials: AcquireCredentialsHandle failed: %x", 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);
-}
-
-
-/*
- * '_sspiConnect()' - Make an SSL connection. This function
- *                    assumes a TCP/IP connection has already
- *                    been successfully made
- */
-BOOL                                   /* O - 1 on success, 0 on failure */
-_sspiConnect(_sspi_struct_t *conn,     /* I - Client connection */
-             const CHAR *hostname)     /* I - Server hostname */
-{
-  PCCERT_CONTEXT       serverCert;     /* Server certificate */
-  DWORD                        dwSSPIFlags;    /* SSL connection attributes we want */
-  DWORD                        dwSSPIOutFlags; /* SSL connection attributes we got */
-  TimeStamp            tsExpiry;       /* Time stamp */
-  SECURITY_STATUS      scRet;          /* Status */
-  DWORD                        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 */
-  BOOL                 ok = TRUE;      /* Return value */
-
-  serverCert  = NULL;
-
-  dwSSPIFlags = ISC_REQ_SEQUENCE_DETECT   |
-                ISC_REQ_REPLAY_DETECT     |
-                ISC_REQ_CONFIDENTIALITY   |
-                ISC_RET_EXTENDED_ERROR    |
-                ISC_REQ_ALLOCATE_MEMORY   |
-                ISC_REQ_STREAM;
-
- /*
-  * 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(&conn->creds, NULL, TEXT(""), dwSSPIFlags,
-                                    0, SECURITY_NATIVE_DREP, NULL, 0, &conn->context,
-                                    &outBuffer, &dwSSPIOutFlags, &tsExpiry);
-
-  if (scRet != SEC_I_CONTINUE_NEEDED)
-  {
-    DEBUG_printf(("_sspiConnect: InitializeSecurityContext(1) failed: %x", scRet));
-    ok = FALSE;
-    goto cleanup;
-  }
-
- /*
-  * Send response to server if there is one.
-  */
-  if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer)
-  {
-    cbData = send(conn->sock, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0);
-
-    if ((cbData == SOCKET_ERROR) || !cbData)
-    {
-      DEBUG_printf(("_sspiConnect: send failed: %d", WSAGetLastError()));
-      FreeContextBuffer(outBuffers[0].pvBuffer);
-      DeleteSecurityContext(&conn->context);
-      ok = FALSE;
-      goto cleanup;
-    }
-
-    DEBUG_printf(("_sspiConnect: %d bytes of handshake data sent", cbData));
-
-   /*
-    * Free output buffer.
-    */
-    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;
-
-  conn->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 ((conn->decryptBufferUsed == 0) || (scRet == SEC_E_INCOMPLETE_MESSAGE))
-    {
-      if (conn->decryptBufferLength <= conn->decryptBufferUsed)
-      {
-        conn->decryptBufferLength += 4096;
-        conn->decryptBuffer = (BYTE*) realloc(conn->decryptBuffer, conn->decryptBufferLength);
-
-        if (!conn->decryptBuffer)
-        {
-          DEBUG_printf(("_sspiConnect: unable to allocate %d byte decrypt buffer",
-                        conn->decryptBufferLength));
-          SetLastError(E_OUTOFMEMORY);
-          ok = FALSE;
-          goto cleanup;
-        }
-      }
-
-      cbData = recv(conn->sock, conn->decryptBuffer + conn->decryptBufferUsed,
-                    (int) (conn->decryptBufferLength - conn->decryptBufferUsed), 0);
-
-      if (cbData == SOCKET_ERROR)
-      {
-        DEBUG_printf(("_sspiConnect: recv failed: %d", WSAGetLastError()));
-        ok = FALSE;
-        goto cleanup;
-      }
-      else if (cbData == 0)
-      {
-        DEBUG_printf(("_sspiConnect: server unexpectedly disconnected"));
-        ok = FALSE;
-        goto cleanup;
-      }
-
-      DEBUG_printf(("_sspiConnect: %d bytes of handshake data received",
-                    cbData));
-
-      conn->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   = conn->decryptBuffer;
-    inBuffers[0].cbBuffer   = (unsigned long) conn->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(&conn->creds, &conn->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 contends 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(conn->sock, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0);
-
-        if ((cbData == SOCKET_ERROR) || !cbData)
-        {
-          DEBUG_printf(("_sspiConnect: send failed: %d", WSAGetLastError()));
-          FreeContextBuffer(outBuffers[0].pvBuffer);
-          DeleteSecurityContext(&conn->context);
-          ok = FALSE;
-          goto cleanup;
-        }
-
-        DEBUG_printf(("_sspiConnect: %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_printf(("_sspiConnect: Handshake was successful"));
-
-      if (inBuffers[1].BufferType == SECBUFFER_EXTRA)
-      {
-        if (conn->decryptBufferLength < inBuffers[1].cbBuffer)
-        {
-          conn->decryptBuffer = realloc(conn->decryptBuffer, inBuffers[1].cbBuffer);
-
-          if (!conn->decryptBuffer)
-          {
-            DEBUG_printf(("_sspiConnect: unable to allocate %d bytes for decrypt buffer",
-                          inBuffers[1].cbBuffer));
-            SetLastError(E_OUTOFMEMORY);
-            ok = FALSE;
-            goto cleanup;
-          }
-        }
-
-        memmove(conn->decryptBuffer,
-                conn->decryptBuffer + (conn->decryptBufferUsed - inBuffers[1].cbBuffer),
-                inBuffers[1].cbBuffer);
-
-        conn->decryptBufferUsed = inBuffers[1].cbBuffer;
-
-        DEBUG_printf(("_sspiConnect: %d bytes of app data was bundled with handshake data",
-                      conn->decryptBufferUsed));
-      }
-      else
-        conn->decryptBufferUsed = 0;
-
-     /*
-      * Bail out to quit
-      */
-      break;
-    }
-
-   /*
-    * Check for fatal error.
-    */
-    if (FAILED(scRet))
-    {
-      DEBUG_printf(("_sspiConnect: InitializeSecurityContext(2) failed: %x", scRet));
-      ok = FALSE;
-      break;
-    }
-
-   /*
-    * If InitializeSecurityContext returned SEC_I_INCOMPLETE_CREDENTIALS,
-    * then the server just requested client authentication.
-    */
-    if (scRet == SEC_I_INCOMPLETE_CREDENTIALS)
-    {
-     /*
-      * Unimplemented
-      */
-      DEBUG_printf(("_sspiConnect: server requested client credentials"));
-      ok = FALSE;
-      break;
-    }
-
-   /*
-    * Copy any leftover data from the "extra" buffer, and go around
-    * again.
-    */
-    if (inBuffers[1].BufferType == SECBUFFER_EXTRA)
-    {
-      memmove(conn->decryptBuffer,
-              conn->decryptBuffer + (conn->decryptBufferUsed - inBuffers[1].cbBuffer),
-              inBuffers[1].cbBuffer);
-
-      conn->decryptBufferUsed = inBuffers[1].cbBuffer;
-    }
-    else
-    {
-      conn->decryptBufferUsed = 0;
-    }
-  }
-
-  if (ok)
-  {
-    conn->contextInitialized = TRUE;
-
-   /*
-    * Get the server cert
-    */
-    scRet = QueryContextAttributes(&conn->context, SECPKG_ATTR_REMOTE_CERT_CONTEXT, (VOID*) &serverCert );
-
-    if (scRet != SEC_E_OK)
-    {
-      DEBUG_printf(("_sspiConnect: QueryContextAttributes failed(SECPKG_ATTR_REMOTE_CERT_CONTEXT): %x", scRet));
-      ok = FALSE;
-      goto cleanup;
-    }
-
-    scRet = sspi_verify_certificate(serverCert, hostname, conn->certFlags);
-
-    if (scRet != SEC_E_OK)
-    {
-      DEBUG_printf(("_sspiConnect: sspi_verify_certificate failed: %x", scRet));
-      ok = FALSE;
-      goto cleanup;
-    }
-
-   /*
-    * Find out how big the header/trailer will be:
-    */
-    scRet = QueryContextAttributes(&conn->context, SECPKG_ATTR_STREAM_SIZES, &conn->streamSizes);
-
-    if (scRet != SEC_E_OK)
-    {
-      DEBUG_printf(("_sspiConnect: QueryContextAttributes failed(SECPKG_ATTR_STREAM_SIZES): %x", scRet));
-      ok = FALSE;
-    }
-  }
-
-cleanup:
-
-  if (serverCert)
-    CertFreeCertificateContext(serverCert);
-
-  return (ok);
-}
-
-
-/*
- * '_sspiAccept()' - Accept an SSL/TLS connection
- */
-BOOL                                   /* O - 1 on success, 0 on failure */
-_sspiAccept(_sspi_struct_t *conn)      /* I  - Client connection */
-{
-  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 */
-  DWORD                        num = 0;        /* 32 bit status value */
-  BOOL                 fInitContext = TRUE;
-                                       /* Has the context been init'd? */
-  BOOL                 ok = TRUE;      /* Return value */
-
-  if (!conn)
-    return (FALSE);
-
-  dwSSPIFlags = ASC_REQ_SEQUENCE_DETECT  |
-                ASC_REQ_REPLAY_DETECT    |
-                ASC_REQ_CONFIDENTIALITY  |
-                ASC_REQ_EXTENDED_ERROR   |
-                ASC_REQ_ALLOCATE_MEMORY  |
-                ASC_REQ_STREAM;
-
-  conn->decryptBufferUsed = 0;
-
- /*
-  * 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 ((conn->decryptBufferUsed == 0) || (scRet == SEC_E_INCOMPLETE_MESSAGE))
-    {
-      if (conn->decryptBufferLength <= conn->decryptBufferUsed)
-      {
-        conn->decryptBufferLength += 4096;
-        conn->decryptBuffer = (BYTE*) realloc(conn->decryptBuffer,
-                                              conn->decryptBufferLength);
-
-        if (!conn->decryptBuffer)
-        {
-          DEBUG_printf(("_sspiAccept: unable to allocate %d byte decrypt buffer",
-                        conn->decryptBufferLength));
-          ok = FALSE;
-          goto cleanup;
-        }
-      }
-
-      for (;;)
-      {
-        num = recv(conn->sock,
-                   conn->decryptBuffer + conn->decryptBufferUsed,
-                   (int)(conn->decryptBufferLength - conn->decryptBufferUsed),
-                   0);
-
-        if ((num == SOCKET_ERROR) && (WSAGetLastError() == WSAEWOULDBLOCK))
-          Sleep(1);
-        else
-          break;
-      }
-
-      if (num == SOCKET_ERROR)
-      {
-        DEBUG_printf(("_sspiAccept: recv failed: %d", WSAGetLastError()));
-        ok = FALSE;
-        goto cleanup;
-      }
-      else if (num == 0)
-      {
-        DEBUG_printf(("_sspiAccept: client disconnected"));
-        ok = FALSE;
-        goto cleanup;
-      }
-
-      DEBUG_printf(("_sspiAccept: received %d (handshake) bytes from client",
-                    num));
-      conn->decryptBufferUsed += num;
-    }
-
-   /*
-    * InBuffers[1] is for getting extra data that
-    * SSPI/SCHANNEL doesn't proccess on this
-    * run around the loop.
-    */
-    inBuffers[0].pvBuffer   = conn->decryptBuffer;
-    inBuffers[0].cbBuffer   = (unsigned long) conn->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(&conn->creds, (fInitContext?NULL:&conn->context),
-                                  &inBuffer, dwSSPIFlags, SECURITY_NATIVE_DREP,
-                                  (fInitContext?&conn->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(conn->sock, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0);
-
-        if ((num == SOCKET_ERROR) || (num == 0))
-        {
-          DEBUG_printf(("_sspiAccept: handshake send failed: %d", WSAGetLastError()));
-          ok = FALSE;
-          goto cleanup;
-        }
-
-        DEBUG_printf(("_sspiAccept: send %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(conn->decryptBuffer,
-               (LPBYTE) (conn->decryptBuffer + (conn->decryptBufferUsed - inBuffers[1].cbBuffer)),
-               inBuffers[1].cbBuffer);
-        conn->decryptBufferUsed = inBuffers[1].cbBuffer;
-      }
-      else
-      {
-        conn->decryptBufferUsed = 0;
-      }
-
-      ok = TRUE;
-      break;
-    }
-    else if (FAILED(scRet) && (scRet != SEC_E_INCOMPLETE_MESSAGE))
-    {
-      DEBUG_printf(("_sspiAccept: AcceptSecurityContext failed: %x", scRet));
-      ok = FALSE;
-      break;
-    }
-
-    if (scRet != SEC_E_INCOMPLETE_MESSAGE &&
-        scRet != SEC_I_INCOMPLETE_CREDENTIALS)
-    {
-      if (inBuffers[1].BufferType == SECBUFFER_EXTRA)
-      {
-        memcpy(conn->decryptBuffer,
-               (LPBYTE) (conn->decryptBuffer + (conn->decryptBufferUsed - inBuffers[1].cbBuffer)),
-               inBuffers[1].cbBuffer);
-        conn->decryptBufferUsed = inBuffers[1].cbBuffer;
-      }
-      else
-      {
-        conn->decryptBufferUsed = 0;
-      }
-    }
-  }
-
-  if (ok)
-  {
-    conn->contextInitialized = TRUE;
-
-   /*
-    * Find out how big the header will be:
-    */
-    scRet = QueryContextAttributes(&conn->context, SECPKG_ATTR_STREAM_SIZES, &conn->streamSizes);
-
-    if (scRet != SEC_E_OK)
-    {
-      DEBUG_printf(("_sspiAccept: QueryContextAttributes failed: %x", scRet));
-      ok = FALSE;
-    }
-  }
-
-cleanup:
-
-  return (ok);
-}
-
-
-/*
- * '_sspiSetAllowsAnyRoot()' - Set the client cert policy for untrusted root certs
- */
-void
-_sspiSetAllowsAnyRoot(_sspi_struct_t *conn,
-                                       /* I  - Client connection */
-                      BOOL           allow)
-                                       /* I  - Allow any root */
-{
-  conn->certFlags = (allow) ? conn->certFlags | SECURITY_FLAG_IGNORE_UNKNOWN_CA :
-                              conn->certFlags & ~SECURITY_FLAG_IGNORE_UNKNOWN_CA;
-}
-
-
-/*
- * '_sspiSetAllowsExpiredCerts()' - Set the client cert policy for expired root certs
- */
-void
-_sspiSetAllowsExpiredCerts(_sspi_struct_t *conn,
-                                       /* I  - Client connection */
-                           BOOL           allow)
-                                       /* I  - Allow expired certs */
-{
-  conn->certFlags = (allow) ? conn->certFlags | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID :
-                              conn->certFlags & ~SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
-}
-
-
-/*
- * '_sspiWrite()' - Write a buffer to an ssl socket
- */
-int                                    /* O  - Bytes written or SOCKET_ERROR */
-_sspiWrite(_sspi_struct_t *conn,       /* I  - Client connection */
-           void           *buf,                /* I  - Buffer */
-           size_t         len)         /* I  - Buffer length */
-{
-  SecBufferDesc        message;                /* Array of SecBuffer struct */
-  SecBuffer    buffers[4] = { 0 };     /* Security package buffer */
-  BYTE         *buffer = NULL;         /* Scratch buffer */
-  int          bufferLen;              /* Buffer length */
-  size_t       bytesLeft;              /* Bytes left to write */
-  int          index = 0;              /* Index into buffer */
-  int          num = 0;                /* Return value */
-
-  if (!conn || !buf || !len)
-  {
-    WSASetLastError(WSAEINVAL);
-    num = SOCKET_ERROR;
-    goto cleanup;
-  }
-
-  bufferLen = conn->streamSizes.cbMaximumMessage +
-              conn->streamSizes.cbHeader +
-              conn->streamSizes.cbTrailer;
-
-  buffer = (BYTE*) malloc(bufferLen);
-
-  if (!buffer)
-  {
-    DEBUG_printf(("_sspiWrite: buffer alloc of %d bytes failed", bufferLen));
-    WSASetLastError(E_OUTOFMEMORY);
-    num = SOCKET_ERROR;
-    goto cleanup;
-  }
-
-  bytesLeft = len;
-
-  while (bytesLeft)
-  {
-    size_t chunk = min(conn->streamSizes.cbMaximumMessage,     /* Size of data to write */
-                       bytesLeft);
-    SECURITY_STATUS scRet;                                     /* SSPI status */
-
-   /*
-    * Copy user data into the buffer, starting
-    * just past the header
-    */
-    memcpy(buffer + conn->streamSizes.cbHeader,
-           ((BYTE*) buf) + index,
-           chunk);
-
-   /*
-    * Setup the SSPI buffers
-    */
-    message.ulVersion = SECBUFFER_VERSION;
-    message.cBuffers = 4;
-    message.pBuffers = buffers;
-    buffers[0].pvBuffer = buffer;
-    buffers[0].cbBuffer = conn->streamSizes.cbHeader;
-    buffers[0].BufferType = SECBUFFER_STREAM_HEADER;
-    buffers[1].pvBuffer = buffer + conn->streamSizes.cbHeader;
-    buffers[1].cbBuffer = (unsigned long) chunk;
-    buffers[1].BufferType = SECBUFFER_DATA;
-    buffers[2].pvBuffer = buffer + conn->streamSizes.cbHeader + chunk;
-    buffers[2].cbBuffer = conn->streamSizes.cbTrailer;
-    buffers[2].BufferType = SECBUFFER_STREAM_TRAILER;
-    buffers[3].BufferType = SECBUFFER_EMPTY;
-
-   /*
-    * Encrypt the data
-    */
-    scRet = EncryptMessage(&conn->context, 0, &message, 0);
-
-    if (FAILED(scRet))
-    {
-      DEBUG_printf(("_sspiWrite: EncryptMessage failed: %x", scRet));
-      WSASetLastError(WSASYSCALLFAILURE);
-      num = SOCKET_ERROR;
-      goto cleanup;
-    }
-
-   /*
-    * 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(conn->sock,
-               buffer,
-               buffers[0].cbBuffer + buffers[1].cbBuffer + buffers[2].cbBuffer,
-               0);
-
-    if ((num == SOCKET_ERROR) || (num == 0))
-    {
-      DEBUG_printf(("_sspiWrite: send failed: %ld", WSAGetLastError()));
-      goto cleanup;
-    }
-
-    bytesLeft -= (int) chunk;
-    index += (int) chunk;
-  }
-
-  num = (int) len;
-
-cleanup:
-
-  if (buffer)
-    free(buffer);
-
-  return (num);
-}
-
-
-/*
- * '_sspiRead()' - Read a buffer from an ssl socket
- */
-int                                    /* O  - Bytes read or SOCKET_ERROR */
-_sspiRead(_sspi_struct_t *conn,                /* I  - Client connection */
-          void           *buf,         /* I  - Buffer */
-          size_t         len)          /* I  - Buffer length */
-{
-  SecBufferDesc        message;                /* Array of SecBuffer struct */
-  SecBuffer    buffers[4] = { 0 };     /* Security package buffer */
-  int          num = 0;                /* Return value */
-
-  if (!conn)
-  {
-    WSASetLastError(WSAEINVAL);
-    num = SOCKET_ERROR;
-    goto cleanup;
-  }
-
- /*
-  * If there are bytes that have already been
-  * decrypted and have not yet been read, return
-  * those
-  */
-  if (buf && (conn->readBufferUsed > 0))
-  {
-    int bytesToCopy = (int) min(conn->readBufferUsed, len);    /* Amount of bytes to copy */
-                                                               /* from read buffer */
-
-    memcpy(buf, conn->readBuffer, bytesToCopy);
-    conn->readBufferUsed -= bytesToCopy;
-
-    if (conn->readBufferUsed > 0)
-     /*
-      * If the caller didn't request all the bytes
-      * we have in the buffer, then move the unread
-      * bytes down
-      */
-      memmove(conn->readBuffer,
-              conn->readBuffer + bytesToCopy,
-              conn->readBufferUsed);
-
-    num = bytesToCopy;
-  }
-  else
-  {
-    PSecBuffer         pDataBuffer;    /* Data buffer */
-    PSecBuffer         pExtraBuffer;   /* Excess data buffer */
-    SECURITY_STATUS    scRet;          /* SSPI status */
-    int                        i;              /* Loop control variable */
-
-   /*
-    * 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 it's size
-      */
-      if (conn->decryptBufferLength <= conn->decryptBufferUsed)
-      {
-        conn->decryptBufferLength += 4096;
-        conn->decryptBuffer = (BYTE*) realloc(conn->decryptBuffer,
-                                              conn->decryptBufferLength);
-
-        if (!conn->decryptBuffer)
-        {
-          DEBUG_printf(("_sspiRead: unable to allocate %d byte buffer",
-                        conn->decryptBufferLength));
-          WSASetLastError(E_OUTOFMEMORY);
-          num = SOCKET_ERROR;
-          goto cleanup;
-        }
-      }
-
-      buffers[0].pvBuffer      = conn->decryptBuffer;
-      buffers[0].cbBuffer      = (unsigned long) conn->decryptBufferUsed;
-      buffers[0].BufferType    = SECBUFFER_DATA;
-      buffers[1].BufferType    = SECBUFFER_EMPTY;
-      buffers[2].BufferType    = SECBUFFER_EMPTY;
-      buffers[3].BufferType    = SECBUFFER_EMPTY;
-
-      scRet = DecryptMessage(&conn->context, &message, 0, NULL);
-
-      if (scRet == SEC_E_INCOMPLETE_MESSAGE)
-      {
-        if (buf)
-        {
-          num = recv(conn->sock,
-                     conn->decryptBuffer + conn->decryptBufferUsed,
-                     (int)(conn->decryptBufferLength - conn->decryptBufferUsed),
-                     0);
-          if (num == SOCKET_ERROR)
-          {
-            DEBUG_printf(("_sspiRead: recv failed: %d", WSAGetLastError()));
-            goto cleanup;
-          }
-          else if (num == 0)
-          {
-            DEBUG_printf(("_sspiRead: server disconnected"));
-            goto cleanup;
-          }
-
-          conn->decryptBufferUsed += num;
-        }
-        else
-        {
-          num = (int) conn->readBufferUsed;
-          goto cleanup;
-        }
-      }
-    }
-    while (scRet == SEC_E_INCOMPLETE_MESSAGE);
-
-    if (scRet == SEC_I_CONTEXT_EXPIRED)
-    {
-      DEBUG_printf(("_sspiRead: context expired"));
-      WSASetLastError(WSAECONNRESET);
-      num = SOCKET_ERROR;
-      goto cleanup;
-    }
-    else if (scRet != SEC_E_OK)
-    {
-      DEBUG_printf(("_sspiRead: DecryptMessage failed: %lx", scRet));
-      WSASetLastError(WSASYSCALLFAILURE);
-      num = SOCKET_ERROR;
-      goto cleanup;
-    }
-
-   /*
-    * 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(pDataBuffer->cbBuffer, (int) 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 ((int)(conn->readBufferLength - conn->readBufferUsed) < bytesToSave)
-        {
-          conn->readBufferLength = conn->readBufferUsed + bytesToSave;
-          conn->readBuffer = realloc(conn->readBuffer,
-                                     conn->readBufferLength);
-
-          if (!conn->readBuffer)
-          {
-            DEBUG_printf(("_sspiRead: unable to allocate %d bytes", conn->readBufferLength));
-            WSASetLastError(E_OUTOFMEMORY);
-            num = SOCKET_ERROR;
-            goto cleanup;
-          }
-        }
-
-        memcpy(((BYTE*) conn->readBuffer) + conn->readBufferUsed,
-               ((BYTE*) pDataBuffer->pvBuffer) + bytesToCopy,
-               bytesToSave);
-
-        conn->readBufferUsed += bytesToSave;
-      }
-
-      num = (buf) ? bytesToCopy : (int) conn->readBufferUsed;
-    }
-    else
-    {
-      DEBUG_printf(("_sspiRead: unable to find data buffer"));
-      WSASetLastError(WSASYSCALLFAILURE);
-      num = SOCKET_ERROR;
-      goto cleanup;
-    }
-
-   /*
-    * 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(conn->decryptBuffer, pExtraBuffer->pvBuffer, pExtraBuffer->cbBuffer);
-      conn->decryptBufferUsed = pExtraBuffer->cbBuffer;
-    }
-    else
-    {
-      conn->decryptBufferUsed = 0;
-    }
-  }
-
-cleanup:
-
-  return (num);
-}
-
-
-/*
- * '_sspiPending()' - Returns the number of available bytes
- */
-int                                    /* O  - Number of available bytes */
-_sspiPending(_sspi_struct_t *conn)     /* I  - Client connection */
-{
-  return (_sspiRead(conn, NULL, 0));
-}
-
-
-/*
- * '_sspiFree()' - Close a connection and free resources
- */
-void
-_sspiFree(_sspi_struct_t *conn)                /* I  - Client connection */
-{
-  if (!conn)
-    return;
-
-  if (conn->contextInitialized)
-  {
-    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(&conn->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(&conn->creds, &conn->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(conn->sock, pbMessage, cbMessage, 0);
-          if ((cbData == SOCKET_ERROR) || (cbData == 0))
-          {
-            status = WSAGetLastError();
-            DEBUG_printf(("_sspiFree: sending close notify failed: %d", status));
-          }
-          else
-          {
-            FreeContextBuffer(pbMessage);
-          }
-        }
-      }
-      else
-      {
-        DEBUG_printf(("_sspiFree: AcceptSecurityContext failed: %x", status));
-      }
-    }
-    else
-    {
-      DEBUG_printf(("_sspiFree: ApplyControlToken failed: %x", status));
-    }
-
-    DeleteSecurityContext(&conn->context);
-    conn->contextInitialized = FALSE;
-  }
-
-  if (conn->decryptBuffer)
-  {
-    free(conn->decryptBuffer);
-    conn->decryptBuffer = NULL;
-  }
-
-  if (conn->readBuffer)
-  {
-    free(conn->readBuffer);
-    conn->readBuffer = NULL;
-  }
-
-  if (conn->sock != INVALID_SOCKET)
-  {
-    closesocket(conn->sock);
-    conn->sock = INVALID_SOCKET;
-  }
-
-  free(conn);
-}
-
-
-/*
- * 'sspi_verify_certificate()' - Verify a server certificate
- */
-static DWORD                           /* 0  - Error code (0 == No error) */
-sspi_verify_certificate(PCCERT_CONTEXT  serverCert,
-                                       /* I  - Server certificate */
-                        const CHAR      *serverName,
-                                       /* I  - Server 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                                serverNameUnicode = NULL;
-                                       /* Unicode server 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 */
-
-  if (!serverCert)
-  {
-    status = SEC_E_WRONG_PRINCIPAL;
-    goto cleanup;
-  }
-
- /*
-  *  Convert server name to unicode.
-  */
-  if (!serverName || (strlen(serverName) == 0))
-  {
-    status = SEC_E_WRONG_PRINCIPAL;
-    goto cleanup;
-  }
-
-  count = MultiByteToWideChar(CP_ACP, 0, serverName, -1, NULL, 0);
-  serverNameUnicode = LocalAlloc(LMEM_FIXED, count * sizeof(WCHAR));
-  if (!serverNameUnicode)
-  {
-    status = SEC_E_INSUFFICIENT_MEMORY;
-    goto cleanup;
-  }
-  count = MultiByteToWideChar(CP_ACP, 0, serverName, -1, serverNameUnicode, count);
-  if (count == 0)
-  {
-    status = SEC_E_WRONG_PRINCIPAL;
-    goto cleanup;
-  }
-
- /*
-  * 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, serverCert, NULL, serverCert->hCertStore,
-                               &chainPara, 0, NULL, &chainContext))
-  {
-    status = GetLastError();
-    DEBUG_printf(("CertGetCertificateChain returned 0x%x\n", status));
-    goto cleanup;
-  }
-
- /*
-  * Validate certificate chain.
-  */
-  ZeroMemory(&httpsPolicy, sizeof(HTTPSPolicyCallbackData));
-  httpsPolicy.cbStruct         = sizeof(HTTPSPolicyCallbackData);
-  httpsPolicy.dwAuthType       = AUTHTYPE_SERVER;
-  httpsPolicy.fdwChecks                = dwCertFlags;
-  httpsPolicy.pwszServerName   = serverNameUnicode;
-
-  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 %d", status));
-    goto cleanup;
-  }
-
-  if (policyStatus.dwError)
-  {
-    status = policyStatus.dwError;
-    goto cleanup;
-  }
-
-  status = SEC_E_OK;
-
-cleanup:
-
-  if (chainContext)
-    CertFreeCertificateChain(chainContext);
-
-  if (serverNameUnicode)
-    LocalFree(serverNameUnicode);
-
-  return (status);
-}
-
-
-/*
- * End of "$Id: sspi.c 11173 2013-07-23 12:31:34Z msweet $".
- */
index c0bded3..558db45 100644 (file)
@@ -1,18 +1,18 @@
 /*
- * "$Id: string-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: string-private.h 12928 2015-10-23 21:31:58Z msweet $"
  *
- *   Private string definitions for CUPS.
+ * Private string definitions for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_STRING_PRIVATE_H_
@@ -28,6 +28,7 @@
 #  include <ctype.h>
 #  include <errno.h>
 #  include <locale.h>
+#  include <time.h>
 
 #  include "config.h"
 
@@ -102,6 +103,12 @@ _cups_isalpha(int ch)                      /* I - Character to test */
 }
 
 _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' ||
@@ -119,12 +126,20 @@ _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 */
 
 
@@ -132,6 +147,7 @@ extern int _cups_tolower(int ch);
  * Prototypes...
  */
 
+extern ssize_t _cups_safe_vsnprintf(char *, size_t, const char *, va_list);
 extern void    _cups_strcpy(char *dst, const char *src);
 
 #  ifndef HAVE_STRDUP
@@ -186,6 +202,13 @@ extern double      _cupsStrScand(const char *buf, char **bufptr,
 
 
 /*
+ * Date function...
+ */
+
+extern char    *_cupsStrDate(char *buf, size_t bufsize, time_t timeval);
+
+
+/*
  * C++ magic...
  */
 
@@ -196,5 +219,5 @@ extern double       _cupsStrScand(const char *buf, char **bufptr,
 #endif /* !_CUPS_STRING_H_ */
 
 /*
- * End of "$Id: string-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: string-private.h 12928 2015-10-23 21:31:58Z msweet $".
  */
index 8575424..9f99494 100644 (file)
@@ -1,35 +1,18 @@
 /*
- * "$Id: string.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: string.c 11889 2014-05-22 13:54:15Z msweet $"
  *
- *   String functions for CUPS.
+ * String functions for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   _cupsStrAlloc()      - Allocate/reference a string.
- *   _cupsStrFlush()      - Flush the string pool.
- *   _cupsStrFormatd()    - Format a floating-point number.
- *   _cupsStrFree()       - Free/dereference a string.
- *   _cupsStrRetain()     - Increment the reference count of a string.
- *   _cupsStrScand()      - Scan a string for a floating-point number.
- *   _cupsStrStatistics() - Return allocation statistics for string pool.
- *   _cups_strcpy()       - Copy a string allowing for overlapping strings.
- *   _cups_strdup()       - Duplicate a string.
- *   _cups_strcasecmp()   - Do a case-insensitive comparison.
- *   _cups_strncasecmp()  - Do a case-insensitive comparison on up to N chars.
- *   _cups_strlcat()      - Safely concatenate two strings.
- *   _cups_strlcpy()      - Safely copy two strings.
- *   compare_sp_items()   - Compare two string pool items...
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
  */
 
 #define _CUPS_STRING_C_
-#include "string-private.h"
-#include "debug-private.h"
-#include "thread-private.h"
-#include "array.h"
+#include "cups-private.h"
 #include <stddef.h>
 #include <limits.h>
 
@@ -69,6 +49,7 @@ static int    compare_sp_items(_cups_sp_item_t *a, _cups_sp_item_t *b);
 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 */
 
@@ -128,7 +109,8 @@ _cupsStrAlloc(const char *s)                /* I - String */
   * Not found, so allocate a new one...
   */
 
-  item = (_cups_sp_item_t *)calloc(1, sizeof(_cups_sp_item_t) + strlen(s));
+  slen = strlen(s);
+  item = (_cups_sp_item_t *)calloc(1, sizeof(_cups_sp_item_t) + slen);
   if (!item)
   {
     _cupsMutexUnlock(&sp_mutex);
@@ -137,7 +119,7 @@ _cupsStrAlloc(const char *s)                /* I - String */
   }
 
   item->ref_count = 1;
-  strcpy(item->str, s);
+  memcpy(item->str, s, slen + 1);
 
 #ifdef DEBUG_GUARDS
   item->guard = _CUPS_STR_GUARD;
@@ -160,6 +142,39 @@ _cupsStrAlloc(const char *s)               /* I - String */
 
 
 /*
+ * '_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    *dateval;               /* Local date/time */
+  char         temp[1024];             /* Temporary buffer */
+  _cups_globals_t *cg = _cupsGlobals();        /* Per-thread globals */
+
+
+  if (!cg->lang_default)
+    cg->lang_default = cupsLangDefault();
+
+  dateval = localtime(&timeval);
+
+  if (cg->lang_default->encoding != CUPS_UTF8)
+  {
+    strftime(temp, sizeof(temp), "%c", dateval);
+    cupsCharsetToUTF8((cups_utf8_t *)buf, temp, (int)bufsize, cg->lang_default->encoding);
+  }
+  else
+    strftime(buf, bufsize, "%c", dateval);
+
+  return (buf);
+}
+
+
+/*
  * '_cupsStrFlush()' - Flush the string pool.
  */
 
@@ -258,7 +273,7 @@ _cupsStrFormatd(char         *buf,  /* I - String */
   }
   else
   {
-    strlcpy(buf, temp, bufend - buf + 1);
+    strlcpy(buf, temp, (size_t)(bufend - buf + 1));
     bufptr = buf + strlen(buf);
   }
 
@@ -434,7 +449,7 @@ _cupsStrScand(const char   *buf,    /* I - Pointer to number */
 
     if (loc && loc->decimal_point)
     {
-      strlcpy(tempptr, loc->decimal_point, sizeof(temp) - (tempptr - temp));
+      strlcpy(tempptr, loc->decimal_point, sizeof(temp) - (size_t)(tempptr - temp));
       tempptr += strlen(tempptr);
     }
     else if (tempptr < (temp + sizeof(temp) - 1))
@@ -544,7 +559,7 @@ _cupsStrStatistics(size_t *alloc_bytes,     /* O - Allocated bytes */
     */
 
     count  += item->ref_count;
-    len    = (strlen(item->str) + 8) & ~7;
+    len    = (strlen(item->str) + 8) & (size_t)~7;
     abytes += sizeof(_cups_sp_item_t) + len;
     tbytes += item->ref_count * len;
   }
@@ -588,16 +603,18 @@ _cups_strcpy(char       *dst,             /* I - Destination string */
 char   *                               /* O - New string pointer */
 _cups_strdup(const char *s)            /* I - String to duplicate */
 {
-  char *t;                             /* New string pointer */
+  char         *t;                     /* New string pointer */
+  size_t       slen;                   /* Length of string */
 
 
-  if (s == NULL)
+  if (!s)
     return (NULL);
 
-  if ((t = malloc(strlen(s) + 1)) == NULL)
+  slen = strlen(s);
+  if ((t = malloc(slen + 1)) == NULL)
     return (NULL);
 
-  return (strcpy(t, s));
+  return (memcpy(t, s, slen + 1));
 }
 #endif /* !HAVE_STRDUP */
 
@@ -698,7 +715,7 @@ _cups_strlcat(char       *dst,              /* O - Destination string */
   if (srclen > size)
     srclen = size;
 
-  memcpy(dst + dstlen, src, srclen);
+  memmove(dst + dstlen, src, srclen);
   dst[dstlen + srclen] = '\0';
 
   return (dstlen + srclen);
@@ -734,7 +751,7 @@ _cups_strlcpy(char       *dst,              /* O - Destination string */
   if (srclen > size)
     srclen = size;
 
-  memcpy(dst, src, srclen);
+  memmove(dst, src, srclen);
   dst[srclen] = '\0';
 
   return (srclen);
@@ -755,5 +772,5 @@ compare_sp_items(_cups_sp_item_t *a,        /* I - First item */
 
 
 /*
- * End of "$Id: string.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: string.c 11889 2014-05-22 13:54:15Z msweet $".
  */
index e992f40..72eb963 100644 (file)
@@ -1,24 +1,18 @@
 /*
- * "$Id: tempfile.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: tempfile.c 12073 2014-07-31 00:58:00Z msweet $"
  *
- *   Temp file utilities for CUPS.
+ * Temp file utilities for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsTempFd()    - Creates a temporary file.
- *   cupsTempFile()  - Generates a temporary filename.
- *   cupsTempFile2() - Creates a temporary CUPS file.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -103,8 +97,7 @@ cupsTempFd(char *filename,           /* I - Pointer to buffer */
     * Format a string using the hex time values...
     */
 
-    snprintf(filename, len - 1, "%s/%05lx%08lx", tmpdir,
-             GetCurrentProcessId(), curtime);
+    snprintf(filename, (size_t)len - 1, "%s/%05lx%08lx", tmpdir, GetCurrentProcessId(), curtime);
 #else
    /*
     * Get the current time of day...
@@ -116,8 +109,7 @@ cupsTempFd(char *filename,          /* I - Pointer to buffer */
     * Format a string using the hex time values...
     */
 
-    snprintf(filename, len - 1, "%s/%05x%08x", tmpdir, (unsigned)getpid(),
-             (unsigned)(curtime.tv_sec + curtime.tv_usec + tries));
+    snprintf(filename, (size_t)len - 1, "%s/%05x%08x", tmpdir, (unsigned)getpid(), (unsigned)(curtime.tv_sec + curtime.tv_usec + tries));
 #endif /* WIN32 */
 
    /*
@@ -153,8 +145,8 @@ cupsTempFd(char *filename,          /* I - Pointer to buffer */
  * 'cupsTempFile()' - Generates a temporary filename.
  *
  * The temporary filename is returned in the filename buffer.
- * This function is deprecated - use @link cupsTempFd@ or
- * @link cupsTempFile2@ instead.
+ * This function is deprecated and will no longer generate a temporary
+ * filename - use @link cupsTempFd@ or @link cupsTempFile2@ instead.
  *
  * @deprecated@
  */
@@ -163,38 +155,12 @@ char *                                    /* O - Filename or @code NULL@ on error */
 cupsTempFile(char *filename,           /* I - Pointer to buffer */
              int  len)                 /* I - Size of buffer */
 {
-  int          fd;                     /* File descriptor for temp file */
-  _cups_globals_t *cg = _cupsGlobals();        /* Pointer to library globals */
-
-
- /*
-  * See if a filename was specified...
-  */
-
-  if (filename == NULL)
-  {
-    filename = cg->tempfile;
-    len      = sizeof(cg->tempfile);
-  }
-
- /*
-  * Create the temporary file...
-  */
-
-  if ((fd = cupsTempFd(filename, len)) < 0)
-    return (NULL);
+  (void)len;
 
- /*
-  * Close the temp file - it'll be reopened later as needed...
-  */
-
-  close(fd);
-
- /*
-  * Return the temp filename...
-  */
+  if (filename)
+    *filename = '\0';
 
-  return (filename);
+  return (NULL);
 }
 
 
@@ -229,5 +195,5 @@ cupsTempFile2(char *filename,               /* I - Pointer to buffer */
 
 
 /*
- * End of "$Id: tempfile.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: tempfile.c 12073 2014-07-31 00:58:00Z msweet $".
  */
index fc453a6..1f64fe5 100644 (file)
@@ -14,7 +14,7 @@
 *%
 *% Copyright 2007-2010 by Apple Inc.
 *% Copyright 2002-2006 by Easy Software Products.
-*% 
+*%
 *% These coded instructions, statements, and computer programs are the
 *% property of Apple Inc. and are protected by Federal copyright
 *% law.  Distribution and use rights are outlined in the file "LICENSE.txt"
@@ -22,7 +22,7 @@
 *% file is missing or damaged, see the license at "http://www.cups.org/".
 *FormatVersion:        "4.3"
 *FileVersion:  "1.3"
-*LanguageVersion: English 
+*LanguageVersion: English
 *LanguageEncoding: ISOLatin1
 *PCFileName:   "TEST.PPD"
 *Manufacturer: "ESP"
 *fr_CA.PageRegion A4/French Canadian A4: ""
 *fr_CA.PageRegion Env10/French Canadian #10 Envelope: ""
 
-*DefaultImageableArea: Letter 
+*DefaultImageableArea: Letter
 *ImageableArea Letter: "18 36 594 756"
 *ImageableArea Letter.Banner:  "18 0 594 792"
 *ImageableArea Letter.Fullbleed:       "0 0 612 792"
 *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
index fac7528..04b02f1 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: testadmin.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testadmin.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Admin function test program for CUPS.
  *
- *   Copyright 2007-2010 by Apple Inc.
+ *   Copyright 2007-2013 by Apple Inc.
  *   Copyright 2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -53,7 +53,8 @@ main(int  argc,                               /* I - Number of command-line args */
   * Connect to the server using the defaults...
   */
 
-  http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
+  http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC,
+                      cupsEncryption(), 1, 30000, NULL);
 
  /*
   * Set the current configuration if we have anything on the command-line...
@@ -116,5 +117,5 @@ show_settings(
 
 
 /*
- * End of "$Id: testadmin.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testadmin.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index a73da61..7003331 100644 (file)
@@ -1,24 +1,18 @@
 /*
- * "$Id: testarray.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testarray.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Array test program for CUPS.
+ * Array test program for CUPS.
  *
- *   Copyright 2007-2010 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()        - Main entry.
- *   get_seconds() - Get the current time in seconds...
- *   load_words()  - Load words from a file.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -27,7 +21,7 @@
 
 #include "string-private.h"
 #include "debug-private.h"
-#include "array.h"
+#include "array-private.h"
 #include "dir.h"
 
 
@@ -44,8 +38,7 @@ static int    load_words(const char *filename, cups_array_t *array);
  */
 
 int                                    /* O - Exit status */
-main(int  argc,                                /* I - Number of command-line arguments */
-     char *argv[])                     /* I - Command-line arguments */
+main(void)
 {
   int          i;                      /* Looping var */
   cups_array_t *array,                 /* Test array */
@@ -139,7 +132,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
  /*
   * cupsArrayCount()
   */
+
   fputs("cupsArrayCount: ", stdout);
   if (cupsArrayCount(array) == 4)
     puts("PASS");
@@ -296,7 +289,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
   {
     while ((dent = cupsDirRead(dir)) != NULL)
     {
-      i = strlen(dent->filename) - 2;
+      i = (int)strlen(dent->filename) - 2;
 
       if (i > 0 && dent->filename[i] == '.' &&
           (dent->filename[i + 1] == 'c' ||
@@ -319,7 +312,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
       * the same buffer in the first place... :)
       */
 
-      strcpy(word, text);
+      strlcpy(word, text, sizeof(word));
 
      /*
       * Grab the next word and compare...
@@ -405,6 +398,88 @@ main(int  argc,                            /* I - Number of command-line arguments */
   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...
   */
 
@@ -476,5 +551,5 @@ load_words(const char   *filename,  /* I - File to load */
 
 
 /*
- * End of "$Id: testarray.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testarray.c 11558 2014-02-06 18:33:34Z msweet $".
  */
diff --git a/cups/testcache.c b/cups/testcache.c
new file mode 100644 (file)
index 0000000..0051f81
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * "$Id: testcache.c 11832 2014-04-24 15:04:00Z msweet $"
+ *
+ * PPD cache testing program for CUPS.
+ *
+ * Copyright 2009-2014 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * 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(pc, num_options, options, (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);
+}
+
+
+/*
+ * End of "$Id: testcache.c 11832 2014-04-24 15:04:00Z msweet $".
+ */
index 9b21356..0ccca82 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: testconflicts.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testconflicts.c 3755 2012-03-30 05:59:14Z msweet $"
  *
  *   PPD constraint test program for CUPS.
  *
@@ -134,5 +134,5 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: testconflicts.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testconflicts.c 3755 2012-03-30 05:59:14Z msweet $".
  */
index e151f4a..690d937 100644 (file)
@@ -1,29 +1,25 @@
 /*
- * "$Id: testcups.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testcups.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   CUPS API test program for CUPS.
+ * CUPS API test program for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()        - Main entry.
- *   dests_equal() - Determine whether two destinations are equal.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
  * Include necessary headers...
  */
 
+#undef _CUPS_NO_DEPRECATED
 #include "string-private.h"
 #include "cups.h"
 #include "ppd.h"
@@ -170,10 +166,27 @@ main(int  argc,                           /* I - Number of command-line arguments */
       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 printer file interval
+      * ./testcups print printer file interval
       */
 
       int              interval,       /* Interval between writes */
@@ -199,7 +212,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
       interval = atoi(argv[4]);
 
       if (cupsStartDocument(CUPS_HTTP_DEFAULT, argv[1], job_id, argv[2],
-                           CUPS_FORMAT_AUTO, 1) != HTTP_CONTINUE)
+                           CUPS_FORMAT_AUTO, 1) != HTTP_STATUS_CONTINUE)
       {
        puts("Unable to start document!");
        return (1);
@@ -209,20 +222,20 @@ main(int  argc,                           /* I - Number of command-line arguments */
       {
        printf("Writing %d bytes...\n", (int)bytes);
 
-       if (cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer,
-                                bytes) != HTTP_CONTINUE)
+       if (cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, (size_t)bytes) != HTTP_STATUS_CONTINUE)
        {
          puts("Unable to write bytes!");
          return (1);
        }
 
         if (interval > 0)
-         sleep(interval);
+         sleep((unsigned)interval);
       }
 
       cupsFileClose(fp);
 
-      if (cupsFinishDocument(CUPS_HTTP_DEFAULT, argv[1]) > IPP_OK_SUBST)
+      if (cupsFinishDocument(CUPS_HTTP_DEFAULT,
+                             argv[1]) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
       {
        puts("Unable to finish document!");
        return (1);
@@ -244,6 +257,10 @@ main(int  argc,                            /* I - Number of command-line arguments */
       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");
@@ -509,6 +526,8 @@ enum_cb(void        *user_data,             /* I - User data (unused) */
   cups_option_t        *option;                /* Current option */
 
 
+  (void)user_data;
+
   if (flags & CUPS_DEST_FLAGS_REMOVED)
     printf("Removed '%s':\n", dest->name);
   else
@@ -566,5 +585,5 @@ show_diffs(cups_dest_t *a,          /* I - First destination */
 
 
 /*
- * End of "$Id: testcups.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testcups.c 11558 2014-02-06 18:33:34Z msweet $".
  */
diff --git a/cups/testdest.c b/cups/testdest.c
new file mode 100644 (file)
index 0000000..c760719
--- /dev/null
@@ -0,0 +1,460 @@
+/*
+ * "$Id: testdest.c 11884 2014-05-16 21:54:22Z msweet $"
+ *
+ * CUPS destination API test program for CUPS.
+ *
+ * Copyright 2014 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <stdio.h>
+#include "cups.h"
+
+
+/*
+ * Local functions...
+ */
+
+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) __attribute__((noreturn));
+
+
+/*
+ * '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;                  /* Connection to destination */
+  cups_dest_t  *dest = NULL;           /* Destination */
+  cups_dinfo_t *dinfo;                 /* Destination info */
+
+
+  if (argc < 2)
+    usage(NULL);
+
+  if (!strcmp(argv[1], "--enum"))
+  {
+    return (0);
+  }
+  else if (!strncmp(argv[1], "ipp://", 6) || !strncmp(argv[1], "ipps://", 7))
+    dest = cupsGetDestWithURI(NULL, argv[1]);
+  else
+    dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, argv[1], NULL);
+
+  if (!dest)
+  {
+    printf("testdest: Unable to get destination \"%s\": %s\n", argv[1], cupsLastErrorString());
+    return (1);
+  }
+
+  if ((http = cupsConnectDest(dest, CUPS_DEST_FLAGS_NONE, 30000, NULL, NULL, 0, NULL, NULL)) == NULL)
+  {
+    printf("testdest: Unable to connect to destination \"%s\": %s\n", argv[1], cupsLastErrorString());
+    return (1);
+  }
+
+  if ((dinfo = cupsCopyDestInfo(http, dest)) == NULL)
+  {
+    printf("testdest: Unable to get information for destination \"%s\": %s\n", argv[1], cupsLastErrorString());
+    return (1);
+  }
+
+  if (argc == 2 || (!strcmp(argv[2], "supported") && argc < 6))
+  {
+    if (argc > 3)
+      show_supported(http, dest, dinfo, argv[3], argv[4]);
+    else if (argc > 2)
+      show_supported(http, dest, dinfo, argv[3], NULL);
+    else
+      show_supported(http, dest, dinfo, NULL, NULL);
+  }
+  else if (!strcmp(argv[2], "conflicts") && argc > 3)
+  {
+    int                        i,              /* Looping var */
+                       num_options = 0;/* Number of options */
+    cups_option_t      *options = NULL;/* Options */
+
+    for (i = 3; i < argc; i ++)
+      num_options = cupsParseOptions(argv[i], num_options, &options);
+
+    show_conflicts(http, dest, dinfo, num_options, options);
+  }
+  else if (!strcmp(argv[2], "default") && argc == 4)
+  {
+    show_default(http, dest, dinfo, argv[3]);
+  }
+  else if (!strcmp(argv[2], "localize") && argc > 3 && argc < 6)
+  {
+    localize(http, dest, dinfo, argv[3], argv[4]);
+  }
+  else if (!strcmp(argv[2], "media"))
+  {
+    int                i;                      /* Looping var */
+    const char *name = NULL;           /* Media name, if any */
+    unsigned   flags = CUPS_MEDIA_FLAGS_DEFAULT;
+                                       /* Media selection flags */
+
+    for (i = 3; 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[2], "print") && argc > 3)
+  {
+    int                        i,              /* Looping var */
+                       num_options = 0;/* Number of options */
+    cups_option_t      *options = NULL;/* Options */
+
+    for (i = 4; i < argc; i ++)
+      num_options = cupsParseOptions(argv[i], num_options, &options);
+
+    print_file(http, dest, dinfo, argv[3], num_options, options);
+  }
+  else
+    usage(argv[2]);
+
+  return (0);
+}
+
+
+/*
+ * '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 */
+{
+  (void)http;
+  (void)dest;
+  (void)dinfo;
+  (void)option;
+  (void)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 */
+{
+  (void)http;
+  (void)dest;
+  (void)dinfo;
+  (void)filename;
+  (void)num_options;
+  (void)options;
+}
+
+
+/*
+ * '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 */
+{
+  (void)http;
+  (void)dest;
+  (void)dinfo;
+  (void)option;
+}
+
+
+/*
+ * '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)
+  {
+    puts(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_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\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 name [operation ...]");
+  puts("  ./testdest ipp://... [operation ...]");
+  puts("  ./testdest ipps://... [operation ...]");
+  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);
+}
+
+
+/*
+ * End of "$Id: testdest.c 11884 2014-05-16 21:54:22Z msweet $".
+ */
index 207e410..61db080 100644 (file)
@@ -1,25 +1,18 @@
 /*
- * "$Id: testfile.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testfile.c 12577 2015-03-30 19:07:17Z msweet $"
  *
- *   File test program for CUPS.
+ * File test program for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()             - Main entry.
- *   count_lines()      - Count the number of lines in a file.
- *   random_tests()     - Do random access tests.
- *   read_write_tests() - Perform read/write tests.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -212,14 +205,14 @@ main(int  argc,                           /* I - Number of command-line arguments */
     * Cat the filename on the command-line...
     */
 
-    char       line[1024];             /* Line from file */
+    char       line[8192];             /* Line from file */
 
     if ((fp = cupsFileOpen(argv[1], "r")) == NULL)
     {
       perror(argv[1]);
       status = 1;
     }
-    else
+    else if (argc == 2)
     {
       status = 0;
 
@@ -231,6 +224,21 @@ main(int  argc,                            /* I - Number of command-line arguments */
 
       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);
@@ -266,8 +274,8 @@ random_tests(void)
                count,                  /* Number of records read */
                record,                 /* Current record */
                num_records;            /* Number of records */
-  ssize_t      pos,                    /* Position in file */
-               expected;               /* Expected position in file */
+  off_t                pos;                    /* Position in file */
+  ssize_t      expected;               /* Expected position in file */
   cups_file_t  *fp;                    /* File */
   char         buffer[512];            /* Data buffer */
 
@@ -298,10 +306,10 @@ random_tests(void)
     * cupsFileTell()
     */
 
-    expected = 256 * sizeof(buffer) * pass;
+    expected = 256 * (ssize_t)sizeof(buffer) * pass;
 
     fputs("cupsFileTell(): ", stdout);
-    if ((pos = cupsFileTell(fp)) != expected)
+    if ((pos = cupsFileTell(fp)) != (off_t)expected)
     {
       printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n",
             CUPS_LLCAST pos, CUPS_LLCAST expected);
@@ -319,7 +327,7 @@ random_tests(void)
     for (record = 0; record < 256; record ++)
     {
       memset(buffer, record, sizeof(buffer));
-      if (cupsFileWrite(fp, buffer, sizeof(buffer)) < sizeof(buffer))
+      if (cupsFileWrite(fp, buffer, sizeof(buffer)) < (ssize_t)sizeof(buffer))
         break;
     }
 
@@ -336,10 +344,10 @@ random_tests(void)
     * cupsFileTell()
     */
 
-    expected += 256 * sizeof(buffer);
+    expected += 256 * (ssize_t)sizeof(buffer);
 
     fputs("cupsFileTell(): ", stdout);
-    if ((pos = cupsFileTell(fp)) != expected)
+    if ((pos = cupsFileTell(fp)) != (off_t)expected)
     {
       printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n",
              CUPS_LLCAST pos, CUPS_LLCAST expected);
@@ -372,11 +380,9 @@ random_tests(void)
 
     fputs("cupsFileSeek(), cupsFileRead(): ", stdout);
 
-    for (num_records = (pass + 1) * 256, count = (pass + 1) * 256,
-             record = CUPS_RAND() % num_records;
+    for (num_records = (pass + 1) * 256, count = (pass + 1) * 256, record = ((int)CUPS_RAND() & 65535) % num_records;
          count > 0;
-        count --, record = (record + (CUPS_RAND() & 31) - 16 + num_records) %
-                           num_records)
+        count --, record = (record + ((int)CUPS_RAND() & 31) - 16 + num_records) % num_records)
     {
      /*
       * The last record is always the first...
@@ -390,7 +396,7 @@ random_tests(void)
       * contents...
       */
 
-      expected = sizeof(buffer) * record;
+      expected = (ssize_t)sizeof(buffer) * record;
 
       if ((pos = cupsFileSeek(fp, expected)) != expected)
       {
@@ -454,6 +460,7 @@ read_write_tests(int compression)   /* I - Use compression? */
   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 */
@@ -472,7 +479,7 @@ read_write_tests(int compression)   /* I - Use compression? */
   CUPS_SRAND((unsigned)time(NULL));
 
   for (i = 0; i < (int)sizeof(writebuf); i ++)
-    writebuf[i] = CUPS_RAND();
+    writebuf[i] = (unsigned char)CUPS_RAND();
 
  /*
   * cupsFileOpen(write)
@@ -673,7 +680,7 @@ read_write_tests(int compression)   /* I - Use compression? */
 
     fputs("cupsFileGetConf(): ", stdout);
 
-    for (i = 0; i < 1000; i ++)
+    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 ||
@@ -700,7 +707,7 @@ read_write_tests(int compression)   /* I - Use compression? */
 
     fputs("cupsFileGetChar(): ", stdout);
 
-    for (i = 0; i < 256; i ++)
+    for (i = 0, byte = 0; i < 256; i ++)
       if ((byte = cupsFileGetChar(fp)) != i)
         break;
 
@@ -723,15 +730,15 @@ read_write_tests(int compression) /* I - Use compression? */
 
     fputs("cupsFileRead(): ", stdout);
 
-    for (i = 0; i < 10000; i ++)
-      if ((byte = cupsFileRead(fp, (char *)readbuf, sizeof(readbuf))) < 0)
+    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 (byte > 0)
+    else if (bytes > 0)
     {
       printf("FAIL (Pass %d, ", i);
 
@@ -806,7 +813,8 @@ read_write_tests(int compression)   /* I - Use compression? */
   * Remove the test file...
   */
 
-  unlink(compression ? "testfile.dat.gz" : "testfile.dat");
+  if (!status)
+    unlink(compression ? "testfile.dat.gz" : "testfile.dat");
 
  /*
   * Return the test status...
@@ -817,5 +825,5 @@ read_write_tests(int compression)   /* I - Use compression? */
 
 
 /*
- * End of "$Id: testfile.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testfile.c 12577 2015-03-30 19:07:17Z msweet $".
  */
index c93a28a..cb5345f 100644 (file)
@@ -1,30 +1,25 @@
 /*
- * "$Id: testhttp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testhttp.c 12678 2015-05-28 19:09:48Z msweet $"
  *
- *   HTTP test program for CUPS.
+ * HTTP test program for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main() - Main entry.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
  * Include necessary headers...
  */
 
-#include "string-private.h"
-#include "http-private.h"
+#include "cups-private.h"
 
 
 /*
@@ -41,6 +36,7 @@ typedef struct uri_test_s             /**** URI test cases ****/
                        *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;
 
 
@@ -51,98 +47,147 @@ typedef struct uri_test_s          /**** URI test cases ****/
 static uri_test_t      uri_tests[] =   /* URI test data */
                        {
                          /* Start with valid URIs */
-                         { HTTP_URI_OK, "file:/filename",
-                           "file", "", "", "/filename", 0, 0 },
-                         { HTTP_URI_OK, "file:/filename%20with%20spaces",
-                           "file", "", "", "/filename with spaces", 0, 0 },
-                         { HTTP_URI_OK, "file:///filename",
-                           "file", "", "", "/filename", 0, 0 },
-                         { HTTP_URI_OK, "file:///filename%20with%20spaces",
-                           "file", "", "", "/filename with spaces", 0, 0 },
-                         { HTTP_URI_OK, "file://localhost/filename",
-                           "file", "", "localhost", "/filename", 0, 0 },
-                         { HTTP_URI_OK, "file://localhost/filename%20with%20spaces",
-                           "file", "", "localhost", "/filename with spaces", 0, 0 },
-                         { HTTP_URI_OK, "http://server/",
-                           "http", "", "server", "/", 80, 0 },
-                         { HTTP_URI_OK, "http://username@server/",
-                           "http", "username", "server", "/", 80, 0 },
-                         { HTTP_URI_OK, "http://username:passwor%64@server/",
-                           "http", "username:password", "server", "/", 80, 0 },
-                         { HTTP_URI_OK, "http://username:passwor%64@server:8080/",
-                           "http", "username:password", "server", "/", 8080, 8080 },
-                         { HTTP_URI_OK, "http://username:passwor%64@server:8080/directory/filename",
-                           "http", "username:password", "server", "/directory/filename", 8080, 8080 },
-                         { HTTP_URI_OK, "http://[2000::10:100]:631/ipp",
-                           "http", "", "2000::10:100", "/ipp", 631, 631 },
-                         { HTTP_URI_OK, "https://username:passwor%64@server/directory/filename",
-                           "https", "username:password", "server", "/directory/filename", 443, 0 },
-                         { HTTP_URI_OK, "ipp://username:passwor%64@[::1]/ipp",
-                           "ipp", "username:password", "::1", "/ipp", 631, 0 },
-                         { HTTP_URI_OK, "lpd://server/queue?reserve=yes",
-                           "lpd", "", "server", "/queue?reserve=yes", 515, 0 },
-                         { HTTP_URI_OK, "mailto:user@domain.com",
-                           "mailto", "", "", "user@domain.com", 0, 0 },
-                         { HTTP_URI_OK, "socket://server/",
-                           "socket", "", "server", "/", 9100, 0 },
-                         { HTTP_URI_OK, "socket://192.168.1.1:9101/",
-                           "socket", "", "192.168.1.1", "/", 9101, 9101 },
-                         { HTTP_URI_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_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_OK, "lpd://Acme%20Laser%20(01%3A23%3A45).local._tcp._printer/",
-                           "lpd", "", "Acme Laser (01:23:45).local._tcp._printer", "/", 515, 0 },
-                         { HTTP_URI_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_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  },
 
                          /* Missing scheme */
-                         { HTTP_URI_MISSING_SCHEME, "/path/to/file/index.html",
-                           "file", "", "", "/path/to/file/index.html", 0, 0 },
-                         { HTTP_URI_MISSING_SCHEME, "//server/ipp",
-                           "ipp", "", "server", "/ipp", 631, 0 },
+                         { 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_UNKNOWN_SCHEME, "vendor://server/resource",
-                           "vendor", "", "server", "/resource", 0, 0 },
+                         { HTTP_URI_STATUS_UNKNOWN_SCHEME, "vendor://server/resource",
+                           "vendor", "", "server", "/resource", 0, 0,
+                           HTTP_URI_CODING_MOST  },
 
                          /* Missing resource */
-                         { HTTP_URI_MISSING_RESOURCE, "socket://[::192.168.2.1]",
-                           "socket", "", "::192.168.2.1", "/", 9100, 0 },
-                         { HTTP_URI_MISSING_RESOURCE, "socket://192.168.1.1:9101",
-                           "socket", "", "192.168.1.1", "/", 9101 },
+                         { 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_BAD_URI, "",
-                           "", "", "", "", 0, 0 },
+                         { HTTP_URI_STATUS_BAD_URI, "",
+                           "", "", "", "", 0, 0,
+                           HTTP_URI_CODING_MOST  },
 
                          /* Bad scheme */
-                         { HTTP_URI_BAD_SCHEME, "bad_scheme://server/resource",
-                           "", "", "", "", 0, 0 },
+                         { HTTP_URI_STATUS_BAD_SCHEME, "bad_scheme://server/resource",
+                           "", "", "", "", 0, 0,
+                           HTTP_URI_CODING_MOST  },
 
                          /* Bad username */
-                         { HTTP_URI_BAD_USERNAME, "http://username:passwor%6@server/resource",
-                           "http", "", "", "", 80, 0 },
+                         { HTTP_URI_STATUS_BAD_USERNAME, "http://username:passwor%6@server/resource",
+                           "http", "", "", "", 80, 0,
+                           HTTP_URI_CODING_MOST  },
 
                          /* Bad hostname */
-                         { HTTP_URI_BAD_HOSTNAME, "http://[/::1]/index.html",
-                           "http", "", "", "", 80, 0 },
-                         { HTTP_URI_BAD_HOSTNAME, "http://[",
-                           "http", "", "", "", 80, 0 },
-                         { HTTP_URI_BAD_HOSTNAME, "http://serve%7/index.html",
-                           "http", "", "", "", 80, 0 },
-                         { HTTP_URI_BAD_HOSTNAME, "http://server with spaces/index.html",
-                           "http", "", "", "", 80, 0 },
+                         { 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_BAD_PORT, "http://127.0.0.1:9999a/index.html",
-                           "http", "", "127.0.0.1", "", 0, 0 },
+                         { 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_BAD_RESOURCE, "http://server/index.html%",
-                           "http", "", "server", "", 80, 0 },
-                         { HTTP_URI_BAD_RESOURCE, "http://server/index with spaces.html",
-                           "http", "", "server", "", 80, 0 }
+                         { 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] =
                        {
@@ -190,20 +235,21 @@ main(int  argc,                           /* I - Number of command-line arguments */
                *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_OVERFLOW",
-                 "HTTP_URI_BAD_ARGUMENTS",
-                 "HTTP_URI_BAD_RESOURCE",
-                 "HTTP_URI_BAD_PORT",
-                 "HTTP_URI_BAD_HOSTNAME",
-                 "HTTP_URI_BAD_USERNAME",
-                 "HTTP_URI_BAD_SCHEME",
-                 "HTTP_URI_BAD_URI",
-                 "HTTP_URI_OK",
-                 "HTTP_URI_MISSING_SCHEME",
-                 "HTTP_URI_UNKNOWN_SCHEME",
-                 "HTTP_URI_MISSING_RESOURCE"
+                 "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"
                };
 
 
@@ -222,7 +268,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
     fputs("httpGetDateString()/httpGetDateTime(): ", stdout);
 
     start = time(NULL);
-    strcpy(buffer, httpGetDateString(start));
+    strlcpy(buffer, httpGetDateString(start), sizeof(buffer));
     current = httpGetDateTime(buffer);
 
     i = (int)(current - start);
@@ -406,12 +452,12 @@ main(int  argc,                           /* I - Number of command-line arguments */
     for (i = 0, j = 0, k = 0;
          i < (int)(sizeof(uri_tests) / sizeof(uri_tests[0]));
         i ++)
-      if (uri_tests[i].result == HTTP_URI_OK &&
+      if (uri_tests[i].result == HTTP_URI_STATUS_OK &&
           !strstr(uri_tests[i].uri, "%64") &&
           strstr(uri_tests[i].uri, "//"))
       {
         k ++;
-       uri_status = httpAssembleURI(HTTP_URI_CODING_MOST,
+       uri_status = httpAssembleURI(uri_tests[i].assemble_coding,
                                     buffer, sizeof(buffer),
                                     uri_tests[i].scheme,
                                     uri_tests[i].username,
@@ -419,7 +465,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
                                     uri_tests[i].assemble_port,
                                     uri_tests[i].resource);
 
-        if (uri_status != HTTP_URI_OK)
+        if (uri_status != HTTP_URI_STATUS_OK)
        {
           failures ++;
 
@@ -451,6 +497,21 @@ main(int  argc,                            /* I - Number of command-line arguments */
       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...
     */
 
@@ -548,23 +609,246 @@ main(int  argc,                          /* I - Number of command-line arguments */
 
     if (!_cups_strcasecmp(scheme, "https") || !_cups_strcasecmp(scheme, "ipps") ||
         port == 443)
-      encryption = HTTP_ENCRYPT_ALWAYS;
+      encryption = HTTP_ENCRYPTION_ALWAYS;
     else
-      encryption = HTTP_ENCRYPT_IF_REQUESTED;
+      encryption = HTTP_ENCRYPTION_IF_REQUESTED;
 
-    http = httpConnectEncrypt(hostname, port, encryption);
+    http = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption, 1, 30000, NULL);
     if (http == NULL)
     {
       perror(hostname);
       continue;
     }
-    printf("Requesting file \"%s\"...\n", resource);
-    httpClearFields(http);
-    httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en");
-    httpGet(http, resource);
-    while ((status = httpUpdate(http)) == HTTP_CONTINUE);
 
-    if (status == HTTP_OK)
+    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);
+
+    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_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);
+
+      if (status == HTTP_STATUS_UNAUTHORIZED)
+      {
+       /*
+       * Flush any error message...
+       */
+
+       httpFlush(http);
+
+       /*
+       * See if we can do authentication...
+       */
+
+       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("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");
+
+    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_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);
+
+      if (status == HTTP_STATUS_UNAUTHORIZED)
+      {
+       /*
+       * Flush any error message...
+       */
+
+       httpFlush(http);
+
+       /*
+       * See if we can do authentication...
+       */
+
+       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);
@@ -576,11 +860,13 @@ main(int  argc,                           /* I - Number of command-line arguments */
     while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
     {
       total += bytes;
-      fwrite(buffer, bytes, 1, out);
+      fwrite(buffer, (size_t)bytes, 1, out);
       if (out != stdout)
       {
         current = time(NULL);
-        if (current == start) current ++;
+        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)));
@@ -589,6 +875,9 @@ main(int  argc,                             /* I - Number of command-line arguments */
     }
   }
 
+  if (out != stdout)
+    putchar('\n');
+
   puts("Closing connection to server...");
   httpClose(http);
 
@@ -600,5 +889,5 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: testhttp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testhttp.c 12678 2015-05-28 19:09:48Z msweet $".
  */
index 0fa0bcc..490c938 100644 (file)
@@ -1,23 +1,18 @@
 /*
- * "$Id: testi18n.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testi18n.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Internationalization test for CUPS.
+ * Internationalization test for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()       - Main entry for internationalization test module.
- *   print_utf8() - Print UTF-8 string with (optional) message.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -282,17 +277,17 @@ main(int  argc,                           /* I - Argument Count */
 
   fputs("cupsCharsetToUTF8(CUPS_ISO8859_1): ", stdout);
 
-  strcpy(legsrc, legdest);
+  strlcpy(legsrc, legdest, sizeof(legsrc));
 
   len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_1);
-  if (len != strlen((char *)utf8latin))
+  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, len))
+  else if (memcmp(utf8latin, utf8dest, (size_t)len))
   {
     puts("FAIL (results do not match)");
     print_utf8("    utf8latin", utf8latin);
@@ -333,17 +328,17 @@ main(int  argc,                           /* I - Argument Count */
 
   fputs("cupsCharsetToUTF8(CUPS_ISO8859_7): ", stdout);
 
-  strcpy(legsrc, legdest);
+  strlcpy(legsrc, legdest, sizeof(legsrc));
 
   len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_7);
-  if (len != strlen((char *)utf8greek))
+  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, len))
+  else if (memcmp(utf8greek, utf8dest, (size_t)len))
   {
     puts("FAIL (results do not match)");
     print_utf8("    utf8greek", utf8greek);
@@ -379,17 +374,17 @@ main(int  argc,                           /* I - Argument Count */
 
   fputs("cupsCharsetToUTF8(CUPS_WINDOWS_932): ", stdout);
 
-  strcpy(legsrc, legdest);
+  strlcpy(legsrc, legdest, sizeof(legsrc));
 
   len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_932);
-  if (len != strlen((char *)utf8japan))
+  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, len))
+  else if (memcmp(utf8japan, utf8dest, (size_t)len))
   {
     puts("FAIL (results do not match)");
     print_utf8("    utf8japan", utf8japan);
@@ -426,17 +421,17 @@ main(int  argc,                           /* I - Argument Count */
 #ifndef __linux
   fputs("cupsCharsetToUTF8(CUPS_EUC_JP): ", stdout);
 
-  strcpy(legsrc, legdest);
+  strlcpy(legsrc, legdest, sizeof(legsrc));
 
   len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_JP);
-  if (len != strlen((char *)utf8japan))
+  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, len))
+  else if (memcmp(utf8japan, utf8dest, (size_t)len))
   {
     puts("FAIL (results do not match)");
     print_utf8("    utf8japan", utf8japan);
@@ -473,17 +468,17 @@ main(int  argc,                           /* I - Argument Count */
 
   fputs("cupsCharsetToUTF8(CUPS_WINDOWS_950): ", stdout);
 
-  strcpy(legsrc, legdest);
+  strlcpy(legsrc, legdest, sizeof(legsrc));
 
   len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_950);
-  if (len != strlen((char *)utf8taiwan))
+  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, len))
+  else if (memcmp(utf8taiwan, utf8dest, (size_t)len))
   {
     puts("FAIL (results do not match)");
     print_utf8("    utf8taiwan", utf8taiwan);
@@ -519,17 +514,17 @@ main(int  argc,                           /* I - Argument Count */
 
   fputs("cupsCharsetToUTF8(CUPS_EUC_TW): ", stdout);
 
-  strcpy(legsrc, legdest);
+  strlcpy(legsrc, legdest, sizeof(legsrc));
 
   len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_TW);
-  if (len != strlen((char *)utf8taiwan))
+  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, len))
+  else if (memcmp(utf8taiwan, utf8dest, (size_t)len))
   {
     puts("FAIL (results do not match)");
     print_utf8("    utf8taiwan", utf8taiwan);
@@ -553,7 +548,7 @@ main(int  argc,                             /* I - Argument Count */
     print_utf8(" utf8good ", utf8good);
     print_utf32(" utf32dest", utf32dest);
   }
-  memcpy (utf32src, utf32dest, (len + 1) * sizeof(cups_utf32_t));
+  memcpy(utf32src, utf32dest, (len + 1) * sizeof(cups_utf32_t));
   len = cupsUTF32ToUTF8(utf8dest, utf32src, 1024);
   if (len < 0)
     return (1);
@@ -615,5 +610,5 @@ print_utf8(const char            *msg,      /* I - Message String */
 
 
 /*
- * End of "$Id: testi18n.c 11173 2013-07-23 12:31:34Z msweet $"
+ * End of "$Id: testi18n.c 11558 2014-02-06 18:33:34Z msweet $"
  */
index d9d7bee..96a431b 100644 (file)
@@ -1,26 +1,18 @@
 /*
- * "$Id: testipp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testipp.c 11889 2014-05-22 13:54:15Z msweet $"
  *
- *   IPP test program for CUPS.
+ * IPP test program for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()             - Main entry.
- *   hex_dump()         - Produce a hex dump of a buffer.
- *   print_attributes() - Print the attributes in a request...
- *   read_cb()          - Read data from a buffer.
- *   write_cb()         - Write data into a buffer.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -55,7 +47,7 @@ typedef struct _ippdata_t
  * Local globals...
  */
 
-ipp_uchar_t    collection[] =          /* Collection buffer */
+static ipp_uchar_t collection[] =      /* Collection buffer */
                {
                  0x01, 0x01,           /* IPP version */
                  0x00, 0x02,           /* Print-Job operation */
@@ -205,7 +197,7 @@ ipp_uchar_t collection[] =          /* Collection buffer */
                  IPP_TAG_END           /* end tag */
                };
 
-ipp_uchar_t    mixed[] =               /* Mixed value buffer */
+static ipp_uchar_t mixed[] =           /* Mixed value buffer */
                {
                  0x01, 0x01,           /* IPP version */
                  0x00, 0x02,           /* Print-Job operation */
@@ -236,7 +228,7 @@ ipp_uchar_t mixed[] =               /* Mixed value buffer */
  * Local functions...
  */
 
-void   hex_dump(const char *title, ipp_uchar_t *buffer, int bytes);
+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        write_cb(_ippdata_t *data, ipp_uchar_t *buffer, size_t bytes);
@@ -259,10 +251,13 @@ main(int  argc,                   /* I - Number of command-line arguments */
                *media_size,    /* media-size attribute */
                *attr;          /* Other attribute */
   ipp_state_t  state;          /* State */
-  int          length;         /* Length of data */
+  size_t       length;         /* Length of data */
   cups_file_t  *fp;            /* File pointer */
-  int          i;              /* Looping var */
+  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;
@@ -278,7 +273,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
     request = ippNew();
     request->request.op.version[0]   = 0x01;
     request->request.op.version[1]   = 0x01;
-    request->request.op.operation_id = IPP_PRINT_JOB;
+    request->request.op.operation_id = IPP_OP_PRINT_JOB;
     request->request.op.request_id   = 1;
 
     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
@@ -319,7 +314,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
     if (length != sizeof(collection))
     {
       printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n",
-             length, (int)sizeof(collection));
+             (int)length, (int)sizeof(collection));
       status = 1;
     }
     else
@@ -336,11 +331,11 @@ main(int  argc,                   /* I - Number of command-line arguments */
     data.wbuffer = buffer;
 
     while ((state = ippWriteIO(&data, (ipp_iocb_t)write_cb, 1, NULL,
-                               request)) != IPP_DATA)
-      if (state == IPP_ERROR)
+                               request)) != IPP_STATE_DATA)
+      if (state == IPP_STATE_ERROR)
        break;
 
-    if (state != IPP_DATA)
+    if (state != IPP_STATE_DATA)
     {
       printf("FAIL - %d bytes written.\n", (int)data.wused);
       status = 1;
@@ -359,7 +354,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
         if (data.wbuffer[i] != collection[i])
          break;
 
-      printf("FAIL - output does not match baseline at 0x%04x!\n", i);
+      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;
@@ -379,13 +374,13 @@ main(int  argc,                   /* I - Number of command-line arguments */
     data.rpos = 0;
 
     while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL,
-                              request)) != IPP_DATA)
-      if (state == IPP_ERROR)
+                              request)) != IPP_STATE_DATA)
+      if (state == IPP_STATE_ERROR)
        break;
 
     length = ippLength(request);
 
-    if (state != IPP_DATA)
+    if (state != IPP_STATE_DATA)
     {
       printf("FAIL - %d bytes read.\n", (int)data.rpos);
       status = 1;
@@ -400,7 +395,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
     else if (length != sizeof(collection))
     {
       printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n",
-             length, (int)sizeof(collection));
+             (int)length, (int)sizeof(collection));
       print_attributes(request, 8);
       status = 1;
     }
@@ -547,6 +542,53 @@ main(int  argc,                    /* I - Number of command-line arguments */
       }
     }
 
+   /*
+    * 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);
 
    /*
@@ -563,13 +605,13 @@ main(int  argc,                   /* I - Number of command-line arguments */
     data.wbuffer = mixed;
 
     while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL,
-                              request)) != IPP_DATA)
-      if (state == IPP_ERROR)
+                              request)) != IPP_STATE_DATA)
+      if (state == IPP_STATE_ERROR)
        break;
 
     length = ippLength(request);
 
-    if (state != IPP_DATA)
+    if (state != IPP_STATE_DATA)
     {
       printf("FAIL - %d bytes read.\n", (int)data.rpos);
       status = 1;
@@ -584,7 +626,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
     else if (length != (sizeof(mixed) + 4))
     {
       printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n",
-             length, (int)sizeof(mixed) + 4);
+             (int)length, (int)sizeof(mixed) + 4);
       print_attributes(request, 8);
       status = 1;
     }
@@ -625,11 +667,26 @@ main(int  argc,                   /* I - Number of command-line arguments */
 
     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);
+    fputs("_ippFindOption(\"printer-type\"): ", stdout);
     if (_ippFindOption("printer-type"))
       puts("PASS");
     else
@@ -655,7 +712,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
     * Read IPP files...
     */
 
-    for (i = 1; i < argc; i ++)
+    for (i = 1; i < (size_t)argc; i ++)
     {
       if ((fp = cupsFileOpen(argv[i], "r")) == NULL)
       {
@@ -666,9 +723,9 @@ main(int  argc,                     /* I - Number of command-line arguments */
 
       request = ippNew();
       while ((state = ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL,
-                                request)) == IPP_ATTRIBUTE);
+                                request)) == IPP_STATE_ATTRIBUTE);
 
-      if (state != IPP_DATA)
+      if (state != IPP_STATE_DATA)
       {
        printf("Error reading IPP message from \"%s\"!\n", argv[i]);
        status = 1;
@@ -695,10 +752,10 @@ main(int  argc,                   /* I - Number of command-line arguments */
 void
 hex_dump(const char  *title,           /* I - Title */
          ipp_uchar_t *buffer,          /* I - Buffer to dump */
-         int         bytes)            /* I - Number of bytes */
+         size_t      bytes)            /* I - Number of bytes */
 {
-  int  i, j;                           /* Looping vars */
-  int  ch;                             /* Current ASCII char */
+  size_t       i, j;                   /* Looping vars */
+  int          ch;                     /* Current ASCII char */
 
 
  /*
@@ -713,7 +770,7 @@ hex_dump(const char  *title,                /* I - Title */
     * Show the offset...
     */
 
-    printf("    %04x ", i);
+    printf("    %04x ", (unsigned)i);
 
    /*
     * Then up to 16 bytes in hex...
@@ -883,17 +940,10 @@ print_attributes(ipp_t *ipp,              /* I - IPP request */
 
       case IPP_TAG_DATE :
           {
-           time_t      vtime;          /* Date/Time value */
-           struct tm   *vdate;         /* Date info */
            char        vstring[256];   /* Formatted time */
 
            for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++)
-           {
-             vtime = ippDateToTime(val->date);
-             vdate = localtime(&vtime);
-             strftime(vstring, sizeof(vstring), "%c", vdate);
-             printf(" (%s)", vstring);
-           }
+             printf(" (%s)", _cupsStrDate(vstring, sizeof(vstring), ippDateToTime(val->date)));
           }
           putchar('\n');
           break;
@@ -966,7 +1016,7 @@ read_cb(_ippdata_t   *data,                /* I - Data */
   * Return the number of bytes read...
   */
 
-  return (count);
+  return ((ssize_t)count);
 }
 
 
@@ -996,10 +1046,10 @@ write_cb(_ippdata_t   *data,             /* I - Data */
   * Return the number of bytes written...
   */
 
-  return (count);
+  return ((ssize_t)count);
 }
 
 
 /*
- * End of "$Id: testipp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testipp.c 11889 2014-05-22 13:54:15Z msweet $".
  */
index 0f8942f..1b7b686 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: testlang.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testlang.c 12841 2015-08-10 17:07:30Z msweet $"
  *
  *   Localization test program for CUPS.
  *
- *   Copyright 2007-2010 by Apple Inc.
+ *   Copyright 2007-2015 by Apple Inc.
  *   Copyright 1997-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -50,8 +50,6 @@ main(int  argc,                               /* I - Number of command-line arguments */
   };
 
 
-  _cupsSetLocale(argv);
-
   if (argc == 1)
   {
     language  = cupsLangDefault();
@@ -61,8 +59,13 @@ main(int  argc,                              /* I - Number of command-line arguments */
   {
     language  = cupsLangGet(argv[1]);
     language2 = cupsLangGet(argv[1]);
+
+    setenv("LANG", argv[1], 1);
+    setenv("SOFTWARE", "CUPS/" CUPS_SVERSION, 1);
   }
 
+  _cupsSetLocale(argv);
+
   if (language != language2)
   {
     errors ++;
@@ -105,10 +108,49 @@ main(int  argc,                           /* I - Number of command-line arguments */
     }
   }
 
+  if (argc == 3)
+  {
+    ppd_file_t         *ppd;           /* PPD file */
+    ppd_option_t       *option;        /* PageSize option */
+    ppd_choice_t       *choice;        /* PageSize/Letter choice */
+
+    if ((ppd = ppdOpenFile(argv[2])) == NULL)
+    {
+      printf("Unable to open PPD file \"%s\".\n", argv[2]);
+      errors ++;
+    }
+    else
+    {
+      ppdLocalize(ppd);
+
+      if ((option = ppdFindOption(ppd, "PageSize")) == NULL)
+      {
+        puts("No PageSize option.");
+        errors ++;
+      }
+      else
+      {
+        printf("PageSize: %s\n", option->text);
+
+        if ((choice = ppdFindChoice(option, "Letter")) == NULL)
+        {
+         puts("No Letter PageSize choice.");
+         errors ++;
+        }
+        else
+        {
+         printf("Letter: %s\n", choice->text);
+        }
+      }
+
+      ppdClose(ppd);
+    }
+  }
+
   return (errors > 0);
 }
 
 
 /*
- * End of "$Id: testlang.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testlang.c 12841 2015-08-10 17:07:30Z msweet $".
  */
index 144f161..d14b64f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: testoptions.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testoptions.c 1992 2010-03-24 14:32:08Z msweet $"
  *
  *   Option test program for CUPS.
  *
@@ -112,5 +112,5 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: testoptions.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testoptions.c 1992 2010-03-24 14:32:08Z msweet $".
  */
index d66be19..dbd896e 100644 (file)
@@ -1,28 +1,25 @@
 /*
- * "$Id: testppd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testppd.c 12603 2015-05-06 01:42:51Z msweet $"
  *
- *   PPD test program for CUPS.
+ * PPD test program for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main() - Main entry.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
  * Include necessary headers...
  */
 
+#undef _CUPS_NO_DEPRECATED
 #include "cups-private.h"
 #include <sys/stat.h>
 #ifdef WIN32
@@ -31,6 +28,7 @@
 #  include <unistd.h>
 #  include <fcntl.h>
 #endif /* WIN32 */
+#include <math.h>
 
 
 /*
@@ -53,6 +51,11 @@ static const char    *default_code =
                        "%%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"
@@ -82,6 +85,11 @@ static const char    *custom_code =
                        "%%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"
@@ -150,6 +158,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
                maxsize,                /* Maximum size */
                *size;                  /* Current size */
   ppd_attr_t   *attr;                  /* Current attribute */
+  _ppd_cache_t *pc;                    /* PPD cache */
 
 
   status = 0;
@@ -392,10 +401,10 @@ main(int  argc,                           /* I - Number of command-line arguments */
     fputs("ppdPageSizeLimits: ", stdout);
     if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
     {
-      if (minsize.width != 36 || minsize.length != 36 ||
-          maxsize.width != 1080 || maxsize.length != 86400)
+      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, "
+        printf("FAIL (got min=%.3fx%.3f, max=%.3fx%.3f, "
               "expected min=36x36, max=1080x86400)\n", minsize.width,
               minsize.length, maxsize.width, maxsize.length);
         status ++;
@@ -481,7 +490,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
     size = ppdPageSize(ppd, NULL);
     if (!size || strcmp(size->name, "Custom") ||
-        size->width != 576 || size->length != 720)
+        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);
@@ -770,8 +780,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
     fputs("ppdPageSizeLimits(default): ", stdout);
     if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
     {
-      if (minsize.width != 36 || minsize.length != 36 ||
-          maxsize.width != 1080 || maxsize.length != 86400)
+      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,
@@ -792,8 +802,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
     fputs("ppdPageSizeLimits(InputSlot=Manual): ", stdout);
     if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
     {
-      if (minsize.width != 100 || minsize.length != 100 ||
-          maxsize.width != 1000 || maxsize.length != 1000)
+      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,
@@ -814,8 +824,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
     fputs("ppdPageSizeLimits(Quality=Photo): ", stdout);
     if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
     {
-      if (minsize.width != 200 || minsize.length != 200 ||
-          maxsize.width != 1000 || maxsize.length != 1000)
+      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,
@@ -836,8 +846,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
     fputs("ppdPageSizeLimits(Quality=Photo): ", stdout);
     if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
     {
-      if (minsize.width != 300 || minsize.length != 300 ||
-          maxsize.width != 1080 || maxsize.length != 86400)
+      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,
@@ -853,13 +863,66 @@ main(int  argc,                           /* I - Number of command-line arguments */
       status ++;
     }
   }
+  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 */
+
+    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]);
+    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 (!strncmp(argv[1], "-d", 2))
+    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 */
 
@@ -897,7 +960,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
 
       if ((realsize = readlink(filename, realfile, sizeof(realfile) - 1)) < 0)
-        strcpy(realfile, "Unknown");
+        strlcpy(realfile, "Unknown", sizeof(realfile));
       else
         realfile[realsize] = '\0';
 
@@ -1073,6 +1136,15 @@ main(int  argc,                          /* I - Number of command-line arguments */
           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))
@@ -1098,5 +1170,5 @@ main(int  argc,                           /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: testppd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testppd.c 12603 2015-05-06 01:42:51Z msweet $".
  */
index 9b6741e..3dcbc34 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: testpwg.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testpwg.c 11239 2013-08-14 20:33:42Z msweet $"
  *
  *   PWG test program for CUPS.
  *
- *   Copyright 2009-2012 by Apple Inc.
+ *   Copyright 2009-2013 by Apple Inc.
  *
  *   These coded instructions, statements, and computer programs are the
  *   property of Apple Inc. and are protected by Federal copyright
@@ -45,11 +45,15 @@ 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 */
-  _pwg_media_t *pwgmedia;              /* PWG media size */
+  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;
@@ -151,8 +155,8 @@ main(int  argc,                             /* I - Number of command-line args */
     puts("PASS");
   }
 
-  fputs("_pwgMediaForPWG(\"iso_a4_210x297mm\"): ", stdout);
-  if ((pwgmedia = _pwgMediaForPWG("iso_a4_210x297mm")) == NULL)
+  fputs("pwgMediaForPWG(\"iso_a4_210x297mm\"): ", stdout);
+  if ((pwgmedia = pwgMediaForPWG("iso_a4_210x297mm")) == NULL)
   {
     puts("FAIL (not found)");
     status ++;
@@ -170,8 +174,22 @@ main(int  argc,                            /* I - Number of command-line args */
   else
     puts("PASS");
 
-  fputs("_pwgMediaForLegacy(\"na-letter\"): ", stdout);
-  if ((pwgmedia = _pwgMediaForLegacy("na-letter")) == NULL)
+  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("pwgMediaForLegacy(\"na-letter\"): ", stdout);
+  if ((pwgmedia = pwgMediaForLegacy("na-letter")) == NULL)
   {
     puts("FAIL (not found)");
     status ++;
@@ -189,8 +207,8 @@ main(int  argc,                             /* I - Number of command-line args */
   else
     puts("PASS");
 
-  fputs("_pwgMediaForPPD(\"4x6\"): ", stdout);
-  if ((pwgmedia = _pwgMediaForPPD("4x6")) == NULL)
+  fputs("pwgMediaForPPD(\"4x6\"): ", stdout);
+  if ((pwgmedia = pwgMediaForPPD("4x6")) == NULL)
   {
     puts("FAIL (not found)");
     status ++;
@@ -208,8 +226,8 @@ main(int  argc,                             /* I - Number of command-line args */
   else
     puts("PASS");
 
-  fputs("_pwgMediaForPPD(\"10x15cm\"): ", stdout);
-  if ((pwgmedia = _pwgMediaForPPD("10x15cm")) == NULL)
+  fputs("pwgMediaForPPD(\"10x15cm\"): ", stdout);
+  if ((pwgmedia = pwgMediaForPPD("10x15cm")) == NULL)
   {
     puts("FAIL (not found)");
     status ++;
@@ -227,8 +245,8 @@ main(int  argc,                             /* I - Number of command-line args */
   else
     puts("PASS");
 
-  fputs("_pwgMediaForPPD(\"Custom.10x15cm\"): ", stdout);
-  if ((pwgmedia = _pwgMediaForPPD("Custom.10x15cm")) == NULL)
+  fputs("pwgMediaForPPD(\"Custom.10x15cm\"): ", stdout);
+  if ((pwgmedia = pwgMediaForPPD("Custom.10x15cm")) == NULL)
   {
     puts("FAIL (not found)");
     status ++;
@@ -246,8 +264,8 @@ main(int  argc,                             /* I - Number of command-line args */
   else
     puts("PASS");
 
-  fputs("_pwgMediaForSize(29700, 42000): ", stdout);
-  if ((pwgmedia = _pwgMediaForSize(29700, 42000)) == NULL)
+  fputs("pwgMediaForSize(29700, 42000): ", stdout);
+  if ((pwgmedia = pwgMediaForSize(29700, 42000)) == NULL)
   {
     puts("FAIL (not found)");
     status ++;
@@ -260,8 +278,8 @@ main(int  argc,                             /* I - Number of command-line args */
   else
     puts("PASS");
 
-  fputs("_pwgMediaForSize(9842, 19050): ", stdout);
-  if ((pwgmedia = _pwgMediaForSize(9842, 19050)) == NULL)
+  fputs("pwgMediaForSize(9842, 19050): ", stdout);
+  if ((pwgmedia = pwgMediaForSize(9842, 19050)) == NULL)
   {
     puts("FAIL (not found)");
     status ++;
@@ -274,8 +292,8 @@ main(int  argc,                             /* I - Number of command-line args */
   else
     printf("PASS (%s)\n", pwgmedia->pwg);
 
-  fputs("_pwgMediaForSize(9800, 19000): ", stdout);
-  if ((pwgmedia = _pwgMediaForSize(9800, 19000)) == NULL)
+  fputs("pwgMediaForSize(9800, 19000): ", stdout);
+  if ((pwgmedia = pwgMediaForSize(9800, 19000)) == NULL)
   {
     puts("FAIL (not found)");
     status ++;
@@ -288,6 +306,33 @@ main(int  argc,                            /* I - Number of command-line args */
   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);
 }
 
@@ -361,9 +406,9 @@ test_ppd_cache(_ppd_cache_t *pc,    /* I - PWG mapping data */
   int          i,                      /* Looping var */
                status = 0;             /* Return status */
   _ppd_cache_t *pc2;                   /* Loaded data */
-  _pwg_size_t  *size,                  /* Size from original */
+  pwg_size_t   *size,                  /* Size from original */
                *size2;                 /* Size from saved */
-  _pwg_map_t   *map,                   /* Map from original */
+  pwg_map_t    *map,                   /* Map from original */
                *map2;                  /* Map from saved */
 
 
@@ -521,5 +566,5 @@ test_ppd_cache(_ppd_cache_t *pc,    /* I - PWG mapping data */
 
 
 /*
- * End of "$Id: testpwg.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testpwg.c 11239 2013-08-14 20:33:42Z msweet $".
  */
index 809584f..d5e3856 100644 (file)
@@ -1,24 +1,17 @@
 /*
- * "$Id: testsnmp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testsnmp.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   SNMP test program for CUPS.
+ * SNMP test program for CUPS.
  *
- *   Copyright 2008-2010 by Apple Inc.
+ * Copyright 2008-2014 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()     - Main entry.
- *   scan_oid() - Scan an OID value.
- *   show_oid() - Show the specified OID.
- *   usage()    - Show program usage and exit.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -132,8 +125,8 @@ static void
 print_packet(cups_snmp_t *packet,      /* I - SNMP response packet */
              void        *data)                /* I - User data pointer (not used) */
 {
-  int  i;                              /* Looping var */
-  char temp[1024];                     /* Temporary OID string */
+  unsigned     i;                      /* Looping var */
+  char         temp[1024];             /* Temporary OID string */
 
 
   (void)data;
@@ -300,5 +293,5 @@ usage(void)
 
 
 /*
- * End of "$Id: testsnmp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testsnmp.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 8682222..dadc034 100644 (file)
@@ -1,15 +1,17 @@
 /*
- * "$Id: thread-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: thread-private.h 11627 2014-02-20 16:15:09Z msweet $"
  *
- *   Private threading definitions for CUPS.
+ * Private threading definitions for CUPS.
  *
- *   Copyright 2009-2012 by Apple Inc.
+ * Copyright 2009-2014 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_THREAD_PRIVATE_H_
@@ -39,7 +41,7 @@ typedef pthread_rwlock_t _cups_rwlock_t;
 typedef pthread_key_t  _cups_threadkey_t;
 #    define _CUPS_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
 #    define _CUPS_RWLOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER
-#    define _CUPS_THREADKEY_INITIALIZER -1
+#    define _CUPS_THREADKEY_INITIALIZER 0
 #    define _cupsThreadGetData(k) pthread_getspecific(k)
 #    define _cupsThreadSetData(k,p) pthread_setspecific(k,p)
 
@@ -94,5 +96,5 @@ extern int    _cupsThreadCreate(_cups_thread_func_t func, void *arg);
 #endif /* !_CUPS_THREAD_PRIVATE_H_ */
 
 /*
- * End of "$Id: thread-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: thread-private.h 11627 2014-02-20 16:15:09Z msweet $".
  */
index 7f1ea21..ea49f1d 100644 (file)
@@ -1,26 +1,17 @@
 /*
- * "$Id: thread.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: thread.c 11627 2014-02-20 16:15:09Z msweet $"
  *
- *   Threading primitives for CUPS.
+ * Threading primitives for CUPS.
  *
- *   Copyright 2009-2012 by Apple Inc.
+ * Copyright 2009-2014 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- * Contents:
- *
- *   _cupsMutexInit()    - Initialize a mutex.
- *   _cupsMutexLock()    - Lock a mutex.
- *   _cupsMutexUnlock()  - Unlock a mutex.
- *   _cupsRWInit()       - Initialize a reader/writer lock.
- *   _cupsRWLockRead()   - Acquire a reader/writer lock for reading.
- *   _cupsRWLockWrite()  - Acquire a reader/writer lock for writing.
- *   _cupsRWUnlock()     - Release a reader/writer lock.
- *   _cupsThreadCreate() - Create a thread.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -332,5 +323,5 @@ _cupsThreadCreate(
 
 
 /*
- * End of "$Id: thread.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: thread.c 11627 2014-02-20 16:15:09Z msweet $".
  */
diff --git a/cups/tls-darwin.c b/cups/tls-darwin.c
new file mode 100644 (file)
index 0000000..377919d
--- /dev/null
@@ -0,0 +1,1839 @@
+/*
+ * "$Id: tls-darwin.c 12675 2015-05-28 01:14:32Z msweet $"
+ *
+ * TLS support code for CUPS on OS X.
+ *
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/**** This file is included from tls.c ****/
+
+/*
+ * Include necessary headers...
+ */
+
+#include <spawn.h>
+
+extern char **environ;
+
+
+/*
+ * Local globals...
+ */
+
+#ifdef HAVE_SECKEYCHAINOPEN
+static int             tls_auto_create = 0;
+                                       /* Auto-create self-signed certs? */
+static char            *tls_common_name = NULL;
+                                       /* Default common name */
+static SecKeychainRef  tls_keychain = NULL;
+                                       /* Server cert keychain */
+static char            *tls_keypath = NULL;
+                                       /* Server cert keychain path */
+static _cups_mutex_t   tls_mutex = _CUPS_MUTEX_INITIALIZER;
+                                       /* Mutex for keychain/certs */
+#endif /* HAVE_SECKEYCHAINOPEN */
+static int             tls_options = -1;/* Options for TLS connections */
+
+
+/*
+ * Local functions...
+ */
+
+#ifdef HAVE_SECKEYCHAINOPEN
+static CFArrayRef      http_cdsa_copy_server(const char *common_name);
+#endif /* HAVE_SECKEYCHAINOPEN */
+static SecCertificateRef http_cdsa_create_credential(http_credential_t *credential);
+static const char      *http_cdsa_default_path(char *buffer, size_t bufsize);
+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 defined(HAVE_SECGENERATESELFSIGNEDCERTIFICATE) && defined(HAVE_SECKEYCHAINOPEN)
+  char                 filename[1024]; /* Default keychain path */
+  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 */
+  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)num_alt_names;
+  (void)alt_names;
+  (void)expiration_date;
+
+  if (!path)
+    path = http_cdsa_default_path(filename, sizeof(filename));
+
+  cfcommon_name = CFStringCreateWithCString(kCFAllocatorDefault, common_name, kCFStringEncodingUTF8);
+  if (!cfcommon_name)
+    goto cleanup;
+
+ /*
+  * Create a public/private key pair...
+  */
+
+  keyParams = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+  if (!keyParams)
+    goto cleanup;
+
+  CFDictionaryAddValue(keyParams, kSecAttrKeyType, kSecAttrKeyTypeRSA);
+  CFDictionaryAddValue(keyParams, kSecAttrKeySizeInBits, CFSTR("2048"));
+  CFDictionaryAddValue(keyParams, kSecAttrLabel, CFSTR("CUPS Self-Signed Certificate"));
+
+  err = SecKeyGeneratePair(keyParams, &publicKey, &privateKey);
+  if (err != noErr)
+    goto cleanup;
+
+ /*
+  * Create a self-signed certificate using the public/private key pair...
+  */
+
+  CFIndex      usageInt = kSecKeyUsageAll;
+  CFNumberRef  usage = CFNumberCreate(alloc, kCFNumberCFIndexType, &usageInt);
+  CFDictionaryRef certParams = CFDictionaryCreateMutable(kCFAllocatorDefault,
+kSecCSRBasicContraintsPathLen, CFINT(0), kSecSubjectAltName, cfcommon_name, kSecCertificateKeyUsage, usage, NULL, NULL);
+  CFRelease(usage);
+
+  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);
+  SecCertificateRef cert = SecGenerateSelfSignedCertificate(subject, certParams, publicKey, privateKey);
+  CFRelease(subject);
+  CFRelease(certParams);
+
+  if (!cert)
+    goto cleanup;
+
+  ident = SecIdentityCreate(kCFAllocatorDefault, cert, privateKey);
+
+  if (ident)
+    status = 1;
+
+  /*
+   * Cleanup and return...
+   */
+
+cleanup:
+
+  if (cfcommon_name)
+    CFRelease(cfcommon_name);
+
+  if (keyParams)
+    CFRelease(keyParams);
+
+  if (ident)
+    CFRelease(ident);
+
+  if (cert)
+    CFRelease(cert);
+
+  if (publicKey)
+    CFRelease(publicKey);
+
+  if (privateKey)
+    CFRelease(publicKey);
+
+  return (status);
+
+#else /* !(HAVE_SECGENERATESELFSIGNEDCERTIFICATE && HAVE_SECKEYCHAINOPEN) */
+  int          pid,                    /* Process ID of command */
+               status,                 /* Status of command */
+               i;                      /* Looping var */
+  char         command[1024],          /* Command */
+               *argv[4],               /* 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, 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"              /* Key size in bits */
+                 "y\n"                 /* OK (y = yes) */
+                 "b\n"                 /* Usage (b=signing/encryption) */
+                 "s\n"                 /* Sign with SHA1 */
+                 "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);
+#endif /* HAVE_SECGENERATESELFSIGNEDCERTIFICATE && HAVE_SECKEYCHAINOPEN */
+}
+
+
+/*
+ * '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 X 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));
+
+#ifdef HAVE_SECKEYCHAINOPEN
+  char                 filename[1024]; /* Filename for keychain */
+  SecKeychainRef       keychain = NULL;/* Temporary keychain */
+
+
+  if (!path)
+    path = http_cdsa_default_path(filename, sizeof(filename));
+
+  if (SecKeychainOpen(path, &keychain) != noErr)
+  {
+    /* TODO: Set cups last error string */
+    DEBUG_puts("1cupsSetServerCredentials: Unable to open keychain, returning 0.");
+    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(path);
+  tls_auto_create = auto_create;
+  tls_common_name = _cupsStrAlloc(common_name);
+
+  _cupsMutexUnlock(&tls_mutex);
+
+  DEBUG_puts("1cupsSetServerCredentials: Opened keychain, returning 1.");
+  return (1);
+
+#else
+  DEBUG_puts("1cupsSetServerCredentials: No keychain support compiled in, returning 0.");
+  return (0);
+#endif /* HAVE_SECKEYCHAINOPEN */
+}
+
+
+/*
+ * 'httpCopyCredentials()' - Copy the credentials associated with the peer in
+ *                           an encrypted connection.
+ *
+ * @since CUPS 1.5/OS X 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)", http, 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/OS X 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/OS X 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)
+    return (HTTP_TRUST_UNKNOWN);
+
+  if ((secCert = http_cdsa_create_credential((http_credential_t *)cupsArrayFirst(credentials))) == NULL)
+    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 (httpCredentialsGetExpiration(credentials) <= httpCredentialsGetExpiration(tcreds) ||
+          !httpCredentialsAreValidForName(credentials, common_name))
+      {
+       /*
+        * Either the new credentials are not newly issued, or the common name
+       * does not match the issued certificate...
+       */
+
+        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))
+    trust = HTTP_TRUST_INVALID;
+
+  if (!cg->expired_certs && !SecCertificateIsValid(secCert, CFAbsoluteTimeGetCurrent()))
+    trust = HTTP_TRUST_EXPIRED;
+  else if (!cg->any_root && cupsArrayCount(credentials) == 1)
+    trust = HTTP_TRUST_INVALID;
+
+  CFRelease(secCert);
+
+  return (trust);
+}
+
+
+/*
+ * 'httpCredentialsGetExpiration()' - Return the expiration date of the credentials.
+ *
+ * @since CUPS 2.0/OS X 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/OS X 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 ")", credentials, 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)
+  {
+    CFStringRef                cf_name;        /* CF common name string */
+    char               name[256];      /* Common name associated with cert */
+    time_t             expiration;     /* Expiration date of cert */
+    _cups_md5_state_t  md5_state;      /* MD5 state */
+    unsigned char      md5_digest[16]; /* MD5 result */
+
+    if ((cf_name = SecCertificateCopySubjectSummary(secCert)) != NULL)
+    {
+      CFStringGetCString(cf_name, name, (CFIndex)sizeof(name), kCFStringEncodingUTF8);
+      CFRelease(cf_name);
+    }
+    else
+      strlcpy(name, "unknown", sizeof(name));
+
+    expiration = (time_t)(SecCertificateNotValidAfter(secCert) + kCFAbsoluteTimeIntervalSince1970);
+
+    _cupsMD5Init(&md5_state);
+    _cupsMD5Append(&md5_state, first->data, (int)first->datalen);
+    _cupsMD5Finish(&md5_state, md5_digest);
+
+    snprintf(buffer, bufsize, "%s / %s / %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 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]);
+
+    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 */
+{
+#ifdef HAVE_SECKEYCHAINOPEN
+  OSStatus             err;            /* Error info */
+  char                 filename[1024]; /* Filename for keychain */
+  SecKeychainRef       keychain = NULL;/* Keychain reference */
+  SecIdentitySearchRef search = NULL;  /* Search reference */
+  SecCertificateRef    cert = NULL;    /* Certificate */
+  CFDataRef            data;           /* Certificate data */
+  SecPolicyRef         policy = NULL;  /* Policy ref */
+  CFStringRef          cfcommon_name = NULL;
+                                       /* Server name */
+  CFMutableDictionaryRef query = NULL; /* Query qualifiers */
+  CFArrayRef           list = NULL;    /* Keychain list */
+
+
+  DEBUG_printf(("httpLoadCredentials(path=\"%s\", credentials=%p, common_name=\"%s\")", path, credentials, common_name));
+
+  if (!credentials)
+    return (-1);
+
+  *credentials = NULL;
+
+  if (!path)
+    path = http_cdsa_default_path(filename, sizeof(filename));
+
+  if ((err = SecKeychainOpen(path, &keychain)) != noErr)
+    goto cleanup;
+
+  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;
+
+  list = CFArrayCreate(kCFAllocatorDefault, (const void **)&keychain, 1, &kCFTypeArrayCallBacks);
+
+  CFDictionaryAddValue(query, kSecClass, kSecClassCertificate);
+  CFDictionaryAddValue(query, kSecMatchPolicy, policy);
+  CFDictionaryAddValue(query, kSecReturnRef, kCFBooleanTrue);
+  CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitOne);
+  CFDictionaryAddValue(query, kSecMatchSearchList, list);
+
+  CFRelease(list);
+
+  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 (keychain)
+    CFRelease(keychain);
+  if (search)
+    CFRelease(search);
+  if (cert)
+    CFRelease(cert);
+  if (policy)
+    CFRelease(policy);
+  if (query)
+    CFRelease(query);
+
+  DEBUG_printf(("1httpLoadCredentials: Returning %d.", *credentials ? 0 : -1));
+
+  return (*credentials ? 0 : -1);
+
+#else
+  (void)path;
+  (void)credentials;
+  (void)common_name;
+
+  return (-1);
+#endif /* HAVE_SECKEYCHAINOPEN */
+}
+
+
+/*
+ * '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 */
+{
+#ifdef HAVE_SECKEYCHAINOPEN
+  int                  ret = -1;       /* Return value */
+  OSStatus             err;            /* Error info */
+  char                 filename[1024]; /* Filename for keychain */
+  SecKeychainRef       keychain = NULL;/* Keychain reference */
+  SecIdentitySearchRef search = NULL;  /* Search reference */
+  SecCertificateRef    cert = NULL;    /* Certificate */
+  CFMutableDictionaryRef attrs = NULL; /* Attributes for add */
+  CFArrayRef           list = NULL;    /* Keychain list */
+
+
+  DEBUG_printf(("httpSaveCredentials(path=\"%s\", credentials=%p, common_name=\"%s\")", path, 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 (!path)
+    path = http_cdsa_default_path(filename, sizeof(filename));
+
+  if ((err = SecKeychainOpen(path, &keychain)) != noErr)
+  {
+    DEBUG_printf(("1httpSaveCredentials: SecKeychainOpen returned %d.", (int)err));
+    goto cleanup;
+  }
+
+  if ((list = CFArrayCreate(kCFAllocatorDefault, (const void **)&keychain, 1, &kCFTypeArrayCallBacks)) == NULL)
+  {
+    DEBUG_puts("1httpSaveCredentials: Unable to create list of keychains.");
+    goto cleanup;
+  }
+
+  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);
+  CFDictionaryAddValue(attrs, kSecMatchSearchList, list);
+
+  /* Note: SecItemAdd consumes "attrs"... */
+  err = SecItemAdd(attrs, NULL);
+  DEBUG_printf(("1httpSaveCredentials: SecItemAdd returned %d.", (int)err));
+
+  cleanup :
+
+  if (list)
+    CFRelease(list);
+  if (keychain)
+    CFRelease(keychain);
+  if (search)
+    CFRelease(search);
+  if (cert)
+    CFRelease(cert);
+
+  DEBUG_printf(("1httpSaveCredentials: Returning %d.", ret));
+
+  return (ret);
+
+#else
+  (void)path;
+  (void)credentials;
+  (void)common_name;
+
+  return (-1);
+#endif /* HAVE_SECKEYCHAINOPEN */
+}
+
+
+/*
+ * '_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 */
+{
+  tls_options = options;
+}
+
+
+/*
+ * '_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 */
+  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)", http));
+
+  if (tls_options < 0)
+  {
+    DEBUG_puts("4_httpTLSStart: Setting defaults.");
+    _cupsSetDefaults();
+    DEBUG_printf(("4_httpTLSStart: tls_options=%x", tls_options));
+  }
+
+#ifdef HAVE_SECKEYCHAINOPEN
+  if (http->mode == _HTTP_MODE_SERVER && !tls_keychain)
+#else
+  if (http->mode == _HTTP_MODE_SERVER)
+#endif /* HAVE_SECKEYCHAINOPEN */
+  {
+    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);
+  }
+
+  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)
+  {
+    SSLProtocol minProtocol;
+
+    if (tls_options & _HTTP_TLS_DENY_TLS10)
+      minProtocol = kTLSProtocol11;
+    else if (tls_options & _HTTP_TLS_ALLOW_SSL3)
+      minProtocol = kSSLProtocol3;
+    else
+      minProtocol = kTLSProtocol1;
+
+    error = SSLSetProtocolVersionMin(http->tls, minProtocol);
+    DEBUG_printf(("4_httpTLSStart: SSLSetProtocolVersionMin(%d), error=%d", minProtocol, (int)error));
+  }
+
+#  if HAVE_SSLSETENABLEDCIPHERS
+  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_DSS_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_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 :
+          case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
+          case TLS_DHE_PSK_WITH_AES_256_CBC_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;
+
+          /* 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);
+    }
+  }
+#endif /* HAVE_SSLSETENABLEDCIPHERS */
+
+  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][0])
+    {
+     /*
+      * 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));
+      }
+    }
+
+#ifdef HAVE_SECKEYCHAINOPEN
+    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);
+    }
+#endif /* HAVE_SECKEYCHAINOPEN */
+
+    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", 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? */
+
+    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;
+      }
+    }
+  }
+
+  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)
+#ifdef HAVE_CSSMERRORSTRING
+      message = cssmErrorString(error);
+#else
+      message = _("Unable to establish a secure connection to host.");
+#endif /* HAVE_CSSMERRORSTRING */
+
+    _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)", http, 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);
+}
+
+
+#ifdef HAVE_SECKEYCHAINOPEN
+/*
+ * '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 */
+{
+  OSStatus             err;            /* Error info */
+  SecIdentitySearchRef search = NULL;  /* Search reference */
+  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 */
+
+
+  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;
+
+  _cupsMutexLock(&tls_mutex);
+
+  list = CFArrayCreate(kCFAllocatorDefault, (const void **)&tls_keychain, 1, &kCFTypeArrayCallBacks);
+
+  CFDictionaryAddValue(query, kSecClass, kSecClassIdentity);
+  CFDictionaryAddValue(query, kSecMatchPolicy, policy);
+  CFDictionaryAddValue(query, kSecReturnRef, kCFBooleanTrue);
+  CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitOne);
+  CFDictionaryAddValue(query, kSecMatchSearchList, list);
+
+  CFRelease(list);
+
+  err = SecItemCopyMatching(query, (CFTypeRef *)&identity);
+
+  _cupsMutexUnlock(&tls_mutex);
+
+  if (err)
+    goto cleanup;
+
+  if (CFGetTypeID(identity) != SecIdentityGetTypeID())
+    goto cleanup;
+
+  if ((certificates = CFArrayCreate(NULL, (const void **)&identity, 1, &kCFTypeArrayCallBacks)) == NULL)
+    goto cleanup;
+
+  cleanup :
+
+  if (search)
+    CFRelease(search);
+  if (identity)
+    CFRelease(identity);
+
+  if (policy)
+    CFRelease(policy);
+  if (query)
+    CFRelease(query);
+
+  return (certificates);
+}
+#endif /* HAVE_SECKEYCHAINOPEN */
+
+
+/*
+ * '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 */
+{
+  if (!credential)
+    return (NULL);
+
+  return (SecCertificateCreateWithBytes(kCFAllocatorDefault, credential->data, (CFIndex)credential->datalen));
+}
+
+
+/*
+ * '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 */
+{
+  const char *home = getenv("HOME");   /* HOME environment variable */
+
+
+  if (getuid() && home)
+    snprintf(buffer, bufsize, "%s/Library/Keychains/login.keychain", home);
+  else
+    strlcpy(buffer, "/Library/Keychains/System.keychain", bufsize);
+
+  DEBUG_printf(("1http_cdsa_default_path: Using default path \"%s\".", buffer));
+
+  return (buffer);
+}
+
+
+/*
+ * '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)
+  {
+   /*
+    * 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)", 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);
+}
+
+
+/*
+ * End of "$Id: tls-darwin.c 12675 2015-05-28 01:14:32Z msweet $".
+ */
diff --git a/cups/tls-gnutls.c b/cups/tls-gnutls.c
new file mode 100644 (file)
index 0000000..3da05e2
--- /dev/null
@@ -0,0 +1,1345 @@
+/*
+ * "$Id: tls-gnutls.c 12670 2015-05-27 19:48:05Z msweet $"
+ *
+ * TLS support code for CUPS using GNU TLS.
+ *
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/**** This file is included from tls.c ****/
+
+/*
+ * Include necessary headers...
+ */
+
+#include <sys/stat.h>
+
+
+/*
+ * Local globals...
+ */
+
+static int             tls_auto_create = 0;
+                                       /* Auto-create self-signed certs? */
+static char            *tls_common_name = NULL;
+                                       /* Default common name */
+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 */
+
+
+/*
+ * 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 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);
+  if (num_alt_names > 0)
+    gnutls_x509_crt_set_subject_alternative_name(crt, GNUTLS_SAN_DNSNAME, alt_names[0]);
+  gnutls_x509_crt_set_key_purpose_oid(crt, GNUTLS_KP_TLS_WWW_SERVER, 0);
+  gnutls_x509_crt_set_key_usage(crt, 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/OS X 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;
+    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)
+    return (HTTP_TRUST_UNKNOWN);
+
+  if ((cert = http_gnutls_create_credential((http_credential_t *)cupsArrayFirst(credentials))) == NULL)
+    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 (httpCredentialsGetExpiration(credentials) <= httpCredentialsGetExpiration(tcreds) ||
+          !httpCredentialsAreValidForName(credentials, common_name))
+      {
+       /*
+        * Either the new credentials are not newly issued, or the common name
+       * does not match the issued certificate...
+       */
+
+        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))
+    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))
+      trust = HTTP_TRUST_EXPIRED;
+  }
+
+  if (trust == HTTP_TRUST_OK && !cg->any_root && cupsArrayCount(credentials) == 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 */
+    size_t             namelen;        /* Length of name */
+    time_t             expiration;     /* Expiration date of cert */
+    _cups_md5_state_t  md5_state;      /* MD5 state */
+    unsigned char      md5_digest[16]; /* MD5 result */
+
+    namelen = sizeof(name) - 1;
+    if (gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_COMMON_NAME, 0, 0, name, &namelen) >= 0)
+      name[namelen] = '\0';
+    else
+      strlcpy(name, "unknown", sizeof(name));
+
+    expiration = gnutls_x509_crt_get_expiration_time(cert);
+
+    _cupsMD5Init(&md5_state);
+    _cupsMD5Append(&md5_state, first->data, (int)first->datalen);
+    _cupsMD5Finish(&md5_state, md5_digest);
+
+    snprintf(buffer, bufsize, "%s / %s / %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 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]);
+
+    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 */
+
+
+  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 (num_data)
+      {
+       /*
+       * Missing END CERTIFICATE...
+       */
+
+        httpFreeCredentials(*credentials);
+       *credentials = NULL;
+        break;
+      }
+    }
+    else if (!strcmp(line, "-----END CERTIFICATE-----"))
+    {
+      if (!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;
+    }
+    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)
+       {
+         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 (num_data)
+  {
+   /*
+    * 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 */
+{
+  const char *home = getenv("HOME");   /* HOME environment variable */
+
+
+  if (getuid() && home)
+  {
+    snprintf(buffer, bufsize, "%s/.cups", 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", 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_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)
+  {
+   /*
+    * 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);
+}
+
+
+/*
+ * '_httpTLSSetCredentials()' - Set the TLS credentials.
+ */
+
+int                                    /* O - Status of connection */
+_httpTLSSetCredentials(http_t *http)   /* I - Connection to server */
+{
+  (void)http;
+
+  return (0);
+}
+
+
+/*
+ * '_httpTLSSetOptions()' - Set TLS protocol and cipher suite options.
+ */
+
+void
+_httpTLSSetOptions(int options)                /* I - Options */
+{
+  tls_options = options;
+}
+
+
+/*
+ * '_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[1024];
+                                       /* Priority string */
+
+
+  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][0])
+    {
+     /*
+      * 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_gnutls_make_path(crtfile, sizeof(crtfile), tls_keypath, hostname, "crt");
+      http_gnutls_make_path(keyfile, sizeof(keyfile), tls_keypath, hostname, "key");
+
+      have_creds = !access(crtfile, 0) && !access(keyfile, 0);
+    }
+    else if (tls_common_name)
+    {
+      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");
+
+      have_creds = !access(crtfile, 0) && !access(keyfile, 0);
+    }
+
+    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));
+
+    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_options & _HTTP_TLS_DENY_TLS10)
+    strlcat(priority_string, ":+VERS-TLS-ALL:-VERS-TLS1.0:-VERS-SSL3.0", sizeof(priority_string));
+  else if (tls_options & _HTTP_TLS_ALLOW_SSL3)
+    strlcat(priority_string, ":+VERS-TLS-ALL", sizeof(priority_string));
+  else
+    strlcat(priority_string, ":+VERS-TLS-ALL:-VERS-SSL3.0", sizeof(priority_string));
+
+  if (!(tls_options & _HTTP_TLS_ALLOW_RC4))
+    strlcat(priority_string, ":-ARCFOUR-128", sizeof(priority_string));
+
+  if (!(tls_options & _HTTP_TLS_ALLOW_DH))
+    strlcat(priority_string, ":!ANON-DH", 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);
+
+  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;
+
+      return (-1);
+    }
+  }
+
+  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);
+}
+
+
+/*
+ * End of "$Id: tls-gnutls.c 12670 2015-05-27 19:48:05Z msweet $".
+ */
diff --git a/cups/tls-sspi.c b/cups/tls-sspi.c
new file mode 100644 (file)
index 0000000..aa8994d
--- /dev/null
@@ -0,0 +1,2431 @@
+/*
+ * "$Id: tls-sspi.c 12647 2015-05-20 18:37:52Z msweet $"
+ *
+ * TLS support for CUPS on Windows using the Security Support Provider
+ * Interface (SSPI).
+ *
+ * Copyright 2010-2015 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/**** 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 */
+
+
+/*
+ * 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/OS X 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 (CertNameToStr(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 */
+    _cups_md5_state_t  md5_state;      /* MD5 state */
+    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 (CertNameToStr(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));
+
+    _cupsMD5Init(&md5_state);
+    _cupsMD5Append(&md5_state, first->data, (int)first->datalen);
+    _cupsMD5Finish(&md5_state, 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 (!CertStrToName(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 (!CertStrToName(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 (!CertStrToName(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 (!CertStrToName(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 */
+{
+  tls_options = options;
+}
+
+
+/*
+ * '_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][0])
+    {
+     /*
+      * 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);
+  GetUserName(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 (!CertStrToName(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 (!CertStrToName(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_options & _HTTP_TLS_DENY_TLS10)
+      SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_SERVER | SP_PROT_TLS1_1_SERVER;
+    else if (tls_options & _HTTP_TLS_ALLOW_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_options & _HTTP_TLS_DENY_TLS10)
+      SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_2_CLIENT | SP_PROT_TLS1_1_CLIENT;
+    else if (tls_options & _HTTP_TLS_ALLOW_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_options & _HTTP_TLS_ALLOW_SSL3)
+      SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_SERVER | SP_PROT_SSL3_SERVER;
+    else
+      SchannelCred.grbitEnabledProtocols = SP_PROT_TLS1_SERVER;
+  }
+  else
+  {
+    if (tls_options & _HTTP_TLS_ALLOW_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 and _HTTP_TLS_ALLOW_DH options; right now we'll rely on Windows registry to enable/disable RC4/DH... */
+
+ /*
+  * 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 (!CertStrToName(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 (!CertStrToName(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;
+
+  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 (FormatMessage(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);
+}
+
+
+/*
+ * End of "$Id: tls-sspi.c 12647 2015-05-20 18:37:52Z msweet $".
+ */
diff --git a/cups/tls.c b/cups/tls.c
new file mode 100644 (file)
index 0000000..14b0260
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * "$Id: tls.c 12136 2014-08-29 15:19:40Z msweet $"
+ *
+ * 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.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include "cups-private.h"
+#include <fcntl.h>
+#include <math.h>
+#ifdef WIN32
+#  include <tchar.h>
+#else
+#  include <signal.h>
+#  include <sys/time.h>
+#  include <sys/resource.h>
+#endif /* WIN32 */
+#ifdef HAVE_POLL
+#  include <poll.h>
+#endif /* HAVE_POLL */
+
+
+/*
+ * Local functions...
+ */
+
+#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 */
+
+
+/*
+ * End of "$Id: tls.c 12136 2014-08-29 15:19:40Z msweet $".
+ */
diff --git a/cups/tlscheck.c b/cups/tlscheck.c
new file mode 100644 (file)
index 0000000..56cc1de
--- /dev/null
@@ -0,0 +1,739 @@
+/*
+ * "$Id: tlscheck.c 12688 2015-06-03 17:31:30Z msweet $"
+ *
+ * TLS check program for CUPS.
+ *
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * 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 */
+  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          tls_options = _HTTP_TLS_NONE,
+                                       /* TLS options */
+               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-tls10"))
+    {
+      tls_options |= _HTTP_TLS_DENY_TLS10;
+    }
+    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 (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);
+
+  http = httpConnect2(server, port, NULL, AF_UNSPEC, HTTP_ENCRYPTION_ALWAYS, 1, 30000, NULL);
+  if (!http)
+  {
+    printf("%s: ERROR (%s)\n", server, cupsLastErrorString());
+    return (1);
+  }
+
+#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, &params, &paramsLen)) != 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);
+
+  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);
+  }
+
+  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-tls10  Disable TLS/1.0");
+  puts("  --rc4       Allow RC4 encryption");
+  puts("  --verbose   Be verbose");
+  puts("  -v          Be verbose");
+  puts("");
+  puts("The default port is 631.");
+
+  exit(1);
+}
+#endif /* !HAVE_SSL */
+
+
+/*
+ * End of "$Id: tlscheck.c 12688 2015-06-03 17:31:30Z msweet $".
+ */
index 2289220..81b596f 100644 (file)
@@ -1,26 +1,18 @@
 /*
- * "$Id: transcode.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: transcode.c 12330 2014-12-09 20:57:28Z msweet $"
  *
- *   Transcoding support for CUPS.
+ * Transcoding support for CUPS.
  *
- *   Copyright 2007-2010 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   _cupsCharmapFlush() - Flush all character set maps out of cache.
- *   cupsCharsetToUTF8() - Convert legacy character set to UTF-8.
- *   cupsUTF8ToCharset() - Convert UTF-8 to legacy character set.
- *   cupsUTF8ToUTF32()   - Convert UTF-8 to UTF-32.
- *   cupsUTF32ToUTF8()   - Convert UTF-32 to UTF-8.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -117,7 +109,7 @@ cupsCharsetToUTF8(
   if (encoding == CUPS_UTF8 || encoding <= CUPS_US_ASCII ||
       encoding >= CUPS_ENCODING_VBCS_END)
   {
-    strlcpy((char *)dest, src, maxout);
+    strlcpy((char *)dest, src, (size_t)maxout);
     return ((int)strlen((char *)dest));
   }
 
@@ -141,11 +133,11 @@ cupsCharsetToUTF8(
 
       if (ch & 128)
       {
-       *destptr++ = 0xc0 | (ch >> 6);
-       *destptr++ = 0x80 | (ch & 0x3f);
+       *destptr++ = (cups_utf8_t)(0xc0 | (ch >> 6));
+       *destptr++ = (cups_utf8_t)(0x80 | (ch & 0x3f));
       }
       else
-       *destptr++ = ch;
+       *destptr++ = (cups_utf8_t)ch;
     }
 
     *destptr = '\0';
@@ -162,11 +154,15 @@ cupsCharsetToUTF8(
 
   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", _cupsEncodingName(encoding));
-    map_encoding     = encoding;
+    map_to_utf8   = iconv_open("UTF-8", toset);
   }
 
   if (map_to_utf8 != (iconv_t)-1)
@@ -174,7 +170,7 @@ cupsCharsetToUTF8(
     char *altdestptr = (char *)dest;   /* Silence bogus GCC type-punned */
 
     srclen       = strlen(src);
-    outBytesLeft = maxout - 1;
+    outBytesLeft = (size_t)maxout - 1;
 
     iconv(map_to_utf8, (char **)&src, &srclen, &altdestptr, &outBytesLeft);
     *altdestptr = '\0';
@@ -234,7 +230,7 @@ cupsUTF8ToCharset(
   if (encoding == CUPS_UTF8 ||
       encoding >= CUPS_ENCODING_VBCS_END)
   {
-    strlcpy(dest, (char *)src, maxout);
+    strlcpy(dest, (char *)src, (size_t)maxout);
     return ((int)strlen(dest));
   }
 
@@ -262,7 +258,7 @@ cupsUTF8ToCharset(
        ch = ((ch & 0x1f) << 6) | (*src++ & 0x3f);
 
        if (ch < maxch)
-          *destptr++ = ch;
+          *destptr++ = (char)ch;
        else
           *destptr++ = '?';
       }
@@ -270,7 +266,7 @@ cupsUTF8ToCharset(
                (ch & 0xf8) == 0xf0)
         *destptr++ = '?';
       else if (!(ch & 0x80))
-       *destptr++ = ch;
+       *destptr++ = (char)ch;
     }
 
     *destptr = '\0';
@@ -287,11 +283,15 @@ cupsUTF8ToCharset(
 
   if (map_encoding != encoding)
   {
+    char       toset[1024];            /* Destination character set */
+
     _cupsCharmapFlush();
 
-    map_from_utf8 = iconv_open(_cupsEncodingName(encoding), "UTF-8");
-    map_to_utf8   = iconv_open("UTF-8", _cupsEncodingName(encoding));
+    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)
@@ -299,7 +299,7 @@ cupsUTF8ToCharset(
     char *altsrc = (char *)src;                /* Silence bogus GCC type-punned */
 
     srclen       = strlen((char *)src);
-    outBytesLeft = maxout - 1;
+    outBytesLeft = (size_t)maxout - 1;
 
     iconv(map_from_utf8, &altsrc, &srclen, &destptr, &outBytesLeft);
     *destptr = '\0';
@@ -404,7 +404,7 @@ cupsUTF8ToUTF32(
        return (-1);
       }
 
-      ch32 = ((ch & 0x1f) << 6) | (next & 0x3f);
+      ch32 = (cups_utf32_t)((ch & 0x1f) << 6) | (cups_utf32_t)(next & 0x3f);
 
      /*
       * Check for non-shortest form (invalid UTF-8)...
@@ -436,7 +436,7 @@ cupsUTF8ToUTF32(
        return (-1);
       }
 
-      ch32 = ((ch & 0x0f) << 6) | (next & 0x3f);
+      ch32 = (cups_utf32_t)((ch & 0x0f) << 6) | (cups_utf32_t)(next & 0x3f);
 
       next = *src++;
       if ((next & 0xc0) != 0x80)
@@ -446,7 +446,7 @@ cupsUTF8ToUTF32(
        return (-1);
       }
 
-      ch32 = (ch32 << 6) | (next & 0x3f);
+      ch32 = (ch32 << 6) | (cups_utf32_t)(next & 0x3f);
 
      /*
       * Check for non-shortest form (invalid UTF-8)...
@@ -478,7 +478,7 @@ cupsUTF8ToUTF32(
        return (-1);
       }
 
-      ch32 = ((ch & 0x07) << 6) | (next & 0x3f);
+      ch32 = (cups_utf32_t)((ch & 0x07) << 6) | (cups_utf32_t)(next & 0x3f);
 
       next = *src++;
       if ((next & 0xc0) != 0x80)
@@ -488,7 +488,7 @@ cupsUTF8ToUTF32(
        return (-1);
       }
 
-      ch32 = (ch32 << 6) | (next & 0x3f);
+      ch32 = (ch32 << 6) | (cups_utf32_t)(next & 0x3f);
 
       next = *src++;
       if ((next & 0xc0) != 0x80)
@@ -498,7 +498,7 @@ cupsUTF8ToUTF32(
        return (-1);
       }
 
-      ch32 = (ch32 << 6) | (next & 0x3f);
+      ch32 = (ch32 << 6) | (cups_utf32_t)(next & 0x3f);
 
      /*
       * Check for non-shortest form (invalid UTF-8)...
@@ -716,5 +716,5 @@ cupsUTF32ToUTF8(
 
 
 /*
- * End of "$Id: transcode.c 11173 2013-07-23 12:31:34Z msweet $"
+ * End of "$Id: transcode.c 12330 2014-12-09 20:57:28Z msweet $"
  */
index 7c7840e..da95d0c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: transcode.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: transcode.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Transcoding definitions for CUPS.
  *
@@ -77,5 +77,5 @@ extern int    cupsUTF32ToUTF8(cups_utf8_t *dest,
 
 
 /*
- * End of "$Id: transcode.h 11173 2013-07-23 12:31:34Z msweet $"
+ * End of "$Id: transcode.h 10996 2013-05-29 11:51:34Z msweet $"
  */
index 73d47f5..7c0eb3b 100644 (file)
@@ -1,39 +1,18 @@
 /*
- * "$Id: usersys.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: usersys.c 12817 2015-07-30 15:45:46Z msweet $"
  *
- *   User, system, and password routines for CUPS.
+ * User, system, and password routines for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsEncryption()        - Get the current encryption settings.
- *   cupsGetPassword()       - Get a password from the user.
- *   cupsGetPassword2()      - Get a password from the user using the advanced
- *                             password callback.
- *   cupsServer()            - Return the hostname/address of the current
- *                             server.
- *   cupsSetClientCertCB()   - Set the client certificate callback.
- *   cupsSetEncryption()     - Set the encryption preference.
- *   cupsSetPasswordCB()     - Set the password callback for CUPS.
- *   cupsSetPasswordCB2()    - Set the advanced password callback for CUPS.
- *   cupsSetServer()         - Set the default server name and port.
- *   cupsSetServerCertCB()   - Set the server certificate callback.
- *   cupsSetUser()           - Set the default user name.
- *   cupsUser()              - Return the current user's name.
- *   _cupsGetPassword()      - Get a password from the user.
- *   _cupsGSSServiceName()   - Get the GSS (Kerberos) service name.
- *   _cupsSetDefaults()      - Set the default server, port, and encryption.
- *   cups_read_client_conf() - Read a client.conf file.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -48,6 +27,7 @@
 #else
 #  include <pwd.h>
 #  include <termios.h>
+#  include <sys/utsname.h>
 #endif /* WIN32 */
 
 
 
 
 /*
+ * Local types...
+ */
+
+typedef struct _cups_client_conf_s     /**** client.conf config data ****/
+{
+#ifdef HAVE_SSL
+  int                  ssl_options;    /* SSLOptions values */
+#endif /* HAVE_SSL */
+  int                  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...
  */
 
-static void    cups_read_client_conf(cups_file_t *fp,
-                                     _cups_globals_t *cg,
-                                     const char *cups_encryption,
-                                     const char *cups_server,
-                                     const char *cups_user,
+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_encryption(_cups_client_conf_t *cc, const char *value);
 #ifdef HAVE_GSSAPI
-                                      const char *cups_gssservicename,
+static void    cups_set_gss_service_name(_cups_client_conf_t *cc, const char *value);
 #endif /* HAVE_GSSAPI */
-                                     const char *cups_anyroot,
-                                     const char *cups_expiredroot,
-                                     const char *cups_expiredcerts);
+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_user(_cups_client_conf_t *cc, const char *value);
 
 
 /*
@@ -81,7 +86,7 @@ static void   cups_read_client_conf(cups_file_t *fp,
  * The default encryption setting comes from the CUPS_ENCRYPTION
  * environment variable, then the ~/.cups/client.conf file, and finally the
  * /etc/cups/client.conf file. If not set, the default is
- * @code HTTP_ENCRYPT_IF_REQUESTED@.
+ * @code 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
@@ -231,8 +236,10 @@ cupsSetCredentials(
   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);
 }
@@ -244,7 +251,7 @@ cupsSetCredentials(
  * The default encryption setting comes from the CUPS_ENCRYPTION
  * environment variable, then the ~/.cups/client.conf file, and finally the
  * /etc/cups/client.conf file. If not set, the default is
- * @code HTTP_ENCRYPT_IF_REQUESTED@.
+ * @code 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
@@ -376,8 +383,11 @@ cupsSetServer(const char *server)  /* I - Server name */
       cg->ipp_port = atoi(port);
     }
 
+    if (!cg->ipp_port)
+      cups_set_default_ipp_port(cg);
+
     if (cg->server[0] == '/')
-      strcpy(cg->servername, "localhost");
+      strlcpy(cg->servername, "localhost", sizeof(cg->servername));
     else
       strlcpy(cg->servername, cg->server, sizeof(cg->servername));
   }
@@ -386,6 +396,7 @@ cupsSetServer(const char *server)   /* I - Server name */
     cg->server[0]      = '\0';
     cg->servername[0]  = '\0';
     cg->server_version = 20;
+    cg->ipp_port       = 0;
   }
 
   if (cg->http)
@@ -445,6 +456,62 @@ cupsSetUser(const char *user)              /* I - User name */
 
 
 /*
+ * '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/OS X 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 */
+  OSVERSIONINFO                version;        /* OS version info */
+#else
+  struct utsname       name;           /* uname info */
+#endif /* WIN32 */
+
+
+  if (user_agent)
+  {
+    strlcpy(cg->user_agent, user_agent, sizeof(cg->user_agent));
+    return;
+  }
+
+#ifdef WIN32
+  version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+  GetVersionEx(&version);
+  GetNativeSystemInfo(&sysinfo);
+
+  snprintf(cg->user_agent, sizeof(cg->user_agent),
+           CUPS_MINIMAL " (Windows %d.%d; %s) IPP/2.0",
+          version.dwMajorVersion, version.dwMinorVersion,
+          sysinfo.wProcessorArchitecture
+              == PROCESSOR_ARCHITECTURE_AMD64 ? "amd64" :
+              sysinfo.wProcessorArchitecture
+                  == PROCESSOR_ARCHITECTURE_ARM ? "arm" :
+              sysinfo.wProcessorArchitecture
+                  == PROCESSOR_ARCHITECTURE_IA64 ? "ia64" :
+              sysinfo.wProcessorArchitecture
+                  == PROCESSOR_ARCHITECTURE_INTEL ? "intel" :
+              "unknown");
+
+#else
+  uname(&name);
+
+  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
@@ -467,6 +534,25 @@ cupsUser(void)
 
 
 /*
+ * 'cupsUserAgent()' - Return the default HTTP User-Agent string.
+ *
+ * @since CUPS 1.7/OS X 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.
  */
 
@@ -623,7 +709,7 @@ _cupsGetPassword(const char *prompt)        /* I - Prompt string */
   }
 
   noecho = original;
-  noecho.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
+  noecho.c_lflag &= (tcflag_t)~(ICANON | ECHO | ECHOE | ISIG);
 
   if (tcsetattr(tty, TCSAFLUSH, &noecho))
   {
@@ -648,7 +734,10 @@ _cupsGetPassword(const char *prompt)       /* I - Prompt string */
 
   while ((passbytes = read(tty, &passch, 1)) == 1)
   {
-    if (passch == noecho.c_cc[VEOL] || passch == noecho.c_cc[VEOL2] ||
+    if (passch == noecho.c_cc[VEOL] ||
+#  ifdef VEOL2
+        passch == noecho.c_cc[VEOL2] ||
+#  endif /* VEOL2 */
         passch == 0x0A || passch == 0x0D)
     {
      /*
@@ -765,82 +854,242 @@ void
 _cupsSetDefaults(void)
 {
   cups_file_t  *fp;                    /* File */
-  const char   *home,                  /* Home directory of user */
-               *cups_encryption,       /* CUPS_ENCRYPTION env var */
-               *cups_server,           /* CUPS_SERVER env var */
-               *cups_user,             /* CUPS_USER/USER env var */
-#ifdef HAVE_GSSAPI
-               *cups_gssservicename,   /* CUPS_GSSSERVICENAME env var */
-#endif /* HAVE_GSSAPI */
-               *cups_anyroot,          /* CUPS_ANYROOT env var */
-               *cups_expiredroot,      /* CUPS_EXPIREDROOT env var */
-               *cups_expiredcerts;     /* CUPS_EXPIREDCERTS env var */
+  const char   *home;                  /* Home directory of user */
   char         filename[1024];         /* Filename */
+  _cups_client_conf_t cc;              /* client.conf values */
   _cups_globals_t *cg = _cupsGlobals();        /* Pointer to library globals */
 
 
   DEBUG_puts("_cupsSetDefaults()");
 
  /*
-  * First collect environment variables...
+  * Load initial client.conf values...
+  */
+
+  cups_init_client_conf(&cc);
+
+ /*
+  * Read the /etc/cups/client.conf and ~/.cups/client.conf files, if
+  * present.
   */
 
-  cups_encryption     = getenv("CUPS_ENCRYPTION");
-  cups_server        = getenv("CUPS_SERVER");
+  snprintf(filename, sizeof(filename), "%s/client.conf", cg->cups_serverroot);
+  if ((fp = cupsFileOpen(filename, "r")) != NULL)
+  {
+    cups_read_client_conf(fp, &cc);
+    cupsFileClose(fp);
+  }
+
+#  ifdef HAVE_GETEUID
+  if ((geteuid() == getuid() || !getuid()) && getegid() == getgid() && (home = getenv("HOME")) != NULL)
+#  elif !defined(WIN32)
+  if (getuid() && (home = getenv("HOME")) != NULL)
+#  else
+  if ((home = getenv("HOME")) != NULL)
+#  endif /* HAVE_GETEUID */
+  {
+   /*
+    * Look for ~/.cups/client.conf...
+    */
+
+    snprintf(filename, sizeof(filename), "%s/.cups/client.conf", 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);
+
+  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
-  cups_gssservicename = getenv("CUPS_GSSSERVICENAME");
+  if (!cg->gss_service_name[0])
+    strlcpy(cg->gss_service_name, cc.gss_service_name, sizeof(cg->gss_service_name));
 #endif /* HAVE_GSSAPI */
-  cups_anyroot       = getenv("CUPS_ANYROOT");
-  cups_expiredroot    = getenv("CUPS_EXPIREDROOT");
-  cups_expiredcerts   = getenv("CUPS_EXPIREDCERTS");
 
-  if ((cups_user = getenv("CUPS_USER")) == NULL)
-    cups_user = getenv("USER");
+  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);
+#endif /* HAVE_SSL */
+}
+
+
+/*
+ * '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_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, if needed, read the ~/.cups/client.conf or /etc/cups/client.conf
-  * files to get the default values...
+  * Then apply defaults for those values that haven't been set...
   */
 
-  if (cg->encryption == (http_encryption_t)-1 || !cg->server[0] ||
-      !cg->user[0] || !cg->ipp_port)
+  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 = 1;
+
+#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 ((home = getenv("HOME")) != NULL)
+#ifdef CUPS_DEFAULT_DOMAINSOCKET
+   /*
+    * If we are compiled with domain socket support, only use the
+    * domain socket if it exists and has the right permissions...
+    */
+
+    struct stat        sockinfo;               /* Domain socket information */
+
+    if (!stat(CUPS_DEFAULT_DOMAINSOCKET, &sockinfo) &&
+       (sockinfo.st_mode & (S_IROTH | S_IWOTH)) == (S_IROTH | S_IWOTH))
+      cups_set_server_name(cc, CUPS_DEFAULT_DOMAINSOCKET);
+    else
+#endif /* CUPS_DEFAULT_DOMAINSOCKET */
+      cups_set_server_name(cc, "localhost");
+  }
+
+  if (!cc->user[0])
+  {
+#ifdef WIN32
+   /*
+    * Get the current user name from the OS...
+    */
+
+    DWORD      size;                   /* Size of string */
+
+    size = sizeof(cc->user);
+    if (!GetUserName(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)
     {
      /*
-      * Look for ~/.cups/client.conf...
+      * 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.
       */
 
-      snprintf(filename, sizeof(filename), "%s/.cups/client.conf", home);
-      fp = cupsFileOpen(filename, "r");
+      if ((pw = getpwnam(envuser)) != NULL && pw->pw_uid != getuid())
+       pw = NULL;
     }
-    else
-      fp = NULL;
 
-    if (!fp)
+    if (!pw)
+      pw = getpwuid(getuid());
+
+    if (pw)
+      strlcpy(cc->user, pw->pw_name, sizeof(cc->user));
+    else
+#endif /* WIN32 */
     {
      /*
-      * Look for CUPS_SERVERROOT/client.conf...
+      * Use the default "unknown" user name...
       */
 
-      snprintf(filename, sizeof(filename), "%s/client.conf",
-               cg->cups_serverroot);
-      fp = cupsFileOpen(filename, "r");
+      strlcpy(cc->user, "unknown", sizeof(cc->user));
     }
+  }
 
-   /*
-    * Read the configuration file and apply any environment variables; both
-    * functions handle NULL cups_file_t pointers...
-    */
+  if (cc->validate_certs < 0)
+    cc->validate_certs = 0;
+}
 
-    cups_read_client_conf(fp, cg, cups_encryption, cups_server, cups_user,
-#ifdef HAVE_GSSAPI
-                         cups_gssservicename,
-#endif /* HAVE_GSSAPI */
-                         cups_anyroot, cups_expiredroot,
-                         cups_expiredcerts);
-    cupsFileClose(fp);
-  }
+
+/*
+ * '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->encryption     = (http_encryption_t)-1;
+  cc->any_root       = -1;
+  cc->expired_certs  = -1;
+  cc->validate_certs = -1;
 }
 
 
@@ -850,33 +1099,12 @@ _cupsSetDefaults(void)
 
 static void
 cups_read_client_conf(
-    cups_file_t     *fp,               /* I - File to read */
-    _cups_globals_t *cg,               /* I - Global data */
-    const char      *cups_encryption,  /* I - CUPS_ENCRYPTION env var */
-    const char      *cups_server,      /* I - CUPS_SERVER env var */
-    const char      *cups_user,                /* I - CUPS_USER env var */
-#ifdef HAVE_GSSAPI
-    const char      *cups_gssservicename,
-                                       /* I - CUPS_GSSSERVICENAME env var */
-#endif /* HAVE_GSSAPI */
-    const char     *cups_anyroot,      /* I - CUPS_ANYROOT env var */
-    const char     *cups_expiredroot,  /* I - CUPS_EXPIREDROOT env var */
-    const char     *cups_expiredcerts) /* I - CUPS_EXPIREDCERTS env var */
+    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 */
-       encryption[1024],               /* Encryption value */
-#ifndef __APPLE__
-       server_name[1024],              /* ServerName value */
-#endif /* !__APPLE__ */
-       user[256],                      /* User value */
-       any_root[1024],                 /* AllowAnyRoot value */
-       expired_root[1024],             /* AllowExpiredRoot value */
-       expired_certs[1024];            /* AllowExpiredCerts value */
-#ifdef HAVE_GSSAPI
-  char gss_service_name[32];           /* GSSServiceName value */
-#endif /* HAVE_GSSAPI */
+        *value;                                /* Pointer into line */
 
 
  /*
@@ -886,176 +1114,176 @@ cups_read_client_conf(
   linenum = 0;
   while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
   {
-    if (!cups_encryption && cg->encryption == (http_encryption_t)-1 &&
-        !_cups_strcasecmp(line, "Encryption") && value)
-    {
-      strlcpy(encryption, value, sizeof(encryption));
-      cups_encryption = encryption;
-    }
+    if (!_cups_strcasecmp(line, "Encryption") && value)
+      cups_set_encryption(cc, value);
 #ifndef __APPLE__
    /*
-    * The Server directive is not supported on OS X due to app sandboxing
-    * restrictions, i.e. not all apps request network access.
+    * The ServerName directive is not supported on OS X due to app
+    * sandboxing restrictions, i.e. not all apps request network access.
     */
-    else if (!cups_server && (!cg->server[0] || !cg->ipp_port) &&
-             !_cups_strcasecmp(line, "ServerName") && value)
-    {
-      strlcpy(server_name, value, sizeof(server_name));
-      cups_server = server_name;
-    }
+    else if (!_cups_strcasecmp(line, "ServerName") && value)
+      cups_set_server_name(cc, value);
 #endif /* !__APPLE__ */
-    else if (!cups_user && !_cups_strcasecmp(line, "User") && value)
-    {
-      strlcpy(user, value, sizeof(user));
-      cups_user = user;
-    }
-    else if (!cups_anyroot && !_cups_strcasecmp(line, "AllowAnyRoot") && value)
-    {
-      strlcpy(any_root, value, sizeof(any_root));
-      cups_anyroot = any_root;
-    }
-    else if (!cups_expiredroot && !_cups_strcasecmp(line, "AllowExpiredRoot") &&
+    else if (!_cups_strcasecmp(line, "User") && value)
+      cups_set_user(cc, value);
+    else if (!_cups_strcasecmp(line, "AllowAnyRoot") && value)
+      cc->any_root = cups_boolean_value(value);
+    else if (!_cups_strcasecmp(line, "AllowExpiredCerts") &&
              value)
-    {
-      strlcpy(expired_root, value, sizeof(expired_root));
-      cups_expiredroot = expired_root;
-    }
-    else if (!cups_expiredcerts && !_cups_strcasecmp(line, "AllowExpiredCerts") &&
-             value)
-    {
-      strlcpy(expired_certs, value, sizeof(expired_certs));
-      cups_expiredcerts = expired_certs;
-    }
+      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_gssservicename && !_cups_strcasecmp(line, "GSSServiceName") &&
-             value)
-    {
-      strlcpy(gss_service_name, value, sizeof(gss_service_name));
-      cups_gssservicename = gss_service_name;
-    }
+    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 */
   }
+}
 
- /*
-  * Set values...
-  */
 
-  if (cg->encryption == (http_encryption_t)-1 && cups_encryption)
+/*
+ * '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 (!_cups_strcasecmp(cups_encryption, "never"))
-      cg->encryption = HTTP_ENCRYPT_NEVER;
-    else if (!_cups_strcasecmp(cups_encryption, "always"))
-      cg->encryption = HTTP_ENCRYPT_ALWAYS;
-    else if (!_cups_strcasecmp(cups_encryption, "required"))
-      cg->encryption = HTTP_ENCRYPT_REQUIRED;
-    else
-      cg->encryption = HTTP_ENCRYPT_IF_REQUESTED;
+    if ((cg->ipp_port = atoi(ipp_port)) <= 0)
+      cg->ipp_port = CUPS_DEFAULT_IPP_PORT;
   }
+  else
+    cg->ipp_port = CUPS_DEFAULT_IPP_PORT;
+}
 
-  if ((!cg->server[0] || !cg->ipp_port) && cups_server)
-    cupsSetServer(cups_server);
+/*
+ * 'cups_set_encryption()' - Set the Encryption value.
+ */
 
-  if (!cg->server[0])
-  {
-#ifdef CUPS_DEFAULT_DOMAINSOCKET
-   /*
-    * If we are compiled with domain socket support, only use the
-    * domain socket if it exists and has the right permissions...
-    */
+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;
+}
 
-    struct stat        sockinfo;               /* Domain socket information */
 
-    if (!stat(CUPS_DEFAULT_DOMAINSOCKET, &sockinfo) &&
-       (sockinfo.st_mode & S_IRWXO) == S_IRWXO)
-      cups_server = CUPS_DEFAULT_DOMAINSOCKET;
-    else
-#endif /* CUPS_DEFAULT_DOMAINSOCKET */
-      cups_server = "localhost";
+/*
+ * 'cups_set_gss_service_name()' - Set the GSSServiceName value.
+ */
 
-    cupsSetServer(cups_server);
-  }
+#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 */
 
-  if (!cg->ipp_port)
-  {
-    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_server_name()' - Set the ServerName value.
+ */
 
-  if (!cg->user[0])
-  {
-    if (cups_user)
-      strlcpy(cg->user, cups_user, sizeof(cg->user));
-    else
-    {
-#ifdef WIN32
-     /*
-      * Get the current user name from the OS...
-      */
+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));
+}
 
-      DWORD    size;                   /* Size of string */
 
-      size = sizeof(cg->user);
-      if (!GetUserName(cg->user, &size))
-#else
-     /*
-      * Get the user name corresponding to the current UID...
-      */
+/*
+ * 'cups_set_ssl_options()' - Set the SSLOptions value.
+ */
 
-      struct passwd    *pwd;           /* User/password entry */
+#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]
+  */
 
-      setpwent();
-      if ((pwd = getpwuid(getuid())) != NULL)
-      {
-       /*
-       * Found a match!
-       */
+  int  options = _HTTP_TLS_NONE;       /* SSL/TLS options */
+  char temp[256],                      /* Copy of value */
+       *start,                         /* Start of option */
+       *end;                           /* End of option */
 
-       strlcpy(cg->user, pwd->pw_name, sizeof(cg->user));
-      }
-      else
-#endif /* WIN32 */
-      {
-       /*
-       * Use the default "unknown" user name...
-       */
 
-       strcpy(cg->user, "unknown");
-      }
-    }
+  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"))
+      options |= _HTTP_TLS_ALLOW_SSL3;
+    else if (!_cups_strcasecmp(start, "AllowDH"))
+      options |= _HTTP_TLS_ALLOW_DH;
+    else if (!_cups_strcasecmp(start, "DenyTLS1.0"))
+      options |= _HTTP_TLS_DENY_TLS10;
+    else if (!_cups_strcasecmp(start, "None"))
+      options = _HTTP_TLS_NONE;
   }
 
-#ifdef HAVE_GSSAPI
-  if (!cups_gssservicename)
-    cups_gssservicename = CUPS_DEFAULT_GSSSERVICENAME;
+  cc->ssl_options = options;
 
-  strlcpy(cg->gss_service_name, cups_gssservicename,
-         sizeof(cg->gss_service_name));
-#endif /* HAVE_GSSAPI */
+  DEBUG_printf(("4cups_set_ssl_options(cc=%p, value=\"%s\") options=%x", cc, value, options));
+}
+#endif /* HAVE_SSL */
 
-  if (cups_anyroot)
-    cg->any_root = !_cups_strcasecmp(cups_anyroot, "yes") ||
-                  !_cups_strcasecmp(cups_anyroot, "on")  ||
-                  !_cups_strcasecmp(cups_anyroot, "true");
 
-  if (cups_expiredroot)
-    cg->expired_root  = !_cups_strcasecmp(cups_expiredroot, "yes") ||
-                       !_cups_strcasecmp(cups_expiredroot, "on")  ||
-                       !_cups_strcasecmp(cups_expiredroot, "true");
+/*
+ * 'cups_set_user()' - Set the User value.
+ */
 
-  if (cups_expiredcerts)
-    cg->expired_certs = !_cups_strcasecmp(cups_expiredcerts, "yes") ||
-                       !_cups_strcasecmp(cups_expiredcerts, "on")  ||
-                       !_cups_strcasecmp(cups_expiredcerts, "true");
+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));
 }
 
 
 /*
- * End of "$Id: usersys.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: usersys.c 12817 2015-07-30 15:45:46Z msweet $".
  */
index 87cf327..2e9f688 100644 (file)
@@ -1,54 +1,18 @@
 /*
- * "$Id: util.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: util.c 12884 2015-10-07 20:31:46Z msweet $"
  *
- *   Printing utilities for CUPS.
+ * Printing utilities for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsCancelJob()        - Cancel a print job on the default server.
- *   cupsCancelJob2()       - Cancel or purge a print job.
- *   cupsCreateJob()        - Create an empty job for streaming.
- *   cupsFinishDocument()   - Finish sending a document.
- *   cupsFreeJobs()         - Free memory used by job data.
- *   cupsGetClasses()       - Get a list of printer classes from the default
- *                            server.
- *   cupsGetDefault()       - Get the default printer or class for the default
- *                            server.
- *   cupsGetDefault2()      - Get the default printer or class for the specified
- *                            server.
- *   cupsGetJobs()          - Get the jobs from the default server.
- *   cupsGetJobs2()         - Get the jobs from the specified server.
- *   cupsGetPPD()           - Get the PPD file for a printer on the default
- *                            server.
- *   cupsGetPPD2()          - Get the PPD file for a printer from the specified
- *                            server.
- *   cupsGetPPD3()          - Get the PPD file for a printer on the specified
- *                            server if it has changed.
- *   cupsGetPrinters()      - Get a list of printers from the default server.
- *   cupsGetServerPPD()     - Get an available PPD file from the server.
- *   cupsPrintFile()        - Print a file to a printer or class on the default
- *                            server.
- *   cupsPrintFile2()       - Print a file to a printer or class on the
- *                            specified server.
- *   cupsPrintFiles()       - Print one or more files to a printer or class on
- *                            the default server.
- *   cupsPrintFiles2()      - Print one or more files to a printer or class on
- *                            the specified server.
- *   cupsStartDocument()    - Add a document to a job created with
- *                            cupsCreateJob().
- *   cups_get_printer_uri() - Get the printer-uri-supported attribute for the
- *                            first printer in a class.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -90,7 +54,7 @@ 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_REDIRECTION_OTHER_SITE);
+              < IPP_STATUS_REDIRECTION_OTHER_SITE);
 }
 
 
@@ -125,7 +89,7 @@ cupsCancelJob2(http_t     *http,     /* I - Connection to server or @code CUPS_HTTP_
 
   if (job_id < -1 || (!name && job_id == 0))
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     return (0);
   }
 
@@ -135,7 +99,7 @@ cupsCancelJob2(http_t     *http,     /* I - Connection to server or @code CUPS_HTTP_
 
   if (!http)
     if ((http = _cupsConnect()) == NULL)
-      return (IPP_SERVICE_UNAVAILABLE);
+      return (IPP_STATUS_ERROR_SERVICE_UNAVAILABLE);
 
  /*
   * Build an IPP_CANCEL_JOB or IPP_PURGE_JOBS request, which requires the following
@@ -148,7 +112,7 @@ cupsCancelJob2(http_t     *http,    /* I - Connection to server or @code CUPS_HTTP_
   *    [purge-job] or [purge-jobs]
   */
 
-  request = ippNewRequest(job_id < 0 ? IPP_PURGE_JOBS : IPP_CANCEL_JOB);
+  request = ippNewRequest(job_id < 0 ? IPP_OP_PURGE_JOBS : IPP_OP_CANCEL_JOB);
 
   if (name)
   {
@@ -223,7 +187,7 @@ cupsCreateJob(
 
   if (!name)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
     return (0);
   }
 
@@ -231,9 +195,9 @@ cupsCreateJob(
   * Build a Create-Job request...
   */
 
-  if ((request = ippNewRequest(IPP_CREATE_JOB)) == NULL)
+  if ((request = ippNewRequest(IPP_OP_CREATE_JOB)) == NULL)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOMEM), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0);
     return (0);
   }
 
@@ -248,6 +212,7 @@ cupsCreateJob(
   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);
 
@@ -323,7 +288,8 @@ cupsFreeJobs(int        num_jobs,   /* I - Number of jobs */
 /*
  * 'cupsGetClasses()' - Get a list of printer classes from the default server.
  *
- * This function is deprecated - use @link cupsGetDests@ instead.
+ * This function is deprecated and no longer returns a list of printer
+ * classes - use @link cupsGetDests@ instead.
  *
  * @deprecated@
  */
@@ -331,84 +297,10 @@ cupsFreeJobs(int        num_jobs, /* I - Number of jobs */
 int                                    /* O - Number of classes */
 cupsGetClasses(char ***classes)                /* O - Classes */
 {
-  int          n;                      /* Number of classes */
-  ipp_t                *request,               /* IPP Request */
-               *response;              /* IPP Response */
-  ipp_attribute_t *attr;               /* Current attribute */
-  char         **temp;                 /* Temporary pointer */
-  http_t       *http;                  /* Connection to server */
-
-
-  if (!classes)
-  {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
-
-    return (0);
-  }
+  if (classes)
+    *classes = NULL;
 
-  *classes = NULL;
-
-  if ((http = _cupsConnect()) == NULL)
-    return (0);
-
- /*
-  * Build a CUPS_GET_CLASSES request, which requires the following
-  * attributes:
-  *
-  *    attributes-charset
-  *    attributes-natural-language
-  *    requested-attributes
-  */
-
-  request = ippNewRequest(CUPS_GET_CLASSES);
-
-  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
-               "requested-attributes", NULL, "printer-name");
-
- /*
-  * Do the request and get back a response...
-  */
-
-  n = 0;
-
-  if ((response = cupsDoRequest(http, request, "/")) != NULL)
-  {
-    for (attr = response->attrs; attr != NULL; attr = attr->next)
-      if (attr->name != NULL &&
-          _cups_strcasecmp(attr->name, "printer-name") == 0 &&
-          attr->value_tag == IPP_TAG_NAME)
-      {
-        if (n == 0)
-         temp = malloc(sizeof(char *));
-       else
-         temp = realloc(*classes, sizeof(char *) * (n + 1));
-
-       if (temp == NULL)
-       {
-        /*
-         * Ran out of memory!
-         */
-
-          while (n > 0)
-         {
-           n --;
-           free((*classes)[n]);
-         }
-
-         free(*classes);
-         ippDelete(response);
-         return (0);
-       }
-
-        *classes = temp;
-        temp[n]  = strdup(attr->values[0].string.text);
-       n ++;
-      }
-
-    ippDelete(response);
-  }
-
-  return (n);
+  return (0);
 }
 
 
@@ -479,7 +371,7 @@ cupsGetDefault2(http_t *http)               /* I - Connection to server or @code CUPS_HTTP_DE
   *    attributes-natural-language
   */
 
-  request = ippNewRequest(CUPS_GET_DEFAULT);
+  request = ippNewRequest(IPP_OP_CUPS_GET_DEFAULT);
 
  /*
   * Do the request and get back a response...
@@ -585,7 +477,7 @@ cupsGetJobs2(http_t     *http,              /* I - Connection to server or @code CUPS_HTTP_D
 
   if (!jobs)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
 
     return (-1);
   }
@@ -597,15 +489,17 @@ cupsGetJobs2(http_t     *http,            /* I - Connection to server or @code CUPS_HTTP_D
   if (name)
   {
     if (httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
-                         "localhost", 0, "/printers/%s", name) != HTTP_URI_OK)
+                         "localhost", 0, "/printers/%s",
+                         name) < HTTP_URI_STATUS_OK)
     {
-      _cupsSetError(IPP_INTERNAL_ERROR, _("Unable to create printer-uri"), 1);
+      _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
+                    _("Unable to create printer-uri"), 1);
 
       return (-1);
     }
   }
   else
-    strcpy(uri, "ipp://localhost/");
+    strlcpy(uri, "ipp://localhost/", sizeof(uri));
 
   if (!http)
     if ((http = _cupsConnect()) == NULL)
@@ -624,7 +518,7 @@ cupsGetJobs2(http_t     *http,              /* I - Connection to server or @code CUPS_HTTP_D
   *    requested-attributes
   */
 
-  request = ippNewRequest(IPP_GET_JOBS);
+  request = ippNewRequest(IPP_OP_GET_JOBS);
 
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
                "printer-uri", NULL, uri);
@@ -674,7 +568,7 @@ cupsGetJobs2(http_t     *http,              /* I - Connection to server or @code CUPS_HTTP_D
       id              = 0;
       size            = 0;
       priority        = 50;
-      state           = IPP_JOB_PENDING;
+      state           = IPP_JSTATE_PENDING;
       user            = "unknown";
       dest            = NULL;
       format          = "application/octet-stream";
@@ -745,7 +639,7 @@ cupsGetJobs2(http_t     *http,              /* I - Connection to server or @code CUPS_HTTP_D
       if (n == 0)
         temp = malloc(sizeof(cups_job_t));
       else
-       temp = realloc(*jobs, sizeof(cups_job_t) * (n + 1));
+       temp = realloc(*jobs, sizeof(cups_job_t) * (size_t)(n + 1));
 
       if (!temp)
       {
@@ -753,7 +647,7 @@ cupsGetJobs2(http_t     *http,              /* I - Connection to server or @code CUPS_HTTP_D
         * Ran out of memory!
         */
 
-        _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+        _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
 
        cupsFreeJobs(n, *jobs);
        *jobs = NULL;
@@ -790,7 +684,7 @@ cupsGetJobs2(http_t     *http,              /* I - Connection to server or @code CUPS_HTTP_D
     ippDelete(response);
   }
 
-  if (n == 0 && cg->last_error >= IPP_BAD_REQUEST)
+  if (n == 0 && cg->last_error >= IPP_STATUS_ERROR_BAD_REQUEST)
     return (-1);
   else
     return (n);
@@ -822,7 +716,7 @@ cupsGetPPD(const char *name)                /* I - Destination name */
   cg->ppd_filename[0] = '\0';
 
   if (cupsGetPPD3(CUPS_HTTP_DEFAULT, name, &modtime, cg->ppd_filename,
-                  sizeof(cg->ppd_filename)) == HTTP_OK)
+                  sizeof(cg->ppd_filename)) == HTTP_STATUS_OK)
     return (cg->ppd_filename);
   else
     return (NULL);
@@ -853,7 +747,7 @@ cupsGetPPD2(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DE
   cg->ppd_filename[0] = '\0';
 
   if (cupsGetPPD3(http, name, &modtime, cg->ppd_filename,
-                  sizeof(cg->ppd_filename)) == HTTP_OK)
+                  sizeof(cg->ppd_filename)) == HTTP_STATUS_OK)
     return (cg->ppd_filename);
   else
     return (NULL);
@@ -873,8 +767,8 @@ cupsGetPPD2(http_t     *http,               /* I - Connection to server or @code CUPS_HTTP_DE
  * 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_OK@ is returned for a new PPD file and
- * @code HTTP_NOT_MODIFIED@ if the existing PPD file is up-to-date.  Any other
+ * 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
@@ -914,20 +808,20 @@ cupsGetPPD3(http_t     *http,             /* I  - HTTP connection or @code CUPS_HTTP_DEFAUL
 
   if (!name)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, _("No printer name"), 1);
-    return (HTTP_NOT_ACCEPTABLE);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No printer name"), 1);
+    return (HTTP_STATUS_NOT_ACCEPTABLE);
   }
 
   if (!modtime)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, _("No modification time"), 1);
-    return (HTTP_NOT_ACCEPTABLE);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No modification time"), 1);
+    return (HTTP_STATUS_NOT_ACCEPTABLE);
   }
 
   if (!buffer || bufsize <= 1)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, _("Bad filename buffer"), 1);
-    return (HTTP_NOT_ACCEPTABLE);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Bad filename buffer"), 1);
+    return (HTTP_STATUS_NOT_ACCEPTABLE);
   }
 
 #ifndef WIN32
@@ -952,10 +846,10 @@ cupsGetPPD3(http_t     *http,             /* I  - HTTP connection or @code CUPS_HTTP_DEFAUL
 
     snprintf(ppdname, sizeof(ppdname), "%s/ppd/%s.ppd", cg->cups_serverroot,
              name);
-    if (!stat(ppdname, &ppdinfo))
+    if (!stat(ppdname, &ppdinfo) && !access(ppdname, R_OK))
     {
      /*
-      * OK, the file exists, use it!
+      * OK, the file exists and is readable, use it!
       */
 
       if (buffer[0])
@@ -964,9 +858,9 @@ cupsGetPPD3(http_t     *http,               /* I  - HTTP connection or @code CUPS_HTTP_DEFAUL
 
        if (symlink(ppdname, buffer) && errno != EEXIST)
         {
-          _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+          _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
 
-         return (HTTP_SERVER_ERROR);
+         return (HTTP_STATUS_SERVER_ERROR);
        }
       }
       else
@@ -1024,18 +918,18 @@ cupsGetPPD3(http_t     *http,            /* I  - HTTP connection or @code CUPS_HTTP_DEFAUL
 
         if (tries >= 1000)
        {
-          _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+          _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
 
-         return (HTTP_SERVER_ERROR);
+         return (HTTP_STATUS_SERVER_ERROR);
        }
       }
 
       if (*modtime >= ppdinfo.st_mtime)
-        return (HTTP_NOT_MODIFIED);
+        return (HTTP_STATUS_NOT_MODIFIED);
       else
       {
         *modtime = ppdinfo.st_mtime;
-       return (HTTP_OK);
+       return (HTTP_STATUS_OK);
       }
     }
   }
@@ -1047,15 +941,27 @@ cupsGetPPD3(http_t     *http,            /* I  - HTTP connection or @code CUPS_HTTP_DEFAUL
 
   if (!http)
     if ((http = _cupsConnect()) == NULL)
-      return (HTTP_SERVICE_UNAVAILABLE);
+      return (HTTP_STATUS_SERVICE_UNAVAILABLE);
 
   if (!cups_get_printer_uri(http, name, hostname, sizeof(hostname), &port,
                             resource, sizeof(resource), 0))
-    return (HTTP_NOT_FOUND);
+    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...
   */
@@ -1065,14 +971,14 @@ cupsGetPPD3(http_t     *http,            /* I  - HTTP connection or @code CUPS_HTTP_DEFAUL
   DEBUG_printf(("2cupsGetPPD3: Local hostname=\"%s\"", localhost));
 
   if (!_cups_strcasecmp(localhost, hostname))
-    strcpy(hostname, "localhost");
+    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);
+  http_port = httpAddrPort(http->hostaddr);
 
   DEBUG_printf(("2cupsGetPPD3: Connection hostname=\"%s\", port=%d",
                 http_hostname, http_port));
@@ -1083,12 +989,12 @@ cupsGetPPD3(http_t     *http,            /* I  - HTTP connection or @code CUPS_HTTP_DEFAUL
 
   if (!_cups_strcasecmp(http_hostname, hostname) && port == http_port)
     http2 = http;
-  else if ((http2 = httpConnectEncrypt(hostname, port,
-                                       cupsEncryption())) == NULL)
+  else if ((http2 = httpConnect2(hostname, port, NULL, AF_UNSPEC,
+                                cupsEncryption(), 1, 30000, NULL)) == NULL)
   {
     DEBUG_puts("1cupsGetPPD3: Unable to connect to server");
 
-    return (HTTP_SERVICE_UNAVAILABLE);
+    return (HTTP_STATUS_SERVICE_UNAVAILABLE);
   }
 
  /*
@@ -1106,12 +1012,12 @@ cupsGetPPD3(http_t     *http,           /* I  - HTTP connection or @code CUPS_HTTP_DEFAUL
     * Can't open file; close the server connection and return NULL...
     */
 
-    _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
 
     if (http2 != http)
       httpClose(http2);
 
-    return (HTTP_SERVER_ERROR);
+    return (HTTP_STATUS_SERVER_ERROR);
   }
 
  /*
@@ -1132,14 +1038,14 @@ cupsGetPPD3(http_t     *http,           /* I  - HTTP connection or @code CUPS_HTTP_DEFAUL
   * See if we actually got the file or an error...
   */
 
-  if (status == HTTP_OK)
+  if (status == HTTP_STATUS_OK)
   {
     *modtime = httpGetDateTime(httpGetField(http2, HTTP_FIELD_DATE));
 
     if (tempfile[0])
       strlcpy(buffer, tempfile, bufsize);
   }
-  else if (status != HTTP_NOT_MODIFIED)
+  else if (status != HTTP_STATUS_NOT_MODIFIED)
   {
     _cupsSetHTTPError(status);
 
@@ -1167,7 +1073,8 @@ cupsGetPPD3(http_t     *http,             /* I  - HTTP connection or @code CUPS_HTTP_DEFAUL
 /*
  * 'cupsGetPrinters()' - Get a list of printers from the default server.
  *
- * This function is deprecated - use @link cupsGetDests@ instead.
+ * This function is deprecated and no longer returns a list of printers - use
+ * @link cupsGetDests@ instead.
  *
  * @deprecated@
  */
@@ -1175,98 +1082,10 @@ cupsGetPPD3(http_t     *http,           /* I  - HTTP connection or @code CUPS_HTTP_DEFAUL
 int                                    /* O - Number of printers */
 cupsGetPrinters(char ***printers)      /* O - Printers */
 {
-  int          n;                      /* Number of printers */
-  ipp_t                *request,               /* IPP Request */
-               *response;              /* IPP Response */
-  ipp_attribute_t *attr;               /* Current attribute */
-  char         **temp;                 /* Temporary pointer */
-  http_t       *http;                  /* Connection to server */
+  if (printers)
+    *printers = NULL;
 
-
- /*
-  * Range check input...
-  */
-
-  if (!printers)
-  {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
-
-    return (0);
-  }
-
-  *printers = NULL;
-
- /*
-  * Try to connect to the server...
-  */
-
-  if ((http = _cupsConnect()) == NULL)
-    return (0);
-
- /*
-  * Build a CUPS_GET_PRINTERS request, which requires the following
-  * attributes:
-  *
-  *    attributes-charset
-  *    attributes-natural-language
-  *    requested-attributes
-  */
-
-  request = ippNewRequest(CUPS_GET_PRINTERS);
-
-  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
-               "requested-attributes", NULL, "printer-name");
-
-  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);
-
- /*
-  * Do the request and get back a response...
-  */
-
-  n = 0;
-
-  if ((response = cupsDoRequest(http, request, "/")) != NULL)
-  {
-    for (attr = response->attrs; attr != NULL; attr = attr->next)
-      if (attr->name != NULL &&
-          _cups_strcasecmp(attr->name, "printer-name") == 0 &&
-          attr->value_tag == IPP_TAG_NAME)
-      {
-        if (n == 0)
-         temp = malloc(sizeof(char *));
-       else
-         temp = realloc(*printers, sizeof(char *) * (n + 1));
-
-       if (temp == NULL)
-       {
-        /*
-         * Ran out of memory!
-         */
-
-         while (n > 0)
-         {
-           n --;
-           free((*printers)[n]);
-         }
-
-         free(*printers);
-         ippDelete(response);
-         return (0);
-       }
-
-        *printers = temp;
-        temp[n]   = strdup(attr->values[0].string.text);
-       n ++;
-      }
-
-    ippDelete(response);
-  }
-
-  return (n);
+  return (0);
 }
 
 
@@ -1301,7 +1120,7 @@ cupsGetServerPPD(http_t     *http,        /* I - Connection to server or @code CUPS_HTT
 
   if (!name)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, _("No PPD name"), 1);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("No PPD name"), 1);
 
     return (NULL);
   }
@@ -1320,7 +1139,7 @@ cupsGetServerPPD(http_t     *http,        /* I - Connection to server or @code CUPS_HTT
     * Can't open file; close the server connection and return NULL...
     */
 
-    _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
 
     return (NULL);
   }
@@ -1329,7 +1148,7 @@ cupsGetServerPPD(http_t     *http,        /* I - Connection to server or @code CUPS_HTT
   * Get the PPD file...
   */
 
-  request = ippNewRequest(CUPS_GET_PPD);
+  request = ippNewRequest(IPP_OP_CUPS_GET_PPD);
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name", NULL,
                name);
 
@@ -1337,7 +1156,7 @@ cupsGetServerPPD(http_t     *http,        /* I - Connection to server or @code CUPS_HTT
 
   close(fd);
 
-  if (cupsLastError() != IPP_OK)
+  if (cupsLastError() != IPP_STATUS_OK)
   {
     unlink(cg->ppd_filename);
     return (NULL);
@@ -1459,7 +1278,7 @@ cupsPrintFiles2(
 
   if (!name || num_files < 1 || !files)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
 
     return (0);
   }
@@ -1498,20 +1317,20 @@ cupsPrintFiles2(
       * Unable to open print file, cancel the job and return...
       */
 
-      _cupsSetError(IPP_DOCUMENT_ACCESS_ERROR, NULL, 0);
+      _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_CONTINUE &&
+    while (status == HTTP_STATUS_CONTINUE &&
           (bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0)
-      status = cupsWriteRequestData(http, buffer, bytes);
+      status = cupsWriteRequestData(http, buffer, (size_t)bytes);
 
     cupsFileClose(fp);
 
-    if (status != HTTP_CONTINUE || cupsFinishDocument(http, name) != IPP_OK)
+    if (status != HTTP_STATUS_CONTINUE || cupsFinishDocument(http, name) != IPP_STATUS_OK)
     {
      /*
       * Unable to queue, cancel the job and return...
@@ -1577,10 +1396,10 @@ cupsStartDocument(
   * Create a Send-Document request...
   */
 
-  if ((request = ippNewRequest(IPP_SEND_DOCUMENT)) == NULL)
+  if ((request = ippNewRequest(IPP_OP_SEND_DOCUMENT)) == NULL)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOMEM), 0);
-    return (HTTP_ERROR);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOMEM), 0);
+    return (HTTP_STATUS_ERROR);
   }
 
   httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), "ipp",
@@ -1598,7 +1417,7 @@ cupsStartDocument(
   if (format)
     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE,
                  "document-format", NULL, format);
-  ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", last_document);
+  ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", (char)last_document);
 
  /*
   * Send and delete the request, then return the status...
@@ -1649,18 +1468,15 @@ cups_get_printer_uri(
                };
 
 
-  DEBUG_printf(("7cups_get_printer_uri(http=%p, name=\"%s\", host=%p, "
-                "hostsize=%d, resource=%p, resourcesize=%d, depth=%d)",
-               http, name, host, hostsize, resource, resourcesize, depth));
+  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_OK)
+  if (httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", name) < HTTP_URI_STATUS_OK)
   {
-    _cupsSetError(IPP_INTERNAL_ERROR, _("Unable to create printer-uri"), 1);
+    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unable to create printer-uri"), 1);
 
     *host     = '\0';
     *resource = '\0';
@@ -1668,14 +1484,16 @@ cups_get_printer_uri(
     return (0);
   }
 
-  DEBUG_printf(("9cups_get_printer_uri: printer-uri=\"%s\"", uri));
+  DEBUG_printf(("5cups_get_printer_uri: printer-uri=\"%s\"", uri));
 
  /*
   * Get the hostname and port number we are connected to...
   */
 
   httpGetHostname(http, http_hostname, sizeof(http_hostname));
-  http_port = _httpAddrPort(http->hostaddr);
+  http_port = httpAddrPort(http->hostaddr);
+
+  DEBUG_printf(("5cups_get_printer_uri: http_hostname=\"%s\"", http_hostname));
 
  /*
   * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
@@ -1687,62 +1505,57 @@ cups_get_printer_uri(
   *    requested-attributes
   */
 
-  request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+  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_URI, "printer-uri", NULL, uri);
 
-  ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
-                "requested-attributes",
-               sizeof(requested_attrs) / sizeof(requested_attrs[0]),
-               NULL, requested_attrs);
+  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, resourcesize, "/printers/%s", name);
+  snprintf(resource, (size_t)resourcesize, "/printers/%s", name);
 
   if ((response = cupsDoRequest(http, request, resource)) != NULL)
   {
     const char *device_uri = NULL;     /* device-uri value */
 
-    if ((attr = ippFindAttribute(response, "device-uri",
-                                 IPP_TAG_URI)) != NULL)
+    if ((attr = ippFindAttribute(response, "device-uri", IPP_TAG_URI)) != NULL)
+    {
       device_uri = attr->values[0].string.text;
+      DEBUG_printf(("5cups_get_printer_uri: device-uri=\"%s\"", device_uri));
+    }
 
     if (device_uri &&
-        (!strncmp(device_uri, "ipp://", 6) ||
-         !strncmp(device_uri, "ipps://", 7) ||
-         ((strstr(device_uri, "._ipp.") != NULL ||
-           strstr(device_uri, "._ipps.") != NULL) &&
+        (((!strncmp(device_uri, "ipp://", 6) || !strncmp(device_uri, "ipps://", 7)) &&
+         (strstr(device_uri, "/printers/") != NULL || strstr(device_uri, "/classes/") != NULL)) ||
+         ((strstr(device_uri, "._ipp.") != NULL || strstr(device_uri, "._ipps.") != NULL) &&
           !strcmp(device_uri + strlen(device_uri) - 5, "/cups"))))
     {
      /*
       * Statically-configured shared printer.
       */
 
-      httpSeparateURI(HTTP_URI_CODING_ALL,
-                      _httpResolveURI(device_uri, uri, sizeof(uri),
-                                      _HTTP_RESOLVE_DEFAULT, NULL, NULL),
-                      scheme, sizeof(scheme), username, sizeof(username),
-                     host, hostsize, port, resource, resourcesize);
+      httpSeparateURI(HTTP_URI_CODING_ALL, _httpResolveURI(device_uri, 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));
       return (1);
     }
-    else if ((attr = ippFindAttribute(response, "member-uris",
-                                      IPP_TAG_URI)) != NULL)
+    else 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 ++)
       {
-       httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[i].string.text,
-                       scheme, sizeof(scheme), username, sizeof(username),
-                       host, hostsize, port, resource, resourcesize);
+        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))
        {
         /*
@@ -1751,6 +1564,7 @@ cups_get_printer_uri(
 
           ippDelete(response);
 
+         DEBUG_printf(("5cups_get_printer_uri: Found printer member with host=\"%s\", port=%d, resource=\"%s\"", host, *port, resource));
          return (1);
        }
       }
@@ -1775,8 +1589,7 @@ cups_get_printer_uri(
 
            if (!_cups_strcasecmp(http_hostname, host) && *port == http_port)
              http2 = http;
-           else if ((http2 = httpConnectEncrypt(host, *port,
-                                                cupsEncryption())) == NULL)
+           else if ((http2 = httpConnect2(host, *port, NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL)) == NULL)
            {
              DEBUG_puts("8cups_get_printer_uri: Unable to connect to server");
 
@@ -1805,25 +1618,21 @@ cups_get_printer_uri(
        }
       }
     }
-    else if ((attr = ippFindAttribute(response, "printer-uri-supported",
-                                      IPP_TAG_URI)) != NULL)
+    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);
+      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_INTERNAL_ERROR,
-                     _("No printer-uri found for class"), 1);
+        _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);
       }
 
@@ -1833,16 +1642,17 @@ cups_get_printer_uri(
     ippDelete(response);
   }
 
-  if (cupsLastError() != IPP_NOT_FOUND)
-    _cupsSetError(IPP_INTERNAL_ERROR, _("No printer-uri found"), 1);
+  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);
 }
 
 
 /*
- * End of "$Id: util.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: util.c 12884 2015-10-07 20:31:46Z msweet $".
  */
index 9ccf18f..1e661df 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: versioning.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: versioning.h 12418 2015-01-22 15:49:23Z msweet $"
  *
  *   API versioning definitions for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
+ *   Copyright 2007-2013 by Apple Inc.
  *
  *   These coded instructions, statements, and computer programs are the
  *   property of Apple Inc. and are protected by Federal copyright
 
 /*
  * This header defines several constants - _CUPS_DEPRECATED,
- * _CUPS_API_1_1, _CUPS_API_1_1_19, _CUPS_API_1_1_20, _CUPS_API_1_1_21,
- * _CUPS_API_1_2, _CUPS_API_1_3, _CUPS_API_1_4, _CUPS_API_1_5, _CUPS_API_1_6 -
- * which add compiler-specific attributes that flag functions that are
- * deprecated or added in particular releases.
+ * _CUPS_DEPRECATED_MSG, _CUPS_INTERNAL_MSG, _CUPS_API_1_1, _CUPS_API_1_1_19,
+ * _CUPS_API_1_1_20, _CUPS_API_1_1_21, _CUPS_API_1_2, _CUPS_API_1_3,
+ * _CUPS_API_1_4, _CUPS_API_1_5, _CUPS_API_1_6, _CUPS_API_1_7, and
+ * _CUPS_API_2_0 - which add compiler-specific attributes that flag functions
+ * that are deprecated, added in particular releases, or internal to CUPS.
  *
  * On OS X, the _CUPS_API_* constants are defined based on the values of
  * the MAC_OS_X_VERSION_MIN_ALLOWED and MAC_OS_X_VERSION_MAX_ALLOWED constants
 #    ifndef AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER
 #      define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER __attribute__((unavailable))
 #    endif /* !AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER */
+#    ifndef AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER
+#      define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER __attribute__((unavailable))
+#    endif /* !AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER */
+#    ifndef AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER
+#      define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER __attribute__((unavailable))
+#    endif /* !AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER */
 #    define _CUPS_API_1_1_19 AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER
 #    define _CUPS_API_1_1_20 AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER
 #    define _CUPS_API_1_1_21 AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER
@@ -56,7 +63,9 @@
 #    define _CUPS_API_1_3 AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER
 #    define _CUPS_API_1_4 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
 #    define _CUPS_API_1_5 AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
-#    define _CUPS_API_1_6
+#    define _CUPS_API_1_6 AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER
+#    define _CUPS_API_1_7 AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER
+#    define _CUPS_API_2_0 AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER
 #  else
 #    define _CUPS_API_1_1_19
 #    define _CUPS_API_1_1_20
 #    define _CUPS_API_1_4
 #    define _CUPS_API_1_5
 #    define _CUPS_API_1_6
+#    define _CUPS_API_1_7
+#    define _CUPS_API_2_0
 #  endif /* __APPLE__ && !_CUPS_SOURCE */
 
 /*
- * With GCC 3.0 and higher, we can mark old APIs "deprecated" so you get
- * a warning at compile-time.
+ * With GCC and Clang we can mark old APIs as "deprecated" or "unavailable" with
+ * messages so you get warnings/errors are compile-time...
  */
 
-#  if defined(__GNUC__) && __GNUC__ > 2 && !defined(_CUPS_SOURCE)
-#    define _CUPS_DEPRECATED __attribute__ ((__deprecated__))
-#  else
+#  ifdef __has_extension               /* Clang */
+#    define _CUPS_HAS_DEPRECATED
+#    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
+#    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 */
+#  endif /* __has_extension */
+
+#  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
-#  endif /* __GNUC__ && __GNUC__ > 2 && !_CUPS_SOURCE */
+#    define _CUPS_DEPRECATED_MSG(m)
+#    define _CUPS_DEPRECATED_1_6_MSG(m)
+#    define _CUPS_DEPRECATED_1_7_MSG(m)
+#    define _CUPS_INTERNAL_MSG(m)
+#  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))
+#    define _CUPS_DEPRECATED_MSG(m) __attribute__ ((unavailable(m)))
+#    define _CUPS_DEPRECATED_1_6_MSG(m) __attribute__ ((unavailable(m)))
+#    define _CUPS_DEPRECATED_1_7_MSG(m) __attribute__ ((unavailable(m)))
+#    define _CUPS_INTERNAL_MSG(m) __attribute__ ((unavailable(m)))
+#  else
+    /*
+     * Compiler supports the deprecated attribute, so use it.
+     */
+#    define _CUPS_DEPRECATED __attribute__ ((deprecated))
+#    ifdef _CUPS_HAS_DEPRECATED_WITH_MESSAGE
+#      define _CUPS_DEPRECATED_MSG(m) __attribute__ ((deprecated(m)))
+#    else
+#      define _CUPS_DEPRECATED_MSG(m) __attribute__ ((deprecated))
+#    endif /* _CUPS_HAS_DEPRECATED_WITH_MESSAGE */
+#    if defined(MAC_OS_X_VERSION_10_8) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_8
+#      define _CUPS_DEPRECATED_1_6_MSG(m) _CUPS_DEPRECATED_MSG(m)
+#    else
+#      define _CUPS_DEPRECATED_1_6_MSG(m)
+#    endif /* MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_8 */
+#    if defined(MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9
+#      define _CUPS_DEPRECATED_1_7_MSG(m) _CUPS_DEPRECATED_MSG(m)
+#    else
+#      define _CUPS_DEPRECATED_1_7_MSG(m)
+#    endif /* MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_9 */
+#    ifdef _CUPS_SOURCE
+#      define _CUPS_INTERNAL_MSG(m)
+#    elif defined(_CUPS_HAS_UNAVAILABLE_WITH_MESSAGE)
+#      define _CUPS_INTERNAL_MSG(m) __attribute__ ((unavailable(m)))
+#    elif defined(_CUPS_HAS_DEPRECATED_WITH_MESSAGE)
+#      define _CUPS_INTERNAL_MSG(m) __attribute__ ((deprecated(m)))
+#    else
+#      define _CUPS_INTERNAL_MSG(m) __attribute__ ((deprecated))
+#    endif /* _CUPS_SOURCE */
+#  endif /* !_CUPS_HAS_DEPRECATED || (_CUPS_SOURCE && !_CUPS_NO_DEPRECATED) */
 
 #  ifndef __GNUC__
 #    define __attribute__(x)
 #endif /* !_CUPS_VERSIONING_H_ */
 
 /*
- * End of "$Id: versioning.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: versioning.h 12418 2015-01-22 15:49:23Z msweet $".
  */
index 5adc9e9..484dc26 100644 (file)
@@ -1,9 +1,9 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12278 2014-12-01 13:53:56Z msweet $"
 #
 #   Datafile makefile for CUPS.
 #
-#   Copyright 2007-2011 by Apple Inc.
+#   Copyright 2007-2014 by Apple Inc.
 #   Copyright 1993-2006 by Easy Software Products.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -19,17 +19,6 @@ include ../Makedefs
 # Data files...
 #
 
-BANNERS        =       \
-               classified \
-               confidential \
-               secret \
-               standard \
-               topsecret \
-               unclassified
-
-DATAFILES =    \
-               testprint
-
 PPDCFILES =    \
                epson.h \
                font.defs \
@@ -87,13 +76,7 @@ install:     all install-data install-headers install-libs install-exec
 
 install-data:
        $(INSTALL_DIR) -m 755 $(DATADIR)/banners
-       for file in $(BANNERS); do \
-               $(INSTALL_DATA) $$file $(DATADIR)/banners; \
-       done
        $(INSTALL_DIR) -m 755 $(DATADIR)/data
-       for file in $(DATAFILES); do \
-               $(INSTALL_DATA) $$file $(DATADIR)/data; \
-       done
        $(INSTALL_DIR) -m 755 $(DATADIR)/model
        $(INSTALL_DIR) -m 755 $(DATADIR)/ppdc
        for file in $(PPDCFILES); do \
@@ -128,12 +111,6 @@ install-libs:
 #
 
 uninstall:
-       for file in $(BANNERS); do \
-               $(RM) $(DATADIR)/banners/$$file; \
-       done
-       for file in $(DATAFILES); do \
-               $(RM) $(DATADIR)/data/$$file; \
-       done
        for file in $(PPDCFILES); do \
                $(RM) $(DATADIR)/ppdc/$$file; \
        done
@@ -146,5 +123,5 @@ uninstall:
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12278 2014-12-01 13:53:56Z msweet $".
 #
diff --git a/data/classified b/data/classified
deleted file mode 100644 (file)
index ca01a13..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#CUPS-BANNER
-Show job-id job-name job-originating-user-name job-originating-host-name job-billing
-Header Classified
-Footer Classified
-Image images/cups.png
-
diff --git a/data/confidential b/data/confidential
deleted file mode 100644 (file)
index f1f0d85..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#CUPS-BANNER
-Show job-id job-name job-originating-user-name job-originating-host-name job-billing
-Header Confidential
-Footer Confidential
-Image images/cups.png
-
index ee6b8af..1b0fe9f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: epson.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: epson.h 624 2008-02-16 00:27:39Z msweet $"
  *
  *   This file contains model number definitions for the CUPS sample
  *   ESC/P driver.
@@ -23,5 +23,5 @@
 
 
 /*
- * End of "$Id: epson.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: epson.h 624 2008-02-16 00:27:39Z msweet $".
  */
index 30de578..3a5ba3d 100644 (file)
--- a/data/hp.h
+++ b/data/hp.h
@@ -1,5 +1,5 @@
 /*
- * "$Id: hp.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: hp.h 624 2008-02-16 00:27:39Z msweet $"
  *
  *   This file contains model number definitions for the CUPS sample
  *   HP driver.
@@ -20,5 +20,5 @@
 
 
 /*
- * End of "$Id: hp.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: hp.h 624 2008-02-16 00:27:39Z msweet $".
  */
index 23450de..38cdc37 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: label.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: label.h 624 2008-02-16 00:27:39Z msweet $"
  *
  *   This file contains model number definitions for the CUPS sample
  *   label printer driver.
@@ -24,5 +24,5 @@
 #define INTELLITECH_PCL        0x20            /* Intellitech PCL-based printers */
 
 /*
- * End of "$Id: label.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: label.h 624 2008-02-16 00:27:39Z msweet $".
  */
diff --git a/data/secret b/data/secret
deleted file mode 100644 (file)
index 66a0e8a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#CUPS-BANNER
-Show job-id job-name job-originating-user-name job-originating-host-name job-billing
-Header Secret
-Footer Secret
-Image images/cups.png
-
diff --git a/data/standard b/data/standard
deleted file mode 100644 (file)
index 31c68a0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#CUPS-BANNER
-Show job-id job-name job-originating-user-name job-originating-host-name job-billing
-Header Cover Page
-Footer Cover Page
-Image images/cups.png
-
diff --git a/data/testprint.in b/data/testprint.in
deleted file mode 100644 (file)
index 8cee3ab..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#CUPS-BANNER
-Show printer-name printer-info printer-location printer-make-and-model printer-driver-name printer-driver-version paper-size imageable-area
-Header Printer Test Page
-Footer Printer Test Page
-Notice CUPS @CUPS_VERSION@.
-Image images/cups.png
-Image images/color-wheel.png
diff --git a/data/topsecret b/data/topsecret
deleted file mode 100644 (file)
index d2b87fa..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#CUPS-BANNER
-Show job-id job-name job-originating-user-name job-originating-host-name job-billing
-Header Top Secret
-Footer Top Secret
-Image images/cups.png
-
diff --git a/data/unclassified b/data/unclassified
deleted file mode 100644 (file)
index 2d1a7d0..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#CUPS-BANNER
-Show job-id job-name job-originating-user-name job-originating-host-name job-billing
-Header Unclassified
-Footer Unclassified
-Image images/cups.png
-
index e382636..c4fdd76 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 1725 2009-10-15 18:50:47Z msweet $"
 #
 #   Desktop makefile for CUPS.
 #
@@ -131,5 +131,5 @@ uninstall:
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 1725 2009-10-15 18:50:47Z msweet $".
 #
index c726747..a6ba24d 100644 (file)
@@ -1,16 +1,16 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 11930 2014-06-16 15:33:00Z msweet $"
 #
-#   Documentation makefile for CUPS.
+# Documentation makefile for CUPS.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 1997-2007 by Easy Software Products.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 include ../Makedefs
@@ -20,6 +20,7 @@ include ../Makedefs
 #
 
 WEBPAGES       =       \
+                       apple-touch-icon.png \
                        cups.css \
                        cups-printable.css \
                        index.html \
@@ -61,14 +62,21 @@ HELPFILES   =       \
                        help/glossary.html \
                        help/kerberos.html \
                        help/license.html \
-                       help/man-cupsaccept.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-cupsaddsmb.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-cupstestdsc.html \
                        help/man-cupstestppd.html \
@@ -81,7 +89,6 @@ HELPFILES     =       \
                        help/man-lpinfo.html \
                        help/man-lpmove.html \
                        help/man-lpoptions.html \
-                       help/man-lppasswd.html \
                        help/man-lpq.html \
                        help/man-lpr.html \
                        help/man-lprm.html \
@@ -94,6 +101,8 @@ HELPFILES    =       \
                        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 \
@@ -101,22 +110,10 @@ HELPFILES =       \
                        help/postscript-driver.html \
                        help/ppd-compiler.html \
                        help/raster-driver.html \
-                       help/ref-access_log.html \
-                       help/ref-classes-conf.html \
-                       help/ref-client-conf.html \
-                       help/ref-cupsd-conf.html \
-                       help/ref-cups-files-conf.html \
-                       help/ref-error_log.html \
-                       help/ref-mailto-conf.html \
-                       help/ref-page_log.html \
                        help/ref-ppdcfile.html \
-                       help/ref-printers-conf.html \
-                       help/ref-snmp-conf.html \
-                       help/ref-subscriptions-conf.html \
                        help/security.html \
                        help/sharing.html \
                        help/spec-banner.html \
-                       help/spec-browsing.html \
                        help/spec-cmp.html \
                        help/spec-command.html \
                        help/spec-design.html \
@@ -126,9 +123,7 @@ HELPFILES   =       \
                        help/spec-ppd.html \
                        help/spec-raster.html \
                        help/spec-stp.html \
-                       help/standard.html \
-                       help/translation.html \
-                       help/whatsnew.html
+                       help/translation.html
 
 
 #
diff --git a/doc/apple-touch-icon.opacity b/doc/apple-touch-icon.opacity
new file mode 100644 (file)
index 0000000..a1d742d
Binary files /dev/null and b/doc/apple-touch-icon.opacity differ
diff --git a/doc/apple-touch-icon.png b/doc/apple-touch-icon.png
new file mode 100644 (file)
index 0000000..e4d8f81
Binary files /dev/null and b/doc/apple-touch-icon.png differ
diff --git a/doc/ca/index.html.in b/doc/ca/index.html.in
deleted file mode 100644 (file)
index 77542d3..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>Inici - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;Inici&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;Administració&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;Classes&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;Ajuda&nbsp;en&nbsp;línia&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;Tasques&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;Impressores&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS és el sistema d'impressió de codi obert i basat en estandards desenvolupat per
-<A HREF="http://www.apple.com/">Apple Inc.</A> per OS<SUP>&reg;</SUP> X and
-altres sistemes operatius basats en UNIX<SUP>&reg;</SUP></P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>CUPS per usuaris</H2>
-
-<P><A HREF="help/overview.html">Descripció general del CUPS</A></P>
-
-<P><A HREF="help/options.html">Impresió i opcions en linia de comandes</A></P>
-
-<P><A HREF="help/whatsnew.html">Novetats del CUPS 1.4</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Fòrum d'usuaris</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>CUPS per Administradors</H2>
-
-<P><A HREF="admin">Afegir impressores i classes</A></P>
-
-<P><A HREF="help/policies.html">Gestió de les polítiques de treball</A></P>
-
-<P><A HREF="help/accounting.html">Bàsic de comptes d'impressió</A></P>
-
-<P><A HREF="help/security.html">Seguritat del servidor</A></P>
-
-<P><A HREF="help/kerberos.html">Ús d'autenticació amb el Kerberos</A></P>
-
-<P><A HREF="help/network.html">Ús d'impressores en xarxa</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">Referència del cupsd.conf</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">Cerca de controladors d'impressora</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>CUPS per desenvolupadors</H2>
-
-<P><A HREF="help/api-overview.html">Introducció a la programació amb CUPS</A></P>
-
-<P><A HREF="help/api-cups.html">La API de CUPS</A></P>
-
-<P><A HREF="help/api-filter.html">Programació de filtres i rerefons</A></P>
-
-<P><A HREF="help/api-httpipp.html">APIs per HTTP i IPP</A></P>
-
-<P><A HREF="help/api-ppd.html">API per PPD</A></P>
-
-<P><A HREF="help/api-raster.html">API per Raster</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">Referència del fitxer d'inf. del compilador del controlador per PPD</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Fòrum de desenvolupadors</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS i el seu logotip són marques registrades de
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS té copyright 2007-2013 d'Apple
-Inc. Tots els drets reservats.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
diff --git a/doc/cs/index.html.in b/doc/cs/index.html.in
deleted file mode 100644 (file)
index 38f4a6f..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>Hlavní strana - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;Hlavní strana&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;Administrace&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;Třídy tiskáren&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;Nápověda&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;Úlohy&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;Tiskárny&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Hledat"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS je na bázi standardů otevřený zdrojový kód tiskového systému vyvinutý
-společností <A HREF="http://www.apple.com/">Apple Inc.</A> pro Mac OS<SUP>&reg;</SUP>
-X a jiné UNIX<SUP>&reg;</SUP>ové operační systémy.</P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>CUPS pro uživatele</H2>
-
-<P><A HREF="help/overview.html">Popis CUPS</A></P>
-
-<P><A HREF="help/options.html">Příkazová řádka tisku a Možnosti</A></P>
-
-<P><A HREF="help/whatsnew.html">Co je nového v CUPS 1.6</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Uživatelské fórum</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>CUPS pro administrátory</H2>
-
-<P><A HREF="admin">Přidání tiskáren a tříd</A></P>
-
-<P><A HREF="help/policies.html">Správa politik</A></P>
-
-<P><A HREF="help/accounting.html">Základní účtování tiskáren</A></P>
-
-<P><A HREF="help/security.html">Zabezpečení serveru</A></P>
-
-<P><A HREF="help/kerberos.html">Použití ověřování pomocí protokolu Kerberos</A></P>
-
-<P><A HREF="help/network.html">Použití síťových tiskáren</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">Konfigurační soubor cupsd.conf</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">Hedat ovladače tiskárny</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>CUPS pro vývojáře</H2>
-
-<P><A HREF="help/api-overview.html">Úvod do CUPS programování</A></P>
-
-<P><A HREF="help/api-cups.html">CUPS API knihovny</A></P>
-
-<P><A HREF="help/api-filter.html">Programování filtrů a backendů</A></P>
-
-<P><A HREF="help/api-httpipp.html">HTTP a IPP API knihovny</A></P>
-
-<P><A HREF="help/api-ppd.html">PPD API knihovny</A></P>
-
-<P><A HREF="help/api-raster.html">Raster API knihovny</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">PPD kompilátor Driver Information File Reference</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Vývojářské fórum</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS a logo CUPS jsou ochranné známky společnosti
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS je chráněn autorskými
-právy 2007-2013 Apple Inc. Všechna práva vyhrazena.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
index 42ea2be..262e625 100644 (file)
@@ -29,7 +29,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -68,7 +80,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
index 815c193..da6ac15 100644 (file)
@@ -1,7 +1,109 @@
+/* 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;
+}
+
+.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;
+  width: 33%;
+}
+.row .thirds:first-child {
+  margin-left: 0;
+}
+
+.row .halves {
+  float: left;
+  margin-left: 0.5%;
+  margin-right: 0;
+  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 {
@@ -31,6 +133,18 @@ P.example {
   margin-left: 36pt;
 }
 
+DL.man DD {
+  margin-left: 5em;
+}
+
+DL.man DT {
+  margin-left: 0;
+}
+
+PRE.man {
+  margin: 0;
+}
+
 PRE.example {
   background: white;
   border: dotted thin #999999;
@@ -255,7 +369,7 @@ H2.title, H3.title {
   border-bottom: solid 1pt #999999;
 }
 
-DIV.indent, TABLE.indent {
+TABLE.indent {
   margin-top: 2em;
   margin-left: auto;
   margin-right: auto;
@@ -460,3 +574,69 @@ div.body dt {
 div.body dd {
   margin-bottom: 0.5em;
 }
+/* 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;
+  }
+}
diff --git a/doc/de/index.html.in b/doc/de/index.html.in
new file mode 100644 (file)
index 0000000..c37edd8
--- /dev/null
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <link rel="stylesheet" href="/cups.css" type="text/css">
+    <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=9">
+    <meta name="viewport" content="width=device-width">
+    <title>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+  </head>
+  <body>
+    <div class="header">
+      <ul>
+       <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+       <li><a class="active" href="/">Home</a></li>
+       <li><a href="/admin">Verwaltung</a></li>
+       <li><a href="/classes/">Klassen</a></li>
+       <li><a href="/help/">Hilfe</a></li>
+       <li><a href="/jobs/">Aufträge</a></li>
+       <li><a href="/printers/">Drucker</a></li>
+      </ul>
+    </div>
+    <div class="body">
+      <div class="row">
+       <h1>CUPS 2.0.2</h1>
+       <p>CUPS basiert auf Standards, Open Source Drucksystem entwickelt durch <a href="http://www.apple.com/">Apple Inc.</a> für OS X<sup>&reg;</sup> und andere UNIX<sup>&reg;</sup>-artige Betriebssysteme.</p>
+      </div>
+      <div class="row">
+       <div class="thirds">
+         <h2>CUPS für Benutzer</h2>
+         <p><a href="help/overview.html">Überblick über CUPS</a></p>
+         <p><a href="help/options.html">Befehlszeilen-Druck und Optionen</a></p>
+         <p><a href="http://www.cups.org/lists.php?LIST=cups">Benutzerforum</a></p>
+       </div>
+       <div class="thirds">
+         <h2>CUPS für Administratoren</h2>
+         <p><a href="admin">Drucker und Klassen hinzufügen</a></p>
+         <p><a href="help/policies.html">Betriebs-Richtlinie festlegen</a></p>
+         <p><a href="help/network.html">Benutzung von Netzwerk-Druckern</a></p>
+         <p><a href="help/man-cupsd.conf.html">cupsd.conf Referenz</a></p>
+       </div>
+       <div class="thirds">
+         <h2>CUPS für Entwickler</h2>
+         <p><a href="help/api-overview.html">Einführung in die CUPS Programmierung</a></p>
+         <p><a href="help/api-cups.html">CUPS API</a></p>
+         <p><a href="help/api-filter.html">Filter und Backend Programmierung</a></p>
+         <p><a href="help/api-httpipp.html">HTTP und IPP APIs</a></p>
+         <p><a href="http://www.cups.org/lists.php?LIST=cups-devel">Entwicklerforum</a></p>
+       </div>
+      </div>
+    </div>
+    <div class="footer">CUPS und das CUPS Logo sind Warenzeichen der <a href="http://www.apple.com">Apple Inc.</a> Copyright &copy; 2007-2015 Apple Inc. Alle Rechte vorbehalten.</div>
+  </body>
+</html>
index d4ef797..4faafe8 100644 (file)
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>Inicio - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;Inicio&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;Administraci&oacute;n&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;Clases&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;Ayuda&nbsp;en&nbsp;l&iacute;nea&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;Trabajos&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;Impresoras&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS es el sistema de impresi&oacute;n de c&oacute;digo abierto basado en
-est&aacute;ndares desarrollado por <A HREF="http://www.apple.com/">Apple Inc.</A> para
-OS<SUP>&reg;</SUP> X y otros sistemas operativos tipo UNIX<SUP>&reg;</SUP>.</P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>CUPS para usuarios</H2>
-
-<P><A HREF="help/overview.html">Descripci&oacute;n de CUPS</A></P>
-
-<P><A HREF="help/options.html">Impresi&oacute;n desde la l&iacute;nea de comandos y opciones</A></P>
-
-<P><A HREF="help/whatsnew.html">Qu&eacute; hay de nuevo en CUPS 1.6</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Foro de usuarios</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>CUPS para administradores</H2>
-
-<P><A HREF="admin">A&ntilde;adiendo impresoras y clases</A></P>
-
-<P><A HREF="help/policies.html">Gestionando pol&iacute;ticas de funcionamiento</A></P>
-
-<P><A HREF="help/accounting.html">Contabilidad b&aacute;sica de impresora</A></P>
-
-<P><A HREF="help/security.html">Seguridad del servidor</A></P>
-
-<P><A HREF="help/kerberos.html">Usando autentificaci&oacute;n Kerberos</A></P>
-
-<P><A HREF="help/network.html">Usando impresoras de red</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">Referencia de cupsd.conf</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">Encontrar controladores de impresora</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>CUPS para desarrolladores</H2>
-
-<P><A HREF="help/api-overview.html">Introducci&oacute;n a la programaci&oacute;n de CUPS</A></P>
-
-<P><A HREF="help/api-cups.html">La API de CUPS</A></P>
-
-<P><A HREF="help/api-filter.html">Programaci&oacute;n de filtros y programas de conexi&oacute;n</A></P>
-
-<P><A HREF="help/api-httpipp.html">Las APIs HTTP e IPP</A></P>
-
-<P><A HREF="help/api-ppd.html">La API PPD</A></P>
-
-<P><A HREF="help/api-raster.html">La API Raster</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">Referencia del archivo de informaci&oacute;n del compilador de controladores PPD</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Foro de desarrollo</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS y el logo de CUPS son
-marcas registradas de <A HREF="http://www.apple.com">Apple Inc.</A> Los derechos
-de copia de CUPS 2007-2013 son de Apple Inc. Todos los derechos reservados.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <link rel="stylesheet" href="/cups.css" type="text/css">
+    <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=9">
+    <meta name="viewport" content="width=device-width">
+    <title>Inicio - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+  </head>
+  <body>
+    <div class="header">
+      <ul>
+       <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+       <li><a class="active" href="/">Inicio</a></li>
+       <li><a href="/admin">Administraci&oacute;n</a></li>
+       <li><a href="/classes/">Clases</a></li>
+       <li><a href="/help/">Ayuda</a></li>
+       <li><a href="/jobs/">Trabajos</a></li>
+       <li><a href="/printers/">Impresoras</a></li>
+      </ul>
+    </div>
+    <div class="body">
+      <div class="row">
+       <h1>CUPS @CUPS_VERSION@</h1>
+       <p>CUPS es el sistema de impresi&oacute;n de c&oacute;digo abierto basado en est&aacute;ndares desarrollado por <a href="http://www.apple.com/">Apple Inc.</a> para OS X<sup>&reg;</sup> y otros sistemas operativos tipo UNIX<sup>&reg;</sup>.</p>
+      </div>
+      <div class="row">
+       <div class="thirds">
+         <h2>CUPS para usuarios</h2>
+         <p><a href="help/overview.html">Descripci&oacute;n de CUPS</a></p>
+         <p><a href="help/options.html">Impresi&oacute;n desde la l&iacute;nea de comandos y opciones</a></p>
+         <p><a href="http://www.cups.org/lists.php?LIST=cups">Foro de usuarios</a></p>
+       </div>
+       <div class="thirds">
+         <h2>CUPS para administradores</h2>
+         <p><a href="admin">A&ntilde;adiendo impresoras y clases</a></p>
+         <p><a href="help/policies.html">Gestionando pol&iacute;ticas de funcionamiento</a></p>
+         <p><a href="help/network.html">Usando impresoras de red</a></p>
+         <p><a href="help/man-cupsd.conf.html">Referencia de cupsd.conf</a></p>
+       </div>
+       <div class="thirds">
+         <h2>CUPS para desarrolladores</h2>
+         <p><a href="help/api-overview.html">Introducci&oacute;n a la programaci&oacute;n de CUPS</a></p>
+         <p><a href="help/api-cups.html">La API de CUPS</a></p>
+         <p><a href="help/api-filter.html">Programaci&oacute;n de filtros y programas de conexi&oacute;n</a></p>
+         <p><a href="help/api-httpipp.html">Las APIs HTTP e IPP</a></p>
+         <p><a href="http://www.cups.org/lists.php?LIST=cups-devel">Foro de desarrollo</a></p>
+       </div>
+      </div>
+    </div>
+    <div class="footer">CUPS y el logo de CUPS son marcas registradas de <a href="http://www.apple.com">Apple Inc.</a> Derechos de autor &copy; 2007-2015 Apple Inc. Todos los derechos reservados.</div>
+  </body>
+</html>
diff --git a/doc/fr/index.html.in b/doc/fr/index.html.in
deleted file mode 100644 (file)
index 3345a48..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>Accueil - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;Accueil&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;Administration&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;Classes&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;Aide&nbsp;En&nbsp;Ligne&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;T&acirc;ches&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;Imprimantes&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS est le syst&egrave;me d'impression Open Source, bas&eacute; sur des standards, d&eacute;velopp&eacute; par
-<A HREF="http://www.apple.com/">Apple Inc.</A> pour Mac OS<SUP>&reg;</SUP> X et
-les autres OS UNIX<SUP>&reg;</SUP>-like.</P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>CUPS pour les utilisateurs</H2>
-
-<P><A HREF="help/overview.html">Pr&eacute;sentation de CUPS</A></P>
-
-<P><A HREF="help/options.html">Impression en ligne de commande et options</A></P>
-
-<P><A HREF="help/whatsnew.html">Quoi de neuf dans CUPS 1.6</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Forum utilisateur</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>CUPS pour les administrateurs</H2>
-
-<P><A HREF="admin">Ajout d'imprimantes et de classes</A></P>
-
-<P><A HREF="help/policies.html">G&eacute;rer les politiques</A></P>
-
-<P><A HREF="help/accounting.html">Printer Accounting Basics</A></P>
-
-<P><A HREF="help/security.html">S&eacute;curit&eacute; du serveur</A></P>
-
-<P><A HREF="help/kerberos.html">Utiliser l'authentification Kerberos</A></P>
-
-<P><A HREF="help/network.html">Utiliser des imprimantes r&eacute;seaux</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">R&eacute;f&eacute;rences sur cupsd.conf</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">Trouver des pilotes d'imprimantes</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>CUPS pour les d&eacute;veloppeurs</H2>
-
-<P><A HREF="help/api-overview.html">Introduction &agrave; la programmation CUPS</A></P>
-
-<P><A HREF="help/api-cups.html">L'API CUPS</A></P>
-
-<P><A HREF="help/api-filter.html">Programmation de filtres et de backends</A></P>
-
-<P><A HREF="help/api-httpipp.html">Les API HTTP et IPP</A></P>
-
-<P><A HREF="help/api-ppd.html">L'API PPD</A></P>
-
-<P><A HREF="help/api-raster.html">L'API Raster</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">PPD Compiler Driver Information File Reference</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Forum d&eacute;veloppeurs</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS et le logo CUPS sont des marques d&eacute;pos&eacute;es de
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS est sous copyright 2007-2013 Apple
-Inc. Tous droits r&eacute;serv&eacute;s.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
index 66c34ec..ea37a55 100644 (file)
@@ -10,8 +10,7 @@
 
 <P>CUPS supports a variety of printer accounting schemes. Aside from the
 built-in <A HREF="#QUOTAS">quota</A> and <A HREF="#PAGELOG">page logging</A>
-support, there are several third-party solutions that can be found on
-<A HREF="http://www.cups.org/">www.cups.org</A>.</P>
+support, there are several third-party solutions that can be found online.</P>
 
 
 <H2 CLASS="title"><A NAME="QUOTAS">Quota Support</A></H2>
@@ -27,7 +26,7 @@ options determine whether and how quotas are enforced for a printer.
 The <CODE>job-quota-period</CODE> 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
-<CODE>job-k-limit</CODE> option specifies the job size limit in killobytes. The 
+<CODE>job-k-limit</CODE> option specifies the job size limit in kilobytes. The
 <CODE>job-page-limit</CODE> option specifies the number of pages limit.</P>
 
 <P>For quotas to be enforced, the period and at least one of the limits
@@ -50,13 +49,7 @@ can be used to easily determine that information.</P>
 
 <H2 CLASS="title"><A NAME="PAGELOG">Page Logging</A></H2>
 
-<P>CUPS logs every page that is printed on a system to the
-<VAR><A HREF="ref-page_log.html">page_log</A></VAR> file. Page logging
-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.</P>
+<P>CUPS can log every page that is printed on a system to the <VAR><A HREF="man-cupsd-logs.html">page_log</A></VAR> file. Page logging must be enabled by setting the <CODE>PageLogFormat</CODE> directive in the <VAR><A HREF="man-cupsd.conf.html">cupsd.conf</A></VAR> 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.</P>
 
 </BODY>
 </HTML>
index 0c1998e..220c0f1 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
index 82c740a..63eb9ca 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
index de95e67..1269182 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
@@ -415,6 +427,9 @@ destination.">cupsCopyDestInfo</a></li>
        <li><a href="#cupsEncryption" title="Get the current encryption settings.">cupsEncryption</a></li>
        <li><a href="#cupsEnumDests" title="Enumerate available destinations with a callback function.">cupsEnumDests</a></li>
        <li><a href="#cupsEnumDestsBlock" title="Enumerate available destinations with a block.">cupsEnumDestsBlock</a></li>
+       <li><a href="#cupsFindDestDefault" title="Find the default value(s) for the given option.">cupsFindDestDefault</a></li>
+       <li><a href="#cupsFindDestReady" title="Find the default value(s) for the given option.">cupsFindDestReady</a></li>
+       <li><a href="#cupsFindDestSupported" title="Find the default value(s) for the given option.">cupsFindDestSupported</a></li>
        <li><a href="#cupsFinishDestDocument" title="Finish the current document.">cupsFinishDestDocument</a></li>
        <li><a href="#cupsFinishDocument" title="Finish sending a document.">cupsFinishDocument</a></li>
        <li><a href="#cupsFreeDestInfo" title="Free destination information obtained using
@@ -426,8 +441,14 @@ cupsCopyDestInfo.">cupsFreeDestInfo</a></li>
        <li><a href="#cupsGetDefault" title="Get the default printer or class for the default server.">cupsGetDefault</a></li>
        <li><a href="#cupsGetDefault2" title="Get the default printer or class for the specified server.">cupsGetDefault2</a></li>
        <li><a href="#cupsGetDest" title="Get the named destination from the list.">cupsGetDest</a></li>
+       <li><a href="#cupsGetDestMediaByIndex" title="Get a media name, dimension, and margins for a
+specific size.">cupsGetDestMediaByIndex</a></li>
        <li><a href="#cupsGetDestMediaByName" title="Get media names, dimensions, and margins.">cupsGetDestMediaByName</a></li>
        <li><a href="#cupsGetDestMediaBySize" title="Get media names, dimensions, and margins.">cupsGetDestMediaBySize</a></li>
+       <li><a href="#cupsGetDestMediaCount" title="Get the number of sizes supported by a
+destination.">cupsGetDestMediaCount</a></li>
+       <li><a href="#cupsGetDestMediaDefault" title="Get the default size for a destination.">cupsGetDestMediaDefault</a></li>
+       <li><a href="#cupsGetDestWithURI" title="Get a destination associated with a URI.">cupsGetDestWithURI</a></li>
        <li><a href="#cupsGetDests" title="Get the list of destinations from the default server.">cupsGetDests</a></li>
        <li><a href="#cupsGetDests2" title="Get the list of destinations from the specified server.">cupsGetDests2</a></li>
        <li><a href="#cupsGetJobs" title="Get the jobs from the default server.">cupsGetJobs</a></li>
@@ -449,6 +470,8 @@ for the given language.">cupsLangEncoding</a></li>
        <li><a href="#cupsLangFlush" title="Flush all language data out of the cache.">cupsLangFlush</a></li>
        <li><a href="#cupsLangFree" title="Free language data.">cupsLangFree</a></li>
        <li><a href="#cupsLangGet" title="Get a language.">cupsLangGet</a></li>
+       <li><a href="#cupsLocalizeDestMedia" title="Get the localized string for a destination media
+size.">cupsLocalizeDestMedia</a></li>
        <li><a href="#cupsLocalizeDestOption" title="Get the localized string for a destination
 option.">cupsLocalizeDestOption</a></li>
        <li><a href="#cupsLocalizeDestValue" title="Get the localized string for a destination
@@ -478,12 +501,21 @@ connections.">cupsSetCredentials</a></li>
        <li><a href="#cupsSetServer" title="Set the default server name and port.">cupsSetServer</a></li>
        <li><a href="#cupsSetServerCertCB" title="Set the server certificate callback.">cupsSetServerCertCB</a></li>
        <li><a href="#cupsSetUser" title="Set the default user name.">cupsSetUser</a></li>
+       <li><a href="#cupsSetUserAgent" title="Set the default HTTP User-Agent string.">cupsSetUserAgent</a></li>
        <li><a href="#cupsStartDestDocument" title="Start a new document.">cupsStartDestDocument</a></li>
        <li><a href="#cupsStartDocument" title="Add a document to a job created with cupsCreateJob().">cupsStartDocument</a></li>
        <li><a href="#cupsTempFd" title="Creates a temporary file.">cupsTempFd</a></li>
        <li><a href="#cupsTempFile" title="Generates a temporary filename.">cupsTempFile</a></li>
        <li><a href="#cupsTempFile2" title="Creates a temporary CUPS file.">cupsTempFile2</a></li>
        <li><a href="#cupsUser" title="Return the current user's name.">cupsUser</a></li>
+       <li><a href="#cupsUserAgent" title="Return the default HTTP User-Agent string.">cupsUserAgent</a></li>
+       <li><a href="#pwgFormatSizeName" title="Generate a PWG self-describing media size name.">pwgFormatSizeName</a></li>
+       <li><a href="#pwgInitSize" title="Initialize a pwg_size_t structure using IPP Job Template
+attributes.">pwgInitSize</a></li>
+       <li><a href="#pwgMediaForLegacy" title="Find a PWG media size by ISO/IPP legacy name.">pwgMediaForLegacy</a></li>
+       <li><a href="#pwgMediaForPPD" title="Find a PWG media size by Adobe PPD name.">pwgMediaForPPD</a></li>
+       <li><a href="#pwgMediaForPWG" title="Find a PWG media size by 5101.1 self-describing name.">pwgMediaForPWG</a></li>
+       <li><a href="#pwgMediaForSize" title="Get the PWG media size for the given dimensions.">pwgMediaForSize</a></li>
 </ul></li>
 <li><a href="#TYPES">Data Types</a><ul class="code">
        <li><a href="#cups_client_cert_cb_t" title="Client credentials callback
@@ -506,6 +538,9 @@ information ">cups_dinfo_t</a></li>
        <li><a href="#cups_server_cert_cb_t" title="Server credentials callback
 ">cups_server_cert_cb_t</a></li>
        <li><a href="#cups_size_t" title="Media Size ">cups_size_t</a></li>
+       <li><a href="#pwg_map_t" title="Map element - PPD to/from PWG">pwg_map_t</a></li>
+       <li><a href="#pwg_media_t" title="Common media size data">pwg_media_t</a></li>
+       <li><a href="#pwg_size_t" title="Size element - PPD to/from PWG">pwg_size_t</a></li>
 </ul></li>
 <li><a href="#STRUCTURES">Structures</a><ul class="code">
        <li><a href="#cups_dest_s" title="Destination">cups_dest_s</a></li>
@@ -513,6 +548,9 @@ information ">cups_dinfo_t</a></li>
        <li><a href="#cups_option_s" title="Printer Options">cups_option_s</a></li>
        <li><a href="#cups_size_s" title="Media Size ">cups_size_s</a></li>
        <li><a href="#pollfd" title="User data (unused)">pollfd</a></li>
+       <li><a href="#pwg_map_s" title="Map element - PPD to/from PWG">pwg_map_s</a></li>
+       <li><a href="#pwg_media_s" title="Common media size data">pwg_media_s</a></li>
+       <li><a href="#pwg_size_s" title="Size element - PPD to/from PWG">pwg_size_s</a></li>
 </ul></li>
 <li><a href="#VARIABLES">Variables</a><ul class="code">
        <li><a href="#CF_RETURNS_RETAINED" title="Get the Apple language identifier associated with a
@@ -1139,7 +1177,7 @@ ipp_status_t cupsCancelDestJob (<br>
 <p class="description">Cancel a job on a destination.</p>
 <p class="discussion">The &quot;job_id&quot; is the number returned by cupsCreateDestJob.<br>
 <br>
-Returns IPP_OK on success and IPP_NOT_AUTHORIZED or IPP_FORBIDDEN on
+Returns IPP_STATUS_OK on success and IPP_NOT_AUTHORIZED or IPP_FORBIDDEN on
 failure.
 
 </p>
@@ -1252,7 +1290,7 @@ ipp_status_t cupsCloseDestJob (<br>
 <p class="description">IPP status code</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">Use when the last call to cupsStartDocument passed 0 for &quot;last_document&quot;.
-&quot;job_id&quot; is the job ID returned by cupsCreateDestJob. Returns <code>IPP_OK</code>
+&quot;job_id&quot; is the job ID returned by cupsCreateDestJob. Returns <code>IPP_STATUS_OK</code>
 on success.
 
 </p>
@@ -1473,7 +1511,7 @@ ipp_status_t cupsCreateDestJob (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">IPP status code</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">Returns <code>IPP_OK</code> or <code>IPP_OK_SUBST</code> on success, saving the job ID
+<p class="discussion">Returns <code>IPP_STATUS_OK</code> or <code>IPP_STATUS_OK_SUBST</code> on success, saving the job ID
 in the variable pointed to by &quot;job_id&quot;.
 
 </p>
@@ -1520,7 +1558,7 @@ http_encryption_t cupsEncryption (void);</p>
 <p class="discussion">The default encryption setting comes from the CUPS_ENCRYPTION
 environment variable, then the ~/.cups/client.conf file, and finally the
 /etc/cups/client.conf file. If not set, the default is
-<code>HTTP_ENCRYPT_IF_REQUESTED</code>.<br>
+<code>HTTP_ENCRYPTION_IF_REQUESTED</code>.<br>
 <br>
 Note: The current encryption setting is tracked separately for each thread
 in a program. Multi-threaded programs that override the setting via the
@@ -1606,6 +1644,96 @@ Enumeration happens on the current thread and does not return until all
 destinations have been enumerated or the block returns 0.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsFindDestDefault">cupsFindDestDefault</a></h3>
+<p class="description">Find the default value(s) for the given option.</p>
+<p class="code">
+ipp_attribute_t *cupsFindDestDefault (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *option<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>option</dt>
+<dd class="description">Option/attribute name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Default attribute or <code>NULL</code> for none</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The returned value is an IPP attribute. Use the <code>ippGetBoolean</code>,
+<code>ippGetCollection</code>, <code>ippGetCount</code>, <code>ippGetDate</code>,
+<code>ippGetInteger</code>, <code>ippGetOctetString</code>, <code>ippGetRange</code>,
+<code>ippGetResolution</code>, <code>ippGetString</code>, and <code>ippGetValueTag</code>
+functions to inspect the default value(s) as needed.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsFindDestReady">cupsFindDestReady</a></h3>
+<p class="description">Find the default value(s) for the given option.</p>
+<p class="code">
+ipp_attribute_t *cupsFindDestReady (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *option<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>option</dt>
+<dd class="description">Option/attribute name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Default attribute or <code>NULL</code> for none</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The returned value is an IPP attribute. Use the <code>ippGetBoolean</code>,
+<code>ippGetCollection</code>, <code>ippGetCount</code>, <code>ippGetDate</code>,
+<code>ippGetInteger</code>, <code>ippGetOctetString</code>, <code>ippGetRange</code>,
+<code>ippGetResolution</code>, <code>ippGetString</code>, and <code>ippGetValueTag</code>
+functions to inspect the default value(s) as needed.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsFindDestSupported">cupsFindDestSupported</a></h3>
+<p class="description">Find the default value(s) for the given option.</p>
+<p class="code">
+ipp_attribute_t *cupsFindDestSupported (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *option<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>option</dt>
+<dd class="description">Option/attribute name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Default attribute or <code>NULL</code> for none</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The returned value is an IPP attribute. Use the <code>ippGetBoolean</code>,
+<code>ippGetCollection</code>, <code>ippGetCount</code>, <code>ippGetDate</code>,
+<code>ippGetInteger</code>, <code>ippGetOctetString</code>, <code>ippGetRange</code>,
+<code>ippGetResolution</code>, <code>ippGetString</code>, and <code>ippGetValueTag</code>
+functions to inspect the default value(s) as needed.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="cupsFinishDestDocument">cupsFinishDestDocument</a></h3>
 <p class="description">Finish the current document.</p>
 <p class="code">
@@ -1626,7 +1754,7 @@ ipp_status_t cupsFinishDestDocument (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Status of document submission</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">Returns <code>IPP_OK</code> or <code>IPP_OK_SUBST</code> on success.
+<p class="discussion">Returns <code>IPP_STATUS_OK</code> or <code>IPP_STATUS_OK_SUBST</code> on success.
 
 </p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span><a name="cupsFinishDocument">cupsFinishDocument</a></h3>
@@ -1717,7 +1845,8 @@ int cupsGetClasses (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Number of classes</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function is deprecated - use <a href="#cupsGetDests"><code>cupsGetDests</code></a> instead.
+<p class="discussion">This function is deprecated and no longer returns a list of printer
+classes - use <a href="#cupsGetDests"><code>cupsGetDests</code></a> instead.
 
 </p>
 <h3 class="function"><a name="cupsGetDefault">cupsGetDefault</a></h3>
@@ -1780,6 +1909,41 @@ not support the lpoptions-defined default printer.
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">Use the <a href="#cupsGetDests"><code>cupsGetDests</code></a> or <a href="#cupsGetDests2"><code>cupsGetDests2</code></a> functions to get a
 list of supported destinations for the current user.</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsGetDestMediaByIndex">cupsGetDestMediaByIndex</a></h3>
+<p class="description">Get a media name, dimension, and margins for a
+specific size.</p>
+<p class="code">
+int cupsGetDestMediaByIndex (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int n,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned flags,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_size_t">cups_size_t</a> *size<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>n</dt>
+<dd class="description">Media size number (0-based)</dd>
+<dt>flags</dt>
+<dd class="description">Media flags</dd>
+<dt>size</dt>
+<dd class="description">Media size information</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>flags</code> parameter determines which set of media are indexed.  For
+example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will get the Nth
+borderless size supported by the printer.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="cupsGetDestMediaByName">cupsGetDestMediaByName</a></h3>
 <p class="description">Get media names, dimensions, and margins.</p>
 <p class="code">
@@ -1873,6 +2037,89 @@ The matching result (if any) is returned in the &quot;cups_size_t&quot; structur
 Returns 1 when there is a match and 0 if there is not a match.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsGetDestMediaCount">cupsGetDestMediaCount</a></h3>
+<p class="description">Get the number of sizes supported by a
+destination.</p>
+<p class="code">
+int cupsGetDestMediaCount (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned flags<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>flags</dt>
+<dd class="description">Media flags</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of sizes</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>flags</code> parameter determines the set of media sizes that are
+counted.  For example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will return
+the number of borderless sizes.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsGetDestMediaDefault">cupsGetDestMediaDefault</a></h3>
+<p class="description">Get the default size for a destination.</p>
+<p class="code">
+int cupsGetDestMediaDefault (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned flags,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_size_t">cups_size_t</a> *size<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>flags</dt>
+<dd class="description">Media flags</dd>
+<dt>size</dt>
+<dd class="description">Media size information</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>flags</code> parameter determines which default size is returned.  For
+example, passing <code>CUPS_MEDIA_FLAGS_BORDERLESS</code> will return the default
+borderless size, typically US Letter or A4, but sometimes 4x6 photo media.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS X 10.10&nbsp;</span><a name="cupsGetDestWithURI">cupsGetDestWithURI</a></h3>
+<p class="description">Get a destination associated with a URI.</p>
+<p class="code">
+<a href="#cups_dest_t">cups_dest_t</a> *cupsGetDestWithURI (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *name,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *uri<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>name</dt>
+<dd class="description">Desired printer name or <code>NULL</code></dd>
+<dt>uri</dt>
+<dd class="description">URI for the printer</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Destination or <code>NULL</code></p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">&quot;name&quot; is the desired name for the printer. If <code>NULL</code>, a name will be
+created using the URI.<br>
+<br>
+&quot;uri&quot; is the &quot;ipp&quot; or &quot;ipps&quot; URI for the printer.
+
+</p>
 <h3 class="function"><a name="cupsGetDests">cupsGetDests</a></h3>
 <p class="description">Get the list of destinations from the default server.</p>
 <p class="code">
@@ -2121,8 +2368,8 @@ the empty string, a new temporary file is created, otherwise the existing
 file will be overwritten as needed.  The caller &quot;owns&quot; the file that is
 created and must <code>unlink</code> the returned filename.<br>
 <br>
-On success, <code>HTTP_OK</code> is returned for a new PPD file and
-<code>HTTP_NOT_MODIFIED</code> if the existing PPD file is up-to-date.  Any other
+On success, <code>HTTP_STATUS_OK</code> is returned for a new PPD file and
+<code>HTTP_STATUS_NOT_MODIFIED</code> if the existing PPD file is up-to-date.  Any other
 status is an error.<br>
 <br>
 For classes, <code>cupsGetPPD3</code> returns the PPD file for the first printer
@@ -2197,7 +2444,8 @@ int cupsGetPrinters (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Number of printers</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function is deprecated - use <a href="#cupsGetDests"><code>cupsGetDests</code></a> instead.
+<p class="discussion">This function is deprecated and no longer returns a list of printers - use
+<a href="#cupsGetDests"><code>cupsGetDests</code></a> instead.
 
 </p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.3/OS X 10.5&nbsp;</span><a name="cupsGetServerPPD">cupsGetServerPPD</a></h3>
@@ -2277,6 +2525,37 @@ cups_lang_t *cupsLangGet (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Language data</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS X 10.10&nbsp;</span><a name="cupsLocalizeDestMedia">cupsLocalizeDestMedia</a></h3>
+<p class="description">Get the localized string for a destination media
+size.</p>
+<p class="code">
+const char *cupsLocalizeDestMedia (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_t *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dest_t">cups_dest_t</a> *dest,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_dinfo_t">cups_dinfo_t</a> *dinfo,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;unsigned flags,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#cups_size_t">cups_size_t</a> *size<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">Connection to destination</dd>
+<dt>dest</dt>
+<dd class="description">Destination</dd>
+<dt>dinfo</dt>
+<dd class="description">Destination information</dd>
+<dt>flags</dt>
+<dd class="description">Media flags</dd>
+<dt>size</dt>
+<dd class="description">Media size</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Localized string</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The returned string is stored in the destination information and will become
+invalid if the destination information is deleted.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="cupsLocalizeDestOption">cupsLocalizeDestOption</a></h3>
 <p class="description">Get the localized string for a destination
 option.</p>
@@ -2701,7 +2980,7 @@ void cupsSetEncryption (<br>
 <p class="discussion">The default encryption setting comes from the CUPS_ENCRYPTION
 environment variable, then the ~/.cups/client.conf file, and finally the
 /etc/cups/client.conf file. If not set, the default is
-<code>HTTP_ENCRYPT_IF_REQUESTED</code>.<br>
+<code>HTTP_ENCRYPTION_IF_REQUESTED</code>.<br>
 <br>
 Note: The current encryption setting is tracked separately for each thread
 in a program. Multi-threaded programs that override the setting need to do
@@ -2811,6 +3090,22 @@ void cupsSetUser (<br>
 Note: The current user name is tracked separately for each thread in a
 program. Multi-threaded programs that override the user name need to do so
 in each thread for the same user name to be used.</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsSetUserAgent">cupsSetUserAgent</a></h3>
+<p class="description">Set the default HTTP User-Agent string.</p>
+<p class="code">
+void cupsSetUserAgent (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *user_agent<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>user_agent</dt>
+<dd class="description">User-Agent string or <code>NULL</code></dd>
+</dl>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Setting the string to NULL forces the default value containing the CUPS
+version, IPP version, and operating system version and architecture.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="cupsStartDestDocument">cupsStartDestDocument</a></h3>
 <p class="description">Start a new document.</p>
 <p class="code">
@@ -2932,8 +3227,8 @@ char *cupsTempFile (<br>
 <p class="description">Filename or <code>NULL</code> on error</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">The temporary filename is returned in the filename buffer.
-This function is deprecated - use <a href="#cupsTempFd"><code>cupsTempFd</code></a> or
-<a href="#cupsTempFile2"><code>cupsTempFile2</code></a> instead.
+This function is deprecated and will no longer generate a temporary
+filename - use <a href="#cupsTempFd"><code>cupsTempFd</code></a> or <a href="#cupsTempFile2"><code>cupsTempFile2</code></a> instead.
 
 </p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="cupsTempFile2">cupsTempFile2</a></h3>
@@ -2968,6 +3263,179 @@ const char *cupsUser (void);</p>
 program. Multi-threaded programs that override the user name with the
 <a href="#cupsSetUser"><code>cupsSetUser</code></a> function need to do so in each thread for the same user
 name to be used.</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="cupsUserAgent">cupsUserAgent</a></h3>
+<p class="description">Return the default HTTP User-Agent string.</p>
+<p class="code">
+const char *cupsUserAgent (void);</p>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">User-Agent string</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="pwgFormatSizeName">pwgFormatSizeName</a></h3>
+<p class="description">Generate a PWG self-describing media size name.</p>
+<p class="code">
+int pwgFormatSizeName (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char *keyword,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;size_t keysize,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *prefix,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *name,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int width,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int length,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *units<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>keyword</dt>
+<dd class="description">Keyword buffer</dd>
+<dt>keysize</dt>
+<dd class="description">Size of keyword buffer</dd>
+<dt>prefix</dt>
+<dd class="description">Prefix for PWG size or <code>NULL</code> for automatic</dd>
+<dt>name</dt>
+<dd class="description">Size name or <code>NULL</code></dd>
+<dt>width</dt>
+<dd class="description">Width of page in 2540ths</dd>
+<dt>length</dt>
+<dd class="description">Length of page in 2540ths</dd>
+<dt>units</dt>
+<dd class="description">Units - &quot;in&quot;, &quot;mm&quot;, or <code>NULL</code> for automatic</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function generates a PWG self-describing media size name of the form
+&quot;prefix_name_WIDTHxLENGTHunits&quot;.  The prefix is typically &quot;custom&quot; or &quot;roll&quot;
+for user-supplied sizes but can also be &quot;disc&quot;, &quot;iso&quot;, &quot;jis&quot;, &quot;jpn&quot;, &quot;na&quot;,
+&quot;oe&quot;, &quot;om&quot;, &quot;prc&quot;, or &quot;roc&quot;.  A value of <code>NULL</code> automatically chooses
+&quot;oe&quot; or &quot;om&quot; depending on the units.<br>
+<br>
+The size name may only contain lowercase letters, numbers, &quot;-&quot;, and &quot;.&quot;.  If
+<code>NULL</code> is passed, the size name will contain the formatted dimensions.<br>
+<br>
+The width and length are specified in hundredths of millimeters, equivalent
+to 1/100000th of a meter or 1/2540th of an inch.  The width, length, and
+units used for the generated size name are calculated automatically if the
+units string is <code>NULL</code>, otherwise inches (&quot;in&quot;) or millimeters (&quot;mm&quot;)
+are used.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="pwgInitSize">pwgInitSize</a></h3>
+<p class="description">Initialize a pwg_size_t structure using IPP Job Template
+attributes.</p>
+<p class="code">
+int pwgInitSize (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#pwg_size_t">pwg_size_t</a> *size,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;ipp_t *job,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int *margins_set<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>size</dt>
+<dd class="description">Size to initialize</dd>
+<dt>job</dt>
+<dd class="description">Job template attributes</dd>
+<dt>margins_set</dt>
+<dd class="description">1 if margins were set, 0 otherwise</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if size was initialized, 0 otherwise</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function initializes a pwg_size_t structure from an IPP &quot;media&quot; or
+&quot;media-col&quot; attribute in the specified IPP message.  0 is returned if neither
+attribute is found in the message or the values are not valid.<br>
+<br>
+The &quot;margins_set&quot; variable is initialized to 1 if any &quot;media-xxx-margin&quot;
+member attribute was specified in the &quot;media-col&quot; Job Template attribute,
+otherwise it is initialized to 0.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="pwgMediaForLegacy">pwgMediaForLegacy</a></h3>
+<p class="description">Find a PWG media size by ISO/IPP legacy name.</p>
+<p class="code">
+<a href="#pwg_media_t">pwg_media_t</a> *pwgMediaForLegacy (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *legacy<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>legacy</dt>
+<dd class="description">Legacy size name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Matching size or NULL</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;name&quot; argument specifies the legacy ISO media size name, for example
+&quot;iso-a4&quot; or &quot;na-letter&quot;.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="pwgMediaForPPD">pwgMediaForPPD</a></h3>
+<p class="description">Find a PWG media size by Adobe PPD name.</p>
+<p class="code">
+<a href="#pwg_media_t">pwg_media_t</a> *pwgMediaForPPD (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *ppd<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ppd</dt>
+<dd class="description">PPD size name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Matching size or NULL</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;ppd&quot; argument specifies an Adobe page size name as defined in Table B.1
+of the Adobe PostScript Printer Description File Format Specification Version
+4.3.<br>
+<br>
+If the name is non-standard, the returned PWG media size is stored in
+thread-local storage and is overwritten by each call to the function in the
+thread.  Custom names can be of the form &quot;Custom.WIDTHxLENGTH[units]&quot; or
+&quot;WIDTHxLENGTH[units]&quot;.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="pwgMediaForPWG">pwgMediaForPWG</a></h3>
+<p class="description">Find a PWG media size by 5101.1 self-describing name.</p>
+<p class="code">
+<a href="#pwg_media_t">pwg_media_t</a> *pwgMediaForPWG (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *pwg<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>pwg</dt>
+<dd class="description">PWG size name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Matching size or NULL</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;pwg&quot; argument specifies a self-describing media size name of the form
+&quot;prefix_name_WIDTHxLENGTHunits&quot; as defined in PWG 5101.1.<br>
+<br>
+If the name is non-standard, the returned PWG media size is stored in
+thread-local storage and is overwritten by each call to the function in the
+thread.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="pwgMediaForSize">pwgMediaForSize</a></h3>
+<p class="description">Get the PWG media size for the given dimensions.</p>
+<p class="code">
+<a href="#pwg_media_t">pwg_media_t</a> *pwgMediaForSize (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int width,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int length<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>width</dt>
+<dd class="description">Width in hundredths of millimeters</dd>
+<dt>length</dt>
+<dd class="description">Length in hundredths of millimeters</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">PWG media name</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The &quot;width&quot; and &quot;length&quot; are in hundredths of millimeters, equivalent to
+1/100000th of a meter or 1/2540th of an inch.<br>
+<br>
+If the dimensions are non-standard, the returned PWG media size is stored in
+thread-local storage and is overwritten by each call to the function in the
+thread.
+
+</p>
 <h2 class="title"><a name="TYPES">Data Types</a></h2>
 <h3 class="typedef"><span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span><a name="cups_client_cert_cb_t">cups_client_cert_cb_t</a></h3>
 <p class="description">Client credentials callback
@@ -3041,6 +3509,21 @@ typedef int (*cups_server_cert_cb_t)(http_t *http, void *tls, cups_array_t *cert
 <p class="code">
 typedef struct <a href="#cups_size_s">cups_size_s</a> cups_size_t;
 </p>
+<h3 class="typedef"><a name="pwg_map_t">pwg_map_t</a></h3>
+<p class="description">Map element - PPD to/from PWG</p>
+<p class="code">
+typedef struct <a href="#pwg_map_s">pwg_map_s</a> pwg_map_t;
+</p>
+<h3 class="typedef"><a name="pwg_media_t">pwg_media_t</a></h3>
+<p class="description">Common media size data</p>
+<p class="code">
+typedef struct <a href="#pwg_media_s">pwg_media_s</a> pwg_media_t;
+</p>
+<h3 class="typedef"><a name="pwg_size_t">pwg_size_t</a></h3>
+<p class="description">Size element - PPD to/from PWG</p>
+<p class="code">
+typedef struct <a href="#pwg_size_s">pwg_size_s</a> pwg_size_t;
+</p>
 <h2 class="title"><a name="STRUCTURES">Structures</a></h2>
 <h3 class="struct"><a name="cups_dest_s">cups_dest_s</a></h3>
 <p class="description">Destination</p>
@@ -3145,6 +3628,42 @@ millimeters</dd>
 <dt>val </dt>
 <dd class="description">Return value</dd>
 </dl>
+<h3 class="struct"><a name="pwg_map_s">pwg_map_s</a></h3>
+<p class="description">Map element - PPD to/from PWG</p>
+<p class="code">struct pwg_map_s {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char *pwg, *ppd;<br>
+};</p>
+<h4 class="members">Members</h4>
+<dl>
+<dt>ppd </dt>
+<dd class="description">PPD option keyword</dd>
+</dl>
+<h3 class="struct"><a name="pwg_media_s">pwg_media_s</a></h3>
+<p class="description">Common media size data</p>
+<p class="code">struct pwg_media_s {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int width, length;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *pwg, *legacy, *ppd;<br>
+};</p>
+<h4 class="members">Members</h4>
+<dl>
+<dt>length </dt>
+<dd class="description">Length in 2540ths</dd>
+<dt>ppd </dt>
+<dd class="description">Standard Adobe PPD name</dd>
+</dl>
+<h3 class="struct"><a name="pwg_size_s">pwg_size_s</a></h3>
+<p class="description">Size element - PPD to/from PWG</p>
+<p class="code">struct pwg_size_s {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#pwg_map_t">pwg_map_t</a> map;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int width, length, left, bottom, right, top;<br>
+};</p>
+<h4 class="members">Members</h4>
+<dl>
+<dt>map </dt>
+<dd class="description">Map element</dd>
+<dt>top </dt>
+<dd class="description">Top margin in 2540ths</dd>
+</dl>
 <h2 class="title"><a name="VARIABLES">Variables</a></h2>
 <h3 class="variable"><a name="CF_RETURNS_RETAINED">CF_RETURNS_RETAINED</a></h3>
 <p class="description">Get the Apple language identifier associated with a
@@ -3156,6 +3675,8 @@ locale ID.</p>
 constants</p>
 <h4 class="constants">Constants</h4>
 <dl>
+<dt>CUPS_PRINTER_3D <span class="info">&nbsp;CUPS 2.1&nbsp;</span></dt>
+<dd class="description">3D Printing </dd>
 <dt>CUPS_PRINTER_AUTHENTICATED <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
 <dd class="description">Printer requires authentication
 </dd>
index fc7b72a..309d09d 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
index 5428058..1ab935b 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
@@ -345,7 +357,7 @@ div.contents ul.subcontents li {
 
   Filter and backend programming header for CUPS.
 
-  Copyright 2008-2011 by Apple Inc.
+  Copyright 2008-2014 by Apple Inc.
 
   These coded instructions, statements, and computer programs are the
   property of Apple Inc. and are protected by Federal copyright
@@ -396,6 +408,7 @@ div.contents ul.subcontents li {
        <li><a href="#COMMUNICATING_FILTER">Communicating with Filters</a></li>
        <li><a href="#SNMP">Doing SNMP Queries with Network Printers</a></li>
 </ul></li>
+<li><a href="#SANDBOXING">Sandboxing on OS X</a></li>
 <li><a href="#FUNCTIONS">Functions</a><ul class="code">
        <li><a href="#cupsBackChannelRead" title="Read data from the backchannel.">cupsBackChannelRead</a></li>
        <li><a href="#cupsBackChannelWrite" title="Write data to the backchannel.">cupsBackChannelWrite</a></li>
@@ -430,7 +443,7 @@ div.contents ul.subcontents li {
 
   Filter and backend programming introduction for CUPS.
 
-  Copyright 2007-2013 by Apple Inc.
+  Copyright 2007-2014 by Apple Inc.
   Copyright 1997-2006 by Easy Software Products, all rights reserved.
 
   These coded instructions, statements, and computer programs are the
@@ -508,7 +521,7 @@ directory to write to.</p>
 
 <p>In addition, some operating systems provide additional security mechanisms
 that further limit file system access, even for backends running as root. On
-OS X, for example, no backend may write to a user's home directory.</p>
+OS X, for example, no backend may write to a user's home directory. See the <a href="#SANDBOXING">Sandboxing on OS X</a> section for more information.</p>
 </blockquote>
 
 <h3><a name="SIGNALS">Canceled Jobs and Signal Handling</a></h3>
@@ -664,7 +677,7 @@ prefix strings:</p>
        <code>marker-types</code>, <code>printer-alert</code>, and
        <code>printer-alert-description</code> printer attributes. Standard
        <code>marker-types</code> values are listed in <a href='#TABLE1'>Table
-       1</a>.</dd>
+       1</a>. String values need special handling - see <a href="#ATTR_STRINGS">Reporting Attribute String Values</a> below.</dd>
 
        <dt>CRIT: message</dt>
        <dd>Sets the printer-state-message attribute and adds the specified
@@ -747,11 +760,11 @@ the "DEBUG:" prefix string.</p>
        <td>Fuser unit</td>
 </tr>
 <tr>
-       <td>fuserCleaningPad</td>
+       <td>fuser-cleaning-pad</td>
        <td>Fuser cleaning pad</td>
 </tr>
 <tr>
-       <td>fuserOil</td>
+       <td>fuser-oil</td>
        <td>Fuser oil</td>
 </tr>
 <tr>
@@ -763,7 +776,7 @@ the "DEBUG:" prefix string.</p>
        <td>Photo conductor</td>
 </tr>
 <tr>
-       <td>solidWax</td>
+       <td>solid-wax</td>
        <td>Wax supply</td>
 </tr>
 <tr>
@@ -775,19 +788,19 @@ the "DEBUG:" prefix string.</p>
        <td>Toner supply</td>
 </tr>
 <tr>
-       <td>transferUnit</td>
+       <td>transfer-unit</td>
        <td>Transfer unit</td>
 </tr>
 <tr>
-       <td>wasteInk</td>
+       <td>waste-ink</td>
        <td>Waste ink tank</td>
 </tr>
 <tr>
-       <td>wasteToner</td>
+       <td>waste-toner</td>
        <td>Waste toner tank</td>
 </tr>
 <tr>
-       <td>wasteWax</td>
+       <td>waste-wax</td>
        <td>Waste wax tank</td>
 </tr>
 </tbody>
@@ -867,6 +880,95 @@ the "DEBUG:" prefix string.</p>
 </tbody>
 </table></div>
 
+
+<h4><a name="ATTR_STRINGS">Reporting Attribute String Values</a></h4>
+
+<p>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:</p>
+
+<pre class="example">
+name=simple
+name=simple,simple,...
+name='complex value'
+name="complex value"
+name='"complex value"','"complex value"',...
+</pre>
+
+<p>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:</p>
+
+<pre class="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);
+</pre>
+
+<p>Complex values that contains spaces, quotes, backslashes, or the comma must be quoted. For a single value a single set of quotes is sufficient:</p>
+
+<pre class="example">
+fputs("ATTR: marker-message='Levels shown are approximate.'\n", stderr);
+</pre>
+
+<p>When multiple values are reported, each value must be enclosed by a set of single and double quotes:</p>
+
+<pre class="example">
+fputs("ATTR: marker-names='\"Cyan Toner\"','\"Magenta Toner\"',"
+      "'\"Yellow Toner\"','\"Black Toner\"'\n", stderr);
+</pre>
+
+<p>The IPP backend includes a <var>quote_string</var> function that may be used to properly quote a complex value in an "ATTR:" message:</p>
+
+<pre class="example">
+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 &lt; q)
+  {
+    *q = '\0';
+    return (q);
+  }
+
+  *qptr++ = '\'';
+  *qptr++ = '\"';
+
+  while (*s && qptr &lt; qend)
+  {
+    if (*s == '\\' || *s == '\"' || *s == '\'')
+    {
+      if (qptr &lt; (qend - 4))
+      {
+        *qptr++ = '\\';
+        *qptr++ = '\\';
+        *qptr++ = '\\';
+      }
+      else
+        break;
+    }
+
+    *qptr++ = *s++;
+  }
+
+  *qptr++ = '\"';
+  *qptr++ = '\'';
+  *qptr   = '\0';
+
+  return (q);
+}
+</pre>
+
+
 <h4><a name="MANAGING_STATE">Managing Printer State in a Filter</a></h4>
 
 <p>Filters are responsible for managing the state keywords they set using
@@ -1190,6 +1292,28 @@ void *my_data;
 
 <a href="#cupsSideChannelSNMPWalk">cupsSNMPSideChannelWalk</a>(".1.3.6.1.2.1.43", 5.0, my_callback, my_data);
 </pre>
+
+<h2><a name="SANDBOXING">Sandboxing on OS X</a></h2>
+
+<p>Starting with OS X 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:</p>
+
+<ol>
+
+       <li>Reading of files: pursuant to normal UNIX file permissions, filters and backends can read files for the current job from the <var>/private/var/spool/cups</var> directory and other files on mounted filesystems <em>except</em> for user home directories under <var>/Users</var>.</li>
+
+       <li>Writing of files: pursuant to normal UNIX file permissions, filters and backends can read/write files to the cache directory specified by the <code>CUPS_CACHEDIR</code> environment variable, to the state directory specified by the <code>CUPS_STATEDIR</code> environment variable, to the temporary directory specified by the <code>TMPDIR</code> environment variable, and under the <var>/private/var/db</var>, <var>/private/var/folders</var>, <var>/private/var/lib</var>, <var>/private/var/mysql</var>, <var>/private/var/run</var>, <var>/private/var/spool</var> (except <var>/private/var/spool/cups</var>), <var>/Library/Application&nbsp;Support</var>, <var>/Library/Caches</var>, <var>/Library/Logs</var>, <var>/Library/Preferences</var>, <var>/Library/WebServer</var>, and <var>/Users/Shared</var> directories.</li>
+
+       <li>Execution of programs: pursuant to normal UNIX file permissions, filters and backends can execute any program not located under the <var>/Users</var> directory. Child processes inherit the sandbox and are subject to the same restrictions as the parent.</li>
+
+       <li>Bluetooth and USB: backends can access Bluetooth and USB printers through IOKit. <em>Filters cannot access Bluetooth and USB printers directly.</em></li>
+
+       <li>Network: filters and backends can access UNIX domain sockets under the <var>/private/tmp</var>, <var>/private/var/run</var>, and <var>/private/var/tmp</var> directories. Backends can also create IPv4 and IPv6 TCP (outgoing) and UDP (incoming and outgoing) socket, and bind to local source ports. <em>Filters cannot directly create IPv4 and IPv6 TCP or UDP sockets.</em></li>
+
+       <li>Notifications: filters and backends can send notifications via the Darwin <code>notify_post()</code> API.</li>
+
+</ol>
+
+<blockquote><b>Note:</b> The sandbox profile used in CUPS 2.0 still allows some actions that are not listed above - these privileges will be removed over time until the profile matches the list above.</blockquote>
 <h2 class="title"><a name="FUNCTIONS">Functions</a></h2>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="cupsBackChannelRead">cupsBackChannelRead</a></h3>
 <p class="description">Read data from the backchannel.</p>
index 0e0591a..7fc0c06 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
@@ -404,26 +416,35 @@ current thread.">cupsLastErrorString</a></li>
        <li><a href="#cupsReadResponseData" title="Read additional data after the IPP response.">cupsReadResponseData</a></li>
        <li><a href="#cupsSendRequest" title="Send an IPP request.">cupsSendRequest</a></li>
        <li><a href="#cupsWriteRequestData" title="Write additional data after an IPP request.">cupsWriteRequestData</a></li>
+       <li><a href="#httpAcceptConnection" title="Accept a new HTTP client connection from the
+specified listening socket.">httpAcceptConnection</a></li>
        <li><a href="#httpAddCredential" title="Allocates and adds a single credential to an array.">httpAddCredential</a></li>
        <li><a href="#httpAddrAny" title="Check for the &quot;any&quot; address.">httpAddrAny</a></li>
+       <li><a href="#httpAddrClose" title="Close a socket created by httpAddrConnect or
+httpAddrListen.">httpAddrClose</a></li>
        <li><a href="#httpAddrEqual" title="Compare two addresses.">httpAddrEqual</a></li>
+       <li><a href="#httpAddrFamily" title="Get the address family of an address.">httpAddrFamily</a></li>
        <li><a href="#httpAddrLength" title="Return the length of the address in bytes.">httpAddrLength</a></li>
+       <li><a href="#httpAddrListen" title="Create a listening socket bound to the specified
+address and port.">httpAddrListen</a></li>
        <li><a href="#httpAddrLocalhost" title="Check for the local loopback address.">httpAddrLocalhost</a></li>
        <li><a href="#httpAddrLookup" title="Lookup the hostname associated with the address.">httpAddrLookup</a></li>
+       <li><a href="#httpAddrPort" title="Get the port number associated with an address.">httpAddrPort</a></li>
        <li><a href="#httpAddrString" title="Convert an address to a numeric string.">httpAddrString</a></li>
        <li><a href="#httpAssembleURI" title="Assemble a uniform resource identifier from its
 components.">httpAssembleURI</a></li>
        <li><a href="#httpAssembleURIf" title="Assemble a uniform resource identifier from its
 components with a formatted resource.">httpAssembleURIf</a></li>
+       <li><a href="#httpAssembleUUID" title="Assemble a name-based UUID URN conforming to RFC 4122.">httpAssembleUUID</a></li>
        <li><a href="#httpBlocking" title="Set blocking/non-blocking behavior on a connection.">httpBlocking</a></li>
        <li><a href="#httpCheck" title="Check to see if there is a pending response from the server.">httpCheck</a></li>
        <li><a href="#httpClearCookie" title="Clear the cookie value(s).">httpClearCookie</a></li>
        <li><a href="#httpClearFields" title="Clear HTTP request fields.">httpClearFields</a></li>
        <li><a href="#httpClose" title="Close an HTTP connection.">httpClose</a></li>
+       <li><a href="#httpCompareCredentials" title="Compare two sets of X.509 credentials.">httpCompareCredentials</a></li>
        <li><a href="#httpConnect" title="Connect to a HTTP server.">httpConnect</a></li>
+       <li><a href="#httpConnect2" title="Connect to a HTTP server.">httpConnect2</a></li>
        <li><a href="#httpConnectEncrypt" title="Connect to a HTTP server using encryption.">httpConnectEncrypt</a></li>
-       <li><a href="#httpCopyCredentials" title="Copy the credentials associated with an encrypted
-connection.">httpCopyCredentials</a></li>
        <li><a href="#httpDecode64" title="Base64-decode a string.">httpDecode64</a></li>
        <li><a href="#httpDecode64_2" title="Base64-decode a string.">httpDecode64_2</a></li>
        <li><a href="#httpDelete" title="Send a DELETE request to the server.">httpDelete</a></li>
@@ -431,25 +452,38 @@ connection.">httpCopyCredentials</a></li>
        <li><a href="#httpEncode64_2" title="Base64-encode a string.">httpEncode64_2</a></li>
        <li><a href="#httpEncryption" title="Set the required encryption on the link.">httpEncryption</a></li>
        <li><a href="#httpError" title="Get the last error on a connection.">httpError</a></li>
+       <li><a href="#httpFieldValue" title="Return the HTTP field enumeration value for a field
+name.">httpFieldValue</a></li>
        <li><a href="#httpFlush" title="Flush data from a HTTP connection.">httpFlush</a></li>
        <li><a href="#httpFlushWrite" title="Flush data in write buffer.">httpFlushWrite</a></li>
        <li><a href="#httpFreeCredentials" title="Free an array of credentials.">httpFreeCredentials</a></li>
        <li><a href="#httpGet" title="Send a GET request to the server.">httpGet</a></li>
+       <li><a href="#httpGetActivity" title="Get the most recent activity for a connection.">httpGetActivity</a></li>
+       <li><a href="#httpGetAddress" title="Get the address of the connected peer of a connection.">httpGetAddress</a></li>
        <li><a href="#httpGetAuthString" title="Get the current authorization string.">httpGetAuthString</a></li>
        <li><a href="#httpGetBlocking" title="Get the blocking/non-block state of a connection.">httpGetBlocking</a></li>
+       <li><a href="#httpGetContentEncoding" title="Get a common content encoding, if any, between
+the client and server.">httpGetContentEncoding</a></li>
        <li><a href="#httpGetCookie" title="Get any cookie data from the response.">httpGetCookie</a></li>
        <li><a href="#httpGetDateString" title="Get a formatted date/time string from a time value.">httpGetDateString</a></li>
        <li><a href="#httpGetDateString2" title="Get a formatted date/time string from a time value.">httpGetDateString2</a></li>
        <li><a href="#httpGetDateTime" title="Get a time value from a formatted date/time string.">httpGetDateTime</a></li>
+       <li><a href="#httpGetEncryption" title="Get the current encryption mode of a connection.">httpGetEncryption</a></li>
+       <li><a href="#httpGetExpect" title="Get the value of the Expect header, if any.">httpGetExpect</a></li>
        <li><a href="#httpGetFd" title="Get the file descriptor associated with a connection.">httpGetFd</a></li>
        <li><a href="#httpGetField" title="Get a field value from a request/response.">httpGetField</a></li>
        <li><a href="#httpGetHostByName" title="Lookup a hostname or IPv4 address, and return
 address records for the specified name.">httpGetHostByName</a></li>
        <li><a href="#httpGetHostname" title="Get the FQDN for the connection or local system.">httpGetHostname</a></li>
+       <li><a href="#httpGetKeepAlive" title="Get the current Keep-Alive state of the connection.">httpGetKeepAlive</a></li>
        <li><a href="#httpGetLength" title="Get the amount of data remaining from the
 content-length or transfer-encoding fields.">httpGetLength</a></li>
        <li><a href="#httpGetLength2" title="Get the amount of data remaining from the
 content-length or transfer-encoding fields.">httpGetLength2</a></li>
+       <li><a href="#httpGetPending" title="Get the number of bytes that are buffered for writing.">httpGetPending</a></li>
+       <li><a href="#httpGetReady" title="Get the number of bytes that can be read without blocking.">httpGetReady</a></li>
+       <li><a href="#httpGetRemaining" title="Get the number of remaining bytes in the message
+body or current chunk.">httpGetRemaining</a></li>
        <li><a href="#httpGetState" title="Get the current state of the HTTP request.">httpGetState</a></li>
        <li><a href="#httpGetStatus" title="Get the status of the last HTTP request.">httpGetStatus</a></li>
        <li><a href="#httpGetSubField" title="Get a sub-field value.">httpGetSubField</a></li>
@@ -459,19 +493,25 @@ content-length or transfer-encoding fields.">httpGetLength2</a></li>
        <li><a href="#httpHead" title="Send a HEAD request to the server.">httpHead</a></li>
        <li><a href="#httpInitialize" title="Initialize the HTTP interface library and set the
 default HTTP proxy (if any).">httpInitialize</a></li>
+       <li><a href="#httpIsChunked" title="Report whether a message body is chunked.">httpIsChunked</a></li>
+       <li><a href="#httpIsEncrypted" title="Report whether a connection is encrypted.">httpIsEncrypted</a></li>
        <li><a href="#httpMD5" title="Compute the MD5 sum of the username:group:password.">httpMD5</a></li>
        <li><a href="#httpMD5Final" title="Combine the MD5 sum of the username, group, and password
 with the server-supplied nonce value, method, and
 request-uri.">httpMD5Final</a></li>
        <li><a href="#httpMD5String" title="Convert an MD5 sum to a character string.">httpMD5String</a></li>
        <li><a href="#httpOptions" title="Send an OPTIONS request to the server.">httpOptions</a></li>
+       <li><a href="#httpPeek" title="Peek at data from a HTTP connection.">httpPeek</a></li>
        <li><a href="#httpPost" title="Send a POST request to the server.">httpPost</a></li>
        <li><a href="#httpPut" title="Send a PUT request to the server.">httpPut</a></li>
        <li><a href="#httpRead" title="Read data from a HTTP connection.">httpRead</a></li>
        <li><a href="#httpRead2" title="Read data from a HTTP connection.">httpRead2</a></li>
+       <li><a href="#httpReadRequest" title="Read a HTTP request from a connection.">httpReadRequest</a></li>
        <li><a href="#httpReconnect" title="Reconnect to a HTTP server.">httpReconnect</a></li>
        <li><a href="#httpReconnect2" title="Reconnect to a HTTP server with timeout and optional
 cancel.">httpReconnect2</a></li>
+       <li><a href="#httpResolveHostname" title="Resolve the hostname of the HTTP connection
+address.">httpResolveHostname</a></li>
        <li><a href="#httpSeparate" title="Separate a Universal Resource Identifier into its
 components.">httpSeparate</a></li>
        <li><a href="#httpSeparate2" title="Separate a Universal Resource Identifier into its
@@ -482,16 +522,22 @@ components.">httpSeparateURI</a></li>
        <li><a href="#httpSetCookie" title="Set the cookie value(s).">httpSetCookie</a></li>
        <li><a href="#httpSetCredentials" title="Set the credentials associated with an encrypted
 connection.">httpSetCredentials</a></li>
+       <li><a href="#httpSetDefaultField" title="Set the default value of an HTTP header.">httpSetDefaultField</a></li>
        <li><a href="#httpSetExpect" title="Set the Expect: header in a request.">httpSetExpect</a></li>
        <li><a href="#httpSetField" title="Set the value of an HTTP header.">httpSetField</a></li>
+       <li><a href="#httpSetKeepAlive" title="Set the current Keep-Alive state of a connection.">httpSetKeepAlive</a></li>
        <li><a href="#httpSetLength" title="Set the content-length and content-encoding.">httpSetLength</a></li>
        <li><a href="#httpSetTimeout" title="Set read/write timeouts and an optional callback.">httpSetTimeout</a></li>
+       <li><a href="#httpShutdown" title="Shutdown one side of an HTTP connection.">httpShutdown</a></li>
+       <li><a href="#httpStateString" title="Return the string describing a HTTP state value.">httpStateString</a></li>
        <li><a href="#httpStatus" title="Return a short string describing a HTTP status code.">httpStatus</a></li>
        <li><a href="#httpTrace" title="Send an TRACE request to the server.">httpTrace</a></li>
+       <li><a href="#httpURIStatusString" title="Return a string describing a URI status code.">httpURIStatusString</a></li>
        <li><a href="#httpUpdate" title="Update the current HTTP state for incoming data.">httpUpdate</a></li>
        <li><a href="#httpWait" title="Wait for data available on a connection.">httpWait</a></li>
        <li><a href="#httpWrite" title="Write data to a HTTP connection.">httpWrite</a></li>
        <li><a href="#httpWrite2" title="Write data to a HTTP connection.">httpWrite2</a></li>
+       <li><a href="#httpWriteResponse" title="Write a HTTP response to a client connection.">httpWriteResponse</a></li>
        <li><a href="#ippAddBoolean" title="Add a boolean attribute to an IPP message.">ippAddBoolean</a></li>
        <li><a href="#ippAddBooleans" title="Add an array of boolean values.">ippAddBooleans</a></li>
        <li><a href="#ippAddCollection" title="Add a collection value.">ippAddCollection</a></li>
@@ -507,10 +553,18 @@ connection.">httpSetCredentials</a></li>
        <li><a href="#ippAddResolutions" title="Add resolution values to an IPP message.">ippAddResolutions</a></li>
        <li><a href="#ippAddSeparator" title="Add a group separator to an IPP message.">ippAddSeparator</a></li>
        <li><a href="#ippAddString" title="Add a language-encoded string to an IPP message.">ippAddString</a></li>
+       <li><a href="#ippAddStringf" title="Add a formatted string to an IPP message.">ippAddStringf</a></li>
+       <li><a href="#ippAddStringfv" title="Add a formatted string to an IPP message.">ippAddStringfv</a></li>
        <li><a href="#ippAddStrings" title="Add language-encoded strings to an IPP message.">ippAddStrings</a></li>
        <li><a href="#ippAttributeString" title="Convert the attribute's value to a string.">ippAttributeString</a></li>
+       <li><a href="#ippContainsInteger" title="Determine whether an attribute contains the
+specified value or is within the list of ranges.">ippContainsInteger</a></li>
+       <li><a href="#ippContainsString" title="Determine whether an attribute contains the
+specified string value.">ippContainsString</a></li>
        <li><a href="#ippCopyAttribute" title="Copy an attribute.">ippCopyAttribute</a></li>
        <li><a href="#ippCopyAttributes" title="Copy attributes from one IPP message to another.">ippCopyAttributes</a></li>
+       <li><a href="#ippCreateRequestedArray" title="Create a CUPS array of attribute names from the
+given requested-attributes attribute.">ippCreateRequestedArray</a></li>
        <li><a href="#ippDateToTime" title="Convert from RFC 1903 Date/Time format to UNIX time
 in seconds.">ippDateToTime</a></li>
        <li><a href="#ippDelete" title="Delete an IPP message.">ippDelete</a></li>
@@ -530,6 +584,7 @@ in seconds.">ippDateToTime</a></li>
        <li><a href="#ippGetGroupTag" title="Get the group associated with an attribute.">ippGetGroupTag</a></li>
        <li><a href="#ippGetInteger" title="Get the integer/enum value for an attribute.">ippGetInteger</a></li>
        <li><a href="#ippGetName" title="Get the attribute name.">ippGetName</a></li>
+       <li><a href="#ippGetOctetString" title="Get an octetString value from an IPP attribute.">ippGetOctetString</a></li>
        <li><a href="#ippGetOperation" title="Get the operation ID in an IPP message.">ippGetOperation</a></li>
        <li><a href="#ippGetRange" title="Get a rangeOfInteger value from an attribute.">ippGetRange</a></li>
        <li><a href="#ippGetRequestId" title="Get the request ID from an IPP message.">ippGetRequestId</a></li>
@@ -542,6 +597,7 @@ in seconds.">ippDateToTime</a></li>
        <li><a href="#ippLength" title="Compute the length of an IPP message.">ippLength</a></li>
        <li><a href="#ippNew" title="Allocate a new IPP message.">ippNew</a></li>
        <li><a href="#ippNewRequest" title="Allocate a new IPP request message.">ippNewRequest</a></li>
+       <li><a href="#ippNewResponse" title="Allocate a new IPP response message.">ippNewResponse</a></li>
        <li><a href="#ippNextAttribute" title="Return the next attribute in the message.">ippNextAttribute</a></li>
        <li><a href="#ippOpString" title="Return a name for the given operation id.">ippOpString</a></li>
        <li><a href="#ippOpValue" title="Return an operation id for the given name.">ippOpValue</a></li>
@@ -555,6 +611,7 @@ in seconds.">ippDateToTime</a></li>
        <li><a href="#ippSetGroupTag" title="Set the group tag of an attribute.">ippSetGroupTag</a></li>
        <li><a href="#ippSetInteger" title="Set an integer or enum value in an attribute.">ippSetInteger</a></li>
        <li><a href="#ippSetName" title="Set the name of an attribute.">ippSetName</a></li>
+       <li><a href="#ippSetOctetString" title="Set an octetString value in an IPP attribute.">ippSetOctetString</a></li>
        <li><a href="#ippSetOperation" title="Set the operation ID in an IPP request message.">ippSetOperation</a></li>
        <li><a href="#ippSetPort" title="Set the default port number.">ippSetPort</a></li>
        <li><a href="#ippSetRange" title="Set a rangeOfInteger value in an attribute.">ippSetRange</a></li>
@@ -563,11 +620,16 @@ in seconds.">ippDateToTime</a></li>
        <li><a href="#ippSetState" title="Set the current state of the IPP message.">ippSetState</a></li>
        <li><a href="#ippSetStatusCode" title="Set the status code in an IPP response or event message.">ippSetStatusCode</a></li>
        <li><a href="#ippSetString" title="Set a string value in an attribute.">ippSetString</a></li>
+       <li><a href="#ippSetStringf" title="Set a formatted string value of an attribute.">ippSetStringf</a></li>
+       <li><a href="#ippSetStringfv" title="Set a formatted string value of an attribute.">ippSetStringfv</a></li>
        <li><a href="#ippSetValueTag" title="Set the value tag of an attribute.">ippSetValueTag</a></li>
        <li><a href="#ippSetVersion" title="Set the version number in an IPP message.">ippSetVersion</a></li>
+       <li><a href="#ippStateString" title="Return the name corresponding to a state value.">ippStateString</a></li>
        <li><a href="#ippTagString" title="Return the tag name corresponding to a tag value.">ippTagString</a></li>
        <li><a href="#ippTagValue" title="Return the tag value corresponding to a tag name.">ippTagValue</a></li>
        <li><a href="#ippTimeToDate" title="Convert from UNIX time to RFC 1903 format.">ippTimeToDate</a></li>
+       <li><a href="#ippValidateAttribute" title="Validate the contents of an attribute.">ippValidateAttribute</a></li>
+       <li><a href="#ippValidateAttributes" title="Validate all attributes in an IPP message.">ippValidateAttributes</a></li>
        <li><a href="#ippWrite" title="Write data for an IPP message to a HTTP connection.">ippWrite</a></li>
        <li><a href="#ippWriteFile" title="Write data for an IPP message to a file.">ippWriteFile</a></li>
        <li><a href="#ippWriteIO" title="Write data for an IPP message.">ippWriteIO</a></li>
@@ -590,9 +652,9 @@ with a hostname. ">http_addrlist_t</a></li>
        <li><a href="#http_keepalive_t" title="HTTP keep-alive values">http_keepalive_t</a></li>
        <li><a href="#http_state_t" title="HTTP state values; states
 are server-oriented...">http_state_t</a></li>
-       <li><a href="#http_status_t" title="HTTP status codes">http_status_t</a></li>
        <li><a href="#http_t" title="HTTP connection type">http_t</a></li>
        <li><a href="#http_timeout_cb_t" title="HTTP timeout callback ">http_timeout_cb_t</a></li>
+       <li><a href="#http_trust_t" title="Level of trust for credentials ">http_trust_t</a></li>
        <li><a href="#http_uri_coding_t" title="URI en/decode flags">http_uri_coding_t</a></li>
        <li><a href="#http_uri_status_t" title="URI separation status ">http_uri_status_t</a></li>
        <li><a href="#http_version_t" title="HTTP version numbers">http_version_t</a></li>
@@ -601,7 +663,7 @@ are server-oriented...">http_state_t</a></li>
 Please use the new accessor functions available in CUPS 1.6 and later, as
 these definitions will be moved to a private header file in a future release.">ipp_copycb_t</a></li>
        <li><a href="#ipp_dstate_t" title="Document states">ipp_dstate_t</a></li>
-       <li><a href="#ipp_finish_t" title="Finishings">ipp_finish_t</a></li>
+       <li><a href="#ipp_finish_t" title="Job collation types">ipp_finish_t</a></li>
        <li><a href="#ipp_iocb_t" title="IPP IO Callback Function ">ipp_iocb_t</a></li>
        <li><a href="#ipp_jcollate_t" title="Job collation types">ipp_jcollate_t</a></li>
        <li><a href="#ipp_orient_t" title="Orientation values">ipp_orient_t</a></li>
@@ -630,11 +692,12 @@ with a hostname. ">http_addrlist_s</a></li>
        <li><a href="#http_state_e" title="HTTP state values; states
 are server-oriented...">http_state_e</a></li>
        <li><a href="#http_status_e" title="HTTP status codes">http_status_e</a></li>
+       <li><a href="#http_trust_e" title="Level of trust for credentials ">http_trust_e</a></li>
        <li><a href="#http_uri_coding_e" title="URI en/decode flags">http_uri_coding_e</a></li>
        <li><a href="#http_uri_status_e" title="URI separation status ">http_uri_status_e</a></li>
        <li><a href="#http_version_e" title="HTTP version numbers">http_version_e</a></li>
        <li><a href="#ipp_dstate_e" title="Document states">ipp_dstate_e</a></li>
-       <li><a href="#ipp_finish_e" title="Finishings">ipp_finish_e</a></li>
+       <li><a href="#ipp_finishings_e" title="Finishings">ipp_finishings_e</a></li>
        <li><a href="#ipp_jcollate_e" title="Job collation types">ipp_jcollate_e</a></li>
        <li><a href="#ipp_jstate_e" title="Job states">ipp_jstate_e</a></li>
        <li><a href="#ipp_op_e" title="IPP operations">ipp_op_e</a></li>
@@ -985,7 +1048,7 @@ int cupsDoAuthentication (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">0 on success, -1 on error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function should be called in response to a <code>HTTP_UNAUTHORIZED</code>
+<p class="discussion">This function should be called in response to a <code>HTTP_STATUS_UNAUTHORIZED</code>
 status, prior to resubmitting your request.
 
 </p>
@@ -1160,7 +1223,7 @@ the request respectively.
 <h3 class="function"><span class="info">&nbsp;CUPS 1.1.20/OS X 10.4&nbsp;</span><a name="cupsGetFd">cupsGetFd</a></h3>
 <p class="description">Get a file from the server.</p>
 <p class="code">
-<a href="#http_status_t">http_status_t</a> cupsGetFd (<br>
+http_status_t cupsGetFd (<br>
 &nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;const char *resource,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;int fd<br>
@@ -1177,13 +1240,13 @@ the request respectively.
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">HTTP status</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function returns <code>HTTP_OK</code> when the file is successfully retrieved.
+<p class="discussion">This function returns <code>HTTP_STATUS_OK</code> when the file is successfully retrieved.
 
 </p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.1.20/OS X 10.4&nbsp;</span><a name="cupsGetFile">cupsGetFile</a></h3>
 <p class="description">Get a file from the server.</p>
 <p class="code">
-<a href="#http_status_t">http_status_t</a> cupsGetFile (<br>
+http_status_t cupsGetFile (<br>
 &nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;const char *resource,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;const char *filename<br>
@@ -1200,7 +1263,7 @@ the request respectively.
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">HTTP status</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function returns <code>HTTP_OK</code> when the file is successfully retrieved.
+<p class="discussion">This function returns <code>HTTP_STATUS_OK</code> when the file is successfully retrieved.
 
 </p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span><a name="cupsGetResponse">cupsGetResponse</a></h3>
@@ -1243,7 +1306,7 @@ const char *cupsLastErrorString (void);</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.1.20/OS X 10.4&nbsp;</span><a name="cupsPutFd">cupsPutFd</a></h3>
 <p class="description">Put a file on the server.</p>
 <p class="code">
-<a href="#http_status_t">http_status_t</a> cupsPutFd (<br>
+http_status_t cupsPutFd (<br>
 &nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;const char *resource,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;int fd<br>
@@ -1260,14 +1323,14 @@ const char *cupsLastErrorString (void);</p>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">HTTP status</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function returns <code>HTTP_CREATED</code> when the file is stored
+<p class="discussion">This function returns <code>HTTP_STATUS_CREATED</code> when the file is stored
 successfully.
 
 </p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.1.20/OS X 10.4&nbsp;</span><a name="cupsPutFile">cupsPutFile</a></h3>
 <p class="description">Put a file on the server.</p>
 <p class="code">
-<a href="#http_status_t">http_status_t</a> cupsPutFile (<br>
+http_status_t cupsPutFile (<br>
 &nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;const char *resource,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;const char *filename<br>
@@ -1316,7 +1379,7 @@ respectively.
 <h3 class="function"><span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span><a name="cupsSendRequest">cupsSendRequest</a></h3>
 <p class="description">Send an IPP request.</p>
 <p class="code">
-<a href="#http_status_t">http_status_t</a> cupsSendRequest (<br>
+http_status_t cupsSendRequest (<br>
 &nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *request,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;const char *resource,<br>
@@ -1342,7 +1405,7 @@ and <a href="#cupsReadResponseData"><code>cupsReadResponseData</code></a> to rea
 response. Only one request can be sent/queued at a time per <code>http_t</code>
 connection.<br>
 <br>
-Returns the initial HTTP status code, which will be <code>HTTP_CONTINUE</code>
+Returns the initial HTTP status code, which will be <code>HTTP_STATUS_CONTINUE</code>
 on a successful send of the request.<br>
 <br>
 Note: Unlike <a href="#cupsDoFileRequest"><code>cupsDoFileRequest</code></a>, <a href="#cupsDoIORequest"><code>cupsDoIORequest</code></a>, and
@@ -1352,7 +1415,7 @@ Note: Unlike <a href="#cupsDoFileRequest"><code>cupsDoFileRequest</code></a>, <a
 <h3 class="function"><span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span><a name="cupsWriteRequestData">cupsWriteRequestData</a></h3>
 <p class="description">Write additional data after an IPP request.</p>
 <p class="code">
-<a href="#http_status_t">http_status_t</a> cupsWriteRequestData (<br>
+http_status_t cupsWriteRequestData (<br>
 &nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;const char *buffer,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;size_t length<br>
@@ -1367,12 +1430,30 @@ Note: Unlike <a href="#cupsDoFileRequest"><code>cupsDoFileRequest</code></a>, <a
 <dd class="description">Number of bytes to write</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description"><code>HTTP_CONTINUE</code> if OK or HTTP status on error</p>
+<p class="description"><code>HTTP_STATUS_CONTINUE</code> if OK or HTTP status on error</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">This function is used after <a href="#cupsSendRequest"><code>cupsSendRequest</code></a> to provide a PPD and
 after <a href="#cupsStartDocument"><code>cupsStartDocument</code></a> to provide a document file.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpAcceptConnection">httpAcceptConnection</a></h3>
+<p class="description">Accept a new HTTP client connection from the
+specified listening socket.</p>
+<p class="code">
+<a href="#http_t">http_t</a> *httpAcceptConnection (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int fd,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int blocking<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>fd</dt>
+<dd class="description">Listen socket file descriptor</dd>
+<dt>blocking</dt>
+<dd class="description">1 if the connection should be
+blocking, 0 otherwise</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">HTTP connection or <code>NULL</code></p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span><a name="httpAddCredential">httpAddCredential</a></h3>
 <p class="description">Allocates and adds a single credential to an array.</p>
 <p class="code">
@@ -1409,6 +1490,29 @@ int httpAddrAny (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 if &quot;any&quot;, 0 otherwise</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpAddrClose">httpAddrClose</a></h3>
+<p class="description">Close a socket created by <a href="#httpAddrConnect"><code>httpAddrConnect</code></a> or
+<a href="#httpAddrListen"><code>httpAddrListen</code></a>.</p>
+<p class="code">
+int httpAddrClose (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_addr_t">http_addr_t</a> *addr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int fd<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>addr</dt>
+<dd class="description">Listen address or <code>NULL</code></dd>
+<dt>fd</dt>
+<dd class="description">Socket file descriptor</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">0 on success, -1 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Pass <code>NULL</code> for sockets created with <a href="#httpAddrConnect"><code>httpAddrConnect</code></a> and the
+listen address for sockets created with <a href="#httpAddrListen"><code>httpAddrListen</code></a>. This will
+ensure that domain sockets are removed when closed.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpAddrEqual">httpAddrEqual</a></h3>
 <p class="description">Compare two addresses.</p>
 <p class="code">
@@ -1425,6 +1529,19 @@ int httpAddrEqual (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 if equal, 0 if not</p>
+<h3 class="function"><a name="httpAddrFamily">httpAddrFamily</a></h3>
+<p class="description">Get the address family of an address.</p>
+<p class="code">
+int httpAddrFamily (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_addr_t">http_addr_t</a> *addr<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>addr</dt>
+<dd class="description">Address</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Address family</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpAddrLength">httpAddrLength</a></h3>
 <p class="description">Return the length of the address in bytes.</p>
 <p class="code">
@@ -1438,6 +1555,23 @@ int httpAddrLength (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Length in bytes</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpAddrListen">httpAddrListen</a></h3>
+<p class="description">Create a listening socket bound to the specified
+address and port.</p>
+<p class="code">
+int httpAddrListen (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_addr_t">http_addr_t</a> *addr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int port<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>addr</dt>
+<dd class="description">Address to bind to</dd>
+<dt>port</dt>
+<dd class="description">Port number to bind to</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Socket or -1 on error</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpAddrLocalhost">httpAddrLocalhost</a></h3>
 <p class="description">Check for the local loopback address.</p>
 <p class="code">
@@ -1470,6 +1604,19 @@ char *httpAddrLookup (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Host name</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpAddrPort">httpAddrPort</a></h3>
+<p class="description">Get the port number associated with an address.</p>
+<p class="code">
+int httpAddrPort (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_addr_t">http_addr_t</a> *addr<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>addr</dt>
+<dd class="description">Address</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Port number</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpAddrString">httpAddrString</a></h3>
 <p class="description">Convert an address to a numeric string.</p>
 <p class="code">
@@ -1577,6 +1724,42 @@ this function in place of traditional string functions whenever
 you need to create a URI string.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpAssembleUUID">httpAssembleUUID</a></h3>
+<p class="description">Assemble a name-based UUID URN conforming to RFC 4122.</p>
+<p class="code">
+char *httpAssembleUUID (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *server,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int port,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *name,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int number,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char *buffer,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;size_t bufsize<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>server</dt>
+<dd class="description">Server name</dd>
+<dt>port</dt>
+<dd class="description">Port number</dd>
+<dt>name</dt>
+<dd class="description">Object name or NULL</dd>
+<dt>number</dt>
+<dd class="description">Object number or 0</dd>
+<dt>buffer</dt>
+<dd class="description">String buffer</dd>
+<dt>bufsize</dt>
+<dd class="description">Size of buffer</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">UUID string</p>
+<h4 class="discussion">Discussion</h4>
+<p class="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.<br>
+<br>
+The buffer needs to be at least 46 bytes in size.
+
+</p>
 <h3 class="function"><a name="httpBlocking">httpBlocking</a></h3>
 <p class="description">Set blocking/non-blocking behavior on a connection.</p>
 <p class="code">
@@ -1587,7 +1770,7 @@ void httpBlocking (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>b</dt>
 <dd class="description">1 = blocking, 0 = non-blocking</dd>
 </dl>
@@ -1600,7 +1783,7 @@ int httpCheck (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">0 = no data, 1 = data available</p>
@@ -1613,7 +1796,7 @@ void httpClearCookie (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h3 class="function"><a name="httpClearFields">httpClearFields</a></h3>
 <p class="description">Clear HTTP request fields.</p>
@@ -1624,7 +1807,7 @@ void httpClearFields (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h3 class="function"><a name="httpClose">httpClose</a></h3>
 <p class="description">Close an HTTP connection.</p>
@@ -1635,8 +1818,24 @@ void httpClose (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpCompareCredentials">httpCompareCredentials</a></h3>
+<p class="description">Compare two sets of X.509 credentials.</p>
+<p class="code">
+int httpCompareCredentials (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;cups_array_t *cred1,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;cups_array_t *cred2<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>cred1</dt>
+<dd class="description">First set of X.509 credentials</dd>
+<dt>cred2</dt>
+<dd class="description">Second set of X.509 credentials</dd>
 </dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if they match, 0 if they do not</p>
 <h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="httpConnect">httpConnect</a></h3>
 <p class="description">Connect to a HTTP server.</p>
 <p class="code">
@@ -1654,16 +1853,21 @@ void httpClose (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New HTTP connection</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">This function is deprecated - use <a href="#httpConnectEncrypt"><code>httpConnectEncrypt</code></a> instead.
+<p class="discussion">This function is deprecated - use <a href="#httpConnect2"><code>httpConnect2</code></a> instead.
 
 </p>
-<h3 class="function"><a name="httpConnectEncrypt">httpConnectEncrypt</a></h3>
-<p class="description">Connect to a HTTP server using encryption.</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpConnect2">httpConnect2</a></h3>
+<p class="description">Connect to a HTTP server.</p>
 <p class="code">
-<a href="#http_t">http_t</a> *httpConnectEncrypt (<br>
+<a href="#http_t">http_t</a> *httpConnect2 (<br>
 &nbsp;&nbsp;&nbsp;&nbsp;const char *host,<br>
 &nbsp;&nbsp;&nbsp;&nbsp;int port,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_encryption_t">http_encryption_t</a> encryption<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_addrlist_t">http_addrlist_t</a> *addrlist,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int family,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_encryption_t">http_encryption_t</a> encryption,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int blocking,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int msec,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int *cancel<br>
 );</p>
 <h4 class="parameters">Parameters</h4>
 <dl>
@@ -1671,28 +1875,45 @@ void httpClose (<br>
 <dd class="description">Host to connect to</dd>
 <dt>port</dt>
 <dd class="description">Port number</dd>
+<dt>addrlist</dt>
+<dd class="description">List of addresses or NULL to lookup</dd>
+<dt>family</dt>
+<dd class="description">Address family to use or <code>AF_UNSPEC</code> for any</dd>
 <dt>encryption</dt>
 <dd class="description">Type of encryption to use</dd>
+<dt>blocking</dt>
+<dd class="description">1 for blocking connection, 0 for non-blocking</dd>
+<dt>msec</dt>
+<dd class="description">Connection timeout in milliseconds, 0 means don't connect</dd>
+<dt>cancel</dt>
+<dd class="description">Pointer to &quot;cancel&quot; variable</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New HTTP connection</p>
-<h3 class="function"><span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span><a name="httpCopyCredentials">httpCopyCredentials</a></h3>
-<p class="description">Copy the credentials associated with an encrypted
-connection.</p>
+<h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="httpConnectEncrypt">httpConnectEncrypt</a></h3>
+<p class="description">Connect to a HTTP server using encryption.</p>
 <p class="code">
-int httpCopyCredentials (<br>
-&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;cups_array_t **credentials<br>
+<a href="#http_t">http_t</a> *httpConnectEncrypt (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *host,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int port,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_encryption_t">http_encryption_t</a> encryption<br>
 );</p>
 <h4 class="parameters">Parameters</h4>
 <dl>
-<dt>http</dt>
-<dd class="description">Connection to server</dd>
-<dt>credentials</dt>
-<dd class="description">Array of credentials</dd>
+<dt>host</dt>
+<dd class="description">Host to connect to</dd>
+<dt>port</dt>
+<dd class="description">Port number</dd>
+<dt>encryption</dt>
+<dd class="description">Type of encryption to use</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Status of call (0 = success)</p>
+<p class="description">New HTTP connection</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function is now deprecated. Please use the <a href="#httpConnect2"><code>httpConnect2</code></a> function
+instead.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="httpDecode64">httpDecode64</a></h3>
 <p class="description">Base64-decode a string.</p>
 <p class="code">
@@ -1743,7 +1964,7 @@ int httpDelete (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>uri</dt>
 <dd class="description">URI to delete</dd>
 </dl>
@@ -1802,7 +2023,7 @@ int httpEncryption (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>e</dt>
 <dd class="description">New encryption preference</dd>
 </dl>
@@ -1817,10 +2038,24 @@ int httpError (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Error code (errno) value</p>
+<h3 class="function"><a name="httpFieldValue">httpFieldValue</a></h3>
+<p class="description">Return the HTTP field enumeration value for a field
+name.</p>
+<p class="code">
+<a href="#http_field_t">http_field_t</a> httpFieldValue (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *name<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>name</dt>
+<dd class="description">String name</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Field index</p>
 <h3 class="function"><a name="httpFlush">httpFlush</a></h3>
 <p class="description">Flush data from a HTTP connection.</p>
 <p class="code">
@@ -1830,7 +2065,7 @@ void httpFlush (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpFlushWrite">httpFlushWrite</a></h3>
 <p class="description">Flush data in write buffer.</p>
@@ -1841,7 +2076,7 @@ int httpFlushWrite (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Bytes written or -1 on error</p>
@@ -1866,12 +2101,46 @@ int httpGet (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>uri</dt>
 <dd class="description">URI to get</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Status of call (0 = success)</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetActivity">httpGetActivity</a></h3>
+<p class="description">Get the most recent activity for a connection.</p>
+<p class="code">
+time_t httpGetActivity (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Time of last read or write</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The return value is the UNIX time of the last read or write.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetAddress">httpGetAddress</a></h3>
+<p class="description">Get the address of the connected peer of a connection.</p>
+<p class="code">
+<a href="#http_addr_t">http_addr_t</a> *httpGetAddress (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Connected address or <code>NULL</code></p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Returns <code>NULL</code> if the socket is currently unconnected.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.3/OS X 10.5&nbsp;</span><a name="httpGetAuthString">httpGetAuthString</a></h3>
 <p class="description">Get the current authorization string.</p>
 <p class="code">
@@ -1881,7 +2150,7 @@ char *httpGetAuthString (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Authorization string</p>
@@ -1901,10 +2170,33 @@ int httpGetBlocking (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 if blocking, 0 if non-blocking</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpGetContentEncoding">httpGetContentEncoding</a></h3>
+<p class="description">Get a common content encoding, if any, between
+the client and server.</p>
+<p class="code">
+const char *httpGetContentEncoding (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Content-Coding value or
+<code>NULL</code> for the identity
+coding.</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function uses the value of the Accepts-Encoding HTTP header and must be
+called after receiving a response from the server or a request from the
+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.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.1.19/OS X 10.3&nbsp;</span><a name="httpGetCookie">httpGetCookie</a></h3>
 <p class="description">Get any cookie data from the response.</p>
 <p class="code">
@@ -1914,7 +2206,7 @@ const char *httpGetCookie (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">HTTP connecion</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Cookie data or NULL</p>
@@ -1963,6 +2255,43 @@ time_t httpGetDateTime (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">UNIX time</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetEncryption">httpGetEncryption</a></h3>
+<p class="description">Get the current encryption mode of a connection.</p>
+<p class="code">
+<a href="#http_encryption_t">http_encryption_t</a> httpGetEncryption (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Current encryption mode</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns the encryption mode for the connection. Use the
+<a href="#httpIsEncrypted"><code>httpIsEncrypted</code></a> function to determine whether a TLS session has
+been established.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpGetExpect">httpGetExpect</a></h3>
+<p class="description">Get the value of the Expect header, if any.</p>
+<p class="code">
+http_status_t httpGetExpect (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Expect: status, if any</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Returns <code>HTTP_STATUS_NONE</code> if there is no Expect header, otherwise
+returns the expected HTTP status code, typically <code>HTTP_STATUS_CONTINUE</code>.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpGetFd">httpGetFd</a></h3>
 <p class="description">Get the file descriptor associated with a connection.</p>
 <p class="code">
@@ -1972,7 +2301,7 @@ int httpGetFd (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">File descriptor or -1 if none</p>
@@ -1986,7 +2315,7 @@ const char *httpGetField (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>field</dt>
 <dd class="description">Field to get</dd>
 </dl>
@@ -2027,11 +2356,25 @@ const char *httpGetHostname (<br>
 <p class="description">FQDN for connection or system</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">When &quot;http&quot; points to a connected socket, return the hostname or
-address that was used in the call to httpConnect() or httpConnectEncrypt().
+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.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetKeepAlive">httpGetKeepAlive</a></h3>
+<p class="description">Get the current Keep-Alive state of the connection.</p>
+<p class="code">
+<a href="#http_keepalive_t">http_keepalive_t</a> httpGetKeepAlive (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Keep-Alive state</p>
 <h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="httpGetLength">httpGetLength</a></h3>
 <p class="description">Get the amount of data remaining from the
 content-length or transfer-encoding fields.</p>
@@ -2042,7 +2385,7 @@ int httpGetLength (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Content length</p>
@@ -2061,7 +2404,7 @@ off_t httpGetLength2 (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Content length</p>
@@ -2070,6 +2413,51 @@ off_t httpGetLength2 (<br>
 content larger than 2^31 - 1.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetPending">httpGetPending</a></h3>
+<p class="description">Get the number of bytes that are buffered for writing.</p>
+<p class="code">
+size_t httpGetPending (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of bytes buffered</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetReady">httpGetReady</a></h3>
+<p class="description">Get the number of bytes that can be read without blocking.</p>
+<p class="code">
+size_t httpGetReady (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of bytes available</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpGetRemaining">httpGetRemaining</a></h3>
+<p class="description">Get the number of remaining bytes in the message
+body or current chunk.</p>
+<p class="code">
+size_t httpGetRemaining (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Remaining bytes</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <a href="#httpIsChunked"><code>httpIsChunked</code></a> function can be used to determine whether the
+message body is chunked or fixed-length.
+
+</p>
 <h3 class="function"><a name="httpGetState">httpGetState</a></h3>
 <p class="description">Get the current state of the HTTP request.</p>
 <p class="code">
@@ -2079,20 +2467,20 @@ content larger than 2^31 - 1.
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">HTTP state</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpGetStatus">httpGetStatus</a></h3>
 <p class="description">Get the status of the last HTTP request.</p>
 <p class="code">
-<a href="#http_status_t">http_status_t</a> httpGetStatus (<br>
+http_status_t httpGetStatus (<br>
 &nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
 );</p>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">HTTP status</p>
@@ -2108,7 +2496,7 @@ char *httpGetSubField (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>field</dt>
 <dd class="description">Field index</dd>
 <dt>name</dt>
@@ -2131,7 +2519,7 @@ char *httpGetSubField2 (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>field</dt>
 <dd class="description">Field index</dd>
 <dt>name</dt>
@@ -2152,7 +2540,7 @@ char *httpGetSubField2 (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Version number</p>
@@ -2171,7 +2559,7 @@ char *httpGets (<br>
 <dt>length</dt>
 <dd class="description">Max length of buffer</dd>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Line or NULL</p>
@@ -2185,7 +2573,7 @@ int httpHead (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>uri</dt>
 <dd class="description">URI for head</dd>
 </dl>
@@ -2196,14 +2584,49 @@ int httpHead (<br>
 default HTTP proxy (if any).</p>
 <p class="code">
 void httpInitialize (void);</p>
-<h3 class="function"><a name="httpMD5">httpMD5</a></h3>
-<p class="description">Compute the MD5 sum of the username:group:password.</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpIsChunked">httpIsChunked</a></h3>
+<p class="description">Report whether a message body is chunked.</p>
 <p class="code">
-char *httpMD5 (<br>
-&nbsp;&nbsp;&nbsp;&nbsp;const char *username,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;const char *realm,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;const char *passwd,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;char md5[33]<br>
+int httpIsChunked (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if chunked, 0 if not</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns non-zero if the message body is composed of
+variable-length chunks.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpIsEncrypted">httpIsEncrypted</a></h3>
+<p class="description">Report whether a connection is encrypted.</p>
+<p class="code">
+int httpIsEncrypted (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if encrypted, 0 if not</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function returns non-zero if the connection is currently encrypted.
+
+</p>
+<h3 class="function"><a name="httpMD5">httpMD5</a></h3>
+<p class="description">Compute the MD5 sum of the username:group:password.</p>
+<p class="code">
+char *httpMD5 (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *username,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *realm,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *passwd,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char md5[33]<br>
 );</p>
 <h4 class="parameters">Parameters</h4>
 <dl>
@@ -2268,12 +2691,39 @@ int httpOptions (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>uri</dt>
 <dd class="description">URI for options</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Status of call (0 = success)</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpPeek">httpPeek</a></h3>
+<p class="description">Peek at data from a HTTP connection.</p>
+<p class="code">
+ssize_t httpPeek (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char *buffer,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;size_t length<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+<dt>buffer</dt>
+<dd class="description">Buffer for data</dd>
+<dt>length</dt>
+<dd class="description">Maximum number of bytes</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Number of bytes copied</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function copies available data from the given HTTP connection, reading
+a buffer as needed.  The data is still available for reading using
+<a href="#httpRead"><code>httpRead</code></a> or <a href="#httpRead2"><code>httpRead2</code></a>.<br>
+<br>
+For non-blocking connections the usual timeouts apply.
+
+</p>
 <h3 class="function"><a name="httpPost">httpPost</a></h3>
 <p class="description">Send a POST request to the server.</p>
 <p class="code">
@@ -2284,7 +2734,7 @@ int httpPost (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>uri</dt>
 <dd class="description">URI for post</dd>
 </dl>
@@ -2300,7 +2750,7 @@ int httpPut (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>uri</dt>
 <dd class="description">URI to put</dd>
 </dl>
@@ -2317,7 +2767,7 @@ int httpRead (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>buffer</dt>
 <dd class="description">Buffer for data</dd>
 <dt>length</dt>
@@ -2341,7 +2791,7 @@ ssize_t httpRead2 (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>buffer</dt>
 <dd class="description">Buffer for data</dd>
 <dt>length</dt>
@@ -2349,7 +2799,26 @@ ssize_t httpRead2 (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Number of bytes read</p>
-<h3 class="function"><a name="httpReconnect">httpReconnect</a></h3>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpReadRequest">httpReadRequest</a></h3>
+<p class="description">Read a HTTP request from a connection.</p>
+<p class="code">
+<a href="#http_state_t">http_state_t</a> httpReadRequest (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char *uri,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;size_t urilen<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+<dt>uri</dt>
+<dd class="description">URI buffer</dd>
+<dt>urilen</dt>
+<dd class="description">Size of URI buffer</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">New state of connection</p>
+<h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="httpReconnect">httpReconnect</a></h3>
 <p class="description">Reconnect to a HTTP server.</p>
 <p class="code">
 int httpReconnect (<br>
@@ -2358,10 +2827,15 @@ int httpReconnect (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">0 on success, non-zero on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function is deprecated. Please use the <a href="#httpReconnect2"><code>httpReconnect2</code></a> function
+instead.
+
+</p>
 <h3 class="function"><a name="httpReconnect2">httpReconnect2</a></h3>
 <p class="description">Reconnect to a HTTP server with timeout and optional
 cancel.</p>
@@ -2374,7 +2848,7 @@ int httpReconnect2 (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>msec</dt>
 <dd class="description">Timeout in milliseconds</dd>
 <dt>cancel</dt>
@@ -2382,6 +2856,26 @@ int httpReconnect2 (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">0 on success, non-zero on failure</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpResolveHostname">httpResolveHostname</a></h3>
+<p class="description">Resolve the hostname of the HTTP connection
+address.</p>
+<p class="code">
+const char *httpResolveHostname (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;char *buffer,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;size_t bufsize<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+<dt>buffer</dt>
+<dd class="description">Hostname buffer</dd>
+<dt>bufsize</dt>
+<dd class="description">Size of buffer</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Resolved hostname or <code>NULL</code></p>
 <h3 class="function"><span class="info">&nbsp;DEPRECATED&nbsp;</span><a name="httpSeparate">httpSeparate</a></h3>
 <p class="description">Separate a Universal Resource Identifier into its
 components.</p>
@@ -2512,7 +3006,7 @@ void httpSetAuthString (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>scheme</dt>
 <dd class="description">Auth scheme (NULL to clear it)</dd>
 <dt>data</dt>
@@ -2550,28 +3044,52 @@ int httpSetCredentials (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>credentials</dt>
 <dd class="description">Array of credentials</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Status of call (0 = success)</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpSetDefaultField">httpSetDefaultField</a></h3>
+<p class="description">Set the default value of an HTTP header.</p>
+<p class="code">
+void httpSetDefaultField (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_field_t">http_field_t</a> field,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *value<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+<dt>field</dt>
+<dd class="description">Field index</dd>
+<dt>value</dt>
+<dd class="description">Value</dd>
+</dl>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Currently only <code>HTTP_FIELD_ACCEPT_ENCODING</code>, <code>HTTP_FIELD_SERVER</code>,
+and <code>HTTP_FIELD_USER_AGENT</code> can be set.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpSetExpect">httpSetExpect</a></h3>
 <p class="description">Set the Expect: header in a request.</p>
 <p class="code">
 void httpSetExpect (<br>
 &nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_status_t">http_status_t</a> expect<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_status_t expect<br>
 );</p>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>expect</dt>
-<dd class="description">HTTP status to expect (HTTP_CONTINUE)</dd>
+<dd class="description">HTTP status to expect
+(<code>HTTP_STATUS_CONTINUE</code>)</dd>
 </dl>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">Currently only HTTP_CONTINUE is supported for the &quot;expect&quot; argument.
+<p class="discussion">Currently only <code>HTTP_STATUS_CONTINUE</code> is supported for the &quot;expect&quot;
+argument.
 
 </p>
 <h3 class="function"><a name="httpSetField">httpSetField</a></h3>
@@ -2585,12 +3103,26 @@ void httpSetField (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>field</dt>
 <dd class="description">Field index</dd>
 <dt>value</dt>
 <dd class="description">Value</dd>
 </dl>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpSetKeepAlive">httpSetKeepAlive</a></h3>
+<p class="description">Set the current Keep-Alive state of a connection.</p>
+<p class="code">
+void httpSetKeepAlive (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_keepalive_t">http_keepalive_t</a> keep_alive<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+<dt>keep_alive</dt>
+<dd class="description">New Keep-Alive value</dd>
+</dl>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="httpSetLength">httpSetLength</a></h3>
 <p class="description">Set the content-length and content-encoding.</p>
 <p class="code">
@@ -2601,7 +3133,7 @@ void httpSetLength (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>length</dt>
 <dd class="description">Length (0 for chunked)</dd>
 </dl>
@@ -2617,7 +3149,7 @@ void httpSetTimeout (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>timeout</dt>
 <dd class="description">Number of seconds for timeout,
 must be greater than 0</dd>
@@ -2631,11 +3163,35 @@ must be greater than 0</dd>
 data pointer and must return 1 to continue or 0 to error (time) out.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpShutdown">httpShutdown</a></h3>
+<p class="description">Shutdown one side of an HTTP connection.</p>
+<p class="code">
+void httpShutdown (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+</dl>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpStateString">httpStateString</a></h3>
+<p class="description">Return the string describing a HTTP state value.</p>
+<p class="code">
+const char *httpStateString (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_state_t">http_state_t</a> state<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>state</dt>
+<dd class="description">HTTP state value</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">State string</p>
 <h3 class="function"><a name="httpStatus">httpStatus</a></h3>
 <p class="description">Return a short string describing a HTTP status code.</p>
 <p class="code">
 const char *httpStatus (<br>
-&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_status_t">http_status_t</a> status<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_status_t status<br>
 );</p>
 <h4 class="parameters">Parameters</h4>
 <dl>
@@ -2657,22 +3213,35 @@ int httpTrace (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>uri</dt>
 <dd class="description">URI for trace</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Status of call (0 = success)</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="httpURIStatusString">httpURIStatusString</a></h3>
+<p class="description">Return a string describing a URI status code.</p>
+<p class="code">
+const char *httpURIStatusString (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_uri_status_t">http_uri_status_t</a> status<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>status</dt>
+<dd class="description">URI status code</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Localized status string</p>
 <h3 class="function"><a name="httpUpdate">httpUpdate</a></h3>
 <p class="description">Update the current HTTP state for incoming data.</p>
 <p class="code">
-<a href="#http_status_t">http_status_t</a> httpUpdate (<br>
+http_status_t httpUpdate (<br>
 &nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http<br>
 );</p>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">HTTP status</p>
@@ -2686,7 +3255,7 @@ int httpWait (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>msec</dt>
 <dd class="description">Milliseconds to wait</dd>
 </dl>
@@ -2703,7 +3272,7 @@ int httpWrite (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>buffer</dt>
 <dd class="description">Buffer for data</dd>
 <dt>length</dt>
@@ -2727,7 +3296,7 @@ ssize_t httpWrite2 (<br>
 <h4 class="parameters">Parameters</h4>
 <dl>
 <dt>http</dt>
-<dd class="description">Connection to server</dd>
+<dd class="description">HTTP connection</dd>
 <dt>buffer</dt>
 <dd class="description">Buffer for data</dd>
 <dt>length</dt>
@@ -2735,6 +3304,22 @@ ssize_t httpWrite2 (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Number of bytes written</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="httpWriteResponse">httpWriteResponse</a></h3>
+<p class="description">Write a HTTP response to a client connection.</p>
+<p class="code">
+int httpWriteResponse (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#http_t">http_t</a> *http,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;http_status_t status<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>http</dt>
+<dd class="description">HTTP connection</dd>
+<dt>status</dt>
+<dd class="description">Status code</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">0 on success, -1 on error</p>
 <h3 class="function"><a name="ippAddBoolean">ippAddBoolean</a></h3>
 <p class="description">Add a boolean attribute to an IPP message.</p>
 <p class="code">
@@ -2758,8 +3343,8 @@ ssize_t httpWrite2 (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -2792,8 +3377,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -2823,8 +3408,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -2859,8 +3444,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -2892,8 +3477,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -2926,8 +3511,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -2966,8 +3551,8 @@ Supported values include enum (<code>IPP_TAG_ENUM</code>) and integer
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3003,8 +3588,8 @@ Supported values include enum (<code>IPP_TAG_ENUM</code>) and integer
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3036,8 +3621,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3078,8 +3663,8 @@ admin-define (<code>IPP_TAG_ADMINDEFINE</code>).
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3117,8 +3702,8 @@ The <code>lower</code> parameter must be less than or equal to the <code>upper</
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3154,8 +3739,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3194,8 +3779,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3216,8 +3801,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.</p>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.</p>
 <h3 class="function"><a name="ippAddString">ippAddString</a></h3>
 <p class="description">Add a language-encoded string to an IPP message.</p>
 <p class="code">
@@ -3247,8 +3832,8 @@ event notification (<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3265,6 +3850,124 @@ Supported string values include charset (<code>IPP_TAG_CHARSET</code>), keyword
 <br>
 The <code>language</code> parameter must be non-<code>NULL</code> for nameWithLanguage and
 textWithLanguage string values and must be <code>NULL</code> for all other string values.</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippAddStringf">ippAddStringf</a></h3>
+<p class="description">Add a formatted string to an IPP message.</p>
+<p class="code">
+<a href="#ipp_attribute_t">ipp_attribute_t</a> *ippAddStringf (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *ipp,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;ipp_tag_t group,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;ipp_tag_t value_tag,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *name,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *language,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *format,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;...<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ipp</dt>
+<dd class="description">IPP message</dd>
+<dt>group</dt>
+<dd class="description">IPP group</dd>
+<dt>value_tag</dt>
+<dd class="description">Type of attribute</dd>
+<dt>name</dt>
+<dd class="description">Name of attribute</dd>
+<dt>language</dt>
+<dd class="description">Language code (<code>NULL</code> for default)</dd>
+<dt>format</dt>
+<dd class="description">Printf-style format string</dd>
+<dt>...</dt>
+<dd class="description">Additional arguments as needed</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">New attribute</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
+<br>
+The <code>group</code> parameter specifies the IPP attribute group tag: none
+(<code>IPP_TAG_ZERO</code>, for member attributes), document
+(<code>IPP_TAG_DOCUMENT</code>), event notification
+(<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation (<code>IPP_TAG_OPERATION</code>),
+printer (<code>IPP_TAG_PRINTER</code>), subscription (<code>IPP_TAG_SUBSCRIPTION</code>),
+or unsupported (<code>IPP_TAG_UNSUPPORTED_GROUP</code>).<br>
+<br>
+Supported string values include charset (<code>IPP_TAG_CHARSET</code>), keyword
+(<code>IPP_TAG_KEYWORD</code>), language (<code>IPP_TAG_LANGUAGE</code>), mimeMediaType
+(<code>IPP_TAG_MIMETYPE</code>), name (<code>IPP_TAG_NAME</code>), nameWithLanguage
+(<code>IPP_TAG_NAMELANG), text (</code>code IPP_TAG_TEXT@), textWithLanguage
+(<code>IPP_TAG_TEXTLANG</code>), uri (<code>IPP_TAG_URI</code>), and uriScheme
+(<code>IPP_TAG_URISCHEME</code>).<br>
+<br>
+The <code>language</code> parameter must be non-<code>NULL</code> for nameWithLanguage
+and textWithLanguage string values and must be <code>NULL</code> for all other
+string values.<br>
+<br>
+The <code>format</code> parameter uses formatting characters compatible with the
+printf family of standard functions.  Additional arguments follow it as
+needed.  The formatted string is truncated as needed to the maximum length of
+the corresponding value type.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippAddStringfv">ippAddStringfv</a></h3>
+<p class="description">Add a formatted string to an IPP message.</p>
+<p class="code">
+<a href="#ipp_attribute_t">ipp_attribute_t</a> *ippAddStringfv (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *ipp,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;ipp_tag_t group,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;ipp_tag_t value_tag,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *name,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *language,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *format,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;va_list ap<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ipp</dt>
+<dd class="description">IPP message</dd>
+<dt>group</dt>
+<dd class="description">IPP group</dd>
+<dt>value_tag</dt>
+<dd class="description">Type of attribute</dd>
+<dt>name</dt>
+<dd class="description">Name of attribute</dd>
+<dt>language</dt>
+<dd class="description">Language code (<code>NULL</code> for default)</dd>
+<dt>format</dt>
+<dd class="description">Printf-style format string</dd>
+<dt>ap</dt>
+<dd class="description">Additional arguments</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">New attribute</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
+<br>
+The <code>group</code> parameter specifies the IPP attribute group tag: none
+(<code>IPP_TAG_ZERO</code>, for member attributes), document
+(<code>IPP_TAG_DOCUMENT</code>), event notification
+(<code>IPP_TAG_EVENT_NOTIFICATION</code>), operation (<code>IPP_TAG_OPERATION</code>),
+printer (<code>IPP_TAG_PRINTER</code>), subscription (<code>IPP_TAG_SUBSCRIPTION</code>),
+or unsupported (<code>IPP_TAG_UNSUPPORTED_GROUP</code>).<br>
+<br>
+Supported string values include charset (<code>IPP_TAG_CHARSET</code>), keyword
+(<code>IPP_TAG_KEYWORD</code>), language (<code>IPP_TAG_LANGUAGE</code>), mimeMediaType
+(<code>IPP_TAG_MIMETYPE</code>), name (<code>IPP_TAG_NAME</code>), nameWithLanguage
+(<code>IPP_TAG_NAMELANG), text (</code>code IPP_TAG_TEXT@), textWithLanguage
+(<code>IPP_TAG_TEXTLANG</code>), uri (<code>IPP_TAG_URI</code>), and uriScheme
+(<code>IPP_TAG_URISCHEME</code>).<br>
+<br>
+The <code>language</code> parameter must be non-<code>NULL</code> for nameWithLanguage
+and textWithLanguage string values and must be <code>NULL</code> for all other
+string values.<br>
+<br>
+The <code>format</code> parameter uses formatting characters compatible with the
+printf family of standard functions.  Additional arguments are passed in the
+stdarg pointer <code>ap</code>.  The formatted string is truncated as needed to the
+maximum length of the corresponding value type.
+
+</p>
 <h3 class="function"><a name="ippAddStrings">ippAddStrings</a></h3>
 <p class="description">Add language-encoded strings to an IPP message.</p>
 <p class="code">
@@ -3297,8 +4000,8 @@ textWithLanguage string values and must be <code>NULL</code> for all other strin
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">New attribute</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>group</code> parameter specifies the IPP attribute group tag: none
 (<code>IPP_TAG_ZERO</code>, for member attributes), document (<code>IPP_TAG_DOCUMENT</code>),
@@ -3340,6 +4043,51 @@ trailing nul. The buffer pointer can be NULL to get the required length,
 just like (v)snprintf.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippContainsInteger">ippContainsInteger</a></h3>
+<p class="description">Determine whether an attribute contains the
+specified value or is within the list of ranges.</p>
+<p class="code">
+int ippContainsInteger (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int value<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>attr</dt>
+<dd class="description">Attribute</dd>
+<dt>value</dt>
+<dd class="description">Integer/enum value</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on a match, 0 on no match</p>
+<h4 class="discussion">Discussion</h4>
+<p class="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.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippContainsString">ippContainsString</a></h3>
+<p class="description">Determine whether an attribute contains the
+specified string value.</p>
+<p class="code">
+int ippContainsString (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *value<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>attr</dt>
+<dd class="description">Attribute</dd>
+<dt>value</dt>
+<dd class="description">String value</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on a match, 0 on no match</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Returns non-zero when the attribute contains a matching charset, keyword,
+language, mimeMediaType, name, text, URI, or URI scheme value.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippCopyAttribute">ippCopyAttribute</a></h3>
 <p class="description">Copy an attribute.</p>
 <p class="code">
@@ -3392,7 +4140,7 @@ int ippCopyAttributes (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on error</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">Zero or more attributes are copied from the source IPP message, @code@ src, to the
+<p class="discussion">Zero or more attributes are copied from the source IPP message, <code>src</code>, to the
 destination IPP message, <code>dst</code>. When <code>quickcopy</code> is non-zero, a &quot;shallow&quot;
 reference copy of the attribute is created - this should only be done as long as the
 original source IPP message will not be freed for the life of the destination.<br>
@@ -3403,6 +4151,35 @@ attributes that are copied - the function must return 1 to copy the attribute or
 itself.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippCreateRequestedArray">ippCreateRequestedArray</a></h3>
+<p class="description">Create a CUPS array of attribute names from the
+given requested-attributes attribute.</p>
+<p class="code">
+cups_array_t *ippCreateRequestedArray (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *request<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>request</dt>
+<dd class="description">IPP request</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">CUPS array or <code>NULL</code> if all</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function creates a (sorted) CUPS array of attribute names matching the
+list of &quot;requested-attribute&quot; values supplied in an IPP request.  All IANA-
+registered values are supported in addition to the CUPS IPP extension
+attributes.<br>
+<br>
+The <code>request</code> parameter specifies the request message that was read from
+the client.
+
+<code>NULL</code> is returned if all attributes should be returned.  Otherwise, the
+result is a sorted array of attribute names, where <code>cupsArrayFind(array,
+"attribute-name")</code> will return a non-NULL pointer.  The array must be freed
+using the <code>cupsArrayDelete</code> function.
+
+</p>
 <h3 class="function"><a name="ippDateToTime">ippDateToTime</a></h3>
 <p class="description">Convert from RFC 1903 Date/Time format to UNIX time
 in seconds.</p>
@@ -3550,6 +4327,10 @@ ipp_status_t ippErrorValue (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Matching attribute</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Starting with CUPS 2.0, the attribute name can contain a hierarchical list
+of attribute and member names separated by slashes, for example
+&quot;media-col/media-size&quot;.</p>
 <h3 class="function"><a name="ippFindNextAttribute">ippFindNextAttribute</a></h3>
 <p class="description">Find the next named attribute in a request.</p>
 <p class="code">
@@ -3569,6 +4350,10 @@ ipp_status_t ippErrorValue (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Matching attribute</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">Starting with CUPS 2.0, the attribute name can contain a hierarchical list
+of attribute and member names separated by slashes, for example
+&quot;media-col/media-size&quot;.</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippFirstAttribute">ippFirstAttribute</a></h3>
 <p class="description">Return the first attribute in the message.</p>
 <p class="code">
@@ -3597,7 +4382,7 @@ int ippGetBoolean (<br>
 <dd class="description">Value number (0-based)</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Boolean value or -1 on error</p>
+<p class="description">Boolean value or 0 on error</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
 <a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a> - 1.
@@ -3636,7 +4421,7 @@ int ippGetCount (<br>
 <dd class="description">IPP attribute</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Number of values or -1 on error</p>
+<p class="description">Number of values or 0 on error</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippGetDate">ippGetDate</a></h3>
 <p class="description">Get a date value for an attribute.</p>
 <p class="code">
@@ -3686,7 +4471,7 @@ int ippGetInteger (<br>
 <dd class="description">Value number (0-based)</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Value or -1 on error</p>
+<p class="description">Value or 0 on error</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
 <a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a> - 1.
@@ -3705,6 +4490,30 @@ const char *ippGetName (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">Attribute name or <code>NULL</code> for separators</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippGetOctetString">ippGetOctetString</a></h3>
+<p class="description">Get an octetString value from an IPP attribute.</p>
+<p class="code">
+void *ippGetOctetString (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int element,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int *datalen<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>attr</dt>
+<dd class="description">IPP attribute</dd>
+<dt>element</dt>
+<dd class="description">Value number (0-based)</dd>
+<dt>datalen</dt>
+<dd class="description">Length of octetString data</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">Pointer to octetString data</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
+<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a> - 1.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippGetOperation">ippGetOperation</a></h3>
 <p class="description">Get the operation ID in an IPP message.</p>
 <p class="code">
@@ -3717,7 +4526,7 @@ ipp_op_t ippGetOperation (<br>
 <dd class="description">IPP request message</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Operation ID or -1 on error</p>
+<p class="description">Operation ID or 0 on error</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippGetRange">ippGetRange</a></h3>
 <p class="description">Get a rangeOfInteger value from an attribute.</p>
 <p class="code">
@@ -3736,7 +4545,7 @@ int ippGetRange (<br>
 <dd class="description">Upper value of range</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Lower value of range or -1</p>
+<p class="description">Lower value of range or 0</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
 <a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a> - 1.
@@ -3754,7 +4563,7 @@ int ippGetRequestId (<br>
 <dd class="description">IPP message</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Request ID or -1 on error</p>
+<p class="description">Request ID or 0 on error</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippGetResolution">ippGetResolution</a></h3>
 <p class="description">Get a resolution value for an attribute.</p>
 <p class="code">
@@ -3776,7 +4585,7 @@ int ippGetResolution (<br>
 <dd class="description">Units for resolution</dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Horizontal/cross feed resolution or -1</p>
+<p class="description">Horizontal/cross feed resolution or 0</p>
 <h4 class="discussion">Discussion</h4>
 <p class="discussion">The <code>element</code> parameter specifies which value to get from 0 to
 <a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a> - 1.
@@ -3859,7 +4668,7 @@ int ippGetVersion (<br>
 <dd class="description">Minor version number or <code>NULL</code></dd>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
-<p class="description">Major version number or -1 on error</p>
+<p class="description">Major version number or 0 on error</p>
 <h3 class="function"><a name="ippLength">ippLength</a></h3>
 <p class="description">Compute the length of an IPP message.</p>
 <p class="code">
@@ -3898,6 +4707,28 @@ attributes-natural-language attributes added. The
 attributes-natural-language value is derived from the current locale.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippNewResponse">ippNewResponse</a></h3>
+<p class="description">Allocate a new IPP response message.</p>
+<p class="code">
+<a href="#ipp_t">ipp_t</a> *ippNewResponse (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *request<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>request</dt>
+<dd class="description">IPP request message</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">IPP response message</p>
+<h4 class="discussion">Discussion</h4>
+<p class="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,
+&quot;utf-8&quot; and a value derived from the current locale are substituted,
+respectively.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippNextAttribute">ippNextAttribute</a></h3>
 <p class="description">Return the next attribute in the message.</p>
 <p class="code">
@@ -4023,8 +4854,8 @@ int ippSetBoolean (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>attr</code> parameter may be modified as a result of setting the value.<br>
 <br>
@@ -4055,8 +4886,8 @@ int ippSetCollection (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>attr</code> parameter may be modified as a result of setting the value.<br>
 <br>
@@ -4087,8 +4918,8 @@ int ippSetDate (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>attr</code> parameter may be modified as a result of setting the value.<br>
 <br>
@@ -4116,8 +4947,8 @@ int ippSetGroupTag (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>attr</code> parameter may be modified as a result of setting the value.<br>
 <br>
@@ -4151,8 +4982,8 @@ int ippSetInteger (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>attr</code> parameter may be modified as a result of setting the value.<br>
 <br>
@@ -4180,12 +5011,47 @@ int ippSetName (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>attr</code> parameter may be modified as a result of setting the value.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippSetOctetString">ippSetOctetString</a></h3>
+<p class="description">Set an octetString value in an IPP attribute.</p>
+<p class="code">
+int ippSetOctetString (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *ipp,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> **attr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int element,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const void *data,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int datalen<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ipp</dt>
+<dd class="description">IPP message</dd>
+<dt>attr</dt>
+<dd class="description">IPP attribute</dd>
+<dt>element</dt>
+<dd class="description">Value number (0-based)</dd>
+<dt>data</dt>
+<dd class="description">Pointer to octetString data</dd>
+<dt>datalen</dt>
+<dd class="description">Length of octetString data</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
+<br>
+The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+<br>
+The <code>element</code> parameter specifies which value to set from 0 to
+<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a>.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippSetOperation">ippSetOperation</a></h3>
 <p class="description">Set the operation ID in an IPP request message.</p>
 <p class="code">
@@ -4203,8 +5069,8 @@ int ippSetOperation (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.
 
 </p>
 <h3 class="function"><a name="ippSetPort">ippSetPort</a></h3>
@@ -4244,8 +5110,8 @@ int ippSetRange (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>attr</code> parameter may be modified as a result of setting the value.<br>
 <br>
@@ -4270,8 +5136,8 @@ int ippSetRequestId (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>request_id</code> parameter must be greater than 0.
 
@@ -4305,8 +5171,8 @@ int ippSetResolution (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>attr</code> parameter may be modified as a result of setting the value.<br>
 <br>
@@ -4347,8 +5213,8 @@ int ippSetStatusCode (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.
 
 </p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippSetString">ippSetString</a></h3>
@@ -4374,8 +5240,8 @@ int ippSetString (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>attr</code> parameter may be modified as a result of setting the value.<br>
 <br>
@@ -4383,6 +5249,86 @@ The <code>element</code> parameter specifies which value to set from 0 to
 <a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a>.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippSetStringf">ippSetStringf</a></h3>
+<p class="description">Set a formatted string value of an attribute.</p>
+<p class="code">
+int ippSetStringf (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *ipp,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> **attr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int element,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *format,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;...<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ipp</dt>
+<dd class="description">IPP message</dd>
+<dt>attr</dt>
+<dd class="description">IPP attribute</dd>
+<dt>element</dt>
+<dd class="description">Value number (0-based)</dd>
+<dt>format</dt>
+<dd class="description">Printf-style format string</dd>
+<dt>...</dt>
+<dd class="description">Additional arguments as needed</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
+<br>
+The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+<br>
+The <code>element</code> parameter specifies which value to set from 0 to
+<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a>.<br>
+<br>
+The <code>format</code> parameter uses formatting characters compatible with the
+printf family of standard functions.  Additional arguments follow it as
+needed.  The formatted string is truncated as needed to the maximum length of
+the corresponding value type.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippSetStringfv">ippSetStringfv</a></h3>
+<p class="description">Set a formatted string value of an attribute.</p>
+<p class="code">
+int ippSetStringfv (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *ipp,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> **attr,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;int element,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;const char *format,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;va_list ap<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ipp</dt>
+<dd class="description">IPP message</dd>
+<dt>attr</dt>
+<dd class="description">IPP attribute</dd>
+<dt>element</dt>
+<dd class="description">Value number (0-based)</dd>
+<dt>format</dt>
+<dd class="description">Printf-style format string</dd>
+<dt>ap</dt>
+<dd class="description">Pointer to additional arguments</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 on success, 0 on failure</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
+<br>
+The <code>attr</code> parameter may be modified as a result of setting the value.<br>
+<br>
+The <code>element</code> parameter specifies which value to set from 0 to
+<a href="#ippGetCount(attr)"><code>ippGetCount(attr)</code></a>.<br>
+<br>
+The <code>format</code> parameter uses formatting characters compatible with the
+printf family of standard functions.  Additional arguments follow it as
+needed.  The formatted string is truncated as needed to the maximum length of
+the corresponding value type.
+
+</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.6/OS X 10.8&nbsp;</span><a name="ippSetValueTag">ippSetValueTag</a></h3>
 <p class="description">Set the value tag of an attribute.</p>
 <p class="code">
@@ -4403,8 +5349,8 @@ int ippSetValueTag (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to the IPP message containing the attribute that was
-previously created using the <a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The <code>attr</code> parameter may be modified as a result of setting the value.<br>
 <br>
@@ -4441,12 +5387,25 @@ int ippSetVersion (<br>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">1 on success, 0 on failure</p>
 <h4 class="discussion">Discussion</h4>
-<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using the
-<a href="#ippNew"><code>ippNew</code></a> or <a href="#ippNewRequest"><code>ippNewRequest</code></a> functions.<br>
+<p class="discussion">The <code>ipp</code> parameter refers to an IPP message previously created using
+the <a href="#ippNew"><code>ippNew</code></a>, <a href="#ippNewRequest"><code>ippNewRequest</code></a>, or  <a href="#ippNewResponse"><code>ippNewResponse</code></a> functions.<br>
 <br>
 The valid version numbers are currently 1.0, 1.1, 2.0, 2.1, and 2.2.
 
 </p>
+<h3 class="function"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="ippStateString">ippStateString</a></h3>
+<p class="description">Return the name corresponding to a state value.</p>
+<p class="code">
+const char *ippStateString (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_state_t">ipp_state_t</a> state<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>state</dt>
+<dd class="description">State value</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">State name</p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span><a name="ippTagString">ippTagString</a></h3>
 <p class="description">Return the tag name corresponding to a tag value.</p>
 <p class="code">
@@ -4494,6 +5453,44 @@ const <a href="#ipp_uchar_t">ipp_uchar_t</a> *ippTimeToDate (<br>
 </dl>
 <h4 class="returnvalue">Return Value</h4>
 <p class="description">RFC-1903 date/time data</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippValidateAttribute">ippValidateAttribute</a></h3>
+<p class="description">Validate the contents of an attribute.</p>
+<p class="code">
+int ippValidateAttribute (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_attribute_t">ipp_attribute_t</a> *attr<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>attr</dt>
+<dd class="description">Attribute</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if valid, 0 otherwise</p>
+<h4 class="discussion">Discussion</h4>
+<p class="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.
+
+</p>
+<h3 class="function"><span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span><a name="ippValidateAttributes">ippValidateAttributes</a></h3>
+<p class="description">Validate all attributes in an IPP message.</p>
+<p class="code">
+int ippValidateAttributes (<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<a href="#ipp_t">ipp_t</a> *ipp<br>
+);</p>
+<h4 class="parameters">Parameters</h4>
+<dl>
+<dt>ipp</dt>
+<dd class="description">IPP message</dd>
+</dl>
+<h4 class="returnvalue">Return Value</h4>
+<p class="description">1 if valid, 0 otherwise</p>
+<h4 class="discussion">Discussion</h4>
+<p class="discussion">This function validates the contents of the IPP message, including each
+attribute.  Like <a href="#ippValidateAttribute"><code>ippValidateAttribute</code></a>, cupsLastErrorString() is set
+to a human-readable message on failure.
+
+</p>
 <h3 class="function"><a name="ippWrite">ippWrite</a></h3>
 <p class="description">Write data for an IPP message to a HTTP connection.</p>
 <p class="code">
@@ -4607,12 +5604,7 @@ typedef enum <a href="#http_keepalive_e">http_keepalive_e</a> http_keepalive_t;
 <p class="description">HTTP state values; states
 are server-oriented...</p>
 <p class="code">
-typedef enum <a href="#http_state_e">http_state_e</a> / http_state_t;
-</p>
-<h3 class="typedef"><a name="http_status_t">http_status_t</a></h3>
-<p class="description">HTTP status codes</p>
-<p class="code">
-typedef enum <a href="#http_status_e">http_status_e</a> http_status_t;
+typedef enum <a href="#http_state_e">http_state_e</a> http_state_t;
 </p>
 <h3 class="typedef"><a name="http_t">http_t</a></h3>
 <p class="description">HTTP connection type</p>
@@ -4624,6 +5616,11 @@ typedef struct _http_s http_t;
 <p class="code">
 typedef int (*http_timeout_cb_t)(<a href="#http_t">http_t</a> *http, void *user_data);
 </p>
+<h3 class="typedef"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="http_trust_t">http_trust_t</a></h3>
+<p class="description">Level of trust for credentials </p>
+<p class="code">
+typedef enum <a href="#http_trust_e">http_trust_e</a> http_trust_t;
+</p>
 <h3 class="typedef"><a name="http_uri_coding_t">http_uri_coding_t</a></h3>
 <p class="description">URI en/decode flags</p>
 <p class="code">
@@ -4657,9 +5654,9 @@ typedef int (*ipp_copycb_t)(void *context, <a href="#ipp_t">ipp_t</a> *dst, <a h
 typedef enum <a href="#ipp_dstate_e">ipp_dstate_e</a> ipp_dstate_t;
 </p>
 <h3 class="typedef"><a name="ipp_finish_t">ipp_finish_t</a></h3>
-<p class="description">Finishings</p>
+<p class="description">Job collation types</p>
 <p class="code">
-typedef enum <a href="#ipp_finish_e">ipp_finish_e</a> ipp_finish_t;
+typedef enum <a href="#ipp_finishings_e">ipp_finishings_e</a> ipp_finish_t;
 </p>
 <h3 class="typedef"><span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span><a name="ipp_iocb_t">ipp_iocb_t</a></h3>
 <p class="description">IPP IO Callback Function </p>
@@ -4790,34 +5787,38 @@ with a hostname. </p>
 <p class="description">HTTP transfer encoding values</p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>HTTP_ENCODE_CHUNKED </dt>
+<dt>HTTP_ENCODING_CHUNKED </dt>
 <dd class="description">Data is chunked</dd>
-<dt>HTTP_ENCODE_FIELDS </dt>
+<dt>HTTP_ENCODING_FIELDS </dt>
 <dd class="description">Sending HTTP fields</dd>
-<dt>HTTP_ENCODE_LENGTH </dt>
+<dt>HTTP_ENCODING_LENGTH </dt>
 <dd class="description">Data is sent with Content-Length</dd>
 </dl>
 <h3 class="enumeration"><a name="http_encryption_e">http_encryption_e</a></h3>
 <p class="description">HTTP encryption values</p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>HTTP_ENCRYPT_ALWAYS </dt>
+<dt>HTTP_ENCRYPTION_ALWAYS </dt>
 <dd class="description">Always encrypt (SSL)</dd>
-<dt>HTTP_ENCRYPT_IF_REQUESTED </dt>
+<dt>HTTP_ENCRYPTION_IF_REQUESTED </dt>
 <dd class="description">Encrypt if requested (TLS upgrade)</dd>
-<dt>HTTP_ENCRYPT_NEVER </dt>
+<dt>HTTP_ENCRYPTION_NEVER </dt>
 <dd class="description">Never encrypt</dd>
-<dt>HTTP_ENCRYPT_REQUIRED </dt>
+<dt>HTTP_ENCRYPTION_REQUIRED </dt>
 <dd class="description">Encryption is required (TLS upgrade)</dd>
 </dl>
 <h3 class="enumeration"><a name="http_field_e">http_field_e</a></h3>
 <p class="description">HTTP field names</p>
 <h4 class="constants">Constants</h4>
 <dl>
+<dt>HTTP_FIELD_ACCEPT_ENCODING <span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span></dt>
+<dd class="description">Accepting-Encoding field </dd>
 <dt>HTTP_FIELD_ACCEPT_LANGUAGE </dt>
 <dd class="description">Accept-Language field</dd>
 <dt>HTTP_FIELD_ACCEPT_RANGES </dt>
 <dd class="description">Accept-Ranges field</dd>
+<dt>HTTP_FIELD_ALLOW <span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span></dt>
+<dd class="description">Allow field </dd>
 <dt>HTTP_FIELD_AUTHORIZATION </dt>
 <dd class="description">Authorization field</dd>
 <dt>HTTP_FIELD_CONNECTION </dt>
@@ -4862,6 +5863,8 @@ with a hostname. </p>
 <dd class="description">Referer field</dd>
 <dt>HTTP_FIELD_RETRY_AFTER </dt>
 <dd class="description">Retry-After field</dd>
+<dt>HTTP_FIELD_SERVER <span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span></dt>
+<dd class="description">Server field </dd>
 <dt>HTTP_FIELD_TRANSFER_ENCODING </dt>
 <dd class="description">Transfer-Encoding field</dd>
 <dt>HTTP_FIELD_UNKNOWN </dt>
@@ -4887,126 +5890,151 @@ with a hostname. </p>
 are server-oriented...</p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>HTTP_CLOSE </dt>
-<dd class="description">CLOSE command, waiting for blank line</dd>
-<dt>HTTP_DELETE </dt>
+<dt>HTTP_STATE_CONNECT </dt>
+<dd class="description">CONNECT command, waiting for blank line</dd>
+<dt>HTTP_STATE_DELETE </dt>
 <dd class="description">DELETE command, waiting for blank line</dd>
-<dt>HTTP_GET </dt>
+<dt>HTTP_STATE_ERROR </dt>
+<dd class="description">Error on socket</dd>
+<dt>HTTP_STATE_GET </dt>
 <dd class="description">GET command, waiting for blank line</dd>
-<dt>HTTP_GET_SEND </dt>
+<dt>HTTP_STATE_GET_SEND </dt>
 <dd class="description">GET command, sending data</dd>
-<dt>HTTP_HEAD </dt>
+<dt>HTTP_STATE_HEAD </dt>
 <dd class="description">HEAD command, waiting for blank line</dd>
-<dt>HTTP_OPTIONS </dt>
+<dt>HTTP_STATE_OPTIONS </dt>
 <dd class="description">OPTIONS command, waiting for blank line</dd>
-<dt>HTTP_POST </dt>
+<dt>HTTP_STATE_POST </dt>
 <dd class="description">POST command, waiting for blank line</dd>
-<dt>HTTP_POST_RECV </dt>
+<dt>HTTP_STATE_POST_RECV </dt>
 <dd class="description">POST command, receiving data</dd>
-<dt>HTTP_POST_SEND </dt>
+<dt>HTTP_STATE_POST_SEND </dt>
 <dd class="description">POST command, sending data</dd>
-<dt>HTTP_PUT </dt>
+<dt>HTTP_STATE_PUT </dt>
 <dd class="description">PUT command, waiting for blank line</dd>
-<dt>HTTP_PUT_RECV </dt>
+<dt>HTTP_STATE_PUT_RECV </dt>
 <dd class="description">PUT command, receiving data</dd>
-<dt>HTTP_STATUS </dt>
+<dt>HTTP_STATE_STATUS </dt>
 <dd class="description">Command complete, sending status</dd>
-<dt>HTTP_TRACE </dt>
+<dt>HTTP_STATE_TRACE </dt>
 <dd class="description">TRACE command, waiting for blank line</dd>
-<dt>HTTP_WAITING </dt>
+<dt>HTTP_STATE_UNKNOWN_METHOD <span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span></dt>
+<dd class="description">Unknown request method, waiting for blank line </dd>
+<dt>HTTP_STATE_UNKNOWN_VERSION <span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span></dt>
+<dd class="description">Unknown request method, waiting for blank line </dd>
+<dt>HTTP_STATE_WAITING </dt>
 <dd class="description">Waiting for command</dd>
 </dl>
 <h3 class="enumeration"><a name="http_status_e">http_status_e</a></h3>
 <p class="description">HTTP status codes</p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>HTTP_ACCEPTED </dt>
+<dt>HTTP_STATUS_ACCEPTED </dt>
 <dd class="description">DELETE command was successful</dd>
-<dt>HTTP_AUTHORIZATION_CANCELED <span class="info">&nbsp;CUPS 1.4&nbsp;</span></dt>
-<dd class="description">User canceled authorization </dd>
-<dt>HTTP_BAD_GATEWAY </dt>
+<dt>HTTP_STATUS_BAD_GATEWAY </dt>
 <dd class="description">Bad gateway</dd>
-<dt>HTTP_BAD_REQUEST </dt>
+<dt>HTTP_STATUS_BAD_REQUEST </dt>
 <dd class="description">Bad request</dd>
-<dt>HTTP_CONFLICT </dt>
+<dt>HTTP_STATUS_CONFLICT </dt>
 <dd class="description">Request is self-conflicting</dd>
-<dt>HTTP_CONTINUE </dt>
+<dt>HTTP_STATUS_CONTINUE </dt>
 <dd class="description">Everything OK, keep going...</dd>
-<dt>HTTP_CREATED </dt>
+<dt>HTTP_STATUS_CREATED </dt>
 <dd class="description">PUT command was successful</dd>
-<dt>HTTP_ERROR </dt>
+<dt>HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED <span class="info">&nbsp;CUPS 1.4&nbsp;</span></dt>
+<dd class="description">User canceled authorization </dd>
+<dt>HTTP_STATUS_CUPS_PKI_ERROR <span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span></dt>
+<dd class="description">Error negotiating a secure connection </dd>
+<dt>HTTP_STATUS_ERROR </dt>
 <dd class="description">An error response from httpXxxx()</dd>
-<dt>HTTP_EXPECTATION_FAILED </dt>
+<dt>HTTP_STATUS_EXPECTATION_FAILED </dt>
 <dd class="description">The expectation given in an Expect header field was not met</dd>
-<dt>HTTP_FORBIDDEN </dt>
+<dt>HTTP_STATUS_FORBIDDEN </dt>
 <dd class="description">Forbidden to access this URI</dd>
-<dt>HTTP_GATEWAY_TIMEOUT </dt>
+<dt>HTTP_STATUS_GATEWAY_TIMEOUT </dt>
 <dd class="description">Gateway connection timed out</dd>
-<dt>HTTP_GONE </dt>
+<dt>HTTP_STATUS_GONE </dt>
 <dd class="description">Server has gone away</dd>
-<dt>HTTP_LENGTH_REQUIRED </dt>
+<dt>HTTP_STATUS_LENGTH_REQUIRED </dt>
 <dd class="description">A content length or encoding is required</dd>
-<dt>HTTP_METHOD_NOT_ALLOWED </dt>
+<dt>HTTP_STATUS_METHOD_NOT_ALLOWED </dt>
 <dd class="description">Method is not allowed</dd>
-<dt>HTTP_MOVED_PERMANENTLY </dt>
+<dt>HTTP_STATUS_MOVED_PERMANENTLY </dt>
 <dd class="description">Document has moved permanently</dd>
-<dt>HTTP_MOVED_TEMPORARILY </dt>
+<dt>HTTP_STATUS_MOVED_TEMPORARILY </dt>
 <dd class="description">Document has moved temporarily</dd>
-<dt>HTTP_MULTIPLE_CHOICES </dt>
+<dt>HTTP_STATUS_MULTIPLE_CHOICES </dt>
 <dd class="description">Multiple files match request</dd>
-<dt>HTTP_NOT_ACCEPTABLE </dt>
+<dt>HTTP_STATUS_NONE <span class="info">&nbsp;CUPS 1.7/OS X 10.9&nbsp;</span></dt>
+<dd class="description">No Expect value </dd>
+<dt>HTTP_STATUS_NOT_ACCEPTABLE </dt>
 <dd class="description">Not Acceptable</dd>
-<dt>HTTP_NOT_AUTHORITATIVE </dt>
+<dt>HTTP_STATUS_NOT_AUTHORITATIVE </dt>
 <dd class="description">Information isn't authoritative</dd>
-<dt>HTTP_NOT_FOUND </dt>
+<dt>HTTP_STATUS_NOT_FOUND </dt>
 <dd class="description">URI was not found</dd>
-<dt>HTTP_NOT_IMPLEMENTED </dt>
+<dt>HTTP_STATUS_NOT_IMPLEMENTED </dt>
 <dd class="description">Feature not implemented</dd>
-<dt>HTTP_NOT_MODIFIED </dt>
+<dt>HTTP_STATUS_NOT_MODIFIED </dt>
 <dd class="description">File not modified</dd>
-<dt>HTTP_NOT_SUPPORTED </dt>
+<dt>HTTP_STATUS_NOT_SUPPORTED </dt>
 <dd class="description">HTTP version not supported</dd>
-<dt>HTTP_NO_CONTENT </dt>
+<dt>HTTP_STATUS_NO_CONTENT </dt>
 <dd class="description">Successful command, no new data</dd>
-<dt>HTTP_OK </dt>
+<dt>HTTP_STATUS_OK </dt>
 <dd class="description">OPTIONS/GET/HEAD/POST/TRACE command was successful</dd>
-<dt>HTTP_PARTIAL_CONTENT </dt>
-<dd class="description">Only a partial file was recieved/sent</dd>
-<dt>HTTP_PAYMENT_REQUIRED </dt>
+<dt>HTTP_STATUS_PARTIAL_CONTENT </dt>
+<dd class="description">Only a partial file was received/sent</dd>
+<dt>HTTP_STATUS_PAYMENT_REQUIRED </dt>
 <dd class="description">Payment required</dd>
-<dt>HTTP_PKI_ERROR <span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span></dt>
-<dd class="description">Error negotiating a secure connection </dd>
-<dt>HTTP_PRECONDITION </dt>
+<dt>HTTP_STATUS_PRECONDITION </dt>
 <dd class="description">Precondition failed</dd>
-<dt>HTTP_PROXY_AUTHENTICATION </dt>
+<dt>HTTP_STATUS_PROXY_AUTHENTICATION </dt>
 <dd class="description">Proxy Authentication is Required</dd>
-<dt>HTTP_REQUESTED_RANGE </dt>
+<dt>HTTP_STATUS_REQUESTED_RANGE </dt>
 <dd class="description">The requested range is not satisfiable</dd>
-<dt>HTTP_REQUEST_TIMEOUT </dt>
+<dt>HTTP_STATUS_REQUEST_TIMEOUT </dt>
 <dd class="description">Request timed out</dd>
-<dt>HTTP_REQUEST_TOO_LARGE </dt>
+<dt>HTTP_STATUS_REQUEST_TOO_LARGE </dt>
 <dd class="description">Request entity too large</dd>
-<dt>HTTP_RESET_CONTENT </dt>
+<dt>HTTP_STATUS_RESET_CONTENT </dt>
 <dd class="description">Content was reset/recreated</dd>
-<dt>HTTP_SEE_OTHER </dt>
+<dt>HTTP_STATUS_SEE_OTHER </dt>
 <dd class="description">See this other link...</dd>
-<dt>HTTP_SERVER_ERROR </dt>
+<dt>HTTP_STATUS_SERVER_ERROR </dt>
 <dd class="description">Internal server error</dd>
-<dt>HTTP_SERVICE_UNAVAILABLE </dt>
+<dt>HTTP_STATUS_SERVICE_UNAVAILABLE </dt>
 <dd class="description">Service is unavailable</dd>
-<dt>HTTP_SWITCHING_PROTOCOLS </dt>
+<dt>HTTP_STATUS_SWITCHING_PROTOCOLS </dt>
 <dd class="description">HTTP upgrade to TLS/SSL</dd>
-<dt>HTTP_UNAUTHORIZED </dt>
+<dt>HTTP_STATUS_UNAUTHORIZED </dt>
 <dd class="description">Unauthorized to access host</dd>
-<dt>HTTP_UNSUPPORTED_MEDIATYPE </dt>
+<dt>HTTP_STATUS_UNSUPPORTED_MEDIATYPE </dt>
 <dd class="description">The requested media type is unsupported</dd>
-<dt>HTTP_UPGRADE_REQUIRED </dt>
+<dt>HTTP_STATUS_UPGRADE_REQUIRED </dt>
 <dd class="description">Upgrade to SSL/TLS required</dd>
-<dt>HTTP_URI_TOO_LONG </dt>
+<dt>HTTP_STATUS_URI_TOO_LONG </dt>
 <dd class="description">URI too long</dd>
-<dt>HTTP_USE_PROXY </dt>
+<dt>HTTP_STATUS_USE_PROXY </dt>
 <dd class="description">Must use a proxy to access this URI</dd>
 </dl>
+<h3 class="enumeration"><span class="info">&nbsp;CUPS 2.0/OS 10.10&nbsp;</span><a name="http_trust_e">http_trust_e</a></h3>
+<p class="description">Level of trust for credentials </p>
+<h4 class="constants">Constants</h4>
+<dl>
+<dt>HTTP_TRUST_CHANGED </dt>
+<dd class="description">Credentials have changed</dd>
+<dt>HTTP_TRUST_EXPIRED </dt>
+<dd class="description">Credentials are expired</dd>
+<dt>HTTP_TRUST_INVALID </dt>
+<dd class="description">Credentials are invalid</dd>
+<dt>HTTP_TRUST_OK </dt>
+<dd class="description">Credentials are OK/trusted</dd>
+<dt>HTTP_TRUST_RENEWED </dt>
+<dd class="description">Credentials have been renewed</dd>
+<dt>HTTP_TRUST_UNKNOWN </dt>
+<dd class="description">Credentials are unknown/new</dd>
+</dl>
 <h3 class="enumeration"><a name="http_uri_coding_e">http_uri_coding_e</a></h3>
 <p class="description">URI en/decode flags</p>
 <h4 class="constants">Constants</h4>
@@ -5032,40 +6060,40 @@ are server-oriented...</p>
 <p class="description">URI separation status </p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>HTTP_URI_BAD_ARGUMENTS </dt>
+<dt>HTTP_URI_STATUS_BAD_ARGUMENTS </dt>
 <dd class="description">Bad arguments to function (error)</dd>
-<dt>HTTP_URI_BAD_HOSTNAME </dt>
+<dt>HTTP_URI_STATUS_BAD_HOSTNAME </dt>
 <dd class="description">Bad hostname in URI (error)</dd>
-<dt>HTTP_URI_BAD_PORT </dt>
+<dt>HTTP_URI_STATUS_BAD_PORT </dt>
 <dd class="description">Bad port number in URI (error)</dd>
-<dt>HTTP_URI_BAD_RESOURCE </dt>
+<dt>HTTP_URI_STATUS_BAD_RESOURCE </dt>
 <dd class="description">Bad resource in URI (error)</dd>
-<dt>HTTP_URI_BAD_SCHEME </dt>
+<dt>HTTP_URI_STATUS_BAD_SCHEME </dt>
 <dd class="description">Bad scheme in URI (error)</dd>
-<dt>HTTP_URI_BAD_URI </dt>
+<dt>HTTP_URI_STATUS_BAD_URI </dt>
 <dd class="description">Bad/empty URI (error)</dd>
-<dt>HTTP_URI_BAD_USERNAME </dt>
+<dt>HTTP_URI_STATUS_BAD_USERNAME </dt>
 <dd class="description">Bad username in URI (error)</dd>
-<dt>HTTP_URI_MISSING_RESOURCE </dt>
+<dt>HTTP_URI_STATUS_MISSING_RESOURCE </dt>
 <dd class="description">Missing resource in URI (warning)</dd>
-<dt>HTTP_URI_MISSING_SCHEME </dt>
+<dt>HTTP_URI_STATUS_MISSING_SCHEME </dt>
 <dd class="description">Missing scheme in URI (warning)</dd>
-<dt>HTTP_URI_OK </dt>
+<dt>HTTP_URI_STATUS_OK </dt>
 <dd class="description">URI decoded OK</dd>
-<dt>HTTP_URI_OVERFLOW </dt>
+<dt>HTTP_URI_STATUS_OVERFLOW </dt>
 <dd class="description">URI buffer for httpAssembleURI is too small</dd>
-<dt>HTTP_URI_UNKNOWN_SCHEME </dt>
+<dt>HTTP_URI_STATUS_UNKNOWN_SCHEME </dt>
 <dd class="description">Unknown scheme in URI (warning)</dd>
 </dl>
 <h3 class="enumeration"><a name="http_version_e">http_version_e</a></h3>
 <p class="description">HTTP version numbers</p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>HTTP_0_9 </dt>
+<dt>HTTP_VERSION_0_9 </dt>
 <dd class="description">HTTP/0.9</dd>
-<dt>HTTP_1_0 </dt>
+<dt>HTTP_VERSION_1_0 </dt>
 <dd class="description">HTTP/1.0</dd>
-<dt>HTTP_1_1 </dt>
+<dt>HTTP_VERSION_1_1 </dt>
 <dd class="description">HTTP/1.1</dd>
 </dl>
 <h3 class="enumeration"><a name="ipp_dstate_e">ipp_dstate_e</a></h3>
@@ -5073,12 +6101,17 @@ are server-oriented...</p>
 <h4 class="constants">Constants</h4>
 <dl>
 <dt>IPP_DOCUMENT_ABORTED </dt>
+<dd class="description">Document is aborted</dd>
 <dt>IPP_DOCUMENT_CANCELED </dt>
+<dd class="description">Document is canceled</dd>
 <dt>IPP_DOCUMENT_COMPLETED </dt>
+<dd class="description">Document is completed</dd>
 <dt>IPP_DOCUMENT_PENDING </dt>
+<dd class="description">Document is pending</dd>
 <dt>IPP_DOCUMENT_PROCESSING </dt>
+<dd class="description">Document is processing</dd>
 </dl>
-<h3 class="enumeration"><a name="ipp_finish_e">ipp_finish_e</a></h3>
+<h3 class="enumeration"><a name="ipp_finishings_e">ipp_finishings_e</a></h3>
 <p class="description">Finishings</p>
 <h4 class="constants">Constants</h4>
 <dl>
@@ -5096,8 +6129,64 @@ are server-oriented...</p>
 <dd class="description">Bind on top</dd>
 <dt>IPP_FINISHINGS_BOOKLET_MAKER </dt>
 <dd class="description">Fold to make booklet</dd>
+<dt>IPP_FINISHINGS_COAT </dt>
+<dd class="description">Apply protective liquid or powder coating</dd>
 <dt>IPP_FINISHINGS_COVER </dt>
 <dd class="description">Add cover</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_ACCORDIAN </dt>
+<dd class="description">Accordian-fold the paper vertically into four sections</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_DOUBLE_GATE </dt>
+<dd class="description">Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_GATE </dt>
+<dd class="description">Fold the top and bottom quarters of the paper towards the midline</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_HALF </dt>
+<dd class="description">Fold the paper in half vertically</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_HALF_Z </dt>
+<dd class="description">Fold the paper in half horizontally, then Z-fold the paper vertically</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_LEFT_GATE </dt>
+<dd class="description">Fold the top quarter of the paper towards the midline</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_LETTER </dt>
+<dd class="description">Fold the paper into three sections vertically; sometimes also known as a C fold</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_PARALLEL </dt>
+<dd class="description">Fold the paper in half vertically two times, yielding four sections</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_POSTER </dt>
+<dd class="description">Fold the paper in half horizontally and vertically; sometimes also called a cross fold</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_RIGHT_GATE </dt>
+<dd class="description">Fold the bottom quarter of the paper towards the midline</dd>
+<dt>IPP_FINISHINGS_CUPS_FOLD_Z </dt>
+<dd class="description">Fold the paper vertically into three sections, forming a Z</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_LEFT </dt>
+<dd class="description">Punch 1 hole bottom left</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_RIGHT </dt>
+<dd class="description">Punch 1 hole bottom right</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_DUAL_BOTTOM </dt>
+<dd class="description">Punch 2 holes bottom edge</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_DUAL_LEFT </dt>
+<dd class="description">Punch 2 holes left side</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_DUAL_RIGHT </dt>
+<dd class="description">Punch 2 holes right side</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_DUAL_TOP </dt>
+<dd class="description">Punch 2 holes top edge</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_QUAD_BOTTOM </dt>
+<dd class="description">Punch 4 holes bottom edge</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_QUAD_LEFT </dt>
+<dd class="description">Punch 4 holes left side</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_QUAD_RIGHT </dt>
+<dd class="description">Punch 4 holes right side</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_QUAD_TOP </dt>
+<dd class="description">Punch 4 holes top edge</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_TOP_LEFT </dt>
+<dd class="description">Punch 1 hole top left</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_TOP_RIGHT </dt>
+<dd class="description">Punch 1 hole top right</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_BOTTOM </dt>
+<dd class="description">Punch 3 holes bottom edge</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_LEFT </dt>
+<dd class="description">Punch 3 holes left side</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_RIGHT </dt>
+<dd class="description">Punch 3 holes right side</dd>
+<dt>IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_TOP </dt>
+<dd class="description">Punch 3 holes top edge</dd>
 <dt>IPP_FINISHINGS_EDGE_STITCH </dt>
 <dd class="description">Stitch along any side</dd>
 <dt>IPP_FINISHINGS_EDGE_STITCH_BOTTOM </dt>
@@ -5110,12 +6199,68 @@ are server-oriented...</p>
 <dd class="description">Stitch along top edge</dd>
 <dt>IPP_FINISHINGS_FOLD </dt>
 <dd class="description">Fold (any type)</dd>
-<dt>IPP_FINISHINGS_JOB_OFFSET </dt>
+<dt>IPP_FINISHINGS_FOLD_ACCORDIAN </dt>
+<dd class="description">Accordian-fold the paper vertically into four sections</dd>
+<dt>IPP_FINISHINGS_FOLD_DOUBLE_GATE </dt>
+<dd class="description">Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically</dd>
+<dt>IPP_FINISHINGS_FOLD_GATE </dt>
+<dd class="description">Fold the top and bottom quarters of the paper towards the midline</dd>
+<dt>IPP_FINISHINGS_FOLD_HALF </dt>
+<dd class="description">Fold the paper in half vertically</dd>
+<dt>IPP_FINISHINGS_FOLD_HALF_Z </dt>
+<dd class="description">Fold the paper in half horizontally, then Z-fold the paper vertically</dd>
+<dt>IPP_FINISHINGS_FOLD_LEFT_GATE </dt>
+<dd class="description">Fold the top quarter of the paper towards the midline</dd>
+<dt>IPP_FINISHINGS_FOLD_LETTER </dt>
+<dd class="description">Fold the paper into three sections vertically; sometimes also known as a C fold</dd>
+<dt>IPP_FINISHINGS_FOLD_PARALLEL </dt>
+<dd class="description">Fold the paper in half vertically two times, yielding four sections</dd>
+<dt>IPP_FINISHINGS_FOLD_POSTER </dt>
+<dd class="description">Fold the paper in half horizontally and vertically; sometimes also called a cross fold</dd>
+<dt>IPP_FINISHINGS_FOLD_RIGHT_GATE </dt>
+<dd class="description">Fold the bottom quarter of the paper towards the midline</dd>
+<dt>IPP_FINISHINGS_FOLD_Z </dt>
+<dd class="description">Fold the paper vertically into three sections, forming a Z</dd>
+<dt>IPP_FINISHINGS_JOG_OFFSET </dt>
 <dd class="description">Offset for binding (any type)</dd>
+<dt>IPP_FINISHINGS_LAMINATE </dt>
+<dd class="description">Apply protective (solid) material</dd>
 <dt>IPP_FINISHINGS_NONE </dt>
 <dd class="description">No finishing</dd>
 <dt>IPP_FINISHINGS_PUNCH </dt>
 <dd class="description">Punch (any location/count)</dd>
+<dt>IPP_FINISHINGS_PUNCH_BOTTOM_LEFT </dt>
+<dd class="description">Punch 1 hole bottom left</dd>
+<dt>IPP_FINISHINGS_PUNCH_BOTTOM_RIGHT </dt>
+<dd class="description">Punch 1 hole bottom right</dd>
+<dt>IPP_FINISHINGS_PUNCH_DUAL_BOTTOM </dt>
+<dd class="description">Punch 2 holes bottom edge</dd>
+<dt>IPP_FINISHINGS_PUNCH_DUAL_LEFT </dt>
+<dd class="description">Punch 2 holes left side</dd>
+<dt>IPP_FINISHINGS_PUNCH_DUAL_RIGHT </dt>
+<dd class="description">Punch 2 holes right side</dd>
+<dt>IPP_FINISHINGS_PUNCH_DUAL_TOP </dt>
+<dd class="description">Punch 2 holes top edge</dd>
+<dt>IPP_FINISHINGS_PUNCH_QUAD_BOTTOM </dt>
+<dd class="description">Punch 4 holes bottom edge</dd>
+<dt>IPP_FINISHINGS_PUNCH_QUAD_LEFT </dt>
+<dd class="description">Punch 4 holes left side</dd>
+<dt>IPP_FINISHINGS_PUNCH_QUAD_RIGHT </dt>
+<dd class="description">Punch 4 holes right side</dd>
+<dt>IPP_FINISHINGS_PUNCH_QUAD_TOP </dt>
+<dd class="description">Punch 4 holes top edge</dd>
+<dt>IPP_FINISHINGS_PUNCH_TOP_LEFT </dt>
+<dd class="description">Punch 1 hole top left</dd>
+<dt>IPP_FINISHINGS_PUNCH_TOP_RIGHT </dt>
+<dd class="description">Punch 1 hole top right</dd>
+<dt>IPP_FINISHINGS_PUNCH_TRIPLE_BOTTOM </dt>
+<dd class="description">Punch 3 holes bottom edge</dd>
+<dt>IPP_FINISHINGS_PUNCH_TRIPLE_LEFT </dt>
+<dd class="description">Punch 3 holes left side</dd>
+<dt>IPP_FINISHINGS_PUNCH_TRIPLE_RIGHT </dt>
+<dd class="description">Punch 3 holes right side</dd>
+<dt>IPP_FINISHINGS_PUNCH_TRIPLE_TOP </dt>
+<dd class="description">Punch 3 holes top edge</dd>
 <dt>IPP_FINISHINGS_SADDLE_STITCH </dt>
 <dd class="description">Staple interior</dd>
 <dt>IPP_FINISHINGS_STAPLE </dt>
@@ -5136,6 +6281,14 @@ are server-oriented...</p>
 <dd class="description">Staple top left corner</dd>
 <dt>IPP_FINISHINGS_STAPLE_TOP_RIGHT </dt>
 <dd class="description">Staple top right corner</dd>
+<dt>IPP_FINISHINGS_STAPLE_TRIPLE_BOTTOM </dt>
+<dd class="description">Three staples on bottom</dd>
+<dt>IPP_FINISHINGS_STAPLE_TRIPLE_LEFT </dt>
+<dd class="description">Three staples on left</dd>
+<dt>IPP_FINISHINGS_STAPLE_TRIPLE_RIGHT </dt>
+<dd class="description">Three staples on right</dd>
+<dt>IPP_FINISHINGS_STAPLE_TRIPLE_TOP </dt>
+<dd class="description">Three staples on top</dd>
 <dt>IPP_FINISHINGS_TRIM </dt>
 <dd class="description">Trim (any type)</dd>
 <dt>IPP_FINISHINGS_TRIM_AFTER_COPIES </dt>
@@ -5151,152 +6304,224 @@ are server-oriented...</p>
 <p class="description">Job collation types</p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>IPP_JOB_COLLATED_DOCUMENTS </dt>
-<dt>IPP_JOB_UNCOLLATED_DOCUMENTS </dt>
-<dt>IPP_JOB_UNCOLLATED_SHEETS </dt>
+<dt>IPP_JCOLLATE_COLLATED_DOCUMENTS </dt>
+<dt>IPP_JCOLLATE_UNCOLLATED_DOCUMENTS </dt>
+<dt>IPP_JCOLLATE_UNCOLLATED_SHEETS </dt>
 </dl>
 <h3 class="enumeration"><a name="ipp_jstate_e">ipp_jstate_e</a></h3>
 <p class="description">Job states</p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>IPP_JOB_ABORTED </dt>
+<dt>IPP_JSTATE_ABORTED </dt>
 <dd class="description">Job has aborted due to error</dd>
-<dt>IPP_JOB_CANCELED </dt>
+<dt>IPP_JSTATE_CANCELED </dt>
 <dd class="description">Job has been canceled</dd>
-<dt>IPP_JOB_COMPLETED </dt>
+<dt>IPP_JSTATE_COMPLETED </dt>
 <dd class="description">Job has completed successfully</dd>
-<dt>IPP_JOB_HELD </dt>
+<dt>IPP_JSTATE_HELD </dt>
 <dd class="description">Job is held for printing</dd>
-<dt>IPP_JOB_PENDING </dt>
+<dt>IPP_JSTATE_PENDING </dt>
 <dd class="description">Job is waiting to be printed</dd>
-<dt>IPP_JOB_PROCESSING </dt>
+<dt>IPP_JSTATE_PROCESSING </dt>
 <dd class="description">Job is currently printing</dd>
-<dt>IPP_JOB_STOPPED </dt>
+<dt>IPP_JSTATE_STOPPED </dt>
 <dd class="description">Job has been stopped</dd>
 </dl>
 <h3 class="enumeration"><a name="ipp_op_e">ipp_op_e</a></h3>
 <p class="description">IPP operations</p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>CUPS_ACCEPT_JOBS </dt>
+<dt>IPP_OP_ACKNOWLEDGE_DOCUMENT </dt>
+<dd class="description">Acknowledge-Document</dd>
+<dt>IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER </dt>
+<dd class="description">Acknowledge-Identify-Printer</dd>
+<dt>IPP_OP_ACKNOWLEDGE_JOB </dt>
+<dd class="description">Acknowledge-Job</dd>
+<dt>IPP_OP_ACTIVATE_PRINTER </dt>
+<dd class="description">Start a printer</dd>
+<dt>IPP_OP_CANCEL_CURRENT_JOB </dt>
+<dd class="description">Cancel the current job</dd>
+<dt>IPP_OP_CANCEL_DOCUMENT </dt>
+<dd class="description">Cancel-Document</dd>
+<dt>IPP_OP_CANCEL_JOB </dt>
+<dd class="description">Cancel a job</dd>
+<dt>IPP_OP_CANCEL_JOBS </dt>
+<dd class="description">Cancel-Jobs</dd>
+<dt>IPP_OP_CANCEL_MY_JOBS </dt>
+<dd class="description">Cancel-My-Jobs</dd>
+<dt>IPP_OP_CANCEL_SUBSCRIPTION <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dd class="description">Cancel a subscription </dd>
+<dt>IPP_OP_CLOSE_JOB </dt>
+<dd class="description">Close-Job</dd>
+<dt>IPP_OP_CREATE_JOB </dt>
+<dd class="description">Create an empty print job</dd>
+<dt>IPP_OP_CREATE_JOB_SUBSCRIPTIONS <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dd class="description">Create one of more job subscriptions </dd>
+<dt>IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dd class="description">Create one or more printer subscriptions </dd>
+<dt>IPP_OP_CUPS_ACCEPT_JOBS </dt>
 <dd class="description">Accept new jobs on a printer</dd>
-<dt>CUPS_ADD_MODIFY_CLASS </dt>
+<dt>IPP_OP_CUPS_ADD_MODIFY_CLASS </dt>
 <dd class="description">Add or modify a class</dd>
-<dt>CUPS_ADD_MODIFY_PRINTER </dt>
+<dt>IPP_OP_CUPS_ADD_MODIFY_PRINTER </dt>
 <dd class="description">Add or modify a printer</dd>
-<dt>CUPS_AUTHENTICATE_JOB <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dt>IPP_OP_CUPS_AUTHENTICATE_JOB <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
 <dd class="description">Authenticate a job </dd>
-<dt>CUPS_DELETE_CLASS </dt>
+<dt>IPP_OP_CUPS_DELETE_CLASS </dt>
 <dd class="description">Delete a class</dd>
-<dt>CUPS_DELETE_PRINTER </dt>
+<dt>IPP_OP_CUPS_DELETE_PRINTER </dt>
 <dd class="description">Delete a printer</dd>
-<dt>CUPS_GET_CLASSES <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
+<dt>IPP_OP_CUPS_GET_CLASSES <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
 <dd class="description">Get a list of classes </dd>
-<dt>CUPS_GET_DEFAULT </dt>
+<dt>IPP_OP_CUPS_GET_DEFAULT </dt>
 <dd class="description">Get the default printer</dd>
-<dt>CUPS_GET_DEVICES </dt>
+<dt>IPP_OP_CUPS_GET_DEVICES </dt>
 <dd class="description">Get a list of supported devices</dd>
-<dt>CUPS_GET_DOCUMENT <span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span></dt>
+<dt>IPP_OP_CUPS_GET_DOCUMENT <span class="info">&nbsp;CUPS 1.4/OS X 10.6&nbsp;</span></dt>
 <dd class="description">Get a document file </dd>
-<dt>CUPS_GET_PPD <span class="info">&nbsp;CUPS 1.3/OS X 10.5&nbsp;</span></dt>
+<dt>IPP_OP_CUPS_GET_PPD <span class="info">&nbsp;CUPS 1.3/OS X 10.5&nbsp;</span></dt>
 <dd class="description">Get a PPD file </dd>
-<dt>CUPS_GET_PPDS </dt>
+<dt>IPP_OP_CUPS_GET_PPDS </dt>
 <dd class="description">Get a list of supported drivers</dd>
-<dt>CUPS_GET_PRINTERS </dt>
+<dt>IPP_OP_CUPS_GET_PRINTERS </dt>
 <dd class="description">Get a list of printers and/or classes</dd>
-<dt>CUPS_MOVE_JOB </dt>
+<dt>IPP_OP_CUPS_INVALID </dt>
+<dd class="description">Invalid operation name for <a href="#ippOpValue"><code>ippOpValue</code></a></dd>
+<dt>IPP_OP_CUPS_MOVE_JOB </dt>
 <dd class="description">Move a job to a different printer</dd>
-<dt>CUPS_REJECT_JOBS </dt>
+<dt>IPP_OP_CUPS_REJECT_JOBS </dt>
 <dd class="description">Reject new jobs on a printer</dd>
-<dt>CUPS_SET_DEFAULT </dt>
+<dt>IPP_OP_CUPS_SET_DEFAULT </dt>
 <dd class="description">Set the default printer</dd>
-<dt>IPP_CANCEL_JOB </dt>
-<dd class="description">Cancel a job</dd>
-<dt>IPP_CANCEL_JOBS </dt>
-<dd class="description">Cancel-Jobs</dd>
-<dt>IPP_CANCEL_MY_JOBS </dt>
-<dd class="description">Cancel-My-Jobs</dd>
-<dt>IPP_CANCEL_SUBSCRIPTION <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
-<dd class="description">Cancel a subscription </dd>
-<dt>IPP_CLOSE_JOB </dt>
-<dd class="description">Close-Job</dd>
-<dt>IPP_CREATE_JOB </dt>
-<dd class="description">Create an empty print job</dd>
-<dt>IPP_CREATE_JOB_SUBSCRIPTION <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
-<dd class="description">Create a job subscription </dd>
-<dt>IPP_CREATE_PRINTER_SUBSCRIPTION <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
-<dd class="description">Create a printer subscription </dd>
-<dt>IPP_DISABLE_PRINTER </dt>
+<dt>IPP_OP_DEACTIVATE_PRINTER </dt>
+<dd class="description">Stop a printer</dd>
+<dt>IPP_OP_DELETE_DOCUMENT </dt>
+<dd class="description">Delete-Document</dd>
+<dt>IPP_OP_DEREGISTER_OUTPUT_DEVICE </dt>
+<dd class="description">Deregister-Output-Device</dd>
+<dt>IPP_OP_DISABLE_PRINTER </dt>
 <dd class="description">Stop a printer</dd>
-<dt>IPP_ENABLE_PRINTER </dt>
+<dt>IPP_OP_ENABLE_PRINTER </dt>
 <dd class="description">Start a printer</dd>
-<dt>IPP_GET_JOBS </dt>
+<dt>IPP_OP_FETCH_DOCUMENT </dt>
+<dd class="description">Fetch-Document</dd>
+<dt>IPP_OP_FETCH_JOB </dt>
+<dd class="description">Fetch-Job</dd>
+<dt>IPP_OP_GET_DOCUMENTS </dt>
+<dd class="description">Get-Documents</dd>
+<dt>IPP_OP_GET_DOCUMENT_ATTRIBUTES </dt>
+<dd class="description">Get-Document-Attributes</dd>
+<dt>IPP_OP_GET_JOBS </dt>
 <dd class="description">Get a list of jobs</dd>
-<dt>IPP_GET_JOB_ATTRIBUTES </dt>
+<dt>IPP_OP_GET_JOB_ATTRIBUTES </dt>
 <dd class="description">Get job attributes</dd>
-<dt>IPP_GET_NOTIFICATIONS <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dt>IPP_OP_GET_NEXT_DOCUMENT_DATA </dt>
+<dd class="description">Get-Next-Document-Data</dd>
+<dt>IPP_OP_GET_NOTIFICATIONS <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
 <dd class="description">Get notification events </dd>
-<dt>IPP_GET_PRINTER_ATTRIBUTES </dt>
+<dt>IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES </dt>
+<dd class="description">Get-Output-Device-Attributes</dd>
+<dt>IPP_OP_GET_PRINTER_ATTRIBUTES </dt>
 <dd class="description">Get printer attributes</dd>
-<dt>IPP_GET_PRINTER_SUPPORTED_VALUES </dt>
+<dt>IPP_OP_GET_PRINTER_SUPPORTED_VALUES </dt>
 <dd class="description">Get supported attribute values</dd>
-<dt>IPP_GET_SUBSCRIPTIONS <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dt>IPP_OP_GET_SUBSCRIPTIONS <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
 <dd class="description">Get list of subscriptions </dd>
-<dt>IPP_GET_SUBSCRIPTION_ATTRIBUTES <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dt>IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
 <dd class="description">Get subscription attributes </dd>
-<dt>IPP_HOLD_JOB </dt>
+<dt>IPP_OP_HOLD_JOB </dt>
 <dd class="description">Hold a job for printing</dd>
-<dt>IPP_IDENTIFY_PRINTER </dt>
-<dd class="description">Identify-Printer (proposed IPP JPS3)</dd>
-<dt>IPP_OP_CUPS_INVALID </dt>
-<dd class="description">Invalid operation name for <a href="#ippOpValue"><code>ippOpValue</code></a></dd>
-<dt>IPP_PAUSE_PRINTER </dt>
+<dt>IPP_OP_HOLD_NEW_JOBS </dt>
+<dd class="description">Hold new jobs</dd>
+<dt>IPP_OP_IDENTIFY_PRINTER </dt>
+<dd class="description">Identify-Printer</dd>
+<dt>IPP_OP_PAUSE_PRINTER </dt>
 <dd class="description">Stop a printer</dd>
-<dt>IPP_PRINT_JOB </dt>
+<dt>IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB </dt>
+<dd class="description">Stop printer after the current job</dd>
+<dt>IPP_OP_PRINT_JOB </dt>
 <dd class="description">Print a single file</dd>
-<dt>IPP_PURGE_JOBS </dt>
+<dt>IPP_OP_PRINT_URI </dt>
+<dd class="description">Print a single URL</dd>
+<dt>IPP_OP_PROMOTE_JOB </dt>
+<dd class="description">Promote a job to print sooner</dd>
+<dt>IPP_OP_PURGE_JOBS </dt>
 <dd class="description">Cancel all jobs</dd>
-<dt>IPP_RELEASE_JOB </dt>
+<dt>IPP_OP_RELEASE_HELD_NEW_JOBS </dt>
+<dd class="description">Release new jobs</dd>
+<dt>IPP_OP_RELEASE_JOB </dt>
 <dd class="description">Release a job for printing</dd>
-<dt>IPP_RENEW_SUBSCRIPTION <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
+<dt>IPP_OP_RENEW_SUBSCRIPTION <span class="info">&nbsp;CUPS 1.2/OS X 10.5&nbsp;</span></dt>
 <dd class="description">Renew a printer subscription </dd>
-<dt>IPP_RESTART_JOB </dt>
+<dt>IPP_OP_REPROCESS_JOB </dt>
 <dd class="description">Reprint a job</dd>
-<dt>IPP_RESUBMIT_JOB </dt>
+<dt>IPP_OP_RESTART_JOB </dt>
+<dd class="description">Reprint a job</dd>
+<dt>IPP_OP_RESTART_PRINTER </dt>
+<dd class="description">Restart a printer</dd>
+<dt>IPP_OP_RESUBMIT_JOB </dt>
 <dd class="description">Resubmit-Job</dd>
-<dt>IPP_RESUME_PRINTER </dt>
+<dt>IPP_OP_RESUME_JOB </dt>
+<dd class="description">Resume the current job</dd>
+<dt>IPP_OP_RESUME_PRINTER </dt>
 <dd class="description">Start a printer</dd>
-<dt>IPP_SEND_DOCUMENT </dt>
+<dt>IPP_OP_SCHEDULE_JOB_AFTER </dt>
+<dd class="description">Schedule a job to print after another</dd>
+<dt>IPP_OP_SEND_DOCUMENT </dt>
 <dd class="description">Add a file to a job</dd>
-<dt>IPP_SET_JOB_ATTRIBUTES </dt>
+<dt>IPP_OP_SEND_HARDCOPY_DOCUMENT </dt>
+<dd class="description">Send-Hardcopy-Document</dd>
+<dt>IPP_OP_SEND_URI </dt>
+<dd class="description">Add a URL to a job</dd>
+<dt>IPP_OP_SET_DOCUMENT_ATTRIBUTES </dt>
+<dd class="description">Set-Document-Attributes</dd>
+<dt>IPP_OP_SET_JOB_ATTRIBUTES </dt>
 <dd class="description">Set job attributes</dd>
-<dt>IPP_VALIDATE_DOCUMENT </dt>
-<dd class="description">Validate-Document (proposed IPP JPS3)</dd>
-<dt>IPP_VALIDATE_JOB </dt>
+<dt>IPP_OP_SET_PRINTER_ATTRIBUTES </dt>
+<dd class="description">Set printer attributes</dd>
+<dt>IPP_OP_SHUTDOWN_PRINTER </dt>
+<dd class="description">Turn a printer off</dd>
+<dt>IPP_OP_STARTUP_PRINTER </dt>
+<dd class="description">Turn a printer on</dd>
+<dt>IPP_OP_SUSPEND_CURRENT_JOB </dt>
+<dd class="description">Suspend the current job</dd>
+<dt>IPP_OP_UPDATE_ACTIVE_JOBS </dt>
+<dd class="description">Update-Active-Jobs</dd>
+<dt>IPP_OP_UPDATE_DOCUMENT_STATUS </dt>
+<dd class="description">Update-Document-Status</dd>
+<dt>IPP_OP_UPDATE_JOB_STATUS </dt>
+<dd class="description">Update-Job-Status</dd>
+<dt>IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES </dt>
+<dd class="description">Update-Output-Device-Attributes</dd>
+<dt>IPP_OP_VALIDATE_DOCUMENT </dt>
+<dd class="description">Validate-Document</dd>
+<dt>IPP_OP_VALIDATE_JOB </dt>
 <dd class="description">Validate job options</dd>
 </dl>
 <h3 class="enumeration"><a name="ipp_orient_e">ipp_orient_e</a></h3>
 <p class="description">Orientation values</p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>IPP_LANDSCAPE </dt>
+<dt>IPP_ORIENT_LANDSCAPE </dt>
 <dd class="description">90 degrees counter-clockwise</dd>
-<dt>IPP_PORTRAIT </dt>
+<dt>IPP_ORIENT_NONE </dt>
+<dd class="description">No rotation</dd>
+<dt>IPP_ORIENT_PORTRAIT </dt>
 <dd class="description">No rotation</dd>
-<dt>IPP_REVERSE_LANDSCAPE </dt>
+<dt>IPP_ORIENT_REVERSE_LANDSCAPE </dt>
 <dd class="description">90 degrees clockwise</dd>
-<dt>IPP_REVERSE_PORTRAIT </dt>
+<dt>IPP_ORIENT_REVERSE_PORTRAIT </dt>
 <dd class="description">180 degrees</dd>
 </dl>
 <h3 class="enumeration"><a name="ipp_pstate_e">ipp_pstate_e</a></h3>
 <p class="description">Printer states</p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>IPP_PRINTER_IDLE </dt>
+<dt>IPP_PSTATE_IDLE </dt>
 <dd class="description">Printer is idle</dd>
-<dt>IPP_PRINTER_PROCESSING </dt>
+<dt>IPP_PSTATE_PROCESSING </dt>
 <dd class="description">Printer is working</dd>
-<dt>IPP_PRINTER_STOPPED </dt>
+<dt>IPP_PSTATE_STOPPED </dt>
 <dd class="description">Printer is stopped</dd>
 </dl>
 <h3 class="enumeration"><a name="ipp_quality_e">ipp_quality_e</a></h3>
@@ -5323,121 +6548,137 @@ are server-oriented...</p>
 <p class="description">IPP states</p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>IPP_ATTRIBUTE </dt>
+<dt>IPP_STATE_ATTRIBUTE </dt>
 <dd class="description">One or more attributes need to be sent/received</dd>
-<dt>IPP_DATA </dt>
+<dt>IPP_STATE_DATA </dt>
 <dd class="description">IPP request data needs to be sent/received</dd>
-<dt>IPP_ERROR </dt>
+<dt>IPP_STATE_ERROR </dt>
 <dd class="description">An error occurred</dd>
-<dt>IPP_HEADER </dt>
+<dt>IPP_STATE_HEADER </dt>
 <dd class="description">The request header needs to be sent/received</dd>
-<dt>IPP_IDLE </dt>
+<dt>IPP_STATE_IDLE </dt>
 <dd class="description">Nothing is happening/request completed</dd>
 </dl>
 <h3 class="enumeration"><a name="ipp_status_e">ipp_status_e</a></h3>
 <p class="description">IPP status codes</p>
 <h4 class="constants">Constants</h4>
 <dl>
-<dt>CUPS_SEE_OTHER </dt>
+<dt>IPP_STATUS_CUPS_INVALID </dt>
+<dd class="description">Invalid status name for <a href="#ippErrorValue"><code>ippErrorValue</code></a></dd>
+<dt>IPP_STATUS_CUPS_SEE_OTHER </dt>
 <dd class="description">cups-see-other</dd>
-<dt>IPP_ATTRIBUTES </dt>
-<dd class="description">client-error-attributes-or-values-not-supported</dd>
-<dt>IPP_ATTRIBUTES_NOT_SETTABLE </dt>
+<dt>IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED </dt>
+<dd class="description">client-error-account-authorization-failed</dd>
+<dt>IPP_STATUS_ERROR_ACCOUNT_CLOSED </dt>
+<dd class="description">client-error-account-closed</dd>
+<dt>IPP_STATUS_ERROR_ACCOUNT_INFO_NEEDED </dt>
+<dd class="description">client-error-account-info-needed</dd>
+<dt>IPP_STATUS_ERROR_ACCOUNT_LIMIT_REACHED </dt>
+<dd class="description">client-error-account-limit-reached</dd>
+<dt>IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE </dt>
 <dd class="description">client-error-attributes-not-settable</dd>
-<dt>IPP_AUTHENTICATION_CANCELED <span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span></dt>
-<dd class="description">Authentication canceled by user </dd>
-<dt>IPP_BAD_REQUEST </dt>
+<dt>IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES </dt>
+<dd class="description">client-error-attributes-or-values-not-supported</dd>
+<dt>IPP_STATUS_ERROR_BAD_REQUEST </dt>
 <dd class="description">client-error-bad-request</dd>
-<dt>IPP_CHARSET </dt>
+<dt>IPP_STATUS_ERROR_BUSY </dt>
+<dd class="description">server-error-busy</dd>
+<dt>IPP_STATUS_ERROR_CHARSET </dt>
 <dd class="description">client-error-charset-not-supported</dd>
-<dt>IPP_COMPRESSION_ERROR </dt>
+<dt>IPP_STATUS_ERROR_COMPRESSION_ERROR </dt>
 <dd class="description">client-error-compression-error</dd>
-<dt>IPP_COMPRESSION_NOT_SUPPORTED </dt>
+<dt>IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED </dt>
 <dd class="description">client-error-compression-not-supported</dd>
-<dt>IPP_CONFLICT </dt>
+<dt>IPP_STATUS_ERROR_CONFLICTING </dt>
 <dd class="description">client-error-conflicting-attributes</dd>
-<dt>IPP_DEVICE_ERROR </dt>
+<dt>IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
+<dd class="description">cups-error-account-authorization-failed </dd>
+<dt>IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED </dt>
+<dd class="description">cups-error-account-closed @deprecate@</dd>
+<dt>IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
+<dd class="description">cups-error-account-info-needed </dd>
+<dt>IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED <span class="info">&nbsp;DEPRECATED&nbsp;</span></dt>
+<dd class="description">cups-error-account-limit-reached </dd>
+<dt>IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED <span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span></dt>
+<dd class="description">cups-authentication-canceled - Authentication canceled by user </dd>
+<dt>IPP_STATUS_ERROR_CUPS_PKI <span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span></dt>
+<dd class="description">cups-pki-error - Error negotiating a secure connection </dd>
+<dt>IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED </dt>
+<dd class="description">cups-upgrade-required - TLS upgrade required</dd>
+<dt>IPP_STATUS_ERROR_DEVICE </dt>
 <dd class="description">server-error-device-error</dd>
-<dt>IPP_DOCUMENT_ACCESS_ERROR </dt>
+<dt>IPP_STATUS_ERROR_DOCUMENT_ACCESS </dt>
 <dd class="description">client-error-document-access-error</dd>
-<dt>IPP_DOCUMENT_FORMAT </dt>
-<dd class="description">client-error-document-format-not-supported</dd>
-<dt>IPP_DOCUMENT_FORMAT_ERROR </dt>
+<dt>IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR </dt>
 <dd class="description">client-error-document-format-error</dd>
-<dt>IPP_DOCUMENT_PASSWORD_ERROR </dt>
+<dt>IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED </dt>
+<dd class="description">client-error-document-format-not-supported</dd>
+<dt>IPP_STATUS_ERROR_DOCUMENT_PASSWORD </dt>
 <dd class="description">client-error-document-password-error</dd>
-<dt>IPP_DOCUMENT_PERMISSION_ERROR </dt>
+<dt>IPP_STATUS_ERROR_DOCUMENT_PERMISSION </dt>
 <dd class="description">client-error-document-permission-error</dd>
-<dt>IPP_DOCUMENT_SECURITY_ERROR </dt>
+<dt>IPP_STATUS_ERROR_DOCUMENT_SECURITY </dt>
 <dd class="description">client-error-document-security-error</dd>
-<dt>IPP_DOCUMENT_UNPRINTABLE_ERROR </dt>
+<dt>IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE </dt>
 <dd class="description">client-error-document-unprintable-error</dd>
-<dt>IPP_ERROR_JOB_CANCELED </dt>
-<dd class="description">server-error-job-canceled</dd>
-<dt>IPP_FORBIDDEN </dt>
+<dt>IPP_STATUS_ERROR_FORBIDDEN </dt>
 <dd class="description">client-error-forbidden</dd>
-<dt>IPP_GONE </dt>
+<dt>IPP_STATUS_ERROR_GONE </dt>
 <dd class="description">client-error-gone</dd>
-<dt>IPP_IGNORED_ALL_SUBSCRIPTIONS </dt>
+<dt>IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS </dt>
 <dd class="description">client-error-ignored-all-subscriptions</dd>
-<dt>IPP_INTERNAL_ERROR </dt>
+<dt>IPP_STATUS_ERROR_INTERNAL </dt>
 <dd class="description">server-error-internal-error</dd>
-<dt>IPP_MULTIPLE_JOBS_NOT_SUPPORTED </dt>
+<dt>IPP_STATUS_ERROR_JOB_CANCELED </dt>
+<dd class="description">server-error-job-canceled</dd>
+<dt>IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED </dt>
 <dd class="description">server-error-multiple-document-jobs-not-supported</dd>
-<dt>IPP_NOT_ACCEPTING </dt>
+<dt>IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS </dt>
 <dd class="description">server-error-not-accepting-jobs</dd>
-<dt>IPP_NOT_AUTHENTICATED </dt>
+<dt>IPP_STATUS_ERROR_NOT_AUTHENTICATED </dt>
 <dd class="description">client-error-not-authenticated</dd>
-<dt>IPP_NOT_AUTHORIZED </dt>
+<dt>IPP_STATUS_ERROR_NOT_AUTHORIZED </dt>
 <dd class="description">client-error-not-authorized</dd>
-<dt>IPP_NOT_FOUND </dt>
+<dt>IPP_STATUS_ERROR_NOT_FOUND </dt>
 <dd class="description">client-error-not-found</dd>
-<dt>IPP_NOT_POSSIBLE </dt>
+<dt>IPP_STATUS_ERROR_NOT_POSSIBLE </dt>
 <dd class="description">client-error-not-possible</dd>
-<dt>IPP_OK </dt>
-<dd class="description">successful-ok</dd>
-<dt>IPP_OK_CONFLICT </dt>
-<dd class="description">successful-ok-conflicting-attributes</dd>
-<dt>IPP_OK_EVENTS_COMPLETE </dt>
-<dd class="description">successful-ok-events-complete</dd>
-<dt>IPP_OK_IGNORED_SUBSCRIPTIONS </dt>
-<dd class="description">successful-ok-ignored-subscriptions</dd>
-<dt>IPP_OK_SUBST </dt>
-<dd class="description">successful-ok-ignored-or-substituted-attributes</dd>
-<dt>IPP_OK_TOO_MANY_EVENTS </dt>
-<dd class="description">successful-ok-too-many-events</dd>
-<dt>IPP_OPERATION_NOT_SUPPORTED </dt>
+<dt>IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED </dt>
 <dd class="description">server-error-operation-not-supported</dd>
-<dt>IPP_PKI_ERROR <span class="info">&nbsp;CUPS 1.5/OS X 10.7&nbsp;</span></dt>
-<dd class="description">Error negotiating a secure connection </dd>
-<dt>IPP_PRINTER_BUSY </dt>
-<dd class="description">server-error-busy</dd>
-<dt>IPP_PRINTER_IS_DEACTIVATED </dt>
+<dt>IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED </dt>
 <dd class="description">server-error-printer-is-deactivated</dd>
-<dt>IPP_REQUEST_ENTITY </dt>
+<dt>IPP_STATUS_ERROR_REQUEST_ENTITY </dt>
 <dd class="description">client-error-request-entity-too-large</dd>
-<dt>IPP_REQUEST_VALUE </dt>
+<dt>IPP_STATUS_ERROR_REQUEST_VALUE </dt>
 <dd class="description">client-error-request-value-too-long</dd>
-<dt>IPP_SERVICE_UNAVAILABLE </dt>
+<dt>IPP_STATUS_ERROR_SERVICE_UNAVAILABLE </dt>
 <dd class="description">server-error-service-unavailable</dd>
-<dt>IPP_STATUS_CUPS_INVALID </dt>
-<dd class="description">Invalid status name for <a href="#ippErrorValue"><code>ippErrorValue</code></a></dd>
-<dt>IPP_TEMPORARY_ERROR </dt>
+<dt>IPP_STATUS_ERROR_TEMPORARY </dt>
 <dd class="description">server-error-temporary-error</dd>
-<dt>IPP_TIMEOUT </dt>
+<dt>IPP_STATUS_ERROR_TIMEOUT </dt>
 <dd class="description">client-error-timeout</dd>
-<dt>IPP_TOO_MANY_DOCUMENTS </dt>
+<dt>IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS </dt>
 <dd class="description">server-error-too-many-documents</dd>
-<dt>IPP_TOO_MANY_JOBS </dt>
+<dt>IPP_STATUS_ERROR_TOO_MANY_JOBS </dt>
 <dd class="description">server-error-too-many-jobs</dd>
-<dt>IPP_TOO_MANY_SUBSCRIPTIONS </dt>
+<dt>IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS </dt>
 <dd class="description">client-error-too-many-subscriptions</dd>
-<dt>IPP_UPGRADE_REQUIRED </dt>
-<dd class="description">TLS upgrade required</dd>
-<dt>IPP_URI_SCHEME </dt>
+<dt>IPP_STATUS_ERROR_URI_SCHEME </dt>
 <dd class="description">client-error-uri-scheme-not-supported</dd>
-<dt>IPP_VERSION_NOT_SUPPORTED </dt>
+<dt>IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED </dt>
 <dd class="description">server-error-version-not-supported</dd>
+<dt>IPP_STATUS_OK </dt>
+<dd class="description">successful-ok</dd>
+<dt>IPP_STATUS_OK_CONFLICTING </dt>
+<dd class="description">successful-ok-conflicting-attributes</dd>
+<dt>IPP_STATUS_OK_EVENTS_COMPLETE </dt>
+<dd class="description">successful-ok-events-complete</dd>
+<dt>IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED </dt>
+<dd class="description">successful-ok-ignored-or-substituted-attributes</dd>
+<dt>IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS </dt>
+<dd class="description">successful-ok-ignored-subscriptions</dd>
+<dt>IPP_STATUS_OK_TOO_MANY_EVENTS </dt>
+<dd class="description">successful-ok-too-many-events</dd>
 </dl>
 <h3 class="enumeration"><a name="ipp_tag_e">ipp_tag_e</a></h3>
 <p class="description">Format tags for attributes</p>
index 2269927..d957342 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
index a310f6e..01a0414 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
index 6530d4b..df8f7a9 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
@@ -404,7 +416,7 @@ marked option choices.">ppdConflicts</a></li>
        <li><a href="#ppdEmitJCL" title="Emit code for JCL options to a file.">ppdEmitJCL</a></li>
        <li><a href="#ppdEmitJCLEnd" title="Emit JCLEnd code to a file.">ppdEmitJCLEnd</a></li>
        <li><a href="#ppdEmitString" title="Get a string containing the code for marked options.">ppdEmitString</a></li>
-       <li><a href="#ppdErrorString" title="Returns the text assocated with a status.">ppdErrorString</a></li>
+       <li><a href="#ppdErrorString" title="Returns the text associated with a status.">ppdErrorString</a></li>
        <li><a href="#ppdFindAttr" title="Find the first matching attribute.">ppdFindAttr</a></li>
        <li><a href="#ppdFindChoice" title="Return a pointer to an option choice.">ppdFindChoice</a></li>
        <li><a href="#ppdFindCustomOption" title="Find a custom option.">ppdFindCustomOption</a></li>
@@ -1039,7 +1051,7 @@ The return string is allocated on the heap and should be freed using
 
 </p>
 <h3 class="function"><span class="info">&nbsp;CUPS 1.1.19/OS X 10.3&nbsp;</span><a name="ppdErrorString">ppdErrorString</a></h3>
-<p class="description">Returns the text assocated with a status.</p>
+<p class="description">Returns the text associated with a status.</p>
 <p class="code">
 const char *ppdErrorString (<br>
 &nbsp;&nbsp;&nbsp;&nbsp;<a href="#ppd_status_t">ppd_status_t</a> status<br>
index 484288e..df32135 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
index f2dade4..9acda47 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
index c50a2a5..34c6deb 100644 (file)
@@ -63,8 +63,7 @@ application/x-httpd-php php
 application/x-httpd-python py
 </PRE>
 
-<P>CGI scripts/programs (application/x-httpd-cgi) also must have execution
-permissions to be treated as a CGI script or program.</P>
+<P>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.</P>
 
 <H2><A NAME="LIMITS">Limitations</A></H2>
 
@@ -75,10 +74,7 @@ following exceptions:</P>
 
        <LI>No PATH_INFO or PATH_TRANSLATED support</LI>
 
-       <LI>Limited HTTP field support; only the Content-Length
-       (CONTENT_LENGTH), Cookie (HTTP_COOKIE), and User-Agent
-       (HTTP_USER_AGENT) fields are placed in environment
-       variables at this time</LI>
+       <LI>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</LI>
 
 </UL>
 
index c6898dc..6bd6137 100644 (file)
@@ -66,9 +66,6 @@
 
 <DL>
 
-       <DT>HP-GL
-       <DD>Hewlett-Packard Graphics Language
-
        <DT>HP-PCL
        <DD>Hewlett-Packard Page Control Language
 
        <DT>PPD
        <DD>PostScript Printer Description
 
+       <DT>PWG
+       <DD>Printer Working Group
+
 </DL>
 
 
 
 <DL>
 
-       <DT>SCSI
-       <DD>Small Computer Systems Interface
-
        <DT>serial
        <DD>Sending or receiving data 1 bit at a time
 
index 30fb533..d6c208c 100644 (file)
@@ -32,8 +32,6 @@ DNS server(s).</li>
        server(s).</li>
        </ol></li>
 
-       <li>A "host" Service Granting Ticket (SGT) for every CUPS server</li>
-
 </ol>
 
 
@@ -62,7 +60,7 @@ DNS server(s).</li>
 
 <H2 CLASS="title"><A NAME="CUPS">Configuring CUPS to Use Kerberos</A></H2>
 
-<P>Once youhave configured Kerberos on your system(s), you can then enable Kerberos authentication by selecting the <tt>Negotiate</tt> authentication type. The simplest way to do this is using the <tt>cupsctl(8)</tt> command on your server(s):</P>
+<P>Once you have configured Kerberos on your system(s), you can then enable Kerberos authentication by selecting the <tt>Negotiate</tt> authentication type. The simplest way to do this is using the <tt>cupsctl(8)</tt> command on your server(s):</P>
 
 <PRE CLASS="command">
 <KBD>cupsctl DefaultAuthType=Negotiate</KBD>
@@ -83,7 +81,7 @@ http://server.example.com:631/admin
 
 <P>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 converted to just "user" for purposes of user and group checks.</P>
 
-<P>In order to support printing to a shared printer, CUPS runs the IPP backend as the owner of the print job so it can obtain the necessary credentials.</P>
+<P>In order to support printing to a shared printer, CUPS runs the IPP backend as the owner of the print job so it can obtain the necessary credentials when the job is de-spooled to the server.</P>
 
 </BODY>
 </HTML>
index 9bbc729..0056621 100644 (file)
@@ -8,7 +8,7 @@
 
 <H1 CLASS="title">Software License Agreement</H1>
 
-<P ALIGN="CENTER">Copyright 2007-2012 by Apple Inc.<BR>
+<P ALIGN="CENTER">Copyright 2007-2013 by Apple Inc.<BR>
 1 Infinite Loop<BR>
 Cupertino, CA 95014 USA<BR>
 <BR>
@@ -16,10 +16,7 @@ WWW: <A HREF="http://www.cups.org/">http://www.cups.org/</A>
 
 <H2 CLASS="title"><A NAME="INTRO">Introduction</A></H2>
 
-<P>CUPS<SUP>TM</SUP> is provided under the GNU General Public License ("GPL")
-and GNU Library General Public License ("LGPL"), Version 2, with exceptions for
-Apple operating systems and the OpenSSL toolkit. A copy of the exceptions and
-licenses follow this introduction.</P>
+<P>CUPS<SUP>TM</SUP> is provided under the GNU General Public License ("GPL") and GNU Library General Public License ("LGPL"), Version 2, with an exception for Apple operating systems. A copy of the exception and licenses follow this introduction.</P>
 
 <P>The GNU LGPL applies to the CUPS and CUPS Imaging libraries located in the
 "cups" and "filter" subdirectories of the CUPS source distribution and the files
@@ -59,7 +56,7 @@ for your application, driver, or filter.</P>
 <H2 CLASS="title"><A NAME="EXCEPTIONS">License Exceptions</A></H2>
 
 <P>In addition, as the copyright holder of CUPS, Apple Inc. grants
-the following special exceptions:</P>
+the following special exception:</P>
 
 <OL>
 
@@ -111,20 +108,9 @@ the following special exceptions:</P>
 
        </OL>
 
-       <LI><B>OpenSSL Toolkit License Exception</B>;
-
-       <OL TYPE="a">
-
-               <LI>Apple Inc. explicitly allows the
-               compilation and distribution of the CUPS
-               software with the OpenSSL Toolkit.</LI>
-
-       </OL>
-
 </OL>
 
-<P>No developer is required to provide these exceptions in a
-derived work.</P>
+<P>No developer is required to provide this exception in a derived work.</P>
 
 
 <H2 CLASS="title"><A NAME="KERBEROS">Kerberos Support Code</A></H2>
diff --git a/doc/help/man-backend.html b/doc/help/man-backend.html
new file mode 100644 (file)
index 0000000..4ccad79
--- /dev/null
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>backend(7)</title>
+</head>
+<body>
+<h1 class="title">backend(7)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+backend - cups backend transmission interfaces
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>backend</b>
+<br>
+<b>backend</b>
+<i>job</i>
+<i>user</i>
+<i>title</i>
+<i>num-copies</i>
+<i>options</i>
+[
+<i>filename</i>
+]
+<pre class="man">
+
+<b>#include &lt;cups/cups.h></b>
+
+<b>const char *cupsBackendDeviceURI</b>(<b>char **</b><i>argv</i>);
+
+<b>void cupsBackendReport</b>(<b>const char *</b><i>device_scheme</i>,
+                       <b>const char *</b><i>device_uri</i>,
+                       <b>const char *</b><i>device_make_and_model</i>,
+                       <b>const char *</b><i>device_info</i>,
+                       <b>const char *</b><i>device_id</i>,
+                       <b>const char *</b><i>device_location</i>);
+
+<b>ssize_t cupsBackChannelWrite</b>(<b>const char *</b><i>buffer</i>,
+                             <b>size_t </b><i>bytes</i>, <b>double </b><i>timeout</i>);
+
+<b>int cupsSideChannelRead</b>(<b>cups_sc_command_t *</b><i>command</i>,
+                        <b>cups_sc_status_t *</b><i>status</i>, <b>char *</b><i>data</i>,
+                        <b>int *</b><i>datalen</i>, <b>double </b><i>timeout</i>);
+
+<b>int cupsSideChannelWrite</b>(<b>cups_sc_command_t </b><i>command</i>,
+                         <b>cups_sc_status_t </b><i>status</i>, <b>const char *</b><i>data</i>,
+                         <b>int </b><i>datalen</i>, <b>double </b><i>timeout</i>);
+</pre>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+Backends are a special type of
+<a href="man-filter.html?TOPIC=Man+Pages"><b>filter</b>(7)</a>
+which is used to send print data to and discover different devices on the system.
+<p>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.
+<p>The command name (<i>argv[0]</i>) is set to the device URI of the destination printer. Authentication information in
+<i>argv[0]</i>
+is removed, so backend developers are urged to use the
+<b>DEVICE_URI</b>
+environment variable whenever authentication information is required. The
+<b>cupsBackendDeviceURI</b>()
+function may be used to retrieve the correct device URI.
+<p>Back-channel data from the device should be relayed to the job filters using the <i>cupsBackChannelWrite</i> function.
+<p>Backends are responsible for reading side-channel requests using the
+<b>cupsSideChannelRead</b>()
+function and responding with the
+<b>cupsSideChannelWrite()</b>
+function. The
+<b>CUPS_SC_FD</b>
+constant defines the file descriptor that should be monitored for incoming requests.
+<h3><a name="DEVICE_DISCOVERY">Device Discovery</a></h3>
+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:
+<pre class="man">
+
+    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"
+</pre>
+<p>The
+<b>cupsBackendReport</b>()
+function can be used to generate these lines and handle any necessary escaping of characters in the various strings.
+<p>The
+<i>device-class</i>
+field is one of the following values:
+<dl class="man">
+<dt><b>direct</b>
+<dd style="margin-left: 5.0em">The device-uri refers to a specific direct-access device with no options, such as a parallel, USB, or SCSI device.
+<dt><b>file</b>
+<dd style="margin-left: 5.0em">The device-uri refers to a file on disk.
+<dt><b>network</b>
+<dd style="margin-left: 5.0em">The device-uri refers to a networked device and conforms to the general form for
+network URIs.
+<dt><b>serial</b>
+<dd style="margin-left: 5.0em">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.
+</dl>
+<p>The
+<i>scheme</i>
+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</i>
+field specifies the full URI to use when communicating with the device.
+<p>The
+<i>device-make-and-model</i>
+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".
+<p>The
+<i>device-info</i>
+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".
+<p>The optional
+<i>device-id</i>
+field specifies the IEEE-1284 device ID string for the device, which is used to select a matching driver.
+<p>The optional
+<i>device-location</i>
+field specifies the physical location of the device, which is often used to pre-populate the printer-location attribute when adding a printer.
+<h3><a name="PERMISSIONS">Permissions</a></h3>
+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".
+<h2 class="title"><a name="EXIT_STATUS">Exit Status</a></h2>
+The following exit codes are defined for backends:
+<dl class="man">
+<dt><b>CUPS_BACKEND_OK</b>
+<dd style="margin-left: 5.0em">The print file was successfully transmitted to the device or remote server.
+<dt><b>CUPS_BACKEND_FAILED</b>
+<dd style="margin-left: 5.0em"><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</i>
+attribute.
+<dt><b>CUPS_BACKEND_AUTH_REQUIRED</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>CUPS_BACKEND_HOLD</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>CUPS_BACKEND_STOP</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>CUPS_BACKEND_CANCEL</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>CUPS_BACKEND_RETRY</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>CUPS_BACKEND_RETRY_CURRENT</b>
+<dd style="margin-left: 5.0em">The print file was not successfully transmitted because of a temporary issue. The scheduler will retry the job immediately without allowing intervening jobs.
+</dl>
+<p>All other exit code values are reserved.
+<h2 class="title"><a name="ENVIRONMENT">Environment</a></h2>
+In addition to the environment variables listed in
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1)</a>
+and
+<a href="man-filter.html?TOPIC=Man+Pages"><b>filter</b>(7),</a>
+CUPS backends can expect the following environment variable:
+<dl class="man">
+<dt><b>DEVICE_URI</b>
+<dd style="margin-left: 5.0em">The device URI associated with the printer.
+</dl>
+<h2 class="title"><a name="FILES">Files</a></h2>
+<i>/etc/cups/cups-files.conf</i>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+CUPS backends are not generally design to be run directly by the user. Aside from the device URI issue (
+<i>argv[0]</i>
+and
+<b>DEVICE_URI</b>
+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 OS X) 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.
+<p>Unless you are a developer and know what you are doing, please do not run backends directly. Instead, use the
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1)</a>
+or
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1)</a>
+programs to send print jobs or
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8)</a>
+to query for available printers using the backend. The one exception is the SNMP backend - see
+<a href="man-cups-snmp.html?TOPIC=Man+Pages"><b>cups-snmp</b>(8)</a>
+for more information.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<i>cups</i>(1),
+<i>cups-files.conf</i>(5),
+<i>cups-snmp</i>(8),
+<i>cupsd</i>(8),
+<i>filter</i>(7),
+<i>lp</i>(1),
+<i>lpinfo</i>(8),
+<i>lpr</i>(1),
+<br>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cancel.html b/doc/help/man-cancel.html
new file mode 100644 (file)
index 0000000..f68f440
--- /dev/null
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cancel(1)</title>
+</head>
+<body>
+<h1 class="title">cancel(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cancel - cancel jobs
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cancel</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-a</b>
+] [
+<b>-h</b>
+<i>hostname[:port]</i>
+] [
+<b>-u</b>
+<i>username</i>
+] [
+<b>-x</b>
+] [
+<i>id</i>
+] [
+<i>destination</i>
+] [
+<i>destination-id</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>cancel</b> command cancels print jobs.
+If no <i>destination</i> or <i>id</i> is specified, the currently printing job on the default destination is canceled.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options are recognized by <b>cancel</b>:
+<dl class="man">
+<dt><b>-a</b>
+<dd style="margin-left: 5.0em">Cancel all jobs on the named destination, or all jobs on all
+destinations if none is provided.
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-h </b><i>hostname</i>[<i>:port</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies the username to use when connecting to the server.
+<dt><b>-u </b><i>username</i>
+<dd style="margin-left: 5.0em">Cancels jobs owned by <i>username</i>.
+<dt><b>-x</b>
+<dd style="margin-left: 5.0em">Deletes job data files in addition to canceling.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+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 <i>not</i> case-sensitive.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Cancel the current print job:
+<pre class="man">
+
+    cancel
+
+</pre>
+Cancel job "myprinter-42":
+<pre class="man">
+
+    cancel myprinter-42
+
+</pre>
+Cancel all jobs:
+<pre class="man">
+
+    cancel -a
+</pre>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+Administrators wishing to prevent unauthorized cancellation of jobs via the <i>-u</i> option should require authentication for Cancel-Jobs operations in
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5).</a>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpmove.html?TOPIC=Man+Pages"><b>lpmove</b>(8),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-classes.conf.html b/doc/help/man-classes.conf.html
new file mode 100644 (file)
index 0000000..a453bbc
--- /dev/null
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>classes.conf(5)</title>
+</head>
+<body>
+<h1 class="title">classes.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+classes.conf - class configuration file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>classes.conf</b> file defines the local printer classes that are available. It is normally located in the <i>/etc/cups</i> directory and is maintained by the
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8)</a>
+program. This file is not intended to be edited or managed manually.
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+<a href="man-printers.conf.html?TOPIC=Man+Pages"><b>printers.conf</b>(5),</a>
+<a href="man-subscriptions.conf.html?TOPIC=Man+Pages"><b>subscriptions.conf</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-client.conf.html b/doc/help/man-client.conf.html
new file mode 100644 (file)
index 0000000..edf4470
--- /dev/null
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>client.conf(5)</title>
+</head>
+<body>
+<h1 class="title">client.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+client.conf - client configuration file for cups (deprecated)
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>client.conf</b> file configures the CUPS client and is normally located in the <i>/etc/cups</i> and/or <i>~/.cups</i> directories.
+Each line in the file can be a configuration directive, a blank line, or a comment. Comment lines start with the # character.
+<p><b>Note:</b> Starting with OS X 10.7, this file is only used by command-line and X11 applications plus the IPP backend.
+The <b>ServerName</b> directive is not supported on OS X at all.
+<h3><a name="DIRECTIVES">Directives</a></h3>
+The following directives are understood by the client. Consult the online help for detailed descriptions:
+<dl class="man">
+<dt><b>AllowAnyRoot Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>AllowAnyRoot No</b>
+<dd style="margin-left: 5.0em">Specifies whether to allow TLS with certificates that have not been signed by a trusted Certificate Authority.
+The default is "Yes".
+<dt><b>AllowExpiredCerts Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>AllowExpiredCerts No</b>
+<dd style="margin-left: 5.0em">Specifies whether to allow TLS with expired certificates.
+The default is "Yes".
+<dt><b>Encryption IfRequested</b>
+<dd style="margin-left: 5.0em"><dt><b>Encryption Never</b>
+<dd style="margin-left: 5.0em"><dt><b>Encryption Required</b>
+<dd style="margin-left: 5.0em">Specifies the level of encryption that should be used.
+<dt><b>GSSServiceName </b><i>name</i>
+<dd style="margin-left: 5.0em">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".
+<dt><b>ServerName </b><i>hostname-or-ip-address</i>[<i>:port</i>]
+<dd style="margin-left: 5.0em"><dt><b>ServerName </b><i>/domain/socket</i>
+<dd style="margin-left: 5.0em">Specifies the address and optionally the port to use when connecting to the server.
+<b>Note: This directive it not supported on OS X 10.7 or later.</b>
+<dt><b>ServerName </b><i>hostname-or-ip-address</i>[<i>:port</i>]<b>/version=1.1</b>
+<dd style="margin-left: 5.0em">Specifies the address and optionally the port to use when connecting to a server running CUPS 1.3.12 and earlier.
+<dt><b>SSLOptions </b>[<i>AllowDH</i>] [<i>AllowRC4</i>] [<i>AllowSSL3</i>] [<i>DenyTLS1.0</i>]
+<dd style="margin-left: 5.0em"><dt><b>SSLOptions None</b>
+<dd style="margin-left: 5.0em">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.
+The <i>AllowDH</i> option enables cipher suites using plain Diffie-Hellman key negotiation.
+The <i>AllowRC4</i> option enables the 128-bit RC4 cipher suites, which are required for some older clients that do not implement newer ones.
+The <i>AllowSSL3</i> option enables SSL v3.0, which is required for some older clients that do not support TLS v1.0.
+The <i>DenyTLS1.0</i> option disables TLS v1.0 support - this sets the minimum protocol version to TLS v1.1.
+<dt><b>User </b><i>name</i>
+<dd style="margin-left: 5.0em">Specifies the default user name to use for requests.
+<dt><b>ValidateCerts Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>ValidateCerts No</b>
+<dd style="margin-left: 5.0em">Specifies whether to only allow TLS with certificates whose common name matches the hostname.
+The default is "No".
+</dl>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+The <b>client.conf</b> file is deprecated and will no longer be supported in a future version of CUPS.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cups-config.html b/doc/help/man-cups-config.html
new file mode 100644 (file)
index 0000000..705e200
--- /dev/null
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cups-config(1)</title>
+</head>
+<body>
+<h1 class="title">cups-config(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cups-config - get cups api, compiler, directory, and link information.
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cups-config</b>
+<i>--api-version</i>
+<br>
+<b>cups-config</b>
+<i>--build</i>
+<br>
+<b>cups-config</b>
+<i>--cflags</i>
+<br>
+<b>cups-config</b>
+<i>--datadir</i>
+<br>
+<b>cups-config</b>
+<i>--help</i>
+<br>
+<b>cups-config</b>
+<i>--ldflags</i>
+<br>
+<b>cups-config</b>
+[
+<i>--image</i>
+] [
+<i>--static</i>
+]
+<i>--libs</i>
+<br>
+<b>cups-config</b>
+<i>--serverbin</i>
+<br>
+<b>cups-config</b>
+<i>--serverroot</i>
+<br>
+<b>cups-config</b>
+<i>--version</i>
+<br>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>cups-config</b> 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.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The <b>cups-config</b> command accepts the following command-line options:
+<dl class="man">
+<dt><b>--api-version</b>
+<dd style="margin-left: 5.0em">Reports the current API version (major.minor).
+<dt><b>--build</b>
+<dd style="margin-left: 5.0em">Reports a system-specific build number.
+<dt><b>--cflags</b>
+<dd style="margin-left: 5.0em">Reports the necessary compiler options.
+<dt><b>--datadir</b>
+<dd style="margin-left: 5.0em">Reports the default CUPS data directory.
+<dt><b>--help</b>
+<dd style="margin-left: 5.0em">Reports the program usage message.
+<dt><b>--image</b>
+<dd style="margin-left: 5.0em">When used with <i>--libs</i>, adds the CUPS imaging library to the
+list of libraries.
+<dt><b>--ldflags</b>
+<dd style="margin-left: 5.0em">Reports the necessary linker options.
+<dt><b>--libs</b>
+<dd style="margin-left: 5.0em">Reports the necessary libraries to link to.
+<dt><b>--serverbin</b>
+<dd style="margin-left: 5.0em">Reports the default CUPS binary directory, where filters and backends are stored.
+<dt><b>--serverroot</b>
+<dd style="margin-left: 5.0em">Reports the default CUPS configuration file directory.
+<dt><b>--static</b>
+<dd style="margin-left: 5.0em">When used with <i>--libs</i>, reports the static libraries instead of the default (shared) libraries.
+<dt><b>--version</b>
+<dd style="margin-left: 5.0em">Reports the full version number of the CUPS installation (major.minor.patch).
+</dl>
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Show the currently installed version of CUPS:
+<pre class="man">
+
+    cups-config --version
+
+</pre>
+Compile a simple one-file CUPS filter:
+<pre class="man">
+
+    cc `cups-config --cflags --ldflags` -o filter filter.c \
+        `cups-config --libs`
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cups-files.conf.html b/doc/help/man-cups-files.conf.html
new file mode 100644 (file)
index 0000000..41001b1
--- /dev/null
@@ -0,0 +1,166 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cups-files.conf(5)</title>
+</head>
+<body>
+<h1 class="title">cups-files.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cups-files.conf - file and directory configuration file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>cups-files.conf</b> file configures the files and directories used by the CUPS scheduler,
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8).</a>
+It is normally located in the <i>/etc/cups</i> directory.
+<p>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.
+<h3><a name="DIRECTIVES">Directives</a></h3>
+The following directives are understood by
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8):</a>
+<dl class="man">
+<dt><a name="AccessLog"></a><b>AccessLog</b>
+<dd style="margin-left: 5.0em"><dt><b>AccessLog </b><i>filename</i>
+<dd style="margin-left: 5.0em"><dt><b>AccessLog stderr</b>
+<dd style="margin-left: 5.0em"><dt><b>AccessLog syslog</b>
+<dd style="margin-left: 5.0em">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:
+<pre class="man">
+
+    AccessLog /var/log/cups/%s-access_log
+
+</pre>
+The default is "/var/log/cups/access_log".
+<dt><a name="ConfigFilePerm"></a><b>ConfigFilePerm </b><i>mode</i>
+<dd style="margin-left: 5.0em">Specifies the permissions for all configuration files that the scheduler writes.
+The default is "0644" on OS X and "0640" on all other operating systems.
+</dl>
+<p><b>Note:</b> The permissions for the <i>printers.conf</i> 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.
+<dl class="man">
+<dt><a name="DataDir"></a><b>DataDir </b><i>path</i>
+<dd style="margin-left: 5.0em">Specifies the directory where data files can be found.
+The default is usually "/usr/share/cups".
+<dt><a name="DocumentRoot"></a><b>DocumentRoot </b><i>directory</i>
+<dd style="margin-left: 5.0em">Specifies the root directory for the CUPS web interface content.
+The default is usually "/usr/share/doc/cups".
+<dt><a name="ErrorLog"></a><b>ErrorLog</b>
+<dd style="margin-left: 5.0em"><dt><b>ErrorLog </b><i>filename</i>
+<dd style="margin-left: 5.0em"><dt><b>ErrorLog stderr</b>
+<dd style="margin-left: 5.0em"><dt><b>ErrorLog syslog</b>
+<dd style="margin-left: 5.0em">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:
+<pre class="man">
+
+    ErrorLog /var/log/cups/%s-error_log
+
+</pre>
+The default is "/var/log/cups/error_log".
+<dt><a name="FatalErrors"></a><b>FatalErrors none</b>
+<dd style="margin-left: 5.0em"><dt><b>FatalErrors all </b><i>-kind </i>[ ... <i>-kind </i>]
+<dd style="margin-left: 5.0em"><dt><b>FatalErrors </b><i>kind </i>[ ... <i>kind </i>]
+<dd style="margin-left: 5.0em">Specifies which errors are fatal, causing the scheduler to exit.
+The default is "config".
+The <i>kind</i> strings are:
+<div style="margin-left: 0.0em;">
+<dl class="man">
+<dt><b>none</b>
+<dd style="margin-left: 5.0em">No errors are fatal.
+<dt><b>all</b>
+<dd style="margin-left: 5.0em">All of the errors below are fatal.
+<dt><b>browse</b>
+<dd style="margin-left: 5.0em">Browsing initialization errors are fatal, for example failed connections to the DNS-SD daemon.
+<dt><b>config</b>
+<dd style="margin-left: 5.0em">Configuration file syntax errors are fatal.
+<dt><b>listen</b>
+<dd style="margin-left: 5.0em">Listen or Port errors are fatal, except for IPv6 failures on the loopback or "any" addresses.
+<dt><b>log</b>
+<dd style="margin-left: 5.0em">Log file creation or write errors are fatal.
+<dt><b>permissions</b>
+<dd style="margin-left: 5.0em">Bad startup file permissions are fatal, for example shared TLS certificate and key files with world-read permissions.
+</div>
+<dt><a name="FileDevice"></a><b>FileDevice Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>FileDevice No</b>
+<dd style="margin-left: 5.0em">Specifies whether the file pseudo-device can be used for new printer queues.
+The URI "file:///dev/null" is always allowed.
+<dt><a name="Group"></a><b>Group </b><i>group-name-or-number</i>
+<dd style="margin-left: 5.0em">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".
+<dt><a name="LogFilePerm"></a><b>LogFilePerm </b><i>mode</i>
+<dd style="margin-left: 5.0em">Specifies the permissions of all log files that the scheduler writes.
+The default is "0644".
+<dt><a name="PageLog"></a><b>PageLog </b>[ <i>filename</i> ]
+<dd style="margin-left: 5.0em"><dt><b>PageLog stderr</b>
+<dd style="margin-left: 5.0em"><dt><b>PageLog syslog</b>
+<dd style="margin-left: 5.0em">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:
+<pre class="man">
+
+    PageLog /var/log/cups/%s-page_log
+
+</pre>
+The default is "/var/log/cups/page_log".
+<dt><a name="RemoteRoot"></a><b>RemoteRoot </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies the username that is associated with unauthenticated accesses by clients claiming to be the root user.
+The default is "remroot".
+<dt><a name="RequestRoot"></a><b>RequestRoot </b><i>directory</i>
+<dd style="margin-left: 5.0em">Specifies the directory that contains print jobs and other HTTP request data.
+The default is "/var/spool/cups".
+<dt><a name="Sandboxing"></a><b>Sandboxing relaxed</b>
+<dd style="margin-left: 5.0em"><dt><b>Sandboxing strict</b>
+<dd style="margin-left: 5.0em">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 OS X.
+<dt><a name="ServerBin"></a><b>ServerBin </b><i>directory</i>
+<dd style="margin-left: 5.0em">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.
+<dt><a name="ServerKeychain"></a><b>ServerKeychain </b><i>path</i>
+<dd style="margin-left: 5.0em">Specifies the location of TLS certificates and private keys.
+The default is "/Library/Keychains/System.keychain" on OS X and "/etc/cups/ssl" on all other operating systems.
+OS X 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.
+<dt><a name="ServerRoot"></a><b>ServerRoot </b><i>directory</i>
+<dd style="margin-left: 5.0em">Specifies the directory containing the server configuration files.
+The default is "/etc/cups".
+<dt><a name="SyncOnClose"></a><b>SyncOnClose Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>SyncOnClose No</b>
+<dd style="margin-left: 5.0em">Specifies whether the scheduler calls
+<b>fsync</b>(2)
+after writing configuration or state files.
+The default is "No".
+<dt><a name="SystemGroup"></a><b>SystemGroup </b><i>group-name </i>[ ... <i>group-name</i> ]
+<dd style="margin-left: 5.0em">Specifies the group(s) to use for <i>@SYSTEM</i> group authentication.
+The default contains "admin", "lpadmin", "root", "sys", and/or "system".
+<dt><a name="TempDir"></a><b>TempDir </b><i>directory</i>
+<dd style="margin-left: 5.0em">Specifies the directory where temporary files are stored.
+The default is "/var/spool/cups/tmp".
+<dt><a name="User"></a><b>User </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies the user name or ID that is used when running external programs.
+The default is "lp".
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-classes.conf.html?TOPIC=Man+Pages"><b>classes.conf</b>(5),</a>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+<a href="man-printers.conf.html?TOPIC=Man+Pages"><b>printers.conf</b>(5),</a>
+<a href="man-subscriptions.conf.html?TOPIC=Man+Pages"><b>subscriptions.conf</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cups-lpd.html b/doc/help/man-cups-lpd.html
new file mode 100644 (file)
index 0000000..697518a
--- /dev/null
@@ -0,0 +1,114 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cups-lpd(8)</title>
+</head>
+<body>
+<h1 class="title">cups-lpd(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cups-lpd - receive print jobs and report printer status to lpd clients
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cups-lpd</b>
+[
+<b>-h </b><i>hostname</i>[<b>:</b><i>port</i>]
+] [
+<b>-n</b>
+] [
+<b>-o</b>
+<i>option=value</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cups-lpd</b>
+is the CUPS Line Printer Daemon ("LPD") mini-server that supports legacy client systems that use the LPD protocol.
+<b>cups-lpd</b>
+does not act as a standalone network daemon but instead operates using any of the Internet "super-servers" such as
+<b>inetd</b>(8),
+<b>launchd</b>(8),
+and
+<b>systemd</b>(8).
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<dl class="man">
+<dt><b>-h </b><i>hostname</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Sets the CUPS server (and port) to use.
+<dt><b>-n</b>
+<dd style="margin-left: 5.0em">Disables reverse address lookups; normally
+<b>cups-lpd</b>
+will try to discover the hostname of the client via a reverse DNS lookup.
+<dt><b>-o </b><i>name=value</i>
+<dd style="margin-left: 5.0em">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
+<b>inetd</b>(8)
+example below sets the "document-format" option to "application/octet-stream" which forces autodetection of the print file format.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+<b>cups-lpd</b>
+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.
+<p>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.
+<h2 class="title"><a name="ERRORS">Errors</a></h2>
+Errors are sent to the system log.
+<h2 class="title"><a name="FILES">Files</a></h2>
+<pre class="man">
+<i>/etc/inetd.conf</i>
+<i>/etc/xinetd.d/cups-lpd</i>
+<i>/System/Library/LaunchDaemons/org.cups.cups-lpd.plist</i>
+</pre>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+<h3><a name="PERFORMANCE">Performance</a></h3>
+<b>cups-lpd</b>
+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.
+<h3><a name="SECURITY">Security</a></h3>
+<b>cups-lpd</b>
+currently does not perform any access control based on the settings in <i>cupsd.conf(5)</i> or in the <i>hosts.allow(5)</i> or <i>hosts.deny(5)</i> files used by TCP wrappers.
+Therefore, running
+<b>cups-lpd</b>
+on your server will allow any computer on your network (and perhaps the entire
+Internet) to print to your server.
+<p>While
+<b>xinetd</b>(8)
+has built-in access control support, you should use the TCP wrappers package with
+<b>inetd</b>(8)
+to limit access to only those computers that should be able to print through your server.
+<p><b>cups-lpd</b>
+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.
+<h2 class="title"><a name="EXAMPLE">Example</a></h2>
+If you are using
+<b>inetd</b>(8),
+add the following line to the <i>inetd.conf</i> file to enable the
+<b>cups-lpd</b>
+mini-server:
+<pre class="man">
+
+    printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd \
+        -o document-format=application/octet-stream
+
+</pre>
+<p><i>Note:</i> If you are using Solaris 10 or higher, you must run the
+<b>inetdconv</b>(1m)
+program to register the changes to the <i>inetd.conf</i> file.
+<p>CUPS includes configuration files for
+<b>launchd</b>(8),
+<b>systemd</b>(8),
+and
+<b>xinetd(8).</b>
+Simply enable the
+<b>cups-lpd</b>
+service using the corresponding control program.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<b>inetconv</b>(1m),
+<b>inetd</b>(8),
+<b>launchd</b>(8),
+<b>xinetd</b>(8),
+CUPS Online Help (<a href="http://localhost:631/help)">http://localhost:631/help)</a>,
+RFC 2569
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cups-snmp.conf.html b/doc/help/man-cups-snmp.conf.html
new file mode 100644 (file)
index 0000000..e0c18bd
--- /dev/null
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>snmp.conf(5)</title>
+</head>
+<body>
+<h1 class="title">snmp.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+snmp.conf - snmp configuration file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The
+<b>snmp.conf</b>
+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 <i>/etc/cups</i> directory.
+Each line in the file can be a configuration directive, a blank line, or a comment. Comment lines start with the # character.
+<p>The Community and DebugLevel directives are used by all backends. The remainder apply only to the SNMP backend -
+<a href="man-cups-snmp.html?TOPIC=Man+Pages"><b>cups-snmp</b>(8).</a>
+<h2 class="title"><a name="DIRECTIVES">Directives</a></h2>
+The following directives are understood by the CUPS network backends:
+<dl class="man">
+<dt><b>Address @IF(</b><i>name</i><b>)</b>
+<dd style="margin-left: 5.0em"><dt><b>Address @LOCAL</b>
+<dd style="margin-left: 5.0em"><dt><b>Address </b><i>address</i>
+<dd style="margin-left: 5.0em">Sends SNMP broadcast queries (for discovery) to the specified address(es).
+There is no default for the broadcast address.
+<dt><b>Community </b><i>name</i>
+<dd style="margin-left: 5.0em">Specifies the community name to use.
+Only a single community name may be specified.
+The default community name is "public".
+<dt><b>DebugLevel </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the logging level from 0 (none) to 3 (everything).
+Typically only used for debugging (thus the name).
+The default debug level is 0.
+<dt><b>DeviceURI "</b><i>regular expression</i><b>" </b><i>device-uri </i>[... <i>device-uri</i>]
+<dd style="margin-left: 5.0em">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.
+<dt><b>HostNameLookups on</b>
+<dd style="margin-left: 5.0em"><dt><b>HostNameLookups off</b>
+<dd style="margin-left: 5.0em">Specifies whether the addresses of printers should be converted to hostnames or left as numeric IP addresses.
+The default is "off".
+<dt><b>MaxRunTime </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of seconds that the SNMP backend will scan the
+network for printers.
+The default is 120 seconds (2 minutes).
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups-snmp.html?TOPIC=Man+Pages"><b>cups-snmp</b>(8),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cups-snmp.html b/doc/help/man-cups-snmp.html
new file mode 100644 (file)
index 0000000..faa5763
--- /dev/null
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cups-snmp(8)</title>
+</head>
+<body>
+<h1 class="title">cups-snmp(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+snmp - cups snmp backend
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>/usr/lib/cups/backend/snmp</b>
+<i>ip-address-or-hostname</i>
+<br>
+<b>/usr/libexec/cups/backend/snmp</b>
+<i>ip-address-or-hostname</i>
+<br>
+<b>lpinfo</b>
+<b>-v</b>
+<b>--include-schemes</b>
+snmp
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The 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.
+<p>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.
+<p>In the second form, the SNMP backend is run indirectly using the
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8)</a>
+command.
+The output provides all printers detected via SNMP on the configured
+broadcast addresses.
+<i>Note: no broadcast addresses are configured by default.</i>
+<h2 class="title"><a name="ENVIRONMENT">Environment</a></h2>
+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.
+<h2 class="title"><a name="FILES">Files</a></h2>
+The SNMP backend reads the <i>/etc/cups/snmp.conf</i> configuration file, if
+present, to set the default broadcast address, community name, and logging
+level.
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+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.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-backend.html?TOPIC=Man+Pages"><b>backend</b>(7),</a>
+<a href="man-cups-snmp.conf.html?TOPIC=Man+Pages"><b>cups-snmp.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cups.html b/doc/help/man-cups.html
new file mode 100644 (file)
index 0000000..bc7390c
--- /dev/null
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cups(1)</title>
+</head>
+<body>
+<h1 class="title">cups(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cups - a standards-based, open source printing system
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>CUPS</b>
+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.
+<p>Now, since every printer manufacturer does things differently, printing can be very complicated.
+<b>CUPS</b>
+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
+<b>CUPS</b>
+can often figure things out on its own.
+<h3><a name="HOW_DOES_IT_WORK_">How Does It Work?</a></h3>
+The first time you print to a printer,
+<b>CUPS</b>
+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.
+<p>Every time you print something,
+<b>CUPS</b>
+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
+<b>CUPS</b>
+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.
+<p>When the print job is completely printed,
+<b>CUPS</b>
+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.
+<h3><a name="WHERE_DO_I_BEGIN_">Where Do I Begin?</a></h3>
+The easiest way to start is by using the web interface to configure your printer. Go to "<a href="http://localhost:631"">http://localhost:631"</a> and choose the Administration tab at the top of the page. Click/press on the Add Printer button and follow the prompts.
+<p>When you are asked for a username and password, enter your login username and password or the "root" username and password.
+<p>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.
+<p>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.
+<p>You can also use the
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8)</a>
+and
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8)</a>
+commands to add printers to
+<b>CUPS</b>.
+Additionally, your operating system may include graphical user interfaces or automatically create printer queues when you connect a printer to your computer.
+<h3><a name="HOW_DO_I_GET_HELP_">How Do I Get Help?</a></h3>
+The
+<b>CUPS</b>
+web site (<a href="http://www.CUPS.org">http://www.CUPS.org</a>) provides access to the
+<i>cups</i>
+and
+<i>cups-devel</i>
+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.
+<h2 class="title"><a name="ENVIRONMENT">Environment</a></h2>
+<b>CUPS</b>
+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:
+<dl class="man">
+<dt><b>CUPS_ANYROOT</b>
+<dd style="margin-left: 5.0em">Whether to allow any X.509 certificate root (Y or N).
+<dt><b>CUPS_CACHEDIR</b>
+<dd style="margin-left: 5.0em">The directory where semi-persistent cache files can be found.
+<dt><b>CUPS_DATADIR</b>
+<dd style="margin-left: 5.0em">The directory where data files can be found.
+<dt><b>CUPS_ENCRYPTION</b>
+<dd style="margin-left: 5.0em">The default level of encryption (Always, IfRequested, Never, Required).
+<dt><b>CUPS_EXPIREDCERTS</b>
+<dd style="margin-left: 5.0em">Whether to allow expired X.509 certificates (Y or N).
+<dt><b>CUPS_GSSSERVICENAME</b>
+<dd style="margin-left: 5.0em">The Kerberos service name used for authentication.
+<dt><b>CUPS_SERVER</b>
+<dd style="margin-left: 5.0em">The hostname/IP address and port number of the CUPS scheduler (hostname:port or ipaddress:port).
+<dt><b>CUPS_SERVERBIN</b>
+<dd style="margin-left: 5.0em">The directory where server helper programs, filters, backend, etc. can be found.
+<dt><b>CUPS_SERVERROOT</b>
+<dd style="margin-left: 5.0em">The root directory of the server.
+<dt><b>CUPS_STATEDIR</b>
+<dd style="margin-left: 5.0em">The directory where state files can be found.
+<dt><b>CUPS_USER</b>
+<dd style="margin-left: 5.0em">Specifies the name of the user for print requests.
+<dt><b>HOME</b>
+<dd style="margin-left: 5.0em">Specifies the home directory of the current user.
+<dt><b>IPP_PORT</b>
+<dd style="margin-left: 5.0em">Specifies the default port number for IPP requests.
+<dt><b>LOCALEDIR</b>
+<dd style="margin-left: 5.0em">Specifies the location of localization files.
+<dt><b>LPDEST</b>
+<dd style="margin-left: 5.0em">Specifies the default print queue (System V standard).
+<dt><b>PRINTER</b>
+<dd style="margin-left: 5.0em">Specifies the default print queue (Berkeley standard).
+<dt><b>TMPDIR</b>
+<dd style="margin-left: 5.0em">Specifies the location of temporary files.
+</dl>
+<h2 class="title"><a name="FILES">Files</a></h2>
+<pre class="man">
+<i>~/.cups/client.conf</i>
+<i>~/.cups/lpoptions</i>
+</pre>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+<b>CUPS</b>
+conforms to the Internet Printing Protocol version 2.1 and implements the Berkeley and System V UNIX print commands.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-client.conf.html?TOPIC=Man+Pages"><b>client.conf</b>(7),</a>
+<a href="man-cupsctl.html?TOPIC=Man+Pages"><b>cupsctl</b>(8),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8),</a>
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+<a href="man-lpq.html?TOPIC=Man+Pages"><b>lpq</b>(1),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help)">http://localhost:631/help)</a>,
+CUPS Web Site (<a href="http://www.CUPS.org)">http://www.CUPS.org)</a>,
+PWG Internet Printing Protocol Workgroup (<a href="http://www.pwg.org/ipp">http://www.pwg.org/ipp</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsaccept.html b/doc/help/man-cupsaccept.html
new file mode 100644 (file)
index 0000000..fe46291
--- /dev/null
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cupsaccept(8)</title>
+</head>
+<body>
+<h1 class="title">cupsaccept(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsaccept/cupsreject - accept/reject jobs sent to a destination
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupsaccept</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h</b>
+<i>hostname[:port]</i>
+]
+<i>destination(s)</i>
+<br>
+<b>cupsreject</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h</b>
+<i>hostname[:port]</i>
+] [
+<b>-r</b>
+<i>reason</i>
+]
+<i>destination(s)</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The
+<b>cupsaccept</b>
+command instructs the printing system to accept print jobs to the specified destinations.
+<p>The
+<b>cupsreject</b>
+command instructs the printing system to reject print jobs to the
+specified destinations.
+The <i>-r</i> option sets the reason for rejecting print jobs. If not specified, the reason defaults to "Reason Unknown".
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options are supported by both
+<b>cupsaccept</b>
+and
+<b>cupsreject</b>:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Sets the username that is sent when connecting to the server.
+<dt><b>-h </b><i>hostname[:port]</i>
+<dd style="margin-left: 5.0em">Chooses an alternate server.
+<dt><b>-r </b>"<i>reason</i>"
+<dd style="margin-left: 5.0em">Sets the reason string that is shown for a printer that is rejecting jobs.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The
+<b>cupsaccept</b>
+and
+<b>cupsreject</b>
+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 <i>not</i> case-sensitive.
+<p>Finally, the CUPS versions may ask the user for an access password depending on the printing system configuration.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-cupsenable.html?TOPIC=Man+Pages"><b>cupsenable</b>(8),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+<br>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsaddsmb.html b/doc/help/man-cupsaddsmb.html
new file mode 100644 (file)
index 0000000..cb2901e
--- /dev/null
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cupsaddsmb(8)</title>
+</head>
+<body>
+<h1 class="title">cupsaddsmb(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsaddsmb - export printers to samba for windows clients
+
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupsaddsmb</b>
+[
+<b>-H</b>
+<i>samba-server</i>
+] [
+<b>-U</b>
+<i>samba-user[%samba-password]</i>
+] [
+<b>-h</b>
+<i>cups-server[:port]</i>
+] [
+<b>-v</b>
+]
+<b>-a</b>
+<br>
+<b>cupsaddsmb</b>
+[
+<b>-H</b>
+<i>samba-server</i>
+] [
+<b>-U</b>
+<i>samba-user[%samba-password]</i>
+] [
+<b>-h</b>
+<i>cups-server[:port]</i>
+] [
+<b>-v</b>
+]
+<i>printer</i>
+[ ...
+<i>printer</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>cupsaddsmb</b> program exports printers to the SAMBA software (version 2.2.0 or higher) for use with Windows clients.
+Depending on the SAMBA configuration, you may need to provide a password to export the printers.
+This program requires the Windows printer driver files described below.
+<h3><a name="SAMBA_CONFIGURATION">Samba Configuration</a></h3>
+<b>cupsaddsmb</b> uses the RPC-based printing support in SAMBA to provide printer drivers and PPD files to Windows client machines.
+In order to use this functionality, you must first configure the SAMBA
+<b>smb.conf</b>(5)
+file to support printing through CUPS and provide a printer driver download
+share, as follows:
+<pre class="man">
+
+    [global]
+       load printers = yes
+       printing = cups
+       printcap name = cups
+
+    [printers]
+       comment = All Printers
+       path = /var/spool/samba
+       browseable = no
+       public = yes
+       guest ok = yes
+       writable = no
+       printable = yes
+
+    [print$]
+       comment = Printer Drivers
+       path = /etc/samba/drivers
+       browseable = yes
+       guest ok = no
+       read only = yes
+       write list = root
+
+</pre>
+This configuration assumes a FHS-compliant installation of SAMBA; adjust the [printers] and [print$] share paths accordingly on your system as needed.
+<h3><a name="MICROSOFT_POSTSCRIPT_DRIVERS_FOR_WINDOWS">Microsoft Postscript Drivers For Windows</a></h3>
+The base driver for Windows 2000 and higher is the Microsoft PostScript driver, which is available on any system running Windows 2000 or higher in the %WINDIR%\SYSTEM32\SPOOL\DRIVERS\W32X86\3 folder for 32-bit drivers and %WINDIR%\SYSTEM32\SPOOL\DRIVERS\X64\3 folder for 64-bit drivers.
+<p>Copy the 32-bit drivers to the <i>/usr/share/cups/drivers</i> directory and the 64-bit drivers to the <i>/usr/share/cups/drivers/x64</i> directory exactly as named below:
+<pre class="man">
+
+    ps5ui.dll
+    pscript.hlp
+    pscript.ntf
+    pscript5.dll
+
+</pre>
+<b>Note:</b> Unlike Windows, case is significant - make sure that you use the lowercase filenames shown above, otherwise <b>cupsaddsmb</b> will fail to export the drivers.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>cupsaddsmb</b> supports the following options:
+<dl class="man">
+<dt><b>-H </b><i>samba-server</i>
+<dd style="margin-left: 5.0em">Specifies the SAMBA server which defaults to the CUPS server.
+<dt><b>-U </b><i>samba-user</i>[<b>%</b><i>samba-password</i>]
+<dd style="margin-left: 5.0em">Specifies the SAMBA print admin username which defaults to your current username.
+If the username contains a percent (%) character, then the text following the percent is treated as the SAMBA password to use.
+<dt><b>-a</b>
+<dd style="margin-left: 5.0em">Exports all known printers.
+Otherwise only the named printers are exported.
+<dt><b>-h </b><i>cups-server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Specifies a different CUPS server to use.
+<dt><b>-v</b>
+<dd style="margin-left: 5.0em">Specifies that verbose information should be shown.
+This is useful for debugging SAMBA configuration problems.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<b>rpcclient</b>(1),
+<b>smbclient</b>(1),
+<b>smbd</b>(8),
+<b>smb.conf</b>(5),
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsctl.html b/doc/help/man-cupsctl.html
new file mode 100644 (file)
index 0000000..6ab47db
--- /dev/null
@@ -0,0 +1,94 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cupsctl(8)</title>
+</head>
+<body>
+<h1 class="title">cupsctl(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsctl - configure cupsd.conf options
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupsctl</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h</b>
+<i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>--</b>[<b>no-</b>]<b>debug-logging</b>
+] [
+<b>--</b>[<b>no-</b>]<b>remote-admin</b>
+] [
+<b>--</b>[<b>no-</b>]<b>remote-any</b>
+] [
+<b>--</b>[<b>no-</b>]<b>share-printers</b>
+] [
+<b>--</b>[<b>no-</b>]<b>user-cancel-any</b>
+] [
+<i>name=value</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cupsctl</b> updates or queries the <i>cupsd.conf</i> 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.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options are recognized:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Enables encryption on the connection to the scheduler.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies an alternate username to use when authenticating with the scheduler.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Specifies the server address.
+<dt><b>--fR[fBno-fR]fBdebug-logging</b>
+<dd style="margin-left: 5.0em">Enables (disables) debug logging to the <i>error_log</i> file.
+<dt><b>--fR[fBno-fR]fBremote-admin</b>
+<dd style="margin-left: 5.0em">Enables (disables) remote administration.
+<dt><b>--fR[fBno-fR]fBremote-any</b>
+<dd style="margin-left: 5.0em">Enables (disables) printing from any address, e.g., the Internet.
+<dt><b>--fR[fBno-fR]fBshare-printers</b>
+<dd style="margin-left: 5.0em">Enables (disables) sharing of local printers with other computers.
+<dt><b>--fR[fBno-fR]fBuser-cancel-any</b>
+<dd style="margin-left: 5.0em">Allows (prevents) users to cancel jobs owned by others.
+</dl>
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Display the current settings:
+<pre class="man">
+
+    cupsctl
+
+</pre>
+Enable debug logging:
+<pre class="man">
+
+    cupsctl --debug-logging
+
+</pre>
+Get the current debug logging state:
+<pre class="man">
+
+    cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'
+
+</pre>
+Disable printer sharing:
+<pre class="man">
+
+    cupsctl --no-share-printers
+</pre>
+<h2 class="title"><a name="KNOWN_ISSUES">Known Issues</a></h2>
+You cannot set the Listen or Port directives using <b>cupsctl</b>.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<br>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsd-helper.html b/doc/help/man-cupsd-helper.html
new file mode 100644 (file)
index 0000000..324408b
--- /dev/null
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cupsd-helper(8)</title>
+</head>
+<body>
+<h1 class="title">cupsd-helper(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsd-helper - cupsd helper programs
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cups-deviced</b>
+<i>request-id</i>
+<i>limit</i>
+<i>user-id</i>
+<i>options</i>
+<br>
+<b>cups-driverd</b>
+<b>cat</b>
+<i>ppd-name</i>
+<br>
+<b>cups-driverd</b>
+<b>list</b>
+<i>request_id</i>
+<i>limit</i>
+<i>options</i>
+<br>
+<b>cups-exec</b>
+<i>sandbox-profile</i>
+[
+<i>-g</i>
+<i>group-id</i>
+] [
+<i>-n</i>
+<i>nice-value</i>
+] [
+<i>-u</i>
+<i>user-id</i>
+]
+<i>/path/to/program</i>
+<i>argv0</i>
+<i>...</i>
+<i>argvN</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>cupsd-helper</b> programs perform long-running operations on behalf of the scheduler,
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8).</a>
+The <b>cups-deviced</b> helper program runs each CUPS
+<a href="man-backend.html?TOPIC=Man+Pages"><b>backend</b>(7)</a>
+with no arguments in order to discover the available printers.
+<p>The <b>cups-driverd</b> helper program lists all available printer drivers, a subset of "matching" printer drivers, or a copy of a specific driver PPD file.
+<p>The <b>cups-exec</b> helper program runs backends, filters, and other programs. On OS X these programs are run in a secure sandbox.
+<h2 class="title"><a name="FILES">Files</a></h2>
+The <b>cups-driverd</b> program looks for PPD and driver information files in the following directories:
+<pre class="man">
+
+    <i>/Library/Printers</i>
+    <i>/opt/share/ppd</i>
+    <i>/System/Library/Printers</i>
+    <i>/usr/local/share/ppd</i>
+    <i>/usr/share/cups/drv</i>
+    <i>/usr/share/cups/model</i>
+    <i>/usr/share/ppd</i>
+</pre>
+<p>PPD files can be compressed using the
+<b>gzip</b>(1)
+program or placed in compressed
+<b>tar</b>(1)
+archives to further reduce their size.
+<p>Driver information files must conform to the format defined in
+<a href="man-ppdcfile.html?TOPIC=Man+Pages"><b>ppdcfile</b>(5).</a>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-backend.html?TOPIC=Man+Pages"><b>backend</b>(7),</a>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-filter.html?TOPIC=Man+Pages"><b>filter</b>(7),</a>
+<a href="man-ppdcfile.html?TOPIC=Man+Pages"><b>ppdcfile</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsd-logs.html b/doc/help/man-cupsd-logs.html
new file mode 100644 (file)
index 0000000..2550681
--- /dev/null
@@ -0,0 +1,194 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cupsd-logs(5)</title>
+</head>
+<body>
+<h1 class="title">cupsd-logs(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsd-logs - cupsd log files (access_log, error_log, and page_log)
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8)</a>
+normally maintains three log files: <i>access_log</i> to track requests that are submitted to the scheduler, <i>error_log</i> to track progress and errors, and <i>page_log</i> to track pages that are printed.
+Configuration directives in
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5)</a>
+and
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5)</a>
+control what information is logged and where it is stored.
+<h3><a name="ACCESS_LOG_FILE_FORMAT">Access Log File Format</a></h3>
+The <i>access_log</i> 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:
+<pre class="man">
+
+    <i>host group user date-time </i>"<i>method resource version</i>" <i>status bytes
+      ipp-operation ipp-status</i>
+
+</pre>
+For example:
+<pre class="man">
+
+    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 - -
+
+</pre>
+The <i>host</i> field will normally only be an IP address unless you have enabled the HostNameLookups directive in the <i>cupsd.conf</i> file or if the IP address corresponds to your local machine.
+<p>The <i>group</i> field always contains "-".
+<p>The <i>user</i> field is the authenticated username of the requesting user.
+If no username and password is supplied for the request then this field contains "-".
+<p>The <i>date-time</i> field is the date and time of the request in local time and is in the format "[DD/MON/YYYY:HH:MM:SS +ZZZZ]".
+<p>The <i>method</i> 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.
+<p>The <i>resource</i> field is the filename of the requested resource.
+<p>The <i>version</i> field is the HTTP specification version used by the client.
+For CUPS clients this will always be "HTTP/1.1".
+<p>The <i>status</i> field contains the HTTP result status of the request, as follows:
+<div style="margin-left: 5.0em;">
+<dl class="man">
+<dt>200
+<dd style="margin-left: 5.0em">Successful operation.
+<dt>201
+<dd style="margin-left: 5.0em">File created/modified successfully.
+<dt>304
+<dd style="margin-left: 5.0em">The requested file has not changed.
+<dt>400
+<dd style="margin-left: 5.0em">Bad HTTP request; typically this means that you have a malicious program trying to access your server.
+<dt>401
+<dd style="margin-left: 5.0em">Unauthorized, authentication (username + password) is required.
+<dt>403
+<dd style="margin-left: 5.0em">Access is forbidden; typically this means that a client tried to access a file or resource they do not have permission to access.
+<dt>404
+<dd style="margin-left: 5.0em">The file or resource does not exist.
+<dt>405
+<dd style="margin-left: 5.0em">URL access method is not allowed; typically this means you have a web browser using your server as a proxy.
+<dt>413
+<dd style="margin-left: 5.0em">Request too large; typically this means that a client tried to print a file larger than the MaxRequestSize allows.
+<dt>426
+<dd style="margin-left: 5.0em">Upgrading to TLS-encrypted connection.
+<dt>500
+<dd style="margin-left: 5.0em">Server error; typically this happens when the server is unable to open/create a file - consult the error_log file for details.
+<dt>501
+<dd style="margin-left: 5.0em">The client requested encryption but encryption support is not enabled/compiled in.
+<dt>505
+<dd style="margin-left: 5.0em">HTTP version number not supported; typically this means that you have a malicious program trying to access your server.
+</div>
+</dl>
+<p>The <i>bytes</i> 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.
+<p>The <i>ipp-operation</i> field contains either "-" for non-IPP requests or the IPP operation name for POST requests containing an IPP request.
+<p>The <i>ipp-status</i> field contains either "-" for non-IPP requests or the IPP status code name for POST requests containing an IPP response.
+<h3><a name="ERROR_LOG_FILE_FORMAT">Error Log File Format</a></h3>
+The <i>error_log</i> file lists messages from the scheduler - errors, warnings, etc. The LogLevel directive in the
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5)</a>
+file controls which messages are logged:
+<pre class="man">
+
+    level date-time message
+
+</pre>
+For example:
+<pre class="man">
+
+    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'.
+
+</pre>
+The <i>level</i> field contains the type of message:
+<dl class="man">
+<dt>A
+<dd style="margin-left: 5.0em">Alert message (LogLevel alert)
+<dt>C
+<dd style="margin-left: 5.0em">Critical error message (LogLevel crit)
+<dt>D
+<dd style="margin-left: 5.0em">Debugging message (LogLevel debug)
+<dt>d
+<dd style="margin-left: 5.0em">Detailed debugging message (LogLevel debug2)
+<dt>E
+<dd style="margin-left: 5.0em">Normal error message (LogLevel error)
+<dt>I
+<dd style="margin-left: 5.0em">Informational message (LogLevel info)
+<dt>N
+<dd style="margin-left: 5.0em">Notice message (LogLevel notice)
+<dt>W
+<dd style="margin-left: 5.0em">Warning message (LogLevel warn)
+<dt>X
+<dd style="margin-left: 5.0em">Emergency error message (LogLevel emerg)
+</dl>
+<p>The <i>date-time</i> 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 <i>access_log</i> file.
+<p>The <i>message</i> field contains a free-form textual message.
+Messages from job filters are prefixed with "[Job NNN]" where "NNN" is the job ID.
+<h3><a name="PAGE_LOG_FILE_FORMAT">Page Log File Format</a></h3>
+The <i>page_log</i> file lists each page or group of pages that are sent to a printer.
+By default, each line contains the following information:
+<pre class="man">
+
+    <i>printer user job-id date-time page-number num-copies job-billing
+      job-originating-host-name job-name media sides</i>
+
+    <i>printer user job-id date-time </i><b>total </b><i>num-impressions job-billing
+      job-originating-host-name job-name media sides</i>
+
+</pre>
+For example the entries for a two page job called "myjob" might look like:
+<pre class="man">
+
+    DeskJet root 1 [20/May/1999:19:21:05 +0000] 1 1 acme-123
+      localhost myjob na_letter_8.5x11in one-sided
+    DeskJet root 1 [20/May/1999:19:21:05 +0000] 2 1 acme-123
+      localhost myjob na_letter_8.5x11in one-sided
+
+    DeskJet root 1 [20/May/1999:19:21:06 +0000] total 2 acme-123
+      localhost myjob na_letter_8.5x11in one-sided
+
+</pre>
+The PageLogFormat directive in the
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5)</a>
+file can be used to change this information.
+<p>The <i>printer</i> 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.
+<p>The <i>user</i> field contains the name of the user (the IPP requesting-user-name attribute) that submitted this file for printing.
+<p>The <i>job-id</i> field contains the job number of the page being printed.
+<p>The <i>date-time</i> 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 <i>access_log</i> file.
+<p>The <i>page-number</i> and <i>num-copies</i> fields contain the page number and number of copies being printed of that page.
+For printers that cannot produce copies on their own, the num-copies field will always be 1.
+<p>Lines containing the keyword "total" have a <i>num-impressions</i> field instead which provides the total number of impressions (sides) that have been printed on for the job.
+<p>The <i>job-billing</i> 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.
+<p>The <i>job-originating-host-name</i> field contains the hostname or IP address of the client that printed the job.
+<p>The <i>job-name</i> field contains a copy of the job-name attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided.
+<p>The <i>media</i> 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.
+<p>The <i>sides</i> field contains a copy of the sides attribute provided with the IPP Create-Job or Print-Job requests or "-" if none was provided.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsd.conf.html b/doc/help/man-cupsd.conf.html
new file mode 100644 (file)
index 0000000..c2ef877
--- /dev/null
@@ -0,0 +1,595 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cupsd.conf(5)</title>
+</head>
+<body>
+<h1 class="title">cupsd.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsd.conf - server configuration file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The
+<i>cupsd.conf</i>
+file configures the CUPS scheduler,
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8).</a>
+It is normally located in the
+<i>/etc/cups</i>
+directory.
+<b>Note:</b> File, directory, and user configuration directives that used to be allowed in the <b>cupsd.conf</b> file are now stored in the
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5)</a>
+file instead in order to prevent certain types of privilege escalation attacks.
+<p>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.
+<h3><a name="TOP_LEVEL_DIRECTIVES">Top-level Directives</a></h3>
+The following top-level directives are understood by
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8):</a>
+<dl class="man">
+<dt><a name="AccessLogLevel"></a><b>AccessLogLevel config</b>
+<dd style="margin-left: 5.0em"><dt><b>AccessLogLevel actions</b>
+<dd style="margin-left: 5.0em"><dt><b>AccessLogLevel all</b>
+<dd style="margin-left: 5.0em">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".
+<dt><a name="AutoPurgeJobs"></a><b>AutoPurgeJobs Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>AutoPurgeJobs No</b>
+<dd style="margin-left: 5.0em"><br>
+Specifies whether to purge job history data automatically when it is no longer required for quotas.
+The default is "No".
+<dt><a name="BrowseLocalProtocols"></a><b>BrowseLocalProtocols all</b>
+<dd style="margin-left: 5.0em"><dt><b>BrowseLocalProtocols dnssd</b>
+<dd style="margin-left: 5.0em"><dt><b>BrowseLocalProtocols none</b>
+<dd style="margin-left: 5.0em">Specifies which protocols to use for local printer sharing.
+The default is "dnssd" on systems that support Bonjour and "none" otherwise.
+<dt><a name="BrowseWebIF"></a><b>BrowseWebIF Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>BrowseWebIF No</b>
+<dd style="margin-left: 5.0em"><br>
+Specifies whether the CUPS web interface is advertised.
+The default is "No".
+<dt><a name="Browsing"></a><b>Browsing Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>Browsing No</b>
+<dd style="margin-left: 5.0em"><br>
+Specifies whether shared printers are advertised.
+The default is "No".
+<dt><a name="Classification"></a><b>Classification </b><i>banner</i>
+<dd style="margin-left: 5.0em"><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.
+<dt><a name="ClassifyOverride"></a><b>ClassifyOverride Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>ClassifyOverride No</b>
+<dd style="margin-left: 5.0em"><br>
+Specifies whether users may override the classification (cover page) of individual print jobs using the "job-sheets" option.
+The default is "No".
+<dt><a name="DefaultAuthType"></a><b>DefaultAuthType Basic</b>
+<dd style="margin-left: 5.0em"><dt><b>DefaultAuthType Negotiate</b>
+<dd style="margin-left: 5.0em"><br>
+Specifies the default type of authentication to use.
+The default is "Basic".
+<dt><a name="DefaultEncryption"></a><b>DefaultEncryption Never</b>
+<dd style="margin-left: 5.0em"><dt><b>DefaultEncryption IfRequested</b>
+<dd style="margin-left: 5.0em"><dt><b>DefaultEncryption Required</b>
+<dd style="margin-left: 5.0em">Specifies whether encryption will be used for authenticated requests.
+The default is "Required".
+<dt><a name="DefaultLanguage"></a><b>DefaultLanguage </b><i>locale</i>
+<dd style="margin-left: 5.0em">Specifies the default language to use for text and web content.
+The default is "en".
+<dt><a name="DefaultPaperSize"></a><b>DefaultPaperSize Auto</b>
+<dd style="margin-left: 5.0em"><dt><b>DefaultPaperSize None</b>
+<dd style="margin-left: 5.0em"><dt><b>DefaultPaperSize </b><i>sizename</i>
+<dd style="margin-left: 5.0em">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".
+<dt><a name="DefaultPolicy"></a><b>DefaultPolicy </b><i>policy-name</i>
+<dd style="margin-left: 5.0em">Specifies the default access policy to use.
+The default access policy is "default".
+<dt><a name="DefaultShared"></a><b>DefaultShared Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>DefaultShared No</b>
+<dd style="margin-left: 5.0em">Specifies whether local printers are shared by default.
+The default is "Yes".
+<dt><a name="DirtyCleanInterval"></a><b>DirtyCleanInterval </b><i>seconds</i>
+<dd style="margin-left: 5.0em">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".
+<dt><a name="ErrorPolicy"></a><b>ErrorPolicy abort-job</b>
+<dd style="margin-left: 5.0em">Specifies that a failed print job should be aborted (discarded) unless otherwise specified for the printer.
+<dt><b>ErrorPolicy retry-job</b>
+<dd style="margin-left: 5.0em">Specifies that a failed print job should be retried at a later time unless otherwise specified for the printer.
+<dt><b>ErrorPolicy retry-this-job</b>
+<dd style="margin-left: 5.0em">Specifies that a failed print job should be retried immediately unless otherwise specified for the printer.
+<dt><b>ErrorPolicy stop-printer</b>
+<dd style="margin-left: 5.0em">Specifies that a failed print job should stop the printer unless otherwise specified for the printer. The 'stop-printer' error policy is the default.
+<dt><a name="FilterLimit"></a><b>FilterLimit </b><i>limit</i>
+<dd style="margin-left: 5.0em">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".
+<dt><a name="FilterNice"></a><b>FilterNice </b><i>nice-value</i>
+<dd style="margin-left: 5.0em">Specifies the scheduling priority (
+<b>nice</b>(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.
+<dt><a name="GSSServiceName"></a><b>GSSServiceName </b><i>name</i>
+<dd style="margin-left: 5.0em">Specifies the service name when using Kerberos authentication.
+The default service name is "http."
+<dt><b>HostNameLookups On</b>
+<dd style="margin-left: 5.0em"><dt><a name="HostNameLookups"></a><b>HostNameLookups Off</b>
+<dd style="margin-left: 5.0em"><dt><b>HostNameLookups Double</b>
+<dd style="margin-left: 5.0em">Specifies whether to do reverse lookups on connecting clients.
+The "Double" setting causes
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8)</a>
+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.
+<dt><a name="JobKillDelay"></a><b>JobKillDelay </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the number of seconds to wait before killing the filters and backend associated with a canceled or held job.
+The default is "30".
+<dt><a name="JobRetryInterval"></a><b>JobRetryInterval </b><i>seconds</i>
+<dd style="margin-left: 5.0em">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".
+<dt><a name="JobRetryLimit"></a><b>JobRetryLimit </b><i>count</i>
+<dd style="margin-left: 5.0em">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".
+<dt><a name="KeepAlive"></a><b>KeepAlive Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>KeepAlive No</b>
+<dd style="margin-left: 5.0em">Specifies whether to support HTTP keep-alive connections.
+The default is "Yes".
+<dt><a name="KeepAliveTimeout"></a><b>KeepAliveTimeout </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies how long an idle client connection remains open.
+The default is "30".
+<dt><a name="LimitIPP"></a><b>&lt;Limit </b><i>operation </i>...<b>> </b>... <b>&lt;/Limit></b>
+<dd style="margin-left: 5.0em">Specifies the IPP operations that are being limited inside a Policy section. IPP operation names are listed below in the section "IPP OPERATIONS".
+<dt><a name="Limit"></a><b>&lt;Limit </b><i>method </i>...<b>> </b>... <b>&lt;/Limit></b>
+<dd style="margin-left: 5.0em"><dt><a name="LimitExcept"></a><b>&lt;LimitExcept </b><i>method </i>...<b>> </b>... <b>&lt;/LimitExcept></b>
+<dd style="margin-left: 5.0em">Specifies the HTTP methods that are being limited inside a Location section. HTTP method names are listed below in the section "HTTP METHODS".
+<dt><a name="LimitRequestBody"></a><b>LimitRequestBody </b><i>size</i>
+<dd style="margin-left: 5.0em">Specifies the maximum size of print files, IPP requests, and HTML form data.
+The default is "0" which disables the limit check.
+<dt><a name="Listen"></a><b>Listen </b><i>ipv4-address</i><b>:</b><i>port</i>
+<dd style="margin-left: 5.0em"><dt><b>Listen [</b><i>ipv6-address</i><b>]:</b><i>port</i>
+<dd style="margin-left: 5.0em"><dt><b>Listen *:</b><i>port</i>
+<dd style="margin-left: 5.0em"><dt><b>Listen </b><i>/path/to/domain/socket</i>
+<dd style="margin-left: 5.0em">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.
+<dt><a name="ListenBackLog"></a><b>ListenBackLog </b><i>number</i>
+<dd style="margin-left: 5.0em">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.
+<dt><a name="Location"></a><b>&lt;Location </b><i>/path</i><b>> </b>... <b>&lt;/Location></b>
+<dd style="margin-left: 5.0em">Specifies access control for the named location.
+Paths are documented below in the section "LOCATION PATHS".
+<dt><a name="LogDebugHistory"></a><b>LogDebugHistory </b><i>number</i>
+<dd style="margin-left: 5.0em">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.
+<dt><a name="LogLevel"></a><b>LogLevel </b>none
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>emerg
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>alert
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>crit
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>error
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>warn
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>notice
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>info
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>debug
+<dd style="margin-left: 5.0em"><dt><b>LogLevel </b>debug2
+<dd style="margin-left: 5.0em">Specifies the level of logging for the ErrorLog file.
+The value "none" stops all logging while "debug2" logs everything.
+The default is "warn".
+<dt><a name="LogTimeFormat"></a><b>LogTimeFormat </b>standard
+<dd style="margin-left: 5.0em"><dt><b>LogTimeFormat </b>usecs
+<dd style="margin-left: 5.0em">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.
+<dt><a name="MaxClients"></a><b>MaxClients </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of simultaneous clients that are allowed by the scheduler.
+The default is "100".
+<dt><a name="MaxClientPerHost"></a><b>MaxClientsPerHost </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of simultaneous clients that are allowed from a
+single address.
+The default is the MaxClients value.
+<dt><a name="MaxCopies"></a><b>MaxCopies </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of copies that a user can print of each job.
+The default is "9999".
+<dt><a name="MaxHoldTime"></a><b>MaxHoldTime </b><i>seconds</i>
+<dd style="margin-left: 5.0em">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.
+<dt><a name="MaxJobs"></a><b>MaxJobs </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of simultaneous jobs that are allowed.
+Set to "0" to allow an unlimited number of jobs.
+The default is "500".
+<dt><a name="MaxJobsPerPrinter"></a><b>MaxJobsPerPrinter </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of simultaneous jobs that are allowed per printer.
+The default is "0" which allows up to MaxJobs jobs per printer.
+<dt><a name="MaxJobsPerUser"></a><b>MaxJobsPerUser </b><i>number</i>
+<dd style="margin-left: 5.0em">Specifies the maximum number of simultaneous jobs that are allowed per user.
+The default is "0" which allows up to MaxJobs jobs per user.
+<dt><a name="MaxJobTime"></a><b>MaxJobTime </b><i>seconds</i>
+<dd style="margin-left: 5.0em">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).
+<dt><a name="MaxLogSize"></a><b>MaxLogSize </b><i>size</i>
+<dd style="margin-left: 5.0em">Specifies the maximum size of the log files before they are rotated.
+The value "0" disables log rotation.
+The default is "1048576" (1MB).
+<dt><a name="MultipleOperationTimeout"></a><b>MultipleOperationTimeout </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the maximum amount of time to allow between files in a multiple file print job.
+The default is "300" (5 minutes).
+<dt><a name="PageLogFormat"></a><b>PageLogFormat </b><i>format-string</i>
+<dd style="margin-left: 5.0em">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:
+<pre class="man">
+
+    "%%" 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.
+
+</pre>
+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.
+<dt><a name="PassEnv"></a><b>PassEnv </b><i>variable </i>[ ... <i>variable </i>]
+<dd style="margin-left: 5.0em">Passes the specified environment variable(s) to child processes.
+<dt><a name="Policy"></a><b>&lt;Policy </b><i>name</i><b>> </b>... <b>&lt;/Policy></b>
+<dd style="margin-left: 5.0em">Specifies access control for the named policy.
+<dt><a name="Port"></a><b>Port </b><i>number</i>
+<dd style="margin-left: 5.0em">Listens to the specified port number for connections.
+<dt><a name="PreserveJobFiles"></a><b>PreserveJobFiles Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>PreserveJobFiles No</b>
+<dd style="margin-left: 5.0em"><dt><b>PreserveJobFiles </b><i>seconds</i>
+<dd style="margin-left: 5.0em">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).
+<dt><a name="PreserveJobHistory"></a><b>PreserveJobHistory Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>PreserveJobHistory No</b>
+<dd style="margin-left: 5.0em"><dt><b>PreserveJobHistory </b><i>seconds</i>
+<dd style="margin-left: 5.0em">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".
+<dt><a name="ReloadTimeout"></a><b>ReloadTimeout </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the amount of time to wait for job completion before restarting the scheduler.
+The default is "30".
+<dt><a name="RIPCache"></a><b>RIPCache </b><i>size</i>
+<dd style="margin-left: 5.0em">Specifies the maximum amount of memory to use when converting documents into bitmaps for a printer.
+The default is "128m".
+<dt><a name="ServerAdmin"></a><b>ServerAdmin </b><i>email-address</i>
+<dd style="margin-left: 5.0em">Specifies the email address of the server administrator.
+The default value is "root@ServerName".
+<dt><a name="ServerAlias"></a><b>ServerAlias </b><i>hostname </i>[ ... <i>hostname </i>]
+<dd style="margin-left: 5.0em"><dt><b>ServerAlias *</b>
+<dd style="margin-left: 5.0em">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 "*".
+<dt><a name="ServerName"></a><b>ServerName </b><i>hostname</i>
+<dd style="margin-left: 5.0em">Specifies the fully-qualified hostname of the server.
+The default is the value reported by the
+<b>hostname</b>(1)
+command.
+<dt><a name="ServerTokens"></a><b>ServerTokens None</b>
+<dd style="margin-left: 5.0em"><dt><b>ServerTokens ProductOnly</b>
+<dd style="margin-left: 5.0em"><dt><b>ServerTokens Major</b>
+<dd style="margin-left: 5.0em"><dt><b>ServerTokens Minor</b>
+<dd style="margin-left: 5.0em"><dt><b>ServerTokens Minimal</b>
+<dd style="margin-left: 5.0em"><dt><b>ServerTokens OS</b>
+<dd style="margin-left: 5.0em"><dt><b>ServerTokens Full</b>
+<dd style="margin-left: 5.0em">Specifies what information is included in the Server header of HTTP responses.
+"None" disables the Server header.
+"ProductOnly" reports "CUPS".
+"Major" reports "CUPS 2".
+"Minor" reports "CUPS 2.0".
+"Minimal" reports "CUPS 2.0.0".
+"OS" reports "CUPS 2.0.0 (UNAME)" where UNAME is the output of the
+<b>uname</b>(1)
+command.
+"Full" reports "CUPS 2.0.0 (UNAME) IPP/2.0".
+The default is "Minimal".
+<dt><a name="SetEnv"></a><b>SetEnv </b><i>variable value</i>
+<dd style="margin-left: 5.0em">Set the specified environment variable to be passed to child processes.
+<dt><a name="SSLListen"></a><b>SSLListen </b><i>ipv4-address</i><b>:</b><i>port</i>
+<dd style="margin-left: 5.0em"><dt><b>SSLListen [</b><i>ipv6-address</i><b>]:</b><i>port</i>
+<dd style="margin-left: 5.0em"><dt><b>SSLListen *:</b><i>port</i>
+<dd style="margin-left: 5.0em">Listens on the specified address and port for encrypted connections.
+<dt><a name="SSLOptions"></a><b>SSLOptions </b>[<i>AllowRC4</i>] [<i>AllowSSL3</i>]
+<dd style="margin-left: 5.0em"><dt><b>SSLOptions None</b>
+<dd style="margin-left: 5.0em">Sets encryption options.
+By default, CUPS only supports encryption using TLS v1.0 or higher using known secure cipher suites.
+The <i>AllowRC4</i> option enables the 128-bit RC4 cipher suites, which are required for some older clients that do not implement newer ones.
+The <i>AllowSSL3</i> option enables SSL v3.0, which is required for some older clients that do not support TLS v1.0.
+<dt><a name="SSLPort"></a><b>SSLPort </b><i>port</i>
+<dd style="margin-left: 5.0em">Listens on the specified port for encrypted connections.
+<dt><a name="StrictConformance"></a><b>StrictConformance Yes</b>
+<dd style="margin-left: 5.0em"><dt><b>StrictConformance No</b>
+<dd style="margin-left: 5.0em">Specifies whether the scheduler requires clients to strictly adhere to the IPP specifications.
+The default is "No".
+<dt><a name="Timeout"></a><b>Timeout </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the HTTP request timeout.
+The default is "300" (5 minutes).
+<dt><a name="WebInterface"></a><b>WebInterface yes</b>
+<dd style="margin-left: 5.0em"><dt><b>WebInterface no</b>
+<dd style="margin-left: 5.0em">Specifies whether the web interface is enabled.
+The default is "No".
+</dl>
+<h3><a name="HTTP_METHOD_NAMES">Http Method Names</a></h3>
+The following HTTP methods are supported by
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8):</a>
+<dl class="man">
+<dt>GET
+<dd style="margin-left: 5.0em">Used by a client to download icons and other printer resources and to access the CUPS web interface.
+<dt>HEAD
+<dd style="margin-left: 5.0em">Used by a client to get the type, size, and modification date of resources.
+<dt>OPTIONS
+<dd style="margin-left: 5.0em">Used by a client to establish a secure (SSL/TLS) connection.
+<dt>POST
+<dd style="margin-left: 5.0em">Used by a client to submit IPP requests and HTML forms from the CUPS web interface.
+<dt>PUT
+<dd style="margin-left: 5.0em">Used by a client to upload configuration files.
+</dl>
+<h3><a name="IPP_OPERATION_NAMES">Ipp Operation Names</a></h3>
+The following IPP operations are supported by
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8):</a>
+<dl class="man">
+<dt>CUPS-Accept-Jobs
+<dd style="margin-left: 5.0em">Allows a printer to accept new jobs.
+<dt>CUPS-Add-Modify-Class
+<dd style="margin-left: 5.0em">Adds or modifies a printer class.
+<dt>CUPS-Add-Modify-Printer
+<dd style="margin-left: 5.0em">Adds or modifies a printer.
+<dt>CUPS-Authenticate-Job
+<dd style="margin-left: 5.0em">Releases a job that is held for authentication.
+<dt>CUPS-Delete-Class
+<dd style="margin-left: 5.0em">Deletes a printer class.
+<dt>CUPS-Delete-Printer
+<dd style="margin-left: 5.0em">Deletes a printer.
+<dt>CUPS-Get-Classes
+<dd style="margin-left: 5.0em">Gets a list of printer classes.
+<dt>CUPS-Get-Default
+<dd style="margin-left: 5.0em">Gets the server default printer or printer class.
+<dt>CUPS-Get-Devices
+<dd style="margin-left: 5.0em">Gets a list of devices that are currently available.
+<dt>CUPS-Get-Document
+<dd style="margin-left: 5.0em">Gets a document file for a job.
+<dt>CUPS-Get-PPD
+<dd style="margin-left: 5.0em">Gets a PPD file.
+<dt>CUPS-Get-PPDs
+<dd style="margin-left: 5.0em">Gets a list of installed PPD files.
+<dt>CUPS-Get-Printers
+<dd style="margin-left: 5.0em">Gets a list of printers.
+<dt>CUPS-Move-Job
+<dd style="margin-left: 5.0em">Moves a job.
+<dt>CUPS-Reject-Jobs
+<dd style="margin-left: 5.0em">Prevents a printer from accepting new jobs.
+<dt>CUPS-Set-Default
+<dd style="margin-left: 5.0em">Sets the server default printer or printer class.
+<dt>Cancel-Job
+<dd style="margin-left: 5.0em">Cancels a job.
+<dt>Cancel-Jobs
+<dd style="margin-left: 5.0em">Cancels one or more jobs.
+<dt>Cancel-My-Jobs
+<dd style="margin-left: 5.0em">Cancels one or more jobs creates by a user.
+<dt>Cancel-Subscription
+<dd style="margin-left: 5.0em">Cancels a subscription.
+<dt>Close-Job
+<dd style="margin-left: 5.0em">Closes a job that is waiting for more documents.
+<dt>Create-Job
+<dd style="margin-left: 5.0em">Creates a new job with no documents.
+<dt>Create-Job-Subscriptions
+<dd style="margin-left: 5.0em">Creates a subscription for job events.
+<dt>Create-Printer-Subscriptions
+<dd style="margin-left: 5.0em">Creates a subscription for printer events.
+<dt>Get-Job-Attributes
+<dd style="margin-left: 5.0em">Gets information about a job.
+<dt>Get-Jobs
+<dd style="margin-left: 5.0em">Gets a list of jobs.
+<dt>Get-Notifications
+<dd style="margin-left: 5.0em">Gets a list of event notifications for a subscription.
+<dt>Get-Printer-Attributes
+<dd style="margin-left: 5.0em">Gets information about a printer or printer class.
+<dt>Get-Subscription-Attributes
+<dd style="margin-left: 5.0em">Gets information about a subscription.
+<dt>Get-Subscriptions
+<dd style="margin-left: 5.0em">Gets a list of subscriptions.
+<dt>Hold-Job
+<dd style="margin-left: 5.0em">Holds a job from printing.
+<dt>Hold-New-Jobs
+<dd style="margin-left: 5.0em">Holds all new jobs from printing.
+<dt>Pause-Printer
+<dd style="margin-left: 5.0em">Stops processing of jobs by a printer or printer class.
+<dt>Pause-Printer-After-Current-Job
+<dd style="margin-left: 5.0em">Stops processing of jobs by a printer or printer class after the current job is finished.
+<dt>Print-Job
+<dd style="margin-left: 5.0em">Creates a new job with a single document.
+<dt>Purge-Jobs
+<dd style="margin-left: 5.0em">Cancels one or more jobs and deletes the job history.
+<dt>Release-Held-New-Jobs
+<dd style="margin-left: 5.0em">Allows previously held jobs to print.
+<dt>Release-Job
+<dd style="margin-left: 5.0em">Allows a job to print.
+<dt>Renew-Subscription
+<dd style="margin-left: 5.0em">Renews a subscription.
+<dt>Restart-Job
+<dd style="margin-left: 5.0em">Reprints a job, if possible.
+<dt>Send-Document
+<dd style="margin-left: 5.0em">Adds a document to a job.
+<dt>Set-Job-Attributes
+<dd style="margin-left: 5.0em">Changes job information.
+<dt>Set-Printer-Attributes
+<dd style="margin-left: 5.0em">Changes printer or printer class information.
+<dt>Validate-Job
+<dd style="margin-left: 5.0em">Validates options for a new job.
+</dl>
+<h3><a name="LOCATION_PATHS">Location Paths</a></h3>
+The following paths are commonly used when configuring
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8):</a>
+<dl class="man">
+<dt>/
+<dd style="margin-left: 5.0em">The path for all get operations (get-printers, get-jobs, etc.)
+<dt>/admin
+<dd style="margin-left: 5.0em">The path for all administration operations (add-printer, delete-printer, start-printer, etc.)
+<dt>/admin/conf
+<dd style="margin-left: 5.0em">The path for access to the CUPS configuration files (cupsd.conf, client.conf, etc.)
+<dt>/admin/log
+<dd style="margin-left: 5.0em">The path for access to the CUPS log files (access_log, error_log, page_log)
+<dt>/classes
+<dd style="margin-left: 5.0em">The path for all printer classes
+<dt>/classes/name
+<dd style="margin-left: 5.0em">The resource for the named printer class
+<dt>/jobs
+<dd style="margin-left: 5.0em">The path for all jobs (hold-job, release-job, etc.)
+<dt>/jobs/id
+<dd style="margin-left: 5.0em">The path for the specified job.
+<dt>/printers
+<dd style="margin-left: 5.0em">The path for all printers
+<dt>/printers/name
+<dd style="margin-left: 5.0em">The path for the named printer
+<dt>/printers/name.png
+<dd style="margin-left: 5.0em">The icon file path for the named printer
+<dt>/printers/name.ppd
+<dd style="margin-left: 5.0em">The PPD file path for the named printer
+</dl>
+<h3><a name="DIRECTIVES_VALID_WITHIN_LOCATION_AND_LIMIT_SECTIONS">Directives Valid Within Location And Limit Sections</a></h3>
+The following directives may be placed inside Location and Limit sections in the <b>cupsd.conf</b> file:
+<dl class="man">
+<dt><b>Allow all</b>
+<dd style="margin-left: 5.0em"><dt><b>Allow none</b>
+<dd style="margin-left: 5.0em"><dt><b>Allow </b><i>host.domain.com</i>
+<dd style="margin-left: 5.0em"><dt><b>Allow *.</b><i>domain.com</i>
+<dd style="margin-left: 5.0em"><dt><b>Allow </b><i>ipv4-address</i>
+<dd style="margin-left: 5.0em"><dt><b>Allow </b><i>ipv4-address</i><b>/</b><i>netmask</i>
+<dd style="margin-left: 5.0em"><dt><b>Allow </b><i>ipv4-address</i><b>/</b><i>mm</i>
+<dd style="margin-left: 5.0em"><dt><b>Allow [</b><i>ipv6-address</i><b>]</b>
+<dd style="margin-left: 5.0em"><dt><b>Allow [</b><i>ipv6-address</i><b>]/</b><i>mm</i>
+<dd style="margin-left: 5.0em"><dt><b>Allow @IF(</b><i>name</i><b>)</b>
+<dd style="margin-left: 5.0em"><dt><b>Allow @LOCAL</b>
+<dd style="margin-left: 5.0em">Allows access from the named hosts, domains, addresses, or interfaces.
+The Order directive controls whether Allow lines are evaluated before or after Deny lines.
+<dt><b>AuthType None</b>
+<dd style="margin-left: 5.0em"><dt><b>AuthType Basic</b>
+<dd style="margin-left: 5.0em"><dt><b>AuthType Default</b>
+<dd style="margin-left: 5.0em"><dt><b>AuthType Negotiate</b>
+<dd style="margin-left: 5.0em">Specifies the type of authentication required.
+The value "Default" corresponds to the DefaultAuthType value.
+<dt><b>Deny all</b>
+<dd style="margin-left: 5.0em"><dt><b>Deny none</b>
+<dd style="margin-left: 5.0em"><dt><b>Deny </b><i>host.domain.com</i>
+<dd style="margin-left: 5.0em"><dt><b>Deny *.</b><i>domain.com</i>
+<dd style="margin-left: 5.0em"><dt><b>Deny </b><i>ipv4-address</i>
+<dd style="margin-left: 5.0em"><dt><b>Deny </b><i>ipv4-address</i><b>/</b><i>netmask</i>
+<dd style="margin-left: 5.0em"><dt><b>Deny </b><i>ipv4-address</i><b>/</b><i>mm</i>
+<dd style="margin-left: 5.0em"><dt><b>Deny [</b><i>ipv6-address</i><b>]</b>
+<dd style="margin-left: 5.0em"><dt><b>Deny [</b><i>ipv6-address</i><b>]/</b><i>mm</i>
+<dd style="margin-left: 5.0em"><dt><b>Deny @IF(</b><i>name</i><b>)</b>
+<dd style="margin-left: 5.0em"><dt><b>Deny @LOCAL</b>
+<dd style="margin-left: 5.0em">Denies access from the named hosts, domains, addresses, or interfaces.
+The Order directive controls whether Deny lines are evaluated before or after Allow lines.
+<dt><b>Encryption IfRequested</b>
+<dd style="margin-left: 5.0em"><dt><b>Encryption Never</b>
+<dd style="margin-left: 5.0em"><dt><b>Encryption Required</b>
+<dd style="margin-left: 5.0em">Specifies the level of encryption that is required for a particular location.
+The default value is "IfRequested".
+<dt><b>Order allow,deny</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>Order deny,allow</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>Require group </b><i>group-name </i>[ <i>group-name </i>... ]
+<dd style="margin-left: 5.0em">Specifies that an authenticated user must be a member of one of the named groups.
+<dt><b>Require user {</b><i>user-name</i>|<b>@</b><i>group-name</i>} ...
+<dd style="margin-left: 5.0em">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
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5)</a>
+file.
+The group name "@OWNER" corresponds to the owner of the resource, for example the person that submitted a print job.
+<dt><b>Require valid-user</b>
+<dd style="margin-left: 5.0em">Specifies that any authenticated user is acceptable.
+<dt><b>Satisfy all</b>
+<dd style="margin-left: 5.0em">Specifies that all Allow, AuthType, Deny, Order, and Require conditions must be satisfied to allow access.
+<dt><b>Satisfy any</b>
+<dd style="margin-left: 5.0em">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.
+</dl>
+<h3><a name="DIRECTIVES_VALID_WITHIN_POLICY_SECTIONS">Directives Valid Within Policy Sections</a></h3>
+The following directives may be placed inside Policy sections in the <b>cupsd.conf</b> file:
+<dl class="man">
+<dt><b>JobPrivateAccess all</b>
+<dd style="margin-left: 5.0em"><dt><b>JobPrivateAccess default</b>
+<dd style="margin-left: 5.0em"><dt><b>JobPrivateAccess </b>{<i>user</i>|<b>@</b><i>group</i>|<b>@ACL</b>|<b>@OWNER</b>|<b>@SYSTEM</b>} ...
+<dd style="margin-left: 5.0em">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
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5)</a>
+file.
+<dt><b>JobPrivateValues all</b>
+<dd style="margin-left: 5.0em"><dt><b>JobPrivateValues default</b>
+<dd style="margin-left: 5.0em"><dt><b>JobPrivateValues none</b>
+<dd style="margin-left: 5.0em"><dt><b>JobPrivateValues </b><i>attribute-name </i>[ ... <i>attribute-name </i>]
+<dd style="margin-left: 5.0em">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".
+<dt><b>SubscriptionPrivateAccess all</b>
+<dd style="margin-left: 5.0em"><dt><b>SubscriptionPrivateAccess default</b>
+<dd style="margin-left: 5.0em"><dt><b>SubscriptionPrivateAccess </b>{<i>user</i>|<b>@</b><i>group</i>|<b>@ACL</b>|<b>@OWNER</b>|<b>@SYSTEM</b>} ...
+<dd style="margin-left: 5.0em">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
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5)</a>
+file.
+<dt><b>SubscriptionPrivateValues all</b>
+<dd style="margin-left: 5.0em"><dt><b>SubscriptionPrivateValues default</b>
+<dd style="margin-left: 5.0em"><dt><b>SubscriptionPrivateValues none</b>
+<dd style="margin-left: 5.0em"><dt><b>SubscriptionPrivateValues </b><i>attribute-name </i>[ ... <i>attribute-name </i>]
+<dd style="margin-left: 5.0em">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".
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The <b>cupsd.conf</b> file format is based on the Apache HTTP Server configuration file format.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Log everything with a maximum log file size of 32 megabytes:
+<pre class="man">
+
+    AccessLogLevel all
+    LogLevel debug2
+    MaxLogSize 32m
+
+</pre>
+Require authentication for accesses from outside the 10. network:
+<pre class="man">
+
+    &lt;Location />
+    Order allow,deny
+    Allow from 10./8
+    AuthType Basic
+    Require valid-user
+    Satisfy any
+    &lt;/Location>
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-classes.conf.html?TOPIC=Man+Pages"><b>classes.conf</b>(5),</a>
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+<a href="man-printers.conf.html?TOPIC=Man+Pages"><b>printers.conf</b>(5),</a>
+<a href="man-subscriptions.conf.html?TOPIC=Man+Pages"><b>subscriptions.conf</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsd.html b/doc/help/man-cupsd.html
new file mode 100644 (file)
index 0000000..de12942
--- /dev/null
@@ -0,0 +1,117 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cupsd(8)</title>
+</head>
+<body>
+<h1 class="title">cupsd(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsd - cups scheduler
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupsd</b>
+[
+<b>-c</b>
+<i>config-file</i>
+] [
+<b>-f</b>
+] [
+<b>-F</b>
+] [
+<b>-h</b>
+] [
+<b>-l</b>
+] [
+<b>-t</b>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cupsd</b>
+is the scheduler for CUPS. It implements a printing system based upon the Internet Printing Protocol, version 2.1. If no options are specified on the command-line then the default configuration file
+<i>/etc/cups/cupsd.conf</i>
+will be used.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<dl class="man">
+<dt><b>-c</b><i> config-file</i>
+<dd style="margin-left: 5.0em">Uses the named configuration file.
+<dt><b>-f</b>
+<dd style="margin-left: 5.0em">Run
+<b>cupsd</b>
+in the foreground; the default is to run in the background as a "daemon".
+<dt><b>-F</b>
+<dd style="margin-left: 5.0em">Run
+<b>cupsd</b>
+in the foreground but detach the process from the controlling terminal and current directory. This is useful for running
+<b>cupsd</b>
+from
+<b>init</b>(8).
+<dt><b>-h</b>
+<dd style="margin-left: 5.0em">Shows the program usage.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">This option is passed to
+<b>cupsd</b>
+when it is run from
+<b>launchd</b>(8)
+or
+<b>systemd</b>(8).
+<dt><b>-t</b>
+<dd style="margin-left: 5.0em">Test the configuration file for syntax errors.
+</dl>
+<h2 class="title"><a name="FILES">Files</a></h2>
+<pre class="man">
+<i>/etc/cups/classes.conf</i>
+<i>/etc/cups/cups-files.conf</i>
+<i>/etc/cups/cupsd.conf</i>
+<i>/usr/share/cups/mime/mime.convs</i>
+<i>/usr/share/cups/mime/mime.types</i>
+<i>/etc/cups/printers.conf</i>
+<i>/etc/cups/subscriptions.conf</i>
+</pre>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+<b>cupsd</b>
+implements all of the required IPP/2.1 attributes and operations. It also implements several CUPS-specific administrative operations.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Run
+<b>cupsd</b>
+in the background with the default configuration file:
+<pre class="man">
+
+    cupsd
+
+</pre>
+Test a configuration file called
+<i>test.conf</i>:
+<pre class="man">
+
+    cupsd -t -c test.conf
+
+</pre>
+Run
+<b>cupsd</b>
+in the foreground with a test configuration file called
+<i>test.conf</i>:
+<pre class="man">
+
+    cupsd -f -c test.conf
+
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-backend.html?TOPIC=Man+Pages"><b>backend</b>(7),</a>
+<a href="man-classes.conf.html?TOPIC=Man+Pages"><b>classes.conf</b>(5),</a>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+<a href="man-cups-lpd.html?TOPIC=Man+Pages"><b>cups-lpd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-cupsd-helper.html?TOPIC=Man+Pages"><b>cupsd-helper</b>(8),</a>
+<a href="man-cupsd-logs.html?TOPIC=Man+Pages"><b>cupsd-logs</b>(8),</a>
+<a href="man-filter.html?TOPIC=Man+Pages"><b>filter</b>(7),</a>
+<b>launchd</b>(8),
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+<a href="man-printers.conf.html?TOPIC=Man+Pages"><b>printers.conf</b>(5),</a>
+<b>systemd</b>(8),
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupsenable.html b/doc/help/man-cupsenable.html
new file mode 100644 (file)
index 0000000..fe00393
--- /dev/null
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cupsenable(8)</title>
+</head>
+<body>
+<h1 class="title">cupsenable(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsdisable, cupsenable - stop/start printers and classes
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupsdisable</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-c</b>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-r</b>
+<i>reason</i>
+] [
+<b>--hold</b>
+]
+<i>destination(s)</i>
+<br>
+<b>cupsenable</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-c</b>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>--release</b>
+]
+<i>destination(s)</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cupsenable</b>
+starts the named printers or classes while
+<b>cupsdisable</b>
+stops the named printers or classes.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options may be used:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption of the connection to the server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Uses the specified username when connecting to the server.
+<dt><b>-c</b>
+<dd style="margin-left: 5.0em">Cancels all jobs on the named destination.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Uses the specified server and port.
+<dt><b>--hold</b>
+<dd style="margin-left: 5.0em">Holds remaining jobs on the named printer.
+Useful for allowing the current job to complete before performing maintenance.
+<dt><b>-r "</b><i>reason</i><b>"</b>
+<dd style="margin-left: 5.0em">Sets the message associated with the stopped state.
+If no reason is specified then the message is set to "Reason Unknown".
+<dt><b>--release</b>
+<dd style="margin-left: 5.0em">Releases pending jobs for printing.
+Use after running <b>cupsdisable</b> with the <i>--hold</i> option to resume printing.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+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 <i>not</i> case-sensitive.
+<p>The System V versions of these commands are <b>disable</b> and <b>enable</b>, respectively.
+They have been renamed to avoid conflicts with the
+<b>bash</b>(1)
+build-in commands of the same names.
+<p>The CUPS versions of <b>disable</b> and <b>enable</b> 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.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsaccept.html?TOPIC=Man+Pages"><b>cupsaccept</b>(8),</a>
+<b>cupsreject</b>(8),
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+
+</body>
+</html>
diff --git a/doc/help/man-cupsfilter.html b/doc/help/man-cupsfilter.html
new file mode 100644 (file)
index 0000000..1e32c1e
--- /dev/null
@@ -0,0 +1,126 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cupsfilter(8)</title>
+</head>
+<body>
+<h1 class="title">cupsfilter(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupsfilter - convert a file to another format using cups filters
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupsfilter</b>
+[
+<b>--list-filters</b>
+] [
+<b>-D</b>
+] [
+<b>-U</b>
+<i>user</i>
+] [
+<b>-c</b>
+<i>config-file</i>
+] [
+<b>-d</b>
+<i>printer</i>
+] [
+<b>-e</b>
+] [
+<b>-i</b>
+<i>mime/type</i>
+] [
+<b>-j</b>
+<i>job-id[,N]</i>
+] [
+<b>-m</b>
+<i>mime/type</i>
+] [
+<b>-n</b>
+<i>copies</i>
+] [
+<b>-o</b>
+<i>name=value</i>
+] [
+<b>-p</b>
+<i>filename.ppd</i>
+] [
+<b>-t</b>
+<i>title</i>
+] [
+<b>-u</b>
+]
+<i>filename</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cupsfilter</b>
+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</b>
+generates a PDF file. The converted file is sent to the standard output.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<dl class="man">
+<dt><b>--list-filters</b>
+<dd style="margin-left: 5.0em">Do not actually run the filters, just print the filters used to stdout.
+<dt><b>-D</b>
+<dd style="margin-left: 5.0em">Delete the input file after conversion.
+<dt><b>-U </b><i>user</i>
+<dd style="margin-left: 5.0em">Specifies the username passed to the filters. The default is the name of the current user.
+<dt><b>-c </b><i>config-file</i>
+<dd style="margin-left: 5.0em">Uses the named cups-files.conf configuration file.
+<dt><b>-d </b><i>printer</i>
+<dd style="margin-left: 5.0em">Uses information from the named printer.
+<dt><b>-e</b>
+<dd style="margin-left: 5.0em">Use every filter from the PPD file.
+<dt><b>-i </b><i>mime/type</i>
+<dd style="margin-left: 5.0em">Specifies the source file type. The default file type is guessed using the filename and contents of the file.
+<dt><b>-j </b><i>job-id[,N]</i>
+<dd style="margin-left: 5.0em">Converts document N from the specified job. If N is omitted, document 1 is converted.
+<dt><b>-m </b><i>mime/type</i>
+<dd style="margin-left: 5.0em">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.
+<dt><b>-n </b><i>copies</i>
+<dd style="margin-left: 5.0em">Specifies the number of copies to generate.
+<dt><b>-o </b><i>name=value</i>
+<dd style="margin-left: 5.0em">Specifies options to pass to the CUPS filters.
+<dt><b>-p </b><i>filename.ppd</i>
+<dd style="margin-left: 5.0em">Specifies the PPD file to use.
+<dt><b>-t </b><i>title</i>
+<dd style="margin-left: 5.0em">Specifies the document title.
+<dt><b>-u</b>
+<dd style="margin-left: 5.0em">Delete the PPD file after conversion.
+</dl>
+<h2 class="title"><a name="EXIT_STATUS">Exit Status</a></h2>
+<b>cupsfilter</b>
+returns a non-zero exit status on any error.
+<h2 class="title"><a name="ENVIRONMENT">Environment</a></h2>
+All of the standard
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1)</a>
+environment variables affect the operation of
+<b>cupsfilter</b>.
+<h2 class="title"><a name="FILES">Files</a></h2>
+<pre class="man">
+/etc/cups/cups-files.conf
+/etc/cups/*.convs
+/etc/cups/*.types
+/usr/share/cups/mime/*.convs
+/usr/share/cups/mime/*.types
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+Unlike when printing, filters run using the
+<b>cupsfilter</b>
+command use the current user and security session. This may result in different output or unexpected behavior.
+<h2 class="title"><a name="EXAMPLE">Example</a></h2>
+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":
+<pre class="man">
+
+    cupsfilter -m application/pdf -d myprinter -j 42 >preview.pdf
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<b>filter(7),</b>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(7),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(7),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupstestdsc.html b/doc/help/man-cupstestdsc.html
new file mode 100644 (file)
index 0000000..5a99948
--- /dev/null
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cupstestdsc(1)</title>
+</head>
+<body>
+<h1 class="title">cupstestdsc(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupstestdsc - test conformance of postscript files (deprecated)
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupstestdsc</b>
+[
+<b>-h</b>
+]
+<i>filename.ps</i>
+[ ...
+<i>filenameN.ps</i>
+]
+<br>
+<b>cupstestdsc</b>
+[
+<b>-h</b>
+]
+<b>-</b>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cupstestdsc</b> tests the conformance of PostScript files to the Adobe PostScript Language Document Structuring Conventions Specification version 3.0.
+The results of testing and any other output are sent to the standard output.
+The second form of the command reads PostScript from the standard input.
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+<i>This program is deprecated and will be removed in a future release of CUPS.</i>
+<p><b>cupstestdsc</b> only validates the DSC comments in a PostScript file and does not attempt to validate the PostScript code itself.
+Developers must ensure that the PostScript they generate follows the rules defined by Adobe.
+Specifically, all pages must be independent of each other, code outside page descriptions may not affect the graphics state (current font, color, transform matrix, etc.), and device-specific commands such as setpagedevice should not be used.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+CUPS Online Help (<a href="http://localhost:631/help)">http://localhost:631/help)</a>,
+Adobe PostScript Language Document Structuring Conventions
+Specification, Version 3.0.
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-cupstestppd.html b/doc/help/man-cupstestppd.html
new file mode 100644 (file)
index 0000000..28d2518
--- /dev/null
@@ -0,0 +1,127 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>cupstestppd(1)</title>
+</head>
+<body>
+<h1 class="title">cupstestppd(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+cupstestppd - test conformance of ppd files
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>cupstestppd</b>
+[
+<b>-I</b>
+<i>category</i>
+] [
+<b>-R</b>
+<i>rootdir</i>
+] [
+<b>-W</b>
+<i>category</i>
+] [
+<b>-q</b>
+] [
+<b>-r</b>
+] [
+<b>-v</b>[<b>v</b>]
+]
+<i>filename.ppd[.gz]</i>
+[ ...
+<i>filename.ppd[.gz]</i>
+]
+<br>
+<b>cupstestppd</b>
+[
+<b>-R</b>
+<i>rootdir</i>
+] [
+<b>-W</b>
+<i>category</i>
+] [
+<b>-q</b>
+] [
+<b>-r</b>
+] [
+<b>-v</b>[<b>v</b>]
+]
+<b>-</b>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>cupstestppd</b> 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.
+<p>The first form of <b>cupstestppd</b> tests one or more PPD files on the command-line.
+The second form tests the PPD file provided on the standard input.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>cupstestppd</b> supports the following options:
+<dl class="man">
+<dt><b>-I filename</b>
+<dd style="margin-left: 5.0em">Ignores all PCFileName warnings.
+<dt><b>-I filters</b>
+<dd style="margin-left: 5.0em">Ignores all filter errors.
+<dt><b>-I profiles</b>
+<dd style="margin-left: 5.0em">Ignores all profile errors.
+<dt><b>-R </b><i>rootdir</i>
+<dd style="margin-left: 5.0em">Specifies an alternate root directory for the filter, pre-filter, and other support file checks.
+<dt><b>-W constraints</b>
+<dd style="margin-left: 5.0em">Report all UIConstraint errors as warnings.
+<dt><b>-W defaults</b>
+<dd style="margin-left: 5.0em">Except for size-related options, report all default option errors as warnings.
+<dt><b>-W filters</b>
+<dd style="margin-left: 5.0em">Report all filter errors as warnings.
+<dt><b>-W profiles</b>
+<dd style="margin-left: 5.0em">Report all profile errors as warnings.
+<dt><b>-W sizes</b>
+<dd style="margin-left: 5.0em">Report all media size errors as warnings.
+<dt><b>-W translations</b>
+<dd style="margin-left: 5.0em">Report all translation errors as warnings.
+<dt><b>-W all</b>
+<dd style="margin-left: 5.0em">Report all of the previous errors as warnings.
+<dt><b>-W none</b>
+<dd style="margin-left: 5.0em">Report all of the previous errors as errors.
+<dt><b>-q</b>
+<dd style="margin-left: 5.0em">Specifies that no information should be displayed.
+<dt><b>-r</b>
+<dd style="margin-left: 5.0em">Relaxes the PPD conformance requirements so that common whitespace, control character, and formatting problems are not treated as hard errors.
+<dt><b>-v</b>
+<dd style="margin-left: 5.0em">Specifies that detailed conformance testing results should be displayed rather than the concise PASS/FAIL/ERROR status.
+<dt><b>-vv</b>
+<dd style="margin-left: 5.0em">Specifies that all information in the PPD file should be displayed in addition to the detailed conformance testing results.
+</dl>
+<p>The <i>-q</i>, <i>-v</i>, and <i>-vv</i> options are mutually exclusive.
+<h2 class="title"><a name="EXIT_STATUS">Exit Status</a></h2>
+<b>cupstestppd</b> returns zero on success and non-zero on error.
+The error codes are as follows:
+<dl class="man">
+<dt>1
+<dd style="margin-left: 5.0em">Bad command-line arguments or missing PPD filename.
+<dt>2
+<dd style="margin-left: 5.0em">Unable to open or read PPD file.
+<dt>3
+<dd style="margin-left: 5.0em">The PPD file contains format errors that cannot be skipped.
+<dt>4
+<dd style="margin-left: 5.0em">The PPD file does not conform to the Adobe PPD specification.
+</dl>
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+The following command will test all PPD files under the current directory and print the names of each file that does not conform:
+<pre class="man">
+
+    find . -name \*.ppd \! -exec cupstestppd -q '{}' \; -print
+
+</pre>
+The next command tests all PPD files under the current directory and print detailed conformance testing results for the files that do not conform:
+<pre class="man">
+
+    find . -name \*.ppd \! -exec cupstestppd -q '{}' \; \
+        -exec cupstestppd -v '{}' \;
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+CUPS Online Help (<a href="http://localhost:631/help)">http://localhost:631/help)</a>,
+Adobe PostScript Printer Description File Format Specification, Version 4.3.
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-filter.html b/doc/help/man-filter.html
new file mode 100644 (file)
index 0000000..bb4f620
--- /dev/null
@@ -0,0 +1,189 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>filter(7)</title>
+</head>
+<body>
+<h1 class="title">filter(7)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+filter - cups file conversion filter interface
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>filter</b>
+<i>job</i>
+<i>user</i>
+<i>title</i>
+<i>num-copies</i>
+<i>options</i>
+[
+<i>filename</i>
+]
+<pre class="man">
+
+<b>#include &lt;cups/cups.h></b>
+
+<b>ssize_t cupsBackChannelRead</b>(<b>char *</b><i>buffer</i>, <b>size_t </b><i>bytes</i>,
+                            <b>double </b><i>timeout</i>);
+
+<b>cups_sc_status_t cupsSideChannelDoRequest</b>(<b>cups_sc_command_t </b><i>command</i>,
+                                          <b>char *</b><i>data</i>, <b>int *</b><i>datalen</i>,
+                                          <b>double </b><i>timeout</i>);
+
+<b>#include &lt;cups/ppd.h></b>
+
+<b>const char *cupsGetOption</b>(<b>const char *</b><i>name</i>, <b>int </b><i>num_options</i>,
+                 <b>cups_option_t *</b><i>options</i>);
+
+<b>int cupsMarkOptions</b>(<b>ppd_file_t *</b><i>ppd</i>, <b>int </b><i>num_options</i>,
+                    <b>cups_option_t *</b><i>options</i>);
+
+<b>int cupsParseOptions</b>(<b>const char *</b><i>arg</i>, <b>int </b><i>num_options</i>,
+                     <b>cups_option_t **</b><i>options</i>);
+
+<b>ppd_choice_t *ppdFindMarkedChoice</b>(<b>ppd_file_t *</b><i>ppd</i>, <b>const char *</b><i>keyword</i>);
+
+<b>void ppdMarkDefaults</b>(<b>ppd_file_t *</b><i>ppd</i>);
+
+<b>ppd_file_t *ppdOpenFile</b>(<b>const char *</b><i>filename</i>);
+</pre>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+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.
+<p>Filters <b>MUST</b> 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 <b>MUST</b> be sent to the standard output.
+Filters <b>MUST NOT</b> attempt to communicate directly with the printer, other processes, or other services.
+<p>The command name (<i>argv[0]</i>) is set to the name of the destination printer but is also available in the <b>PRINTER</b><i> environment variable.
+</i><h2 class="title"><a name="OPTIONS">Options</a></h2>
+Options are passed in <i>argv[5]</i> and are encoded from the corresponding IPP attributes used when the job was submitted. Use the
+<b>cupsParseOptions</b>()
+function to load the options into a <b>cups_option_t</b> array and the
+<b>cupsGetOption</b>()
+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.
+<p>Options passed on the command-line typically do not include the default choices the printer's PPD file. Use the
+<b>ppdMarkDefaults</b>()
+and
+<b>cupsMarkOptions</b>()
+functions in the CUPS library to apply the options to the PPD defaults and map any IPP attributes to the corresponding PPD options.
+Use
+<b>ppdFindMarkedChoice</b>()
+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 <b>Duplex</b> PPD option:
+<pre class="man">
+
+    ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
+    cups_option_t *options = NULL;
+    int num_options = cupsParseOptions(argv[5], 0, &amp;options);
+
+    ppdMarkDefaults(ppd);
+    cupsMarkOptions(ppd, num_options, options);
+
+    ppd_choice_t *choice = ppdFindMarkedChoice(ppd, "Duplex");
+</pre>
+<p>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.
+<h2 class="title"><a name="LOG_MESSAGES">Log Messages</a></h2>
+Messages sent to the standard error are generally stored in the printer's "printer-state-message" attribute and the current <b>ErrorLog</b> file.
+Each line begins with a standard prefix:
+<dl class="man">
+<dt><b>ALERT: </b><i>message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute and adds the specified message to the current <b>ErrorLog</b> using the "alert" log level.
+<dt><b>ATTR: </b><i>attribute=value </i>[ <i>... attribute=value</i>]
+<dd style="margin-left: 5.0em">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".
+<dt><b>CRIT: </b><i>message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute and adds the specified message to the current <b>ErrorLog</b> using the "critical" log level.
+<dt><b>DEBUG: </b><i>message</i>
+<dd style="margin-left: 5.0em">Adds the specified message to the current <b>ErrorLog</b> using the "debug" log level.
+<b>DEBUG</b> messages are never stored in the "printer-state-message" attribute.
+<dt><b>DEBUG2: </b><i>message</i>
+<dd style="margin-left: 5.0em"><br>
+Adds the specified message to the current <b>ErrorLog</b> using the "debug2" log level.
+<b>DEBUG2</b> messages are never stored in the "printer-state-message" attribute.
+<dt><b>EMERG: </b><i>message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute and adds the specified message to the current <b>ErrorLog</b> using the "emergency" log level.
+<dt><b>ERROR:</b><i> message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute and adds the specified message to the current <b>ErrorLog</b> using the "error" log level.
+<dt><b>INFO:</b><i> message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute. If the current <b>LogLevel</b> is set to "debug2", also adds the specified message to the current <b>ErrorLog</b> using the "info" log level.
+<dt><b>NOTICE:</b><i> message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute and adds the specified message to the current <b>ErrorLog</b> using the "notice" log level.
+<dt><b>PAGE:</b><i> page-number #-copies</i>
+<dd style="margin-left: 5.0em"><dt><b>PAGE:</b><i> total #-pages</i>
+<dd style="margin-left: 5.0em">Adds an entry to the current <b>PageLog</b>. The first form adds <i>#-copies</i> to the "job-media-sheets-completed" attribute. The second form sets the "job-media-sheets-completed" attribute to <i>#-pages</i>.
+<dt><b>PPD:</b><i> Keyword=Value</i> [ <i>... KeywordN=Value</i> ]
+<dd style="margin-left: 5.0em">Sets the named keywords in the printer's PPD file. This is typically used to update default option keywords such as <b>DefaultPageSize</b> and the various installable options in the PPD file.
+<dt><b>STATE:</b><i> printer-state-reason </i>[ <i>... printer-state-reason</i> ]
+<dd style="margin-left: 5.0em"><dt><b>STATE: +</b><i> printer-state-reason </i>[ <i>... printer-state-reason</i> ]
+<dd style="margin-left: 5.0em"><dt><b>STATE: -</b><i> printer-state-reason </i>[ <i>... printer-state-reason</i> ]
+<dd style="margin-left: 5.0em">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.
+<dt><b>WARNING:</b><i> message</i>
+<dd style="margin-left: 5.0em">Sets the "printer-state-message" attribute and adds the specified message to the current <b>ErrorLog</b> using the "warning" log level.
+</dl>
+<h2 class="title"><a name="ENVIRONMENT_VARIABLES">Environment Variables</a></h2>
+The following environment variables are defined by the CUPS
+server when executing the filter:
+<dl class="man">
+<dt><b>CHARSET</b>
+<dd style="margin-left: 5.0em">The default text character set, typically "utf-8".
+<dt><b>CLASS</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>CONTENT_TYPE</b>
+<dd style="margin-left: 5.0em">The MIME media type associated with the submitted job file, for example "application/postscript".
+<dt><b>CUPS_CACHEDIR</b>
+<dd style="margin-left: 5.0em">The directory where semi-persistent cache files can be found and stored.
+<dt><b>CUPS_DATADIR</b>
+<dd style="margin-left: 5.0em">The directory where data files can be found.
+<dt><b>CUPS_FILETYPE</b>
+<dd style="margin-left: 5.0em">The type of file being printed: "job-sheet" for a banner page and "document"
+for a regular print file.
+<dt><b>CUPS_MAX_MESSAGE</b>
+<dd style="margin-left: 5.0em">The maximum size of a message sent to <i>stderr</i>, including any leading prefix and the trailing newline.
+<dt><b>CUPS_SERVERROOT</b>
+<dd style="margin-left: 5.0em">The root directory of the server.
+<dt><b>FINAL_CONTENT_TYPE</b>
+<dd style="margin-left: 5.0em">The MIME media type associated with the output destined for the printer, for example "application/vnd.cups-postscript".
+<dt><b>LANG</b>
+<dd style="margin-left: 5.0em">The default language locale (typically C or en).
+<dt><b>PATH</b>
+<dd style="margin-left: 5.0em">The standard execution path for external programs that may be run by the filter.
+<dt><b>PPD</b>
+<dd style="margin-left: 5.0em">The full pathname of the PostScript Printer Description (PPD) file for this printer.
+<dt><b>PRINTER</b>
+<dd style="margin-left: 5.0em">The name of the printer.
+<dt><b>RIP_CACHE</b>
+<dd style="margin-left: 5.0em">The recommended amount of memory to use for Raster Image Processors (RIPs).
+<dt><b>SOFTWARE</b>
+<dd style="margin-left: 5.0em">The name and version number of the server (typically CUPS/<i>major.minor</i>).
+<dt><b>TZ</b>
+<dd style="margin-left: 5.0em">The timezone of the server.
+<dt><b>USER</b>
+<dd style="margin-left: 5.0em">The user executing the filter, typically "lp" or "root"; consult the <i>cups-files.conf</i> file for the current setting.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+While the filter interface is compatible with System V interface
+scripts, it will only work with the System V interface script as the
+only filter.  Typically the interface script will be provided via the
+<i>lpadmin(8)</i> command using the <i>-i</i> option.
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+CUPS filters are not meant to be run directly by the user.
+Aside from the legacy System V interface issues (<i>argv[0]</i> is the printer name), CUPS filters also expect specific environment variables and file descriptors, and typically run in a user session that (on OS X) 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
+<a href="man-cupsfilter.html?TOPIC=Man+Pages"><b>cupsfilter</b>(8)</a>
+program to use the appropriate filters to do the conversions you need.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-backend.html?TOPIC=Man+Pages"><b>backend</b>(7),</a>
+<a href="man-cups.html?TOPIC=Man+Pages"><b>cups</b>(1),</a>
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsfilter.html?TOPIC=Man+Pages"><b>cupsfilter</b>(8),</a>
+<br>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ippfind.html b/doc/help/man-ippfind.html
new file mode 100644 (file)
index 0000000..41445fe
--- /dev/null
@@ -0,0 +1,204 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>ippfind(1)</title>
+</head>
+<body>
+<h1 class="title">ippfind(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ippfind - find internet printing protocol printers
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>ippfind</b>
+[
+<i>options</i>
+] <i>regtype</i>[<b>,</b><i>subtype</i>][<b>.</b><i>domain</i><b>.</b>] ... [
+<i>expression</i>
+ ... ]
+<br>
+<b>ippfind</b>
+[
+<i>options</i>
+] <i>name</i>[<b>.</b><i>regtype</i>[<b>.</b><i>domain</i><b>.</b>]] ... [
+<i>expression</i>
+ ... ]
+<br>
+<b>ippfind</b>
+<b>--help</b>
+<br>
+<b>ippfind</b>
+<b>--version</b>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>ippfind</b> 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.
+<h3><a name="REGISTRATION_TYPES">Registration Types</a></h3>
+<b>ippfind</b> supports the following registration types:
+<dl class="man">
+<dt>_http._tcp
+<dd style="margin-left: 5.0em">HyperText Transport Protocol (HTTP, RFC 2616)
+<dt>_https._tcp
+<dd style="margin-left: 5.0em">Secure HyperText Transport Protocol (HTTPS, RFC 2818)
+<dt>_ipp._tcp
+<dd style="margin-left: 5.0em">Internet Printing Protocol (IPP, RFC 2911)
+<dt>_ipps._tcp
+<dd style="margin-left: 5.0em">Secure Internet Printing Protocol (IPPS, draft)
+<dt>_printer._tcp
+<dd style="margin-left: 5.0em">Line Printer Daemon (LPD, RFC 1179)
+</dl>
+<h3><a name="EXPRESSIONS">Expressions</a></h3>
+<b>ippfind</b> supports expressions much like the
+<b>find</b>(1)
+utility.
+However, unlike
+<b>find</b>(1),
+<b>ippfind</b> uses POSIX regular expressions instead of shell filename matching patterns.
+If <i>--exec</i>, <i>-l</i>, <i>--ls</i>, <i>-p</i>, <i>--print</i>, <i>--print-name</i>, <i>-q</i>, <i>--quiet</i>, <i>-s</i>, or <i>-x</i> is not specified, <b>ippfind</b> adds <i>--print</i> to print the service URI of anything it finds.
+The following expressions are supported:
+<dl class="man">
+<dt><b>-d </b><i>regex</i>
+<dd style="margin-left: 5.0em"><dt><b>--domain </b><i>regex</i>
+<dd style="margin-left: 5.0em">True if the domain matches the given regular expression.
+<dt><b>--false</b>
+<dd style="margin-left: 5.0em">Always false.
+<dt><b>-h </b><i>regex</i>
+<dd style="margin-left: 5.0em"><dt><b>--host </b><i>regex</i>
+<dd style="margin-left: 5.0em">True is the hostname matches the given regular expression.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em"><dt><b>--ls</b>
+<dd style="margin-left: 5.0em">Lists attributes returned by Get-Printer-Attributes for IPP printers and traditional <i>find</i> "-ls" output for HTTP URLs.
+The result is true if the URI is accessible, false otherwise.
+<dt><b>--local</b>
+<dd style="margin-left: 5.0em">True if the service is local to this computer.
+<dt><b>-n </b><i>regex</i>
+<dd style="margin-left: 5.0em"><dt><b>--name </b><i>regex</i>
+<dd style="margin-left: 5.0em">True if the service instance name matches the given regular expression.
+<dt><b>--path </b><i>regex</i>
+<dd style="margin-left: 5.0em">True if the URI resource path matches the given regular expression.
+<dt><b>-P </b><i>number</i>[<b>-</b><i>number</i>]
+<dd style="margin-left: 5.0em"><dt><b>--port </b><i>number</i>[<b>-</b><i>number</i>]
+<dd style="margin-left: 5.0em">True if the port matches the given number or range.
+<dt><b>-p</b>
+<dd style="margin-left: 5.0em"><dt><b>--print</b>
+<dd style="margin-left: 5.0em">Prints the URI if the result of previous expressions is true.
+The result is always true.
+<dt><b>-q</b>
+<dd style="margin-left: 5.0em"><dt><b>--quiet</b>
+<dd style="margin-left: 5.0em">Quiet mode - just returns the exit codes below.
+<dt><b>-r</b>
+<dd style="margin-left: 5.0em"><dt><b>--remote</b>
+<dd style="margin-left: 5.0em">True if the service is not local to this computer.
+<dt><b>-s</b>
+<dd style="margin-left: 5.0em"><dt><b>--print-name</b>
+<dd style="margin-left: 5.0em">Prints the service instance name if the result of previous expressions is true.
+The result is always true.
+<dt><b>--true</b>
+<dd style="margin-left: 5.0em">Always true.
+<dt><b>-t </b><i>key</i>
+<dd style="margin-left: 5.0em"><dt><b>--txt </b><i>key</i>
+<dd style="margin-left: 5.0em">True if the TXT record contains the named key.
+<dt><b>--txt-</b><i>key regex</i>
+<dd style="margin-left: 5.0em">True if the TXT record contains the named key and matches the given regular expression.
+<dt><b>-u </b><i>regex</i>
+<dd style="margin-left: 5.0em"><dt><b>--uri </b><i>regex</i>
+<dd style="margin-left: 5.0em">True if the URI matches the given regular expression.
+<dt><b>-x </b><i>utility </i>[ <i>argument </i>... ] <b>;</b>
+<dd style="margin-left: 5.0em"><dt><b>--exec </b><i>utility </i>[ <i>argument </i>... ] <b>;</b>
+<dd style="margin-left: 5.0em">Executes the specified program if the current result is true.
+"{foo}" arguments are replaced with the corresponding value - see SUBSTITUTIONS below.
+</dl>
+<p>Expressions may also contain modifiers:
+<dl class="man">
+<dt><b>( </b><i>expression </i><b>)</b>
+<dd style="margin-left: 5.0em">Group the result of expressions.
+<dt><b>! </b><i>expression</i>
+<dd style="margin-left: 5.0em"><dt><b>--not </b><i>expression</i>
+<dd style="margin-left: 5.0em">Unary NOT of the expression.
+<dt><i>expression expression</i>
+<dd style="margin-left: 5.0em"><dt><i>expression </i><b>--and </b><i>expression</i>
+<dd style="margin-left: 5.0em">Logical AND of expressions.
+<dt><i>expression </i><b>--or </b><i>expression</i>
+<dd style="margin-left: 5.0em">Logical OR of expressions.
+</dl>
+<h3><a name="SUBSTITUTIONS">Substitutions</a></h3>
+The substitutions for "{foo}" in <i>-e</i> and <i>--exec</i> are:
+<dl class="man">
+<dt><b>{service_domain}</b>
+<dd style="margin-left: 5.0em">Domain name, e.g., "example.com.", "local.", etc.
+<dt><b>{service_hostname}</b>
+<dd style="margin-left: 5.0em">Fully-qualified domain name, e.g., "printer.example.com.", "printer.local.", etc.
+<dt><b>{service_name}</b>
+<dd style="margin-left: 5.0em">Service instance name, e.g., "My Fine Printer".
+<dt><b>{service_port}</b>
+<dd style="margin-left: 5.0em">Port number for server, typically 631 for IPP and 80 for HTTP.
+<dt><b>{service_regtype}</b>
+<dd style="margin-left: 5.0em">DNS-SD registration type, e.g., "_ipp._tcp", "_http._tcp", etc.
+<dt><b>{service_scheme}</b>
+<dd style="margin-left: 5.0em">URI scheme for DNS-SD registration type, e.g., "ipp", "http", etc.
+<dt><b>{}</b>
+<dd style="margin-left: 5.0em"><dt><b>{service_uri}</b>
+<dd style="margin-left: 5.0em">URI for service, e.g., "ipp://printer.local./ipp/print", "<a href="http://printer.local./"">http://printer.local./"</a>, etc.
+<dt><b>{txt_</b><i>key</i><b>}</b>
+<dd style="margin-left: 5.0em">Value of TXT record <i>key</i> (lowercase).
+</dl>
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>ippfind</b> supports the following options:
+<dl class="man">
+<dt><b>--help</b>
+<dd style="margin-left: 5.0em">Show program help.
+<dt><b>--version</b>
+<dd style="margin-left: 5.0em">Show program version.
+<dt><b>-4</b>
+<dd style="margin-left: 5.0em">Use IPv4 when listing.
+<dt><b>-6</b>
+<dd style="margin-left: 5.0em">Use IPv6 when listing.
+<dt><b>-T </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specify find timeout in seconds.
+If 1 or less, <b>ippfind</b> stops as soon as it thinks it has found everything.
+The default timeout is 1 second.
+<dt><b>-V </b><i>version</i>
+<dd style="margin-left: 5.0em">Specifies the IPP version when listing.
+Supported values are "1.1", "2.0", "2.1", and "2.2".
+</dl>
+<h2 class="title"><a name="EXIT_STATUS">Exit Status</a></h2>
+<b>ippfind</b> 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.
+<h2 class="title"><a name="ENVIRONMENT">Environment</a></h2>
+When executing a program, <b>ippfind</b> sets the following environment variables for the matching service registration:
+<dl class="man">
+<dt><b>IPPFIND_SERVICE_DOMAIN</b>
+<dd style="margin-left: 5.0em">Domain name, e.g., "example.com.", "local.", etc.
+<dt><b>IPPFIND_SERVICE_HOSTNAME</b>
+<dd style="margin-left: 5.0em">Fully-qualified domain name, e.g., "printer.example.com.", "printer.local.", etc.
+<dt><b>IPPFIND_SERVICE_NAME</b>
+<dd style="margin-left: 5.0em">Service instance name, e.g., "My Fine Printer".
+<dt><b>IPPFIND_SERVICE_PORT</b>
+<dd style="margin-left: 5.0em">Port number for server, typically 631 for IPP and 80 for HTTP.
+<dt><b>IPPFIND_SERVICE_REGTYPE</b>
+<dd style="margin-left: 5.0em">DNS-SD registration type, e.g., "_ipp._tcp", "_http._tcp", etc.
+<dt><b>IPPFIND_SERVICE_SCHEME</b>
+<dd style="margin-left: 5.0em">URI scheme for DNS-SD registration type, e.g., "ipp", "http", etc.
+<dt><b>IPPFIND_SERVICE_URI</b>
+<dd style="margin-left: 5.0em">URI for service, e.g., "ipp://printer.local./ipp/print", "<a href="http://printer.local./"">http://printer.local./"</a>, etc.
+<dt><b>IPPFIND_TXT_fIKEYfR</b>
+<dd style="margin-left: 5.0em">Values of TXT record <i>KEY</i> (uppercase).
+</dl>
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+To show the status of all registered IPP printers on your network, run:
+<pre class="man">
+
+    ippfind --ls
+
+</pre>
+Similarly, to send a PostScript test page to every PostScript printer, run:
+<pre class="man">
+
+    ippfind --txt-pdl application/postscript --exec ipptool
+      -f onepage-letter.ps '{}' print-job.test \;
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(1)</a>
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2013-2015 by Apple Inc.
+
+</body>
+</html>
index 189613a..f3e3dc0 100644 (file)
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!DOCTYPE HTML>
 <html>
 <!-- SECTION: Man Pages -->
 <head>
 <h2 class="title"><a name="NAME">Name</a></h2>
 ipptool - perform internet printing protocol requests
 <h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
-<b>ipptool
-</b>[ -4 ] [ -6 ] [ -C ] [ -E ] [ -I ] [ -L ] [ -S ] [ -T
-<i>seconds
-</i>] [ -V
-<i>version
-</i>] [ -X ] [ -c ] [ -d
-<i>name=value
-</i>] [ -f
-<i>filename
-</i>] [ -i
-<i>seconds
-</i>] [ -n
-<i>repeat-count
-</i>] [ -q ] [ -t ] [ -v ]
-<i>URI
-</i><i>filename
-</i>[
-<i>... filenameN
-</i>]
+<b>ipptool</b>
+[
+<b>--help</b>
+] [
+<b>--stop-after-include-error</b>
+] [
+<b>--version</b>
+] [
+<b>-4</b>
+] [
+<b>-6</b>
+] [
+<b>-C</b>
+] [
+<b>-E</b>
+] [
+<b>-I</b>
+] [
+<b>-L</b>
+] [
+<b>-P</b>
+<i>filename.plist</i>
+] [
+<b>-S</b>
+] [
+<b>-T</b>
+<i>seconds</i>
+] [
+<b>-V</b>
+<i>version</i>
+] [
+<b>-X</b>
+] [
+<b>-c</b>
+] [
+<b>-d</b>
+<i>name=value</i>
+] [
+<b>-f</b>
+<i>filename</i>
+] [
+<b>-i</b>
+<i>seconds</i>
+] [
+<b>-n</b>
+<i>repeat-count</i>
+] [
+<b>-q</b>
+] [
+<b>-t</b>
+] [
+<b>-v</b><b>]</b>
+<i>printer-uri</i>
+<i>testfile</i>
+[ ...
+<i>testfile</i>
+]
 <h2 class="title"><a name="DESCRIPTION">Description</a></h2>
-<i>ipptool</i> sends IPP requests to the specified URI and tests and/or displays the results. Each named file 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 file format is described in <a href='man-ipptoolfile.html?TOPIC=Man+Pages'>ipptoolfile(5)</a>.
+<b>ipptool</b>
+sends IPP requests to the specified
+<i>printer-uri</i>
+and tests and/or displays the results.
+Each named
+<i>testfile</i>
+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</i>
+format is described in
+<a href="man-ipptoolfile.html?TOPIC=Man+Pages"><b>ipptoolfile</b>(5).</a>
 <h2 class="title"><a name="OPTIONS">Options</a></h2>
-The following options are recognized by <i>ipptool</i>:
-<dl>
-<dt>-4
-</dt>
-<dd>Specifies that <i>ipptool</i> must connect to the printer or server using IPv4.
-</dd>
-<dt>-6
-</dt>
-<dd>Specifies that <i>ipptool</i> must connect to the printer or server using IPv6.
-</dd>
-<dt>-C
-</dt>
-<dd>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.
-</dd>
-<dt>-E
-</dt>
-<dd>Forces TLS encryption when connecting to the server using the HTTP "Upgrade" header.
-</dd>
-<dt>-I
-</dt>
-<dd>Specifies that <i>ipptool</i> will continue past errors.
-</dd>
-<dt>-L
-</dt>
-<dd>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.
-</dd>
-<dt>-S
-</dt>
-<dd>Forces (dedicated) SSL encryption when connecting to the server.
-</dd>
-<dt>-T seconds
-</dt>
-<dd>Specifies a timeout for IPP requests in seconds.
-</dd>
-<dt>-V version
-</dt>
-<dd>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.
-</dd>
-<dt>-X
-</dt>
-<dd>Specifies that XML (Apple plist) output is desired instead of the plain text report. This option is incompatible with the <i>-i</i> (interval) and <i>-n</i> (repeat-count) options.
-</dd>
-<dt>-c
-</dt>
-<dd>Specifies that CSV (comma-separated values) output is desired instead of the plain text output.
-</dd>
-<dt>-d name=value
-</dt>
-<dd>Defines the named variable.
-</dd>
-<dt>-f filename
-</dt>
-<dd>Defines the default request filename for tests.
-</dd>
-<dt>-i seconds
-</dt>
-<dd>Specifies that the (last) file should be repeated at the specified interval. This option is incompatible with the <i>-X</i> (XML plist output) option.
-</dd>
-<dt>-l
-</dt>
-<dd>Specifies that plain text output is desired.
-</dd>
-<dt>-n repeat-count
-</dt>
-<dd>Specifies that the (last) file should be repeated the specified number of times. This option is incompatible with the <i>-X</i> (XML plist output) option.
-</dd>
-<dt>-t
-</dt>
-<dd>Specifies that CUPS test report output is desired instead of the plain text output.
-</dd>
-<dt>-v
-</dt>
-<dd>Specifies that all request and response attributes should be output in CUPS test mode (<i>-t</i>). This is the default for XML output.
-</dd>
+The following options are recognized by
+<b>ipptool:</b>
+<dl class="man">
+<dt><b>--help</b>
+<dd style="margin-left: 5.0em">Shows program help.
+<dt><b>--stop-after-include-error</b>
+<dd style="margin-left: 5.0em">Tells
+<b>ipptool</b>
+to stop if an error occurs in an included file. Normally
+<b>ipptool</b>
+will continue with subsequent tests after the INCLUDE directive.
+<dt><b>--version</b>
+<dd style="margin-left: 5.0em">Shows the version of
+<b>ipptool</b>
+being used.
+<dt><b>-4</b>
+<dd style="margin-left: 5.0em">Specifies that
+<b>ipptool</b>
+must connect to the printer or server using IPv4.
+<dt><b>-6</b>
+<dd style="margin-left: 5.0em">Specifies that
+<b>ipptool</b>
+must connect to the printer or server using IPv6.
+<dt><b>-C</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces TLS encryption when connecting to the server using the HTTP "Upgrade" header.
+<dt><b>-I</b>
+<dd style="margin-left: 5.0em">Specifies that
+<b>ipptool</b>
+will continue past errors.
+<dt><b>-L</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>-P</b><i> filename.plist</i>
+<dd style="margin-left: 5.0em">Specifies that the test results should be written to the named XML (Apple plist) file in addition to the regular test report (<b>-t</b>).
+This option is incompatible with the <b>-i</b> (interval) and <b>-n</b> (repeat-count) options.
+<dt><b>-S</b>
+<dd style="margin-left: 5.0em">Forces (dedicated) TLS encryption when connecting to the server.
+<dt><b>-T</b><i> seconds</i>
+<dd style="margin-left: 5.0em">Specifies a timeout for IPP requests in seconds.
+<dt><b>-V</b><i> version</i>
+<dd style="margin-left: 5.0em">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.
+<dt><b>-X</b>
+<dd style="margin-left: 5.0em">Specifies that XML (Apple plist) output is desired instead of the plain text report.
+This option is incompatible with the <b>-i</b> (interval) and <b>-n</b> (repeat-count) options.
+<dt><b>-c</b>
+<dd style="margin-left: 5.0em">Specifies that CSV (comma-separated values) output is desired instead of the plain text output.
+<dt><b>-d</b><i> name=value</i>
+<dd style="margin-left: 5.0em">Defines the named variable.
+<dt><b>-f</b><i> filename</i>
+<dd style="margin-left: 5.0em">Defines the default request filename for tests.
+<dt><b>-i</b><i> seconds</i>
+<dd style="margin-left: 5.0em">Specifies that the (last)
+<i>testfile</i>
+should be repeated at the specified interval.
+This option is incompatible with the <b>-X</b> (XML plist output) option.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">Specifies that plain text output is desired.
+<dt><b>-n</b><i> repeat-count</i>
+<dd style="margin-left: 5.0em">Specifies that the (last)
+<i>testfile</i>
+should be repeated the specified number of times.
+This option is incompatible with the <i>-X</i> (XML plist output) option.
+<dt><b>-q</b>
+<dd style="margin-left: 5.0em">Be quiet and produce no output.
+<dt><b>-t</b>
+<dd style="margin-left: 5.0em">Specifies that CUPS test report output is desired instead of the plain text output.
+<dt><b>-v</b>
+<dd style="margin-left: 5.0em">Specifies that all request and response attributes should be output in CUPS test mode (<b>-t</b>).
+This is the default for XML output.
 </dl>
-<h2 class="title"><a name="COMPATIBILITY">Compatibility</a></h2>
-The <i>ipptool</i> program is unique to CUPS.
+<h2 class="title"><a name="EXIT_STATUS">Exit Status</a></h2>
+The
+<b>ipptool</b>
+program returns 0 if all tests were successful and 1 otherwise.
+<h2 class="title"><a name="FILES">Files</a></h2>
+The following standard files are available:
+<pre class="man">
+<i>color.jpg</i>
+<i>create-printer-subscription.test</i>
+<i>document-a4.pdf</i>
+<i>document-a4.ps</i>
+<i>document-letter.pdf</i>
+<i>document-letter.ps</i>
+<i>get-completed-jobs.test</i>
+<i>get-jobs.test</i>
+<i>get-notifications.test</i>
+<i>get-printer-attributes.test</i>
+<i>get-subscriptions.test</i>
+<i>gray.jpg</i>
+<i>ipp-1.1.test</i>
+<i>ipp-2.0.test</i>
+<i>ipp-2.1.test</i>
+<i>ipp-2.2.test</i>
+<i>ipp-everywhere.test</i>
+<i>onepage-a4.pdf</i>
+<i>onepage-a4.ps</i>
+<i>onepage-letter.pdf</i>
+<i>onepage-letter.ps</i>
+<i>print-job.test</i>
+<i>print-job-deflate.test</i>
+<i>print-job-gzip.test</i>
+<i>testfile.jpg</i>
+<i>testfile.pcl</i>
+<i>testfile.pdf</i>
+<i>testfile.ps</i>
+<i>testfile.txt</i>
+<i>validate-job.test</i>
+</pre>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The
+<b>ipptool</b>
+program is unique to CUPS and conforms to the Internet Printing Protocol up to version 2.2.
 <h2 class="title"><a name="EXAMPLES">Examples</a></h2>
 Get a list of completed jobs for "myprinter":
-<pre>
+<pre class="man">
+
     ipptool ipp://localhost/printers/myprinter get-completed-jobs.test
 </pre>
 <p>Send email notifications to "user@example.com" when "myprinter" changes:
-<pre>
-    ipptool -d recipient=mailto:user@example.com 
+<pre class="man">
+
+    ipptool -d recipient=mailto:user@example.com \
         ipp://localhost/printers/myprinter create-printer-subscription.test
 </pre>
-<h2 class="title"><a name="STANDARD_FILES">Standard Files</a></h2>
-The following standard files are available:
-<pre>
-    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-printer-attributes.test
-    gray.jpg
-    ipp-1.1.test
-    ipp-2.0.test
-    ipp-2.1.test
-    ipp-2.2.test
-    onepage-a4.pdf
-    onepage-a4.ps
-    onepage-letter.pdf
-    onepage-letter.ps
-    print-job.test
-    testfile.jpg
-    testfile.pdf
-    testfile.ps
-    testfile.txt
-</pre>
 <h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
-<a href='man-ipptoolfile.html?TOPIC=Man+Pages'>ipptoolfile(5)</a>,
-<br>
-<a href='http://localhost:631/help'>http://localhost:631/help</a>
+<a href="man-ipptoolfile.html?TOPIC=Man+Pages"><b>ipptoolfile</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help)">http://localhost:631/help)</a>,
+IANA IPP Registry (<a href="http://www.iana.org/assignments/ipp\-registrations)">http://www.iana.org/assignments/ipp\-registrations)</a>,
+PWG Internet Printing Protocol Workgroup (<a href="http://www.pwg.org/ipp">http://www.pwg.org/ipp</a>)
+RFC 2911 (<a href="http://tools.ietf.org/html/rfc2911)">http://tools.ietf.org/html/rfc2911)</a>,
 <h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
-Copyright 2007-2013 by Apple Inc.
+Copyright &copy; 2007-2015 by Apple Inc.
 
 </body>
 </html>
index 8c75389..4f54d64 100644 (file)
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!DOCTYPE HTML>
 <html>
 <!-- SECTION: Man Pages -->
 <head>
@@ -9,15 +9,16 @@
 <h1 class="title">ipptoolfile(5)</h1>
 <h2 class="title"><a name="NAME">Name</a></h2>
 ipptoolfile - ipptool file format
-
 <h2 class="title"><a name="DESCRIPTION">Description</a></h2>
-The <a href='man-ipptool.html?TOPIC=Man+Pages'>ipptool(1)</a> 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:
-<pre>
+The
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(1)</a>
+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:
+<pre class="man">
 
     # This is a comment
     {
       # The name of the test
-      NAME "Print PostScript Job"
+      NAME "Print PostScript File"
 
       # The request to send
       OPERATION Print-Job
@@ -30,9 +31,7 @@ The <a href='man-ipptool.html?TOPIC=Man+Pages'>ipptool(1)</a> program accepts fr
 
       # The response to expect
       STATUS successful-ok
-      EXPECT attributes-charset OF-TYPE charset
-      EXPECT attributes-natural-language OF-TYPE naturalLanguage
-      EXPECT job-id OF-TYPE integer
+      EXPECT job-id OF-TYPE integer WITH-VALUE >0
       EXPECT job-uri OF-TYPE uri
     }
     {
@@ -50,393 +49,234 @@ The <a href='man-ipptool.html?TOPIC=Man+Pages'>ipptool(1)</a> program accepts fr
 
       # The response to expect
       STATUS successful-ok
-      EXPECT attributes-charset OF-TYPE charset
-      EXPECT attributes-natural-language OF-TYPE naturalLanguage
-      EXPECT job-id OF-TYPE integer
+      EXPECT job-id OF-TYPE integer WITH-VALUE $job-id
       EXPECT job-uri OF-TYPE uri
-      EXPECT job-state OF-TYPE enum
+      EXPECT job-state OF-TYPE enum WITH-VALUE 3,4,5,6,7,8,9
       EXPECT job-originating-user-name OF-TYPE name WITH-VALUE "$user"
     }
 </pre>
-
-<h2 class="title"><a name="TOP-LEVEL_DIRECTIVES">Top-level Directives</a></h2>
-The following directives can be used outside of a test:
-<dl>
-<dt>{ test }
-</dt>
-<dd>Defines a test.
-</dd>
-<dt>DEFINE variable-name value
-</dt>
-<dd>Defines the named variable to the given value. This is equivalent to specifying
-"-d variable-name=value" on the <i>ipptool</i> command-line.
-</dd>
-<dt>DEFINE-DEFAULT variable-name value
-</dt>
-<dd>Defines the named variable to the given value if it does not already have a
-value.
-</dd>
-<dt>IGNORE-ERRORS yes
-</dt>
-<dd></dd>
-<dt>IGNORE-ERRORS no
-</dt>
-<dd>Specifies whether, by default, <i>ipptool</i> will ignore errors and continue with
-subsequent tests.
-</dd>
-<dt>INCLUDE "filename"
-</dt>
-<dd></dd>
-<dt>INCLUDE &lt;filename>
-</dt>
-<dd>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 <i>ipptool</i>
+<h3><a name="TOP_LEVEL_DIRECTIVES">Top-level Directives</a></h3>
+The following directives can be used outside of a <i>test</i>:
+<dl class="man">
+<dt><b>{ </b><i>test </i><b>}</b>
+<dd style="margin-left: 5.0em">Defines a test.
+<dt><b>DEFINE </b><i>variable-name value</i>
+<dd style="margin-left: 5.0em">Defines the named variable to the given value. This is equivalent to specifying <i>-d variable-name=value</i> on the
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+command-line.
+<dt><b>DEFINE-DEFAULT </b><i>variable-name value</i>
+<dd style="margin-left: 5.0em">Defines the named variable to the given value if it does not already have a value.
+<dt><b>FILE-ID "</b><i>identifier</i><b>"</b>
+<dd style="margin-left: 5.0em">Specifies an identifier string for the current file.
+<dt><b>IGNORE-ERRORS yes</b>
+<dd style="margin-left: 5.0em"><dt><b>IGNORE-ERRORS no</b>
+<dd style="margin-left: 5.0em">Specifies whether, by default,
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+will ignore errors and continue with subsequent tests.
+<dt><b>INCLUDE "</b><i>filename</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>INCLUDE &lt;</b><i>filename</i><b>></b>
+<dd style="margin-left: 5.0em">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
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
 include directory.
-</dd>
-<dt>INCLUDE-IF-DEFINED name "filename"
-</dt>
-<dd></dd>
-<dt>INCLUDE-IF-DEFINED name &lt;filename>
-</dt>
-<dd>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 <i>ipptool</i> include directory.
-</dd>
-<dt>INCLUDE-IF-NOT-DEFINED name "filename"
-</dt>
-<dd></dd>
-<dt>INCLUDE-IF-NOT-DEFINED name &lt;filename>
-</dt>
-<dd>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 <i>ipptool</i> include directory.
-</dd>
-<dt>SKIP-IF-DEFINED variable-name
-</dt>
-<dd></dd>
-<dt>SKIP-IF-NOT-DEFINED variable-name
-</dt>
-<dd>Specifies that the remainder of the test file should be skipped when the
-variable is or is not defined.
-</dd>
-<dt>TRANSFER auto
-</dt>
-<dd>Specifies that tests will, by default, use "Transfer-Encoding: chunked" for
-requests with attached files and "Content-Length:" for requests without attached
-files.
-</dd>
-<dt>TRANSFER chunked
-</dt>
-<dd>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
-<i>ipptool</i> command-line. Support for chunked requests is required for
-conformance with all versions of IPP.
-</dd>
-<dt>TRANSFER length
-</dt>
-<dd>Specifies that tests will, by default, use the HTTP/1.0 "Content-Length:"
-header. This is equivalent to specifying "-l" on the <i>ipptool</i> command-line.
-Support for content length requests is required for conformance with all
-versions of IPP.
-</dd>
-<dt>VERSION 1.0
-</dt>
-<dd></dd>
-<dt>VERSION 1.1
-</dt>
-<dd></dd>
-<dt>VERSION 2.0
-</dt>
-<dd></dd>
-<dt>VERSION 2.1
-</dt>
-<dd></dd>
-<dt>VERSION 2.2
-</dt>
-<dd>Specifies the default IPP version number to use for the tests that follow.
-
-</dd>
+<dt><b>INCLUDE-IF-DEFINED </b><i>name </i><b>"</b><i>filename</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>INCLUDE-IF-DEFINED </b><i>name </i><b>&lt;</b><i>filename</i><b>></b>
+<dd style="margin-left: 5.0em">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
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+include directory.
+<dt><b>INCLUDE-IF-NOT-DEFINED </b><i>name </i><b>"</b><i>filename</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>INCLUDE-IF-NOT-DEFINED </b><i>name </i><b>&lt;</b><i>filename</i><b>></b>
+<dd style="margin-left: 5.0em">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
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+include directory.
+<dt><b>SKIP-IF-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em"><dt><b>SKIP-IF-NOT-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Specifies that the remainder of the test file should be skipped when the variable is or is not defined.
+<dt><b>STOP-AFTER-INCLUDE-ERROR no</b>
+<dd style="margin-left: 5.0em"><dt><b>STOP-AFTER-INCLUDE-ERROR yes</b>
+<dd style="margin-left: 5.0em">Specifies whether tests will be stopped after an error in an included file.
+<dt><b>TRANSFER auto</b>
+<dd style="margin-left: 5.0em">Specifies that tests will, by default, use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files.
+<dt><b>TRANSFER chunked</b>
+<dd style="margin-left: 5.0em">Specifies that tests will, by default, use the HTTP/1.1 "Transfer-Encoding: chunked" header. This is the default and is equivalent to specifying <i>-c</i> on the
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+command-line. Support for chunked requests is required for conformance with all versions of IPP.
+<dt><b>TRANSFER length</b>
+<dd style="margin-left: 5.0em">Specifies that tests will, by default, use the HTTP/1.0 "Content-Length:" header. This is equivalent to specifying <i>-l</i> on the
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+command-line. Support for content length requests is required for conformance with all versions of IPP.
+<dt><b>VERSION 1.0</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 1.1</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 2.0</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 2.1</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 2.2</b>
+<dd style="margin-left: 5.0em">Specifies the default IPP version number to use for the tests that follow.
 </dl>
-<h2 class="title"><a name="TEST_DIRECTIVES">Test Directives</a></h2>
-The following directives are understood in a test:
-<dl>
-<dt>ATTR tag attribute-name value(s)
-</dt>
-<dd>Adds an attribute to the test request. Values are separated by the comma (",")
-character - escape commas using the "" character.
-</dd>
-<dt>ATTR collection attribute-name { MEMBER tag member-name value(s) ... } [ ... { ... } ]
-</dt>
-<dd>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.
-</dd>
-<dt>DELAY seconds
-</dt>
-<dd>Specifies a delay before this test will be run.
-</dd>
-<dt>DISPLAY attribute-name
-</dt>
-<dd>Specifies that value of the named attribute should be output as part of the
+<h3><a name="TEST_DIRECTIVES">Test Directives</a></h3>
+The following directives are understood within a <i>test</i>:
+<dl class="man">
+<dt><b>ATTR </b><i>tag attribute-name value(s)</i>
+<dd style="margin-left: 5.0em">Adds an attribute to the test request. Values are separated by the comma (",") character - escape commas using the "" character. Common attributes and values are listed in the IANA IPP registry - see references below.
+<dt><b>ATTR collection </b><i>attribute-name </i><b>{ MEMBER </b><i>tag member-name value(s) ... </i><b>}</b> [ <i>... </i><b>,{ </b><i>... </i><b>} </b>]
+<dd style="margin-left: 5.0em">Adds a collection attribute to the test request. 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.
+<dt><b>COMPRESSION deflate</b>
+<dd style="margin-left: 5.0em"><dt><b>COMPRESSION gzip</b>
+<dd style="margin-left: 5.0em"><dt><b>COMPRESSION none</b>
+<dd style="margin-left: 5.0em">Uses the specified compression on the document data following the attributes in a Print-Job or Send-Document request.
+<dt><b>DELAY </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies a delay before this test will be run.
+<dt><b>DISPLAY </b><i>attribute-name</i>
+<dd style="margin-left: 5.0em">Specifies that value of the named attribute should be output as part of the
 test report.
-</dd>
-<dt>EXPECT attribute-name [ predicate(s) ]
-</dt>
-<dd></dd>
-<dt>EXPECT ?attribute-name predicate(s)
-</dt>
-<dd></dd>
-<dt>EXPECT !attribute-name
-</dt>
-<dd>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.
-</dd>
-<dt>FILE filename
-</dt>
-<dd>Specifies a file to include at the end of the request. This is typically used
-when sending a test print file.
-</dd>
-<dt>GROUP tag
-</dt>
-<dd>Specifies the group tag for subsequent attributes in the request.
-</dd>
-<dt>IGNORE-ERRORS yes
-</dt>
-<dd></dd>
-<dt>IGNORE-ERRORS no
-</dt>
-<dd>Specifies whether <i>ipptool</i> will ignore errors and continue with subsequent
-tests.
-</dd>
-<dt>NAME "literal string"
-</dt>
-<dd>Specifies the human-readable name of the test.
-</dd>
-<dt>OPERATION operation-code
-</dt>
-<dd>Specifies the operation to be performed.
-</dd>
-<dt>REQUEST-ID number
-</dt>
-<dd></dd>
-<dt>REQUEST-ID random
-</dt>
-<dd>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).
-</dd>
-<dt>RESOURCE path
-</dt>
-<dd>Specifies an alternate resource path that is used for the HTTP POST request.
-The default is the resource from the URI provided to the <i>ipptool</i> program.
-</dd>
-<dt>SKIP-IF-DEFINED variable-name
-</dt>
-<dd></dd>
-<dt>SKIP-IF-NOT-DEFINED variable-name
-</dt>
-<dd>Specifies that the current test should be skipped when the variable is or is not
-defined.
-</dd>
-<dt>SKIP-PREVIOUS-ERROR yes
-</dt>
-<dd></dd>
-<dt>SKIP-PREVIOUS-ERROR no
-</dt>
-<dd>Specifies whether <i>ipptool</i> will skip the current test if the previous test
-resulted in an error/failure.
-</dd>
-<dt>STATUS status-code [ predicate ]
-</dt>
-<dd>Specifies an expected response status-code value. Additional requirements can be
-added as predicates - see the "STATUS PREDICATES" section for more information
-on predicates.
-</dd>
-<dt>TRANSFER auto
-</dt>
-<dd>Specifies that this test will use "Transfer-Encoding: chunked" if it has an
-attached file or "Content-Length:" otherwise.
-</dd>
-<dt>TRANSFER chunked
-</dt>
-<dd>Specifies that this test will use the HTTP/1.1 "Transfer-Encoding: chunked"
-header.
-</dd>
-<dt>TRANSFER length
-</dt>
-<dd>Specifies that this test will use the HTTP/1.0 "Content-Length:" header.
-</dd>
-<dt>VERSION 1.0
-</dt>
-<dd></dd>
-<dt>VERSION 1.1
-</dt>
-<dd></dd>
-<dt>VERSION 2.0
-</dt>
-<dd></dd>
-<dt>VERSION 2.1
-</dt>
-<dd></dd>
-<dt>VERSION 2.2
-</dt>
-<dd>Specifies the IPP version number to use for this test.
-
-</dd>
+<dt><b>EXPECT </b><i>attribute-name </i>[ <i>predicate(s) </i>]
+<dd style="margin-left: 5.0em"><dt><b>EXPECT ?</b><i>attribute-name predicate(s)</i>
+<dd style="margin-left: 5.0em"><dt><b>EXPECT !</b><i>attribute-name</i>
+<dd style="margin-left: 5.0em">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".
+<dt><b>EXPECT-ALL </b><i>attribute-name </i>[ <i>predicate(s) </i>]
+<dd style="margin-left: 5.0em"><dt><b>EXPECT-ALL ?</b><i>attribute-name predicate(s)</i>
+<dd style="margin-left: 5.0em">Specifies that the response must/may include the named attribute and that all occurrences of that attribute must match the given predicates.
+<dt><b>FILE filename</b>
+<dd style="margin-left: 5.0em">Specifies a file to include at the end of the request. This is typically used when sending a test print file.
+<dt><b>GROUP tag</b>
+<dd style="margin-left: 5.0em">Specifies the group tag for subsequent attributes in the request.
+<dt><b>IGNORE-ERRORS yes</b>
+<dd style="margin-left: 5.0em"><dt><b>IGNORE-ERRORS no</b>
+<dd style="margin-left: 5.0em">Specifies whether
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+will ignore errors and continue with subsequent tests.
+<dt><b>NAME "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em">Specifies the human-readable name of the test.
+<dt><b>OPERATION </b><i>operation-code</i>
+<dd style="margin-left: 5.0em">Specifies the operation to be performed.
+<dt><b>PAUSE "</b><i>message</i><b>"</b>
+<dd style="margin-left: 5.0em">Displays the provided message and waits for the user to press a key to continue.
+<dt><b>REQUEST-ID </b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>REQUEST-ID random</b>
+<dd style="margin-left: 5.0em">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).
+<dt><b>RESOURCE </b><i>path</i>
+<dd style="margin-left: 5.0em">Specifies an alternate resource path that is used for the HTTP POST request. The default is the resource from the URI provided to the
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+program.
+<dt><b>SKIP-IF-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em"><dt><b>SKIP-IF-NOT-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Specifies that the current test should be skipped when the variable is or is not defined.
+<dt><b>SKIP-PREVIOUS-ERROR yes</b>
+<dd style="margin-left: 5.0em"><dt><b>SKIP-PREVIOUS-ERROR no</b>
+<dd style="margin-left: 5.0em">Specifies whether
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+will skip the current test if the previous test resulted in an error/failure.
+<dt><b>STATUS </b><i>status-code </i>[ <i>predicate</i> ]
+<dd style="margin-left: 5.0em">Specifies an expected response status-code value. Additional requirements can be added as predicates - see the "STATUS PREDICATES" section for more information on predicates.
+<dt><b>TEST-ID "</b><i>identifier</i>"
+<dd style="margin-left: 5.0em">Specifies an identifier string for the current test.
+<dt><b>TRANSFER auto</b>
+<dd style="margin-left: 5.0em">Specifies that this test will use "Transfer-Encoding: chunked" if it has an attached file or "Content-Length:" otherwise.
+<dt><b>TRANSFER chunked</b>
+<dd style="margin-left: 5.0em">Specifies that this test will use the HTTP/1.1 "Transfer-Encoding: chunked" header.
+<dt><b>TRANSFER length</b>
+<dd style="margin-left: 5.0em">Specifies that this test will use the HTTP/1.0 "Content-Length:" header.
+<dt><b>VERSION 1.0</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 1.1</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 2.0</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 2.1</b>
+<dd style="margin-left: 5.0em"><dt><b>VERSION 2.2</b>
+<dd style="margin-left: 5.0em">Specifies the IPP version number to use for this test.
 </dl>
-<h2 class="title"><a name="EXPECT_PREDICATES">Expect Predicates</a></h2>
-The following predicates are understood following the EXPECT test directive:
-<dl>
-<dt>COUNT number
-</dt>
-<dd>Requires the EXPECT attribute to have the specified number of values.
-</dd>
-<dt>DEFINE-MATCH variable-name
-</dt>
-<dd>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.
-</dd>
-<dt>DEFINE-NO-MATCH variable-name
-</dt>
-<dd>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.
-</dd>
-<dt>DEFINE-VALUE variable-name
-</dt>
-<dd>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.
-</dd>
-<dt>IF-DEFINED variable-name
-</dt>
-<dd>Makes the EXPECT conditions apply only if the specified variable is defined.
-</dd>
-<dt>IF-NOT-DEFINED variable-name
-</dt>
-<dd>Makes the EXPECT conditions apply only if the specified variable is not
-defined.
-</dd>
-<dt>IN-GROUP tag
-</dt>
-<dd>Requires the EXPECT attribute to be in the specified group tag.
-</dd>
-<dt>OF-TYPE tag[,tag,...]
-</dt>
-<dd>Requires the EXPECT attribute to use the specified value tag(s).
-</dd>
-<dt>REPEAT-LIMIT number
-</dt>
-<dd></dd>
-<dd>Specifies the maximum number of times to repeat. The default value is 1000.
-</dd>
-<dt>REPEAT-MATCH
-</dt>
-<dd></dd>
-<dt>REPEAT-NO-MATCH
-</dt>
-<dd>Specifies that the current test should be repeated when the EXPECT condition
-matches or does not match.
-</dd>
-<dt>SAME-COUNT-AS attribute-name
-</dt>
-<dd>Requires the EXPECT attribute to have the same number of values as the specified
-parallel attribute.
-</dd>
-<dt>WITH-ALL-VALUES "literal string"
-</dt>
-<dd>Requires that all values of the EXPECT attribute match the literal string. Comparisons are case-sensitive.
-</dd>
-<dt>WITH-ALL-VALUES &lt;number
-</dt>
-<dd></dd>
-<dt>WITH-ALL-VALUES =number
-</dt>
-<dd></dd>
-<dt>WITH-ALL-VALUES >number
-</dt>
-<dd></dd>
-<dt>WITH-ALL-VALUES number[,number,...]
-</dt>
-<dd>Requires that all values of the EXPECT attribute match the number(s) or numeric comparison. When comparing rangeOfInteger values, the "&lt;" and ">" operators only check the upper bound of the range.
-</dd>
-<dt>WITH-ALL-VALUES "false"
-</dt>
-<dd></dd>
-<dt>WITH-ALL-VALUES "true"
-</dt>
-<dd>Requires that all values of the EXPECT attribute match the boolean value given.
-</dd>
-<dt>WITH-ALL-VALUES "/regular expression/"
-</dt>
-<dd>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.
-</dd>
-<dt>WITH-VALUE "literal string"
-</dt>
-<dd>Requires that at least one value of the EXPECT attribute matches the literal string. Comparisons are case-sensitive.
-</dd>
-<dt>WITH-VALUE &lt;number
-</dt>
-<dd></dd>
-<dt>WITH-VALUE =number
-</dt>
-<dd></dd>
-<dt>WITH-VALUE >number
-</dt>
-<dd></dd>
-<dt>WITH-VALUE number[,number,...]
-</dt>
-<dd>Requires that at least one value of the EXPECT attribute matches the number(s) or numeric comparison. When comparing rangeOfInteger values, the "&lt;" and ">" operators only check the upper bound of the range.
-</dd>
-<dt>WITH-VALUE "false"
-</dt>
-<dd></dd>
-<dt>WITH-VALUE "true"
-</dt>
-<dd>Requires that at least one value of the EXPECT attribute matches the boolean value given.
-</dd>
-<dt>WITH-VALUE "/regular expression/"
-</dt>
-<dd>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.
-
-</dd>
+<h3><a name="EXPECT_PREDICATES">Expect Predicates</a></h3>
+The following predicates are understood following the <b>EXPECT</b> test directive:
+<dl class="man">
+<dt><b>COUNT </b><i>number</i>
+<dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to have the specified number of values.
+<dt><b>DEFINE-MATCH </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Defines the variable to "1" when the <b>EXPECT</b> condition matches. A side-effect of this predicate is that this <b>EXPECT</b> will never fail a test.
+<dt><b>DEFINE-NO-MATCH </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Defines the variable to "1" when the <b>EXPECT</b> condition does not match. A side-effect of this predicate is that this <b>EXPECT</b> will never fail a test.
+<dt><b>DEFINE-VALUE </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Defines the variable to the value of the attribute when the <b>EXPECT</b> condition matches. A side-effect of this predicate is that this <b>EXPECT</b> will never fail a test.
+<dt><b>IF-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Makes the <b>EXPECT</b> conditions apply only if the specified variable is defined.
+<dt><b>IF-NOT-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Makes the <b>EXPECT</b> conditions apply only if the specified variable is not defined.
+<dt><b>IN-GROUP </b><i>tag</i>
+<dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to be in the specified group tag.
+<dt><b>OF-TYPE </b><i>tag[,tag,...]</i>
+<dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to use one of the specified value tag(s).
+<dt><b>REPEAT-LIMIT </b><i>number</i>
+<dd style="margin-left: 5.0em"><br>
+Specifies the maximum number of times to repeat if the <b>REPEAT-MATCH</b> or <b>REPEAT-NO-MATCH</b> predicate is specified. The default value is 1000.
+<dt><b>REPEAT-MATCH</b>
+<dd style="margin-left: 5.0em"><dt><b>REPEAT-NO-MATCH</b>
+<dd style="margin-left: 5.0em">Specifies that the current test should be repeated when the <b>EXPECT</b> condition matches or does not match.
+<dt><b>SAME-COUNT-AS </b><i>attribute-name</i>
+<dd style="margin-left: 5.0em">Requires the <b>EXPECT</b> attribute to have the same number of values as the specified parallel attribute.
+<dt><b>WITH-ALL-HOSTNAMES "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-HOSTNAMES "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that all URI values contain a matching hostname.
+<dt><b>WITH-ALL-RESOURCES "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-RESOURCES "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that all URI values contain a matching resource (including leading /).
+<dt><b>WITH-ALL-SCHEMES "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-SCHEMES "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that all URI values contain a matching scheme.
+<dt><b>WITH-ALL-VALUES "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the literal string. Comparisons are case-sensitive.
+<dt><b>WITH-ALL-VALUES &lt;</b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-VALUES =</b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-VALUES ></b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-VALUES </b><i>number</i>[<i>,...,number</i>]
+<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the number(s) or numeric comparison. When comparing rangeOfInteger values, the "&lt;" and ">" operators only check the upper bound of the range.
+<dt><b>WITH-ALL-VALUES "false"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-ALL-VALUES "true"</b>
+<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the boolean value given.
+<dt><b>WITH-ALL-VALUES "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that all values of the <b>EXPECT</b> attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
+<dt><b>WITH-HOSTNAME "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-HOSTNAME "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that at least one URI value contains a matching hostname.
+<dt><b>WITH-RESOURCE "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-RESOURCE "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that at least one URI value contains a matching resource (including leading /).
+<dt><b>WITH-SCHEME "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-SCHEME "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that at least one URI value contains a matching scheme.
+<dt><b>WITH-VALUE "</b><i>literal string</i><b>"</b>
+<dd style="margin-left: 5.0em">Requires that at least one value of the <b>EXPECT</b> attribute matches the literal string. Comparisons are case-sensitive.
+<dt><b>WITH-VALUE &lt;</b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>WITH-VALUE =</b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>WITH-VALUE ></b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>WITH-VALUE </b><i>number</i>[<i>,...,number</i>]
+<dd style="margin-left: 5.0em">Requires that at least one value of the <b>EXPECT</b> attribute matches the number(s) or numeric comparison. When comparing rangeOfInteger values, the "&lt;" and ">" operators only check the upper bound of the range.
+<dt><b>WITH-VALUE "false"</b>
+<dd style="margin-left: 5.0em"><dt><b>WITH-VALUE "true"</b>
+<dd style="margin-left: 5.0em">Requires that at least one value of the <b>EXPECT</b> attribute matches the boolean value given.
+<dt><b>WITH-VALUE "/</b><i>regular expression</i><b>/"</b>
+<dd style="margin-left: 5.0em">Requires that at least one value of the <b>EXPECT</b> attribute matches the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
+<dt><b>WITH-VALUE-FROM </b><i>attribute-name</i>
+<dd style="margin-left: 5.0em">Requires that the value(s) of the <b>EXPECT</b> 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.
 </dl>
-<h2 class="title"><a name="STATUS_PREDICATES">Status Predicates</a></h2>
-The following predicates are understood following the STATUS test directive:
-<dl>
-<dt>DEFINE-MATCH variable-name
-</dt>
-<dd>Defines the variable to "1" when the STATUS matches. A side-effect of this predicate is that this STATUS will never fail a test.
-</dd>
-<dt>DEFINE-NO-MATCH variable-name
-</dt>
-<dd>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.
-</dd>
-<dt>IF-DEFINED variable-name
-</dt>
-<dd>Makes the STATUS apply only if the specified variable is defined.
-</dd>
-<dt>IF-NOT-DEFINED variable-name
-</dt>
-<dd>Makes the STATUS apply only if the specified variable is not defined.
-</dd>
-<dt>REPEAT-LIMIT number
-</dt>
-<dd></dd>
-<dd>Specifies the maximum number of times to repeat. The default value is 1000.
-</dd>
-<dt>REPEAT-MATCH
-</dt>
-<dd></dd>
-<dt>REPEAT-NO-MATCH
-</dt>
-<dd>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.
-
-</dd>
+<h3><a name="STATUS_PREDICATES">Status Predicates</a></h3>
+The following predicates are understood following the <b>STATUS</b> test directive:
+<dl class="man">
+<dt><b>DEFINE-MATCH </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Defines the variable to "1" when the <b>STATUS</b> matches. A side-effect of this predicate is that this <b>STATUS</b> will never fail a test.
+<dt><b>DEFINE-NO-MATCH </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Defines the variable to "1" when the <b>STATUS</b> does not match. A side-effect of this predicate is that this <b>STATUS</b> will never fail a test.
+<dt><b>IF-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Makes the <b>STATUS</b> apply only if the specified variable is defined.
+<dt><b>IF-NOT-DEFINED </b><i>variable-name</i>
+<dd style="margin-left: 5.0em">Makes the <b>STATUS</b> apply only if the specified variable is not defined.
+<dt><b>REPEAT-LIMIT </b><i>number</i>
+<dd style="margin-left: 5.0em"><br>
+Specifies the maximum number of times to repeat. The default value is 1000.
+<dt><b>REPEAT-MATCH</b>
+<dd style="margin-left: 5.0em"><dt><b>REPEAT-NO-MATCH</b>
+<dd style="margin-left: 5.0em">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.
 </dl>
-<h2 class="title"><a name="OPERATION_CODES">Operation Codes</a></h2>
-Operation codes correspond to the hexadecimal numbers (0xHHHH) and names from
-RFC 2911 and other IPP extension specifications. Here is a complete list:
-<pre>
+<h3><a name="OPERATION_CODES">Operation Codes</a></h3>
+Operation codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC 2911 and other IPP extension specifications. Here is a complete list of names supported by
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8):</a>
+<pre class="man">
+
     Activate-Printer
     CUPS-Accept-Jobs
     CUPS-Add-Modify-Class
@@ -461,8 +301,8 @@ RFC 2911 and other IPP extension specifications. Here is a complete list:
     Cancel-Subscription
     Close-Job
     Create-Job
-    Create-Job-Subscription
-    Create-Printer-Subscription
+    Create-Job-Subscriptions
+    Create-Printer-Subscriptions
     Deactivate-Printer
     Disable-Printer
     Enable-Printer
@@ -494,6 +334,7 @@ RFC 2911 and other IPP extension specifications. Here is a complete list:
     Resume-Printer
     Schedule-Job-After
     Send-Document
+    Send-Hardcopy-Document
     Send-Notifications
     Send-URI
     Set-Job-Attributes
@@ -504,11 +345,15 @@ RFC 2911 and other IPP extension specifications. Here is a complete list:
     Validate-Document
     Validate-Job
 </pre>
+<h3><a name="STATUS_CODES">Status Codes</a></h3>
+Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC 2911 and other IPP extension specifications. Here is a complete list of the names supported by
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8):</a>
+<pre class="man">
 
-<h2 class="title"><a name="STATUS_CODES">Status Codes</a></h2>
-Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC
-2911 and other IPP extension specifications. Here is a complete list:
-<pre>
+    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
@@ -537,6 +382,10 @@ Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC
     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
@@ -559,11 +408,11 @@ Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC
     successful-ok-ignored-subscriptions
     successful-ok-too-many-events
 </pre>
+<h3><a name="TAGS">Tags</a></h3>
+Value and group tags correspond to the names from RFC 2911 and other IPP extension specifications. Here are the group tags:
+<pre class="man">
 
-<h2 class="title"><a name="TAGS">Tags</a></h2>
-Value and group tags correspond to the names from RFC 2911 and other IPP
-extension specifications. Here are the group tags:
-<pre>
+    document-attributes-tag
     event-notification-attributes-tag
     job-attributes-tag
     operation-attributes-tag
@@ -572,7 +421,8 @@ extension specifications. Here are the group tags:
     unsupported-attributes-tag
 </pre>
 <p>Here are the value tags:
-<pre>
+<pre class="man">
+
     admin-define
     boolean
     charset
@@ -599,78 +449,59 @@ extension specifications. Here are the group tags:
     uri
     uriScheme
 </pre>
-
-<h2 class="title"><a name="VARIABLES">Variables</a></h2>
-The <i>ipptool</i> 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:
-<dl>
-<dt>$$
-</dt>
-<dd>Inserts a single "$" character.
-</dd>
-<dt>$ENV[name]
-</dt>
-<dd>Inserts the value of the named environment variable, or an empty string if the
-environment variable is not defined.
-</dd>
-<dt>$filename
-</dt>
-<dd>Inserts the filename provided to <i>ipptool</i> with the "-f" option.
-</dd>
-<dt>$hostname
-</dt>
-<dd>Inserts the hostname from the URI provided to <i>ipptool</i>.
-</dd>
-<dt>$job-id
-</dt>
-<dd>Inserts the last job-id value returned in a test response or 0 if no job-id has
-been seen.
-</dd>
-<dt>$job-uri
-</dt>
-<dd>Inserts the last job-uri value returned in a test response or an empty string if
-no job-uri has been seen.
-</dd>
-<dt>$scheme
-</dt>
-<dd>Inserts the scheme from the URI provided to <i>ipptool</i>.
-</dd>
-<dt>$notify-subscription-id
-</dt>
-<dd>Inserts the last notify-subscription-id value returned in a test response or 0 if
-no notify-subscription-id has been seen.
-</dd>
-<dt>$port
-</dt>
-<dd>Inserts the port number from the URI provided to <i>ipptool</i>.
-</dd>
-<dt>$resource
-</dt>
-<dd>Inserts the resource path from the URI provided to <i>ipptool</i>.
-</dd>
-<dt>$uri
-</dt>
-<dd>Inserts the URI provided to <i>ipptool</i>.
-</dd>
-<dt>$user
-</dt>
-<dd>Inserts the current user's login name.
-</dd>
-<dt>$username
-</dt>
-<dd>Inserts the username from the URI provided to <i>ipptool</i>, if any.
-
-</dd>
+<h3><a name="VARIABLES">Variables</a></h3>
+The
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+program maintains a list of variables that can be used in any literal string or attribute value by specifying "<i>$variable-name</i>". Aside from variables defined using the <i>-d</i> option or <b>DEFINE</b> directive, the following pre-defined variables are available:
+<dl class="man">
+<dt><b>$$</b>
+<dd style="margin-left: 5.0em">Inserts a single "$" character.
+<dt><b>$ENV[</b><i>name</i><b>]</b>
+<dd style="margin-left: 5.0em">Inserts the value of the named environment variable, or an empty string if the environment variable is not defined.
+<dt><b>$filename</b>
+<dd style="margin-left: 5.0em">Inserts the filename provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+with the <i>-f</i> option.
+<dt><b>$filetype</b>
+<dd style="margin-left: 5.0em">Inserts the MIME media type for the filename provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8)</a>
+with the <i>-f</i> option.
+<dt><b>$hostname</b>
+<dd style="margin-left: 5.0em">Inserts the hostname from the URI provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8).</a>
+<dt><b>$job-id</b>
+<dd style="margin-left: 5.0em">Inserts the last "job-id" attribute value returned in a test response or 0 if no "job-id" attribute has been seen.
+<dt><b>$job-uri</b>
+<dd style="margin-left: 5.0em">Inserts the last "job-uri" attribute value returned in a test response or an empty string if no "job-uri" attribute has been seen.
+<dt><b>$notify-subscription-id</b>
+<dd style="margin-left: 5.0em">Inserts the last "notify-subscription-id" attribute value returned in a test response or 0 if no "notify-subscription-id" attribute has been seen.
+<dt><b>$port</b>
+<dd style="margin-left: 5.0em">Inserts the port number from the URI provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8).</a>
+<dt><b>$resource</b>
+<dd style="margin-left: 5.0em">Inserts the resource path from the URI provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8).</a>
+<dt><b>$scheme</b>
+<dd style="margin-left: 5.0em">Inserts the scheme from the URI provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8).</a>
+<dt><b>$uri</b>
+<dd style="margin-left: 5.0em">Inserts the URI provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8).</a>
+<dt><b>$uriuser</b>
+<dd style="margin-left: 5.0em">Inserts the username from the URI provided to
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(8),</a>
+if any.
+<dt><b>$user</b>
+<dd style="margin-left: 5.0em">Inserts the current user's login name.
 </dl>
 <h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
-<a href='man-ipptool.html?TOPIC=Man+Pages'>ipptool(1)</a>,
-<br>
-<a href='http://localhost:631/help'>http://localhost:631/help</a>
-
+<a href="man-ipptool.html?TOPIC=Man+Pages"><b>ipptool</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help)">http://localhost:631/help)</a>,
+IANA IPP Registry (<a href="http://www.iana.org/assignments/ipp-registrations)">http://www.iana.org/assignments/ipp-registrations)</a>,
+PWG Internet Printing Protocol Workgroup (<a href="http://www.pwg.org/ipp)">http://www.pwg.org/ipp)</a>,
+RFC 2911 (<a href="http://tools.ietf.org/html/rfc3911">http://tools.ietf.org/html/rfc3911</a>)
 <h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
-Copyright 2007-2013 by Apple Inc.
+Copyright &copy; 2007-2015 by Apple Inc.
 
 </body>
 </html>
diff --git a/doc/help/man-lp.html b/doc/help/man-lp.html
new file mode 100644 (file)
index 0000000..73d7c2d
--- /dev/null
@@ -0,0 +1,193 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>lp(1)</title>
+</head>
+<body>
+<h1 class="title">lp(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lp - print files
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lp</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-c</b>
+] [
+<b>-d </b><i>destination</i>[<b>/</b><i>instance</i>]
+] [
+<b>-h </b><i>hostname</i>[<b>:</b><i>port</i>]
+] [
+<b>-m</b>
+] [
+<b>-n</b>
+<i>num-copies</i>
+] [
+<b>-o </b><i>option</i>[<b>=</b><i>value</i>]
+] [
+<b>-q</b>
+<i>priority</i>
+] [
+<b>-s</b>
+] [
+<b>-t</b>
+<i>title</i>
+] [
+<b>-H</b>
+<i>handling</i>
+] [
+<b>-P</b>
+<i>page-list</i>
+] [
+<b>--</b>
+] [
+<i>file(s)</i>
+]
+<br>
+<b>lp</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-c</b>
+] [
+<b>-h </b><i>hostname</i>[<b>:</b><i>port</i>]
+] [
+<b>-i</b>
+<i>job-id</i>
+] [
+<b>-n</b>
+<i>num-copies</i>
+] [
+<b>-o </b><i>option</i>[<b>=</b><i>value</i>]
+] [
+<b>-q</b>
+<i>priority</i>
+] [
+<b>-t</b>
+<i>title</i>
+] [
+<b>-H</b>
+<i>handling</i>
+] [
+<b>-P</b>
+<i>page-list</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lp</b> submits files for printing or alters a pending job.
+Use a filename of "-" to force printing from the standard input.
+<h3><a name="THE_DEFAULT_DESTINATION">The Default Destination</a></h3>
+CUPS provides many ways to set the default destination. The <b>LPDEST</b> and <b>PRINTER</b> environment variables are consulted first.
+If neither are set, the current default set using the
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1)</a>
+command is used, followed by the default set using the
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8)</a>
+command.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options are recognized by <i>lp</i>:
+<dl class="man">
+<dt><b>--</b>
+<dd style="margin-left: 5.0em">Marks the end of options; use this to print a file whose name begins with a dash (-).
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies the username to use when connecting to the server.
+<dt><b>-c</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>-d </b><i>destination</i>
+<dd style="margin-left: 5.0em">Prints files to the named printer.
+<dt><b>-h </b><i>hostname</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Chooses an alternate server.
+<dt><b>-i </b><i>job-id</i>
+<dd style="margin-left: 5.0em">Specifies an existing job to modify.
+<dt><b>-m</b>
+<dd style="margin-left: 5.0em">Sends an email when the job is completed.
+<dt><b>-n </b><i>copies</i>
+<dd style="margin-left: 5.0em">Sets the number of copies to print.
+<dt><b>-o "</b><i>name</i><b>=</b><i>value </i>[ ... <i>name</i><b>=</b><i>value </i>]<b>"</b>
+<dd style="margin-left: 5.0em">Sets one or more job options.
+<dt><b>-q </b><i>priority</i>
+<dd style="margin-left: 5.0em">Sets the job priority from 1 (lowest) to 100 (highest).
+The default priority is 50.
+<dt><b>-s</b>
+<dd style="margin-left: 5.0em">Do not report the resulting job IDs (silent mode.)
+<dt><b>-t "</b><i>name</i><b>"</b>
+<dd style="margin-left: 5.0em">Sets the job name.
+<dt><b>-H </b><i>hh:mm</i>
+<dd style="margin-left: 5.0em"><dt><b>-H hold</b>
+<dd style="margin-left: 5.0em"><dt><b>-H immediate</b>
+<dd style="margin-left: 5.0em"><dt><b>-H restart</b>
+<dd style="margin-left: 5.0em"><dt><b>-H resume</b>
+<dd style="margin-left: 5.0em">Specifies when the job should be printed.
+A value of <i>immediate</i> will print the file immediately, a value of <i>hold</i> 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 <i>resume</i> with the <i>-i</i> option to resume a held job.
+Use a value of <i>restart</i> with the <i>-i</i> option to restart a completed job.
+<dt><b>-P </b><i>page-list</i>
+<dd style="margin-left: 5.0em">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.
+</dl>
+<h3><a name="COMMON_JOB_OPTIONS">Common Job Options</a></h3>
+Aside from the printer-specific options reported by the
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1)</a>
+command, the following generic options are available:
+<dl class="man">
+<dt><b>-o media=</b><i>size</i>
+<dd style="margin-left: 5.0em">Sets the page size to <i>size</i>. Most printers support at least the size names "a4", "letter", and "legal".
+<dt><b>-o orientation-requested=4</b>
+<dd style="margin-left: 5.0em">Prints the job in landscape (rotated 90 degrees).
+<dt><b>-o sides=one-sided</b>
+<dd style="margin-left: 5.0em">Prints on one side of the paper.
+<dt><b>-o sides=two-sided-long-edge</b>
+<dd style="margin-left: 5.0em">Prints on both sides of the paper for portrait output.
+<dt><b>-o sides=two-sided-short-edge</b>
+<dd style="margin-left: 5.0em">Prints on both sides of the paper for landscape output.
+<dt><b>-o fit-to-page</b>
+<dd style="margin-left: 5.0em">Scales the print file to fit on the page.
+<dt><b>-o number-up=</b>{<i>2|4|6|9|16</i>}
+<dd style="margin-left: 5.0em">Prints 2, 4, 6, 9, or 16 document (input) pages on each output page.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+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 <i>not</i> case-sensitive.
+<p>The <i>-q</i> 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).
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Print two copies of a document to the default printer:
+<pre class="man">
+
+    lp -n 2 filename
+
+</pre>
+Print a double-sided legal document to a printer called "foo":
+<pre class="man">
+
+    lp -d foo -o media=legal -o sides=two-sided-long-edge filename
+
+</pre>
+Print a presentation document 2-up to a printer called "foo":
+<pre class="man">
+
+    lp -d foo -o number-up=2 filename
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1),</a>
+<a href="man-lpq.html?TOPIC=Man+Pages"><b>lpq</b>(1),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpadmin.html b/doc/help/man-lpadmin.html
new file mode 100644 (file)
index 0000000..2a74cf0
--- /dev/null
@@ -0,0 +1,182 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>lpadmin(8)</title>
+</head>
+<body>
+<h1 class="title">lpadmin(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpadmin - configure cups printers and classes
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpadmin</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+]
+<b>-d</b>
+<i>destination</i>
+<br>
+<b>lpadmin</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+]
+<b>-p</b>
+<i>destination</i>
+[
+<b>-R</b>
+<i>name-default</i>
+]
+<i>option(s)</i>
+<br>
+<b>lpadmin</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+]
+<b>-x</b>
+<i>destination</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpadmin</b> configures printer and class queues provided by CUPS.
+It can also be used to set the server default printer or class.
+<p>When specified before the <i>-d</i>, <i>-p</i>, or <i>-x</i> options, the <i>-E</i> option forces encryption when connecting to the server.
+<p>The first form of the command (<i>-d</i>) sets the default printer or class to <i>destination</i>.
+Subsequent print jobs submitted via the
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1)</a>
+or
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1)</a>
+commands will use this destination unless the user specifies otherwise with the
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1)</a>
+command.
+<p>The second form of the command (<i>-p</i>) configures the named printer or class.  The additional options are described below.
+<p>The third form of the command (<i>-x</i>) deletes the printer or class <i>destination</i>.
+Any jobs that are pending for the destination will be removed and any job that is currently printed will be aborted.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options are recognized when configuring a printer queue:
+<dl class="man">
+<dt><b>-c </b><i>class</i>
+<dd style="margin-left: 5.0em">Adds the named <i>printer</i> to <i>class</i>.
+If <i>class</i> does not exist it is created automatically.
+<dt><b>-i </b><i>interface</i>
+<dd style="margin-left: 5.0em">Sets a System V style interface script for the printer.
+This option cannot be specified with the <i>-P</i> option (PPD file) and is intended for providing support for legacy printer drivers.
+<dt><b>-m </b><i>model</i>
+<dd style="margin-left: 5.0em">Sets a standard System V interface script or PPD file for the printer from the <i>model</i> directory or using one of the driver interfaces.
+Use the <i>-m</i> option with the
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8)</a>
+command to get a list of supported models.
+The model "raw" clears any existing interface script or PPD file and the model "everywhere" queries the printer referred to by the specified IPP <i>device-uri</i>.
+<dt><b>-o cupsIPPSupplies=true</b>
+<dd style="margin-left: 5.0em"><dt><b>-o cupsIPPSupplies=false</b>
+<dd style="margin-left: 5.0em">Specifies whether IPP supply level values should be reported.
+<dt><b>-o cupsSNMPSupplies=true</b>
+<dd style="margin-left: 5.0em"><dt><b>-o cupsSNMPSupplies=false</b>
+<dd style="margin-left: 5.0em">Specifies whether SNMP supply level (RFC 3805) values should be reported.
+<dt><b>-o job-k-limit=</b><i>value</i>
+<dd style="margin-left: 5.0em">Sets the kilobyte limit for per-user quotas.
+The value is an integer number of kilobytes; one kilobyte is 1024 bytes.
+<dt><b>-o job-page-limit=</b><i>value</i>
+<dd style="margin-left: 5.0em">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.
+<dt><b>-o job-quota-period=</b><i>value</i>
+<dd style="margin-left: 5.0em">Sets the accounting period for per-user quotas.
+The value is an integer number of seconds; 86,400 seconds are in one day.
+<dt><b>-o job-sheets-default=</b><i>banner</i>
+<dd style="margin-left: 5.0em"><dt><b>-o job-sheets-default=</b><i>banner</i><b>,</b><i>banner</i>
+<dd style="margin-left: 5.0em">Sets the default banner page(s) to use for print jobs.
+<dt><b>-o </b><i>name</i><b>=</b><i>value</i>
+<dd style="margin-left: 5.0em">Sets a PPD option for the printer.
+PPD options can be listed using the <i>-l</i> option with the
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1)</a>
+command.
+<dt><b>-o </b><i>name</i><b>-default=</b><i>value</i>
+<dd style="margin-left: 5.0em">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.
+<dt><b>-o port-monitor=</b><i>name</i>
+<dd style="margin-left: 5.0em">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.
+<dt><b>-o printer-error-policy=</b><i>name</i>
+<dd style="margin-left: 5.0em">Sets the error policy to be used when the printer backend is unable to send the job to the printer.
+The name must be one of "abort-job", "retry-job", "retry-current-job", or "stop-printer".
+The default error policy is "stop-printer" for printers and "retry-current-job" for
+classes.
+<dt><b>-o printer-is-shared=true</b>
+<dd style="margin-left: 5.0em"><dt><b>-o printer-is-shared=false</b>
+<dd style="margin-left: 5.0em">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 <i>cupsd.conf</i>, while unshared/unpublished destinations are not announced.
+The default value is "true".
+<dt><b>-o printer-op-policy=</b><i>name</i>
+<dd style="margin-left: 5.0em">Sets the IPP operation policy associated with the destination.
+The name must be defined in the <i>cupsd.conf</i> in a Policy section.
+The default operation policy is "default".
+<dt><b>-R </b><i>name</i><b>-default</b>
+<dd style="margin-left: 5.0em">Deletes the named option from <i>printer</i>.
+<dt><b>-r </b><i>class</i>
+<dd style="margin-left: 5.0em">Removes the named <i>printer</i> from <i>class</i>.
+If the resulting class becomes empty it is removed.
+<dt><b>-u allow:</b>{<i>user</i>|<b>@</b><i>group</i>}{<b>,</b><i>user</i>|<b>,@</b><i>group</i>}*
+<dd style="margin-left: 5.0em"><dt><b>-u deny:</b>{<i>user</i>|<b>@</b><i>group</i>}{<b>,</b><i>user</i>|<b>,@</b><i>group</i>}*
+<dd style="margin-left: 5.0em"><dt><b>-u allow:all</b>
+<dd style="margin-left: 5.0em"><dt><b>-u deny:none</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>-v "</b><i>device-uri</i><b>"</b>
+<dd style="margin-left: 5.0em">Sets the <i>device-uri</i> attribute of the printer queue.
+Use the <i>-v</i> option with the
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8)</a>
+command to get a list of supported device URIs and schemes.
+<dt><b>-D "</b><i>info</i><b>"</b>
+<dd style="margin-left: 5.0em">Provides a textual description of the destination.
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Enables the destination and accepts jobs; this is the same as running the
+<a href="man-cupsaccept.html?TOPIC=Man+Pages"><b>cupsaccept</b>(8)</a>
+and
+<a href="man-cupsenable.html?TOPIC=Man+Pages"><b>cupsenable</b>(8)</a>
+programs on the destination.
+<dt><b>-L "</b><i>location</i><b>"</b>
+<dd style="margin-left: 5.0em">Provides a textual location of the destination.
+<dt><b>-P </b><i>ppd-file</i>
+<dd style="margin-left: 5.0em">Specifies a PostScript Printer Description file to use with the printer.
+If specified, this option overrides the <i>-i</i> option (interface script).
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+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 <i>not</i> case-sensitive.
+Finally, the CUPS version of <b>lpadmin</b> 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.
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+The CUPS version of <b>lpadmin</b> does not support all of the System V or Solaris printing system configuration options.
+<h2 class="title"><a name="EXAMPLE">Example</a></h2>
+Create an IPP Everywhere print queue:
+<pre class="man">
+
+    lpadmin -p myprinter -E -v ipp://myprinter.local/ipp/print -m everywhere
+
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsaccept.html?TOPIC=Man+Pages"><b>cupsaccept</b>(8),</a>
+<a href="man-cupsenable.html?TOPIC=Man+Pages"><b>cupsenable</b>(8),</a>
+<a href="man-lpinfo.html?TOPIC=Man+Pages"><b>lpinfo</b>(8),</a>
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpc.html b/doc/help/man-lpc.html
new file mode 100644 (file)
index 0000000..e482a78
--- /dev/null
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>lpc(8)</title>
+</head>
+<body>
+<h1 class="title">lpc(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpc - line printer control program
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpc</b>
+[
+<i>command</i>
+[
+<i>parameter(s)</i>
+] ]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpc</b> provides limited control over printer and class queues provided by CUPS. It can also be used to query the state of queues.
+<p>If no command is specified on the command-line, <b>lpc</b> displays a prompt and accepts commands from the standard input.
+<h3><a name="COMMANDS">Commands</a></h3>
+The <b>lpc</b> program accepts a subset of commands accepted by the Berkeley <b>lpc</b> program of the same name:
+<dl class="man">
+<dt><b>exit</b>
+<dd style="margin-left: 5.0em">Exits the command interpreter.
+<dt><b>help </b>[<i>command</i>]
+<dd style="margin-left: 5.0em"><dt><b>? </b>[<i>command</i>]
+<dd style="margin-left: 5.0em">Displays a short help message.
+<dt><b>quit</b>
+<dd style="margin-left: 5.0em">Exits the command interpreter.
+<dt><b>status </b>[<i>queue</i>]
+<dd style="margin-left: 5.0em">Displays the status of one or more printer or class queues.
+</dl>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+Since <b>lpc</b> is geared towards the Berkeley printing system, it is impossible to use <b>lpc</b> to configure printer or class queues provided by CUPS.
+To configure printer or class queues you must use the
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8)</a>
+command or another CUPS-compatible client with that functionality.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-cupsaccept.html?TOPIC=Man+Pages"><b>cupsaccept</b>(8),</a>
+<a href="man-cupsenable.html?TOPIC=Man+Pages"><b>cupsenable</b>(8),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpinfo.html b/doc/help/man-lpinfo.html
new file mode 100644 (file)
index 0000000..bafd2bf
--- /dev/null
@@ -0,0 +1,123 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>lpinfo(8)</title>
+</head>
+<body>
+<h1 class="title">lpinfo(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpinfo - show available devices or drivers
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpinfo</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-l</b>
+] [
+<b>--device-id</b>
+<i>device-id-string</i>
+] [
+<b>--exclude-schemes</b>
+<i>scheme-list</i>
+] [
+<b>--include-schemes</b>
+<i>scheme-list</i>
+] [
+<b>--language</b>
+<i>locale</i>
+] [
+<b>--make-and-model</b>
+<i>name</i>
+] [
+<b>--product</b>
+<i>name</i>
+]
+<b>-m</b>
+<br>
+<b>lpinfo</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-l</b>
+] [
+<b>--exclude-schemes</b>
+<i>scheme-list</i>
+] [
+<b>--include-schemes</b>
+<i>scheme-list</i>
+] [
+<b>--timeout</b>
+<i>seconds</i>
+]
+<b>-v</b>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpinfo</b> lists the available devices or drivers known to the CUPS server.
+The first form (<i>-m</i>) lists the available drivers, while the second form (<i>-v</i>) lists the available devices.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>lpinfo</b> accepts the following options:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Sets the username to use when connecting to the server.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Selects an alternate server.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">Shows a "long" listing of devices or drivers.
+<dt><b>--device-id </b><i>device-id-string</i>
+<dd style="margin-left: 5.0em">Specifies the IEEE-1284 device ID to match when listing drivers with the <i>-m</i> option.
+<dt><b>--exclude-schemes </b><i>scheme-list</i>
+<dd style="margin-left: 5.0em">Specifies a comma-delimited list of device or PPD schemes that should be excluded from the results.
+Static PPD files use the "file" scheme.
+<dt><b>--include-schemes </b><i>scheme-list</i>
+<dd style="margin-left: 5.0em">Specifies a comma-delimited list of device or PPD schemes that should be included in the results.
+Static PPD files use the "file" scheme.
+<dt><b>--language </b><i>locale</i>
+<dd style="margin-left: 5.0em">Specifies the language to match when listing drivers with the <i>-m</i> option.
+<dt><b>--make-and-model </b><i>name</i>
+<dd style="margin-left: 5.0em">Specifies the make and model to match when listing drivers with the <i>-m</i> option.
+<dt><b>--product </b><i>name</i>
+<dd style="margin-left: 5.0em">Specifies the product to match when listing drivers with the <i>-m</i> option.
+<dt><b>--timeout </b><i>seconds</i>
+<dd style="margin-left: 5.0em">Specifies the timeout when listing devices with the <i>-v</i> option.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The <i>lpinfo</i> command is unique to CUPS.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+List all devices:
+<pre class="man">
+
+    lpinfo -v
+
+</pre>
+List all drivers:
+<pre class="man">
+
+    lpinfo -m
+
+</pre>
+List drivers matching "HP LaserJet":
+<pre class="man">
+
+    lpinfo --make-and-model "HP LaserJet" -m
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpmove.html b/doc/help/man-lpmove.html
new file mode 100644 (file)
index 0000000..8e902cd
--- /dev/null
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>lpmove(8)</title>
+</head>
+<body>
+<h1 class="title">lpmove(8)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpmove - move a job or all jobs to a new destination
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpmove</b>
+[
+<b>-E</b>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-U</b>
+<i>username</i>
+]
+<i>job</i>
+<i>destination</i>
+<br>
+<b>lpmove</b>
+[
+<b>-E</b>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-U</b>
+<i>username</i>
+]
+<i>source</i>
+<i>destination</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpmove</b> moves the specified <i>job</i> or all jobs from <i>source</i> to <i>destination</i>. <i>job</i> can be the job ID number or the old destination and job ID.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The <b>lpmove</b> command supports the following options:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies an alternate username.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate server.
+</dl>
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Move job 123 from "oldprinter" to "newprinter":
+<pre class="man">
+
+    lpmove 123 newprinter
+
+            <i>or</i>
+
+    lpmove oldprinter-123 newprinter
+
+</pre>
+Move all jobs from "oldprinter" to "newprinter":
+<pre class="man">
+
+    lpmove oldprinter newprinter
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+<br>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpoptions.html b/doc/help/man-lpoptions.html
new file mode 100644 (file)
index 0000000..0aeed45
--- /dev/null
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>lpoptions(1)</title>
+</head>
+<body>
+<h1 class="title">lpoptions(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpoptions - display or set printer options and defaults
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpoptions</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+]
+<b>-d </b><i>destination</i>[<b>/</b><i>instance</i>]
+[
+<b>-l</b>
+]
+<br>
+<b>lpoptions</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-p </b><i>destination</i>[<b>/</b><i>instance</i>]
+]
+<b>-o </b><i>option</i>[<b>=</b><i>value</i>] ...
+<br>
+<b>lpoptions</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-p </b><i>destination</i>[<b>/</b><i>instance</i>]
+]
+<b>-r</b>
+<i>option</i>
+<br>
+<b>lpoptions</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+]
+<b>-x </b><i>destination</i>[<b>/</b><i>instance</i>]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpoptions</b> displays or sets printer options and defaults.
+If no printer is specified using the <i>-p</i> option, the default printer is used as described in
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1).</a>
+<p>If no <i>-l</i>, <i>-o</i>, or <i>-r</i> options are specified, the current options are reported on the standard output.
+<p>Options set with the <b>lpoptions</b> command are used by the
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1)</a>
+and
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1)</a>
+commands when submitting jobs.
+<p>When run by the root user, <b>lpoptions</b> gets and sets default options and instances for all users in the <i>/etc/cups/lpoptions</i> file.
+Otherwise, the per-user defaults are managed in the <i>~/.cups/lpoptions</i> file.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>lpoptions</b> supports the following options:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Enables encryption when communicating with the CUPS server.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Uses an alternate username.
+<dt><b>-d </b><i>destination</i>[<b>/</b><i>instance</i>]
+<dd style="margin-left: 5.0em">Sets the user default printer to <i>destination</i>.
+If <i>instance</i> is supplied then that particular instance is used.
+This option overrides the system default printer for the current user.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Uses an alternate server.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">Lists the printer specific options and their current settings.
+<dt><b>-o </b><i>option</i>[<b>=</b><i>value</i>]
+<dd style="margin-left: 5.0em">Specifies a new option for the named destination.
+<dt><b>-p </b><i>destination</i>[<b>/</b><i>instance</i>]
+<dd style="margin-left: 5.0em">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
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8)</a>
+program.
+<dt><b>-r </b><i>option</i>
+<dd style="margin-left: 5.0em">Removes the specified option from the named destination.
+<dt><b>-x </b><i>destination</i>[<b>/</b><i>instance</i>]
+<dd style="margin-left: 5.0em">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
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8)</a>
+command.
+</dl>
+<h2 class="title"><a name="FILES">Files</a></h2>
+<i>~/.cups/lpoptions</i> - user defaults and instances created by non-root users.
+<br>
+<i>/etc/cups/lpoptions</i> - system-wide defaults and instances created by the root user.
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The <b>lpoptions</b> command is unique to CUPS.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpq.html b/doc/help/man-lpq.html
new file mode 100644 (file)
index 0000000..d54378e
--- /dev/null
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>lpq(1)</title>
+</head>
+<body>
+<h1 class="title">lpq(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpq - show printer queue status
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpq</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-P </b><i>destination</i>[<b>/</b><i>instance</i>]
+] [
+<b>-a</b>
+] [
+<b>-l</b>
+] [
+<b>+</b><i>interval</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpq</b> 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.
+<p>The <i>+interval</i> option allows you to continuously report the jobs in the queue until the queue is empty; the list of jobs is shown once every <i>interval</i> seconds.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>lpq</b> supports the following options:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-P </b><i>destination</i>[<b>/</b><i>instance</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate printer or class name.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies an alternate username.
+<dt><b>-a</b>
+<dd style="margin-left: 5.0em">Reports jobs on all printers.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate server.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">Requests a more verbose (long) reporting format.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpr.html b/doc/help/man-lpr.html
new file mode 100644 (file)
index 0000000..98fc7c6
--- /dev/null
@@ -0,0 +1,130 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>lpr(1)</title>
+</head>
+<body>
+<h1 class="title">lpr(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpr - print files
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpr</b>
+[
+<b>-E</b>
+] [
+<b>-H </b><i>server</i>[<b>:</b><i>port</i>]
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-P </b><i>destination</i>[<b>/</b><i>instance</i>]
+] [
+<b>-#</b>
+<i>num-copies</i>
+[
+<b>-h</b>
+] [
+<b>-l</b>
+] [
+<b>-m</b>
+] [
+<b>-o </b><i>option</i>[<b>=</b><i>value</i>]
+] [
+<b>-p</b>
+] [
+<b>-q</b>
+] [
+<b>-r</b>
+] [
+<b>-C</b>
+<i>title</i>
+] [
+<b>-J</b>
+<i>title</i>
+] [
+<b>-T</b>
+<i>title</i>
+] [
+<i>file(s)</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpr</b> 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, <b>lpr</b> reads the print file from the standard input.
+<h3><a name="THE_DEFAULT_DESTINATION">The Default Destination</a></h3>
+CUPS provides many ways to set the default destination. The <b>LPDEST</b> and <b>PRINTER</b> environment variables are consulted first.
+If neither are set, the current default set using the
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1)</a>
+command is used, followed by the default set using the
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8)</a>
+command.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The following options are recognized by <i>lpr</i>:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-H </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate server.
+<dt><b>-C "</b><i>name</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>-J "</b><i>name</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>-T "</b><i>name</i><b>"</b>
+<dd style="margin-left: 5.0em">Sets the job name/title.
+<dt><b>-P </b><i>destination</i>[<b>/</b><i>instance</i>]
+<dd style="margin-left: 5.0em">Prints files to the named printer.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies an alternate username.
+<dt><b>-# </b><i>copies</i>
+<dd style="margin-left: 5.0em">Sets the number of copies to print.
+<dt><b>-h</b>
+<dd style="margin-left: 5.0em">Disables banner printing. This option is equivalent to <i>-o job-sheets=none</i>.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">Specifies that the print file is already formatted for the destination and should be sent without filtering.
+This option is equivalent to <i>-o raw</i>.
+<dt><b>-m</b>
+<dd style="margin-left: 5.0em">Send an email on job completion.
+<dt><b>-o </b><i>option</i>[<b>=</b><i>value</i>]
+<dd style="margin-left: 5.0em">Sets a job option.
+<dt><b>-p</b>
+<dd style="margin-left: 5.0em">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 <i>-o prettyprint</i> and is only useful when printing text files.
+<dt><b>-q</b>
+<dd style="margin-left: 5.0em">Hold job for printing.
+<dt><b>-r</b>
+<dd style="margin-left: 5.0em">Specifies that the named print files should be deleted after submitting them.
+</dl>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+The <i>-c</i>, <i>-d</i>, <i>-f</i>, <i>-g</i>, <i>-i</i>, <i>-n</i>, <i>-t</i>, <i>-v</i>, and <i>-w</i> options are not supported by CUPS and produce a warning message if used.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Print two copies of a document to the default printer:
+<pre class="man">
+
+    lpr -# 2 filename
+
+</pre>
+Print a double-sided legal document to a printer called "foo":
+<pre class="man">
+
+    lpr -P foo -o media=legal -o sides=two-sided-long-edge filename
+
+</pre>
+Print a presentation document 2-up to a printer called "foo":
+<pre class="man">
+
+    lpr -P foo -o number-up=2 filename
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpadmin.html?TOPIC=Man+Pages"><b>lpadmin</b>(8),</a>
+<a href="man-lpoptions.html?TOPIC=Man+Pages"><b>lpoptions</b>(1),</a>
+<a href="man-lpq.html?TOPIC=Man+Pages"><b>lpq</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lprm.html b/doc/help/man-lprm.html
new file mode 100644 (file)
index 0000000..558da4e
--- /dev/null
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>lprm(1)</title>
+</head>
+<body>
+<h1 class="title">lprm(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lprm - cancel print jobs
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lprm</b>
+[
+<b>-E</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h</b>
+<i>server</i>[<i>:port</i>]
+] [
+<b>-P</b>
+<i>destination</i>[<i>/instance</i>]
+] [
+<b>-</b>
+] [
+<i>job-id(s)</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lprm</b>
+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 <i>-</i> option to cancel all jobs.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The
+<b>lprm</b>
+command supports the following options:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-P </b><i>destination</i>[<i>/instance</i>]
+<dd style="margin-left: 5.0em">Specifies the destination printer or class.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies an alternate username.
+<dt><b>-h </b><i>server</i>[<i>:port</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate server.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+The CUPS version of
+<b>lprm</b>
+is compatible with the standard Berkeley command of the same name.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Cancel the current job on the default printer:
+<pre class="man">
+
+    lprm
+
+</pre>
+Cancel job 1234:
+<pre class="man">
+
+    lprm 1234
+
+</pre>
+Cancel all jobs:
+<pre class="man">
+
+    lprm -
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpq.html?TOPIC=Man+Pages"><b>lpq</b>(1),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lpstat.html?TOPIC=Man+Pages"><b>lpstat</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-lpstat.html b/doc/help/man-lpstat.html
new file mode 100644 (file)
index 0000000..3b7024e
--- /dev/null
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>lpstat(1)</title>
+</head>
+<body>
+<h1 class="title">lpstat(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+lpstat - print cups status information
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>lpstat</b>
+[
+<b>-E</b>
+] [
+<b>-H</b>
+] [
+<b>-U</b>
+<i>username</i>
+] [
+<b>-h </b><i>hostname</i>[<b>:</b><i>port</i>]
+] [
+<b>-l</b>
+] [
+<b>-W</b>
+<i>which-jobs</i>
+] [
+<b>-a</b>
+[
+<i>destination(s)</i>
+] ] [
+<b>-c</b>
+[
+<i>class(es)</i>
+] ] [
+<b>-d</b>
+] [
+<b>-o</b>
+[
+<i>destination(s)</i>
+] ] [
+<b>-p</b>
+[
+<i>printer(s)</i>
+] ] [
+<b>-r</b>
+] [
+<b>-R</b>
+] [
+<b>-s</b>
+] [
+<b>-t</b>
+] [
+<b>-u</b>
+[
+<i>user(s)</i>
+] ] [
+<b>-v</b>
+[
+<i>printer(s)</i>
+] ]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>lpstat</b> displays status information about the current classes, jobs, and printers.
+When run with no arguments, <b>lpstat</b> will list active jobs queued by the current user.
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+The <b>lpstat</b> command supports the following options:
+<dl class="man">
+<dt><b>-E</b>
+<dd style="margin-left: 5.0em">Forces encryption when connecting to the server.
+<dt><b>-H</b>
+<dd style="margin-left: 5.0em">Shows the server hostname and port.
+<dt><b>-R</b>
+<dd style="margin-left: 5.0em">Shows the ranking of print jobs.
+<dt><b>-U </b><i>username</i>
+<dd style="margin-left: 5.0em">Specifies an alternate username.
+<dt><b>-W </b><i>which-jobs</i>
+<dd style="margin-left: 5.0em">Specifies which jobs to show, "completed" or "not-completed" (the default).
+This option <i>must</i> appear before the <i>-o</i> option and/or any printer names, otherwise the default ("not-completed") value will be used in the request to the scheduler.
+<dt><b>-a </b>[<i>printer(s)</i>]
+<dd style="margin-left: 5.0em">Shows the accepting state of printer queues.
+If no printers are specified then all printers are listed.
+<dt><b>-c </b>[<i>class(es)</i>]
+<dd style="margin-left: 5.0em">Shows the printer classes and the printers that belong to them.
+If no classes are specified then all classes are listed.
+<dt><b>-d</b>
+<dd style="margin-left: 5.0em">Shows the current default destination.
+<dt><b>-h </b><i>server</i>[<b>:</b><i>port</i>]
+<dd style="margin-left: 5.0em">Specifies an alternate server.
+<dt><b>-l</b>
+<dd style="margin-left: 5.0em">Shows a long listing of printers, classes, or jobs.
+<dt><b>-o </b>[<i>destination(s)</i>]
+<dd style="margin-left: 5.0em">Shows the jobs queued on the specified destinations.
+If no destinations are specified all jobs are shown.
+<dt><b>-p </b>[<i>printer(s)</i>]
+<dd style="margin-left: 5.0em">Shows the printers and whether they are enabled for printing.
+If no printers are specified then all printers are listed.
+<dt><b>-r</b>
+<dd style="margin-left: 5.0em">Shows whether the CUPS server is running.
+<dt><b>-s</b>
+<dd style="margin-left: 5.0em">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 <i>-d</i>, <i>-c</i>, and <i>-v</i> options.
+<dt><b>-t</b>
+<dd style="margin-left: 5.0em">Shows all status information.
+This is equivalent to using the <i>-r</i>, <i>-d</i>, <i>-c</i>, <i>-v</i>, <i>-a</i>, <i>-p</i>, and <i>-o</i> options.
+<dt><b>-u </b>[<i>user(s)</i>]
+<dd style="margin-left: 5.0em">Shows a list of print jobs queued by the specified users.
+If no users are specified, lists the jobs queued by the current user.
+<dt><b>-v </b>[<i>printer(s)</i>]
+<dd style="margin-left: 5.0em">Shows the printers and what device they are attached to.
+If no printers are specified then all printers are listed.
+</dl>
+<h2 class="title"><a name="CONFORMING_TO">Conforming To</a></h2>
+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 <i>not</i> case-sensitive.
+<p>The <i>-h</i>, <i>-E</i>, <i>-U</i>, and <i>-W</i> options are unique to CUPS.
+<p>The Solaris <i>-f</i>, <i>-P</i>, and <i>-S</i> options are silently ignored.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cancel.html?TOPIC=Man+Pages"><b>cancel</b>(1),</a>
+<a href="man-lp.html?TOPIC=Man+Pages"><b>lp</b>(1),</a>
+<a href="man-lpq.html?TOPIC=Man+Pages"><b>lpq</b>(1),</a>
+<a href="man-lpr.html?TOPIC=Man+Pages"><b>lpr</b>(1),</a>
+<a href="man-lprm.html?TOPIC=Man+Pages"><b>lprm</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-mailto.conf.html b/doc/help/man-mailto.conf.html
new file mode 100644 (file)
index 0000000..05b1e14
--- /dev/null
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>mailto.conf(5)</title>
+</head>
+<body>
+<h1 class="title">mailto.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+mailto.conf - configuration file for cups email notifier
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>mailto.conf</b> file defines the local mail server and email notification preferences for CUPS.
+<p>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.
+<h3><a name="DIRECTIVES">Directives</a></h3>
+<dl class="man">
+<dt><b>Cc </b><i>cc-address@domain.com</i>
+<dd style="margin-left: 5.0em">Specifies an additional recipient for all email notifications.
+<dt><b>From </b><i>from-address@domain.com</i>
+<dd style="margin-left: 5.0em">Specifies the sender of email notifications.
+<dt><b>Sendmail </b><i>sendmail command and options</i>
+<dd style="margin-left: 5.0em">Specifies the sendmail command to use when sending email notifications.
+Only one <i>Sendmail</i> or <i>SMTPServer</i> line may be present in the <b>mailto.conf</b> file.
+If multiple lines are present, only the last one is used.
+<dt><b>SMTPServer </b><i>servername</i>
+<dd style="margin-left: 5.0em">Specifies a SMTP server to send email notifications to.
+Only one <i>Sendmail</i> or <i>SMTPServer</i> line may be present in the <b>mailto.conf</b> file.
+If multiple lines are present, only the last one is used.
+<dt><b>Subject </b><i>subject-prefix</i>
+<dd style="margin-left: 5.0em">Specifies a prefix string for the subject line of an email notification.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-mime.convs.html b/doc/help/man-mime.convs.html
new file mode 100644 (file)
index 0000000..4d41262
--- /dev/null
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>mime.convs(5)</title>
+</head>
+<body>
+<h1 class="title">mime.convs(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+mime.convs - mime type conversion file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>mime.convs</b> 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.
+<p>Additional filters are specified in files with the extension <i>.convs</i> in the CUPS configuration directory.
+<p>Each line in the <b>mime.convs</b> 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:
+<pre class="man">
+
+    source/type destination/type cost filter
+
+</pre>
+The <i>source/type</i> field specifies the source MIME media type that is consumed by the filter.
+<p>The <i>destination/type</i> field specifies the destination MIME media type that is produced by the filter.
+<p>The <i>cost</i> 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.
+<p>The <i>filter</i> field specifies the filter program filename.
+Filenames are relative to the CUPS filter directory.
+<h2 class="title"><a name="FILES">Files</a></h2>
+<i>/etc/cups</i> - Typical CUPS configuration directory.
+<br>
+<i>/usr/lib/cups/filter</i> - Typical CUPS filter directory.
+<br>
+<i>/usr/libexec/cups/filter</i> - CUPS filter directory on OS X.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Define a filter that converts PostScript documents to CUPS Raster format:
+<pre class="man">
+
+    application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster
+
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsfilter.html?TOPIC=Man+Pages"><b>cupsfilter</b>(8),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-mime.types.html b/doc/help/man-mime.types.html
new file mode 100644 (file)
index 0000000..34168d5
--- /dev/null
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>mime.types(5)</title>
+</head>
+<body>
+<h1 class="title">mime.types(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+mime.types - mime type description file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>mime.types</b> file defines the recognized file types.
+<p>Additional file types are specified in files with the extension <i>.types</i> in the CUPS configuration directory.
+<p>Each line in the <b>mime.types</b> 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:
+<pre class="man">
+
+    <i>mime/type </i>[ <i>rule </i>... <i>rule </i>]
+
+</pre>
+Rules can be extended over multiple lines using the backslash character (\):
+<pre class="man">
+
+    <i>mime/type </i>[ <i>really-really-really-long-rule </i>... <b>\
+      </b><i>rule </i>]
+
+</pre>
+MIME media types specified by the <i>mime/type</i> 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.
+<p>The rules may be grouped using parenthesis, joined using "+" for a logical AND, joined using "," or whitespace for a logical OR, and negated using "!".
+<h3><a name="RULES">Rules</a></h3>
+Rules take two forms - a filename extension by itself and functions with test
+values inside parenthesis.
+The following functions are available:
+<dl class="man">
+<dt><b>match("</b><i>pattern</i><b>")</b>
+<dd style="margin-left: 5.0em">True if the filename matches the given shell wildcard <i>pattern</i>.
+<dt><b>ascii(</b><i>offset</i><b>,</b><i>length</i><b>)</b>
+<dd style="margin-left: 5.0em">True if the <i>length</i> bytes starting at <i>offset</i> are valid printable ASCII (CR, NL, TAB, BS, 32-126).
+<dt><b>printable(</b><i>offset</i><b>,</b><i>length</i><b>)</b>
+<dd style="margin-left: 5.0em">True if the <i>length</i> bytes starting at <i>offset</i> are printable 8-bit chars (CR, NL, TAB, BS, 32-126, 128-254).
+<dt><b>priority(</b><i>number</i><b>)</b>
+<dd style="margin-left: 5.0em">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.
+<dt><b>string(</b><i>offset</i><b>,"</b><i>string</i><b>")</b>
+<dd style="margin-left: 5.0em">True if the bytes starting at <i>offset</i> are identical to <i>string</i>.
+<dt><b>istring(</b><i>offset</i><b>,"</b><i>string</i><b>")</b>
+<dd style="margin-left: 5.0em">True if the bytes starting at <i>offset</i> match <i>string</i> without respect to case.
+<dt><b>char(</b><i>offset</i><b>,</b><i>value</i><b>)</b>
+<dd style="margin-left: 5.0em">True if the byte at <i>offset</i> is identical to <i>value</i>.
+<dt><b>short(</b><i>offset</i><b>,</b><i>value</i><b>)</b>
+<dd style="margin-left: 5.0em">True if the 16-bit big-endian integer at <i>offset</i> is identical to <i>value</i>.
+<dt><b>int(</b><i>offset</i><b>,</b><i>value</i><b>)</b>
+<dd style="margin-left: 5.0em">True if the 32-bit big-endian integer at <i>offset</i> is identical to <i>value</i>.
+<dt><b>locale("</b><i>string</i><b>")</b>
+<dd style="margin-left: 5.0em">True if current locale matches <i>string</i>.
+<dt><b>contains(</b><i>offset</i><b>,</b><i>range</i><b>,"</b><i>string</i><b>")</b>
+<dd style="margin-left: 5.0em">True if the bytes starting at <i>offset</i> for <i>range</i> bytes contains <i>string</i>.
+</dl>
+<h3><a name="STRING_CONSTANTS">String Constants</a></h3>
+String constants can be specified inside quotes ("") for strings containing whitespace and angle brackets (&lt;>) for hexadecimal strings.
+<h3><a name="TYPE_MATCHING_AND_PRIORITY">Type Matching And Priority</a></h3>
+When CUPS needs to determine the MIME media type of a given file, it checks every MIME media type defined in the <i>.types</i> 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.
+<p>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.
+<h2 class="title"><a name="FILES">Files</a></h2>
+<i>/etc/cups</i> - Typical CUPS configuration directory.
+<h2 class="title"><a name="EXAMPLES">Examples</a></h2>
+Define two MIME media types for raster data, with one being a subset with higher priority:
+<pre class="man">
+
+    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&lt;00>) priority(150)
+</pre>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cups-files.conf.html?TOPIC=Man+Pages"><b>cups-files.conf</b>(5),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsfilter.html?TOPIC=Man+Pages"><b>cupsfilter</b>(8),</a>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-notifier.html b/doc/help/man-notifier.html
new file mode 100644 (file)
index 0000000..0a2cec0
--- /dev/null
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>notifier(7)</title>
+</head>
+<body>
+<h1 class="title">notifier(7)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+notifier - cups notification interface
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>notifier</b>
+<i>recipient</i>
+[
+<i>user-data</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+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.
+<p>Notifiers <b>MUST</b> read IPP messages from the standard input using the
+<b>ippNew</b>()
+and
+<b>ippReadFile</b>()
+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
+<a href="man-filter.html?TOPIC=Man+Pages"><b>filter</b>(7).</a>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-filter.html?TOPIC=Man+Pages"><b>filter</b>(7),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ppdc.html b/doc/help/man-ppdc.html
new file mode 100644 (file)
index 0000000..7e5063e
--- /dev/null
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>ppdc(1)</title>
+</head>
+<body>
+<h1 class="title">ppdc(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ppdc - cups ppd compiler (deprecated)
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>ppdc</b>
+[
+<b>-D </b><i>name</i>[<b>=</b><i>value</i>]
+] [
+<b>-I</b>
+<i>include-directory</i>
+] [
+<b>-c</b>
+<i>message-catalog</i>
+] [
+<b>-d</b>
+<i>output-directory</i>
+] [
+<b>-l</b>
+<i>language(s)</i>
+] [
+<b>-m</b>
+] [
+<b>-t</b>
+] [
+<b>-v</b>
+] [
+<b>-z</b>
+] [
+<b>--cr</b>
+] [
+<b>--crlf</b>
+] [
+<b>--lf</b>
+]
+<i>source-file</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>ppdc</b> compiles PPDC source files into one or more PPD files.
+<b>This program is deprecated and will be removed in a future release of CUPS.</b>
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>ppdc</b> supports the following options:
+<dl class="man">
+<dt><b>-D </b><i>name</i>[<b>=</b><i>value</i>]
+<dd style="margin-left: 5.0em">Sets the named variable for use in the source file.
+It is equivalent to using the <i>#define</i> directive in the source file.
+<dt><b>-I </b><i>include-directory</i>
+<dd style="margin-left: 5.0em">Specifies an alternate include directory.
+Multiple <i>-I</i> options can be supplied to add additional directories.
+<dt><b>-c </b><i>message-catalog</i>
+<dd style="margin-left: 5.0em">Specifies a single message catalog file in GNU gettext (filename.po) or Apple strings (filename.strings) format to be used for localization.
+<dt><b>-d </b><i>output-directory</i>
+<dd style="margin-left: 5.0em">Specifies the output directory for PPD files.
+The default output directory is "ppd".
+<dt><b>-l </b><i>language(s)</i>
+<dd style="margin-left: 5.0em">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.
+<dt><b>-m</b>
+<dd style="margin-left: 5.0em">Specifies that the output filename should be based on the ModelName value instead of FileName or PCFilenName.
+<dt><b>-t</b>
+<dd style="margin-left: 5.0em">Specifies that PPD files should be tested instead of generated.
+<dt><b>-v</b>
+<dd style="margin-left: 5.0em">Specifies verbose output, basically a running status of which files are being loaded or written.
+<b>-z</b>
+Generates compressed PPD files (filename.ppd.gz).
+The default is to generate uncompressed PPD files.
+<dt><b>--cr</b>
+<dd style="margin-left: 5.0em"><dt><b>--crlf</b>
+<dd style="margin-left: 5.0em"><dt><b>--lf</b>
+<dd style="margin-left: 5.0em">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.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ppdhtml.html?TOPIC=Man+Pages"><b>ppdhtml</b>(1),</a>
+<a href="man-ppdi.html?TOPIC=Man+Pages"><b>ppdi</b>(1),</a>
+<a href="man-ppdmerge.html?TOPIC=Man+Pages"><b>ppdmerge</b>(1),</a>
+<a href="man-ppdpo.html?TOPIC=Man+Pages"><b>ppdpo</b>(1),</a>
+<a href="man-ppdcfile.html?TOPIC=Man+Pages"><b>ppdcfile</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ppdcfile.html b/doc/help/man-ppdcfile.html
new file mode 100644 (file)
index 0000000..4e42797
--- /dev/null
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>ppdcfile(5)</title>
+</head>
+<body>
+<h1 class="title">ppdcfile(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ppdcfile - cups ppd compiler source file format
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The CUPS PPD compiler reads meta files that contain descriptions of one or more PPD files to be generated by
+<a href="man-ppdc.html?TOPIC=Man+Pages"><b>ppdc</b>(1).</a>
+This man page provides a quick reference to the supported keywords and should be used in conjunction with the online help for CUPS.
+<p>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.
+<p>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.
+<p>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:
+<dl class="man">
+<dt><b>#define </b><i>name value</i>
+<dd style="margin-left: 5.0em"><dt><b>#elif </b>{<i>name </i>| <i>value</i>}
+<dd style="margin-left: 5.0em"><dt><b>#else</b>
+<dd style="margin-left: 5.0em"><dt><b>#endif</b>
+<dd style="margin-left: 5.0em"><dt><b>#font </b><i>name encoding "version" charset status</i>
+<dd style="margin-left: 5.0em"><dt><b>#if </b>{<i>name </i>| <i>value</i>}
+<dd style="margin-left: 5.0em"><dt><b>#include &lt;</b><i>filename</i><b>></b>
+<dd style="margin-left: 5.0em"><dt><b>#include "</b><i>filename</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>#media </b><i>name width length</i>
+<dd style="margin-left: 5.0em"><dt><b>#media "</b><i>name</i><b>/</b><i>text</i><b>" </b><i>width length</i>
+<dd style="margin-left: 5.0em"><dt><b>#po </b><i>locale </i><b>"</b><i>filename</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>Attribute </b><i>name </i><b>"" </b><i>value</i>
+<dd style="margin-left: 5.0em"><dt><b>Attribute </b><i>name keyword value</i>
+<dd style="margin-left: 5.0em"><dt><b>Attribute </b><i>name </i><b>"</b><i>keyword</i><b>/</b><i>text</i><b>" </b><i>value</i>
+<dd style="margin-left: 5.0em"><dt><b>Choice </b><i>name </i><b>"</b><i>code</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>Choice "</b><i>name</i><b>/</b><i>text</i><b>" "</b><i>code</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>ColorDevice </b><i>boolean-value</i>
+<dd style="margin-left: 5.0em"><dt><b>ColorModel </b><i>name colorspace colororder compression</i>
+<dd style="margin-left: 5.0em"><dt><b>ColorModel "</b><i>name</i><b>/</b><i>text</i><b>" </b><i>colorspace colororder compression</i>
+<dd style="margin-left: 5.0em"><dt><b>ColorProfile </b><i>resolution</i><b>/</b><i>mediatype gamma density matrix</i>
+<dd style="margin-left: 5.0em"><dt><b>Copyright "</b><i>text</i>"
+<dd style="margin-left: 5.0em"><dt><b>CustomMedia </b><i>name width length left bottom right top </i><b>"</b><i>size-code</i><b>" "</b><i>region-code</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>CustomMedia "</b><i>name</i><b>/</b><i>text</i><b>" </b><i>width length left bottom right top </i><b>"</b><i>size-code</i><b>" "</b><i>region-code</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>Cutter </b><i>boolean-value</i>
+<dd style="margin-left: 5.0em"><dt><b>Darkness </b><i>temperature name</i>
+<dd style="margin-left: 5.0em"><dt><b>Darkness </b><i>temperature </i><b>"</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>DriverType </b><i>type</i>
+<dd style="margin-left: 5.0em"><dt><b>Duplex </b><i>type</i>
+<dd style="margin-left: 5.0em"><dt><b>Filter Imime-type cost program</b>
+<dd style="margin-left: 5.0em"><dt><b>Finishing </b><i>name</i>
+<dd style="margin-left: 5.0em"><dt><b>Finishing "</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>Font *</b>
+<dd style="margin-left: 5.0em"><dt><b>Font </b><i>name encoding </i><b>"</b><i>version</i><b>" </b><i>charset status</i>
+<dd style="margin-left: 5.0em"><dt><b>Group </b><i>name</i>
+<dd style="margin-left: 5.0em"><dt><b>Group "</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>HWMargins </b><i>left bottom right top</i>
+<dd style="margin-left: 5.0em"><dt><b>InputSlot </b><i>position name</i>
+<dd style="margin-left: 5.0em"><dt><b>InputSlot </b><i>position </i><b>"</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>Installable </b><i>name</i>
+<dd style="margin-left: 5.0em"><dt><b>Installable "</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>LocAttribute </b><i>name </i><b>"</b><i>keyword</i><b>/</b><i>text</i><b>" </b><i>value</i>
+<dd style="margin-left: 5.0em"><dt><b>ManualCopies </b><i>boolean-value</i>
+<dd style="margin-left: 5.0em"><dt><b>Manufacturer "</b><i>name</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>MaxSize </b><i>width length</i>
+<dd style="margin-left: 5.0em"><dt><b>MediaSize </b><i>name</i>
+<dd style="margin-left: 5.0em"><dt><b>MediaType </b><i>type name</i>
+<dd style="margin-left: 5.0em"><dt><b>MediaType </b><i>type </i><b>"</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>MinSize </b><i>width length</i>
+<dd style="margin-left: 5.0em"><dt><b>ModelName "</b><i>name</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>ModelNumber </b><i>number</i>
+<dd style="margin-left: 5.0em"><dt><b>Option </b><i>name type section order</i>
+<dd style="margin-left: 5.0em"><dt><b>Option "</b><i>name</i><b>/</b><i>text</i><b>" </b><i>type section order</i>
+<dd style="margin-left: 5.0em"><dt><b>PCFileName "</b><i>filename.ppd</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>Resolution </b><i>colorspace bits-per-color row-count row-feed row-step name</i>
+<dd style="margin-left: 5.0em"><dt><b>Resolution </b><i>colorspace bits-per-color row-count row-feed row-step </i><b>"</b><i>name</i><b>/</b><i>text</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>SimpleColorProfile </b><i>resolution</i><b>/</b><i>mediatype density yellow-density red-density gamma red-adjust green-adjust blue-adjust</i>
+<dd style="margin-left: 5.0em"><dt><b>Throughput </b><i>pages-per-minute</i>
+<dd style="margin-left: 5.0em"><dt><b>UIConstraints "</b><i>*Option1 *Option2</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>UIConstraints "</b><i>*Option1 Choice1 *Option2</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>UIConstraints "</b><i>*Option1 *Option2 Choice2</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>UIConstraints "</b><i>*Option1 Choice1 *Option2 Choice2</i><b>"</b>
+<dd style="margin-left: 5.0em"><dt><b>VariablePaperSize </b><i>boolean-value</i>
+<dd style="margin-left: 5.0em"><dt><b>Version </b><i>number</i>
+<dd style="margin-left: 5.0em"></dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ppdc.html?TOPIC=Man+Pages"><b>ppdc</b>(1),</a>
+<a href="man-ppdhtml.html?TOPIC=Man+Pages"><b>ppdhtml</b>(1),</a>
+<a href="man-ppdi.html?TOPIC=Man+Pages"><b>ppdi</b>(1),</a>
+<a href="man-ppdmerge.html?TOPIC=Man+Pages"><b>ppdmerge</b>(1),</a>
+<a href="man-ppdpo.html?TOPIC=Man+Pages"><b>ppdpo</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ppdhtml.html b/doc/help/man-ppdhtml.html
new file mode 100644 (file)
index 0000000..e009f7e
--- /dev/null
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>ppdhtml(1)</title>
+</head>
+<body>
+<h1 class="title">ppdhtml(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ppdhtml - cups html summary generator (deprecated)
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>ppdhtml</b>
+[
+<b>-D </b><i>name</i>[<b>=</b><i>value</i>]
+] [
+<b>-I</b>
+<i>include-directory</i>
+]
+<i>source-file</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>ppdhtml</b> reads a driver information file and produces a HTML summary page that lists all of the drivers in a file and the supported options.
+<b>This program is deprecated and will be removed in a future release of CUPS.</b>
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>ppdhtml</b> supports the following options:
+<dl class="man">
+<dt><b>-D </b><i>name</i>[<b>=</b><i>value</i>]
+<dd style="margin-left: 5.0em">Sets the named variable for use in the source file.
+It is equivalent to using the <i>#define</i> directive in the source file.
+<dt><b>-I </b><i>include-directory</i>
+<dd style="margin-left: 5.0em">Specifies an alternate include directory.
+Multiple <i>-I</i> options can be supplied to add additional directories.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ppdc.html?TOPIC=Man+Pages"><b>ppdc</b>(1),</a>
+<a href="man-ppdcfile.html?TOPIC=Man+Pages"><b>ppdcfile</b>(5),</a>
+<a href="man-ppdi.html?TOPIC=Man+Pages"><b>ppdi</b>(1),</a>
+<a href="man-ppdmerge.html?TOPIC=Man+Pages"><b>ppdmerge</b>(1),</a>
+<a href="man-ppdpo.html?TOPIC=Man+Pages"><b>ppdpo</b>(1),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ppdi.html b/doc/help/man-ppdi.html
new file mode 100644 (file)
index 0000000..bb5c08b
--- /dev/null
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>ppdi(1)</title>
+</head>
+<body>
+<h1 class="title">ppdi(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ppdi - import ppd files (deprecated)
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>ppdi</b>
+[
+<b>-I</b>
+<i>include-directory</i>
+] [
+<b>-o</b>
+<i>source-file</i>
+]
+<i>ppd-file</i>
+[ ...
+<i>ppd-file</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>ppdi</b> 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.
+<b>This program is deprecated and will be removed in a future release of CUPS.</b>
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>ppdi</b> supports the following options:
+<dl class="man">
+<dt><b>-I </b><i>include-directory</i>
+<dd style="margin-left: 5.0em">Specifies an alternate include directory.
+Multiple <i>-I</i> options can be supplied to add additional directories.
+<dt><b>-o </b><i>source-file</i>
+<dd style="margin-left: 5.0em">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 <i>ppdi.drv</i> is used.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ppdc.html?TOPIC=Man+Pages"><b>ppdc</b>(1),</a>
+<a href="man-ppdhtml.html?TOPIC=Man+Pages"><b>ppdhtml</b>(1),</a>
+<a href="man-ppdmerge.html?TOPIC=Man+Pages"><b>ppdmerge</b>(1),</a>
+<a href="man-ppdpo.html?TOPIC=Man+Pages"><b>ppdpo</b>(1),</a>
+<a href="man-ppdcfile.html?TOPIC=Man+Pages"><b>ppdcfile</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ppdmerge.html b/doc/help/man-ppdmerge.html
new file mode 100644 (file)
index 0000000..efb0950
--- /dev/null
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>ppdmerge(1)</title>
+</head>
+<body>
+<h1 class="title">ppdmerge(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ppdmerge - merge ppd files (deprecated)
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>ppdmerge</b>
+[
+<b>-o</b>
+<i>output-ppd-file</i>
+]
+<i>ppd-file</i>
+<i>ppd-file</i>
+[ ...
+<i>ppd-file</i>
+]
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>ppdmerge</b> merges two or more PPD files into a single, multi-language
+PPD file.
+<b>This program is deprecated and will be removed in a future release of CUPS.</b>
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>ppdmerge</b> supports the following options:
+<dl class="man">
+<dt><b>-o </b><i>output-ppd-file</i>
+<dd style="margin-left: 3.0em">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.
+</dl>
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+<b>ppdmerge</b> does not check whether the merged PPD files are for the same device.
+Merging of different device PPDs will yield unpredictable results.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ppdc.html?TOPIC=Man+Pages"><b>ppdc</b>(1),</a>
+<a href="man-ppdhtml.html?TOPIC=Man+Pages"><b>ppdhtml</b>(1),</a>
+<a href="man-ppdi.html?TOPIC=Man+Pages"><b>ppdi</b>(1),</a>
+<a href="man-ppdpo.html?TOPIC=Man+Pages"><b>ppdpo</b>(1),</a>
+<a href="man-ppdcfile.html?TOPIC=Man+Pages"><b>ppdcfile</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-ppdpo.html b/doc/help/man-ppdpo.html
new file mode 100644 (file)
index 0000000..4696f1c
--- /dev/null
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>ppdpo(1)</title>
+</head>
+<body>
+<h1 class="title">ppdpo(1)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+ppdpo - ppd message catalog generator (deprecated)
+<h2 class="title"><a name="SYNOPSIS">Synopsis</a></h2>
+<b>ppdpo</b>
+[
+<b>-D </b><i>name</i>[<b>=</b><i>value</i>]
+] [
+<b>-I</b>
+<i>include-directory</i>
+] [
+<b>-o</b>
+<i>output-file</i>
+]
+<i>source-file</i>
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+<b>ppdpo</b> extracts UI strings from PPDC source files and updates either a GNU gettext or OS X strings format message catalog source file for translation.
+<b>This program is deprecated and will be removed in a future release of CUPS.</b>
+<h2 class="title"><a name="OPTIONS">Options</a></h2>
+<b>ppdpo</b> supports the following options:
+<dl class="man">
+<dt><b>-D </b><i>name</i>[<b>=</b><i>value</i>]
+<dd style="margin-left: 5.0em">Sets the named variable for use in the source file.
+It is equivalent to using the <i>#define</i> directive in the source file.
+<dt><b>-I </b><i>include-directory</i>
+<dd style="margin-left: 5.0em">Specifies an alternate include directory.
+Multiple <i>-I</i> options can be supplied to add additional directories.
+<dt><b>-o </b><i>output-file</i>
+<dd style="margin-left: 5.0em">Specifies the output file.
+The supported extensions are <i>.po</i> or <i>.po.gz</i> for GNU gettext format message catalogs and <i>.strings</i> for OS X strings files.
+</dl>
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-ppdc.html?TOPIC=Man+Pages"><b>ppdc</b>(1),</a>
+<a href="man-ppdhtml.html?TOPIC=Man+Pages"><b>ppdhtml</b>(1),</a>
+<a href="man-ppdi.html?TOPIC=Man+Pages"><b>ppdi</b>(1),</a>
+<a href="man-ppdmerge.html?TOPIC=Man+Pages"><b>ppdmerge</b>(1),</a>
+<b>ppdcfile(5),</b>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-printers.conf.html b/doc/help/man-printers.conf.html
new file mode 100644 (file)
index 0000000..8dfcce0
--- /dev/null
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>printers.conf(5)</title>
+</head>
+<body>
+<h1 class="title">printers.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+printers.conf - printer configuration file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>printers.conf</b> file defines the local printers that are available. It is normally located in the <i>/etc/cups</i> directory and is maintained by the
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8)</a>
+program. This file is not intended to be edited or managed manually.
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-classes.conf.html?TOPIC=Man+Pages"><b>classes.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+<a href="man-subscriptions.conf.html?TOPIC=Man+Pages"><b>subscriptions.conf</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
diff --git a/doc/help/man-subscriptions.conf.html b/doc/help/man-subscriptions.conf.html
new file mode 100644 (file)
index 0000000..0c7b5d0
--- /dev/null
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<!-- SECTION: Man Pages -->
+<head>
+       <link rel="stylesheet" type="text/css" href="../cups-printable.css">
+       <title>subscriptions.conf(5)</title>
+</head>
+<body>
+<h1 class="title">subscriptions.conf(5)</h1>
+<h2 class="title"><a name="NAME">Name</a></h2>
+subscriptions.conf - subscription configuration file for cups
+<h2 class="title"><a name="DESCRIPTION">Description</a></h2>
+The <b>subscriptions.conf</b> file defines the local event notification subscriptions that are active. It is normally located in the <i>/etc/cups</i> directory and is maintained by the
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8)</a>
+program. This file is not intended to be edited or managed manually.
+<h2 class="title"><a name="NOTES">Notes</a></h2>
+The name, location, and format of this file are an implementation detail that will change in future releases of CUPS.
+<h2 class="title"><a name="SEE_ALSO">See Also</a></h2>
+<a href="man-classes.conf.html?TOPIC=Man+Pages"><b>classes.conf</b>(5),</a>
+<a href="man-cupsd.html?TOPIC=Man+Pages"><b>cupsd</b>(8),</a>
+<a href="man-cupsd.conf.html?TOPIC=Man+Pages"><b>cupsd.conf</b>(5),</a>
+<a href="man-mime.convs.html?TOPIC=Man+Pages"><b>mime.convs</b>(5),</a>
+<a href="man-mime.types.html?TOPIC=Man+Pages"><b>mime.types</b>(5),</a>
+<a href="man-printers.conf.html?TOPIC=Man+Pages"><b>printers.conf</b>(5),</a>
+CUPS Online Help (<a href="http://localhost:631/help">http://localhost:631/help</a>)
+<h2 class="title"><a name="COPYRIGHT">Copyright</a></h2>
+Copyright &copy; 2007-2015 by Apple Inc.
+
+</body>
+</html>
index e8c2219..e29c9a4 100644 (file)
@@ -14,7 +14,7 @@
 
 <P>Every network printer or print server has a unique Internet Protocol (IP) address associated with it. This address is either configured manually or set using an automatic network protocol such as the <A HREF="#BOOTP">Boot Protocol (BOOTP)</A>, <A HREF="#DHCP">Dynamic Host Control Protocol (DHCP)</A>, Reverse Address Resolution Protocol (RARP), or ZeroConf.</P>
 
-<P>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 <A HREF="#SNMP">Simple Network Management Protocol (SNMP)</A> can also be used to get the IP address remotely, which happens automatically when you visit the CUPS administration web page or choose an available CUPS device when adding a printer.</P>
+<P>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 <A HREF="#SNMP">Simple Network Management Protocol (SNMP)</A> can also be used to get the IP address remotely.</P>
 
 
 <H2 CLASS="title"><A NAME="CONFIG">Configuring the IP Address</A></H2>
@@ -38,13 +38,7 @@ host <I>hostname</I> {
 
 <H3><A NAME="BOOTP">Configuring the IP Address Using BOOTP</A></H3>
 
-<P>The BOOTP protocol is used when you need to provide additional information such as the location of a configuration file to the network interface. Using the standard <TT>bootpd(8)</TT> program supplied with UNIX you simply need to add a line to the <VAR>/etc/bootptab</VAR> file; for IRIX:</P>
-
-<PRE CLASS="command">
-myprinter 08:00:69:00:12:34 192.0.2.2 <VAR>myprinter.boot</VAR>
-</PRE>
-
-<P>Newer versions of <TT>bootpd</TT> use a different format:</P>
+<P>The BOOTP protocol is used when you need to provide additional information such as the location of a configuration file to the network interface. Using the standard <TT>bootpd(8)</TT> program supplied with UNIX you simply need to add a line to the <VAR>/etc/bootptab</VAR> file:</P>
 
 <PRE CLASS="command">
 myprinter:ha=080069001234:ip=192.0.2.2:<VAR>t144=myprinter.boot</VAR>
@@ -108,7 +102,7 @@ socket://<i>ip-address-or-hostname</i>:<i>port-number</i>/?option=value&amp;opti
 
 <H3><A NAME="IPP">Internet Printing Protocol (IPP)</A></H3>
 
-<P>IPP is the only protocol that CUPS supports natively and is supported by some network printers and print servers. However, since many printers do not implement IPP properly, only use IPP when the vendor actually documents official support for it. IPP printing normally happens over port 631 and uses the <tt>http</tt>, <tt>ipp</tt>, and <tt>ipps</tt> URI schemes:</P>
+<P>IPP is the only protocol that CUPS supports natively and is supported by most network printers and print servers. IPP printing normally happens over port 631 and uses the <tt>http</tt> (Windows), <tt>ipp</tt>, and <tt>ipps</tt> URI schemes:</P>
 
 <PRE>
 http://<i>ip-address-or-hostname</i>:<i>port-number</i>/<i>resource</i>
@@ -140,10 +134,6 @@ ipps://<i>ip-address-or-hostname</i>:<i>port-number</i>/<i>resource</i>?<i>optio
 </THEAD>
 <TBODY>
 <TR>
-       <TD><TT>compression=gzip</TT></TD>
-       <TD>Specifies that print data should be compressed before sending.</TD>
-</TR>
-<TR>
        <TD><TT>encryption=always</TT></TD>
        <TD>Specifies that the connection to the IPP server should be encrypted using SSL.</TD>
 </TR>
@@ -276,11 +266,11 @@ lpd://<i>username@ip-address-or-hostname</i>/<i>queue</i>?<i>option=value&amp;op
 </TR>
 <TR>
        <TD><TT>sanitize_title=no</TT></TD>
-       <TD>Specifies that the job title string should not be restricted to ASCII characters.</TD>
+       <TD>Specifies that the job title string should not be restricted to ASCII alphanumeric and space characters.</TD>
 </TR>
 <TR>
        <TD><TT>sanitize_title=yes</TT></TD>
-       <TD>Specifies that the job title string should be restricted to ASCII characters.</TD>
+       <TD>Specifies that the job title string should be restricted to ASCII alphanumeric and space characters.</TD>
 </TR>
 <TR>
        <TD><TT>snmp=false</TT></TD>
index 4a4b173..367434d 100644 (file)
@@ -47,14 +47,9 @@ different ways.</P>
 
 <H2 CLASS="title"><A NAME="BEGIN">Where Do I Begin?</A></H2>
 
-<P>Click on the <A HREF="http://localhost:631/admin">Administration</A> tab at
-the top of this page. Click on the <VAR>Add Printer</VAR> button and follow the
-prompts.</P>
+<P>Click on the <var>Administration</var> tab. Click on the <var>Add Printer</var> button and follow the prompts.</P>
 
-<BLOCKQUOTE>When you are asked for a username and password, enter your login
-username and password or the "root" username and password. On MacOS X, the login
-username (or "short name") is typically your first and last name in
-lowercase.</BLOCKQUOTE>
+<BLOCKQUOTE>When you are asked for a username and password, enter your login username and password or the "root" username and password. On OS X<sup>&reg;</sup>, the login username (or "short name") is typically your first and last name in lowercase.</BLOCKQUOTE>
 
 <P>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
index 18f4c80..8a0fc31 100644 (file)
 
 <H2 CLASS="title"><A NAME="BASICS">The Basics</A></H2>
 
-<P>Operation policies are used for all IPP requests sent to the scheduler and are evaluated <em>after</em> the <A HREF="ref-cupsd-conf.html#Location"><TT>Location</TT></A> based access control rules. This means that operation policies can only add additional security restrictions to a request, never relax them. Use <TT>Location</TT> based access control rules for server-wide limits and operation policies for limits on individual printers, tasks, or services.</P>
+<P>Operation policies are used for all IPP requests sent to the scheduler and are evaluated <em>after</em> the <A HREF="man-cupsd.conf.html#Location"><TT>Location</TT></A> based access control rules. This means that operation policies can only add additional security restrictions to a request, never relax them. Use <TT>Location</TT> based access control rules for server-wide limits and operation policies for limits on individual printers, tasks, or services.</P>
 
-<P>Policies are stored in the <VAR>cupsd.conf</VAR> file in <A HREF="ref-cupsd-conf.html#Policy"><TT>Policy</TT></A> sections. Each policy has an alphanumeric name that is used to select it. Inside the policy section are one or more <A
-HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list the operations that are affected by the rules inside it. <A HREF="#LISTING01">Listing 1</A> shows the default operation policy, appropriately called "default", that is shipped with CUPS.</P>
+<P>Policies are stored in the <VAR>cupsd.conf</VAR> file in <A HREF="man-cupsd.conf.html#Policy"><TT>Policy</TT></A> sections. Each policy has an alphanumeric name that is used to select it. Inside the policy section are one or more <A
+HREF="man-cupsd.conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list the operations that are affected by the rules inside it. <A HREF="#LISTING01">Listing 1</A> shows the default operation policy, appropriately called "default", that is shipped with CUPS.</P>
 
-<P>The easiest way to add a policy to the <VAR>cupsd.conf</VAR> file is to use the web interface. Click on the <VAR>Administration</VAR> tab and then the <VAR>Edit Configuration File</VAR> button to edit the current <VAR>cupsd.conf</VAR> file. Click on the <VAR>Save Changes</VAR> button to save the changes and restart the scheduler. If you edit the <VAR>cupsd.conf</VAR> file from the console, make sure to <A HREF="ref-cupsd-conf.html">restart the cupsd process</A> before trying to use the new policy.</P>
+<P>The easiest way to add a policy to the <VAR>cupsd.conf</VAR> file is to use the web interface. Click on the <VAR>Administration</VAR> tab and then the <VAR>Edit Configuration File</VAR> button to edit the current <VAR>cupsd.conf</VAR> file. Click on the <VAR>Save Changes</VAR> button to save the changes and restart the scheduler. If you edit the <VAR>cupsd.conf</VAR> file from the console, make sure to <A HREF="man-cupsd.conf.html">restart the cupsd process</A> before trying to use the new policy.</P>
 
 <PRE CLASS="example">
 <EM>Listing 1: <A NAME="LISTING01">Default Operation Policy</A></EM>
@@ -39,7 +39,7 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
  7
  8      # All administration operations require an administrator
       to authenticate...
- 9      &lt;Limit CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class
+ 9      &lt;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
@@ -97,10 +97,10 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
 
 <P>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. <A HREF="#TABLE01">Table 1</A> lists all of the operations that have been defined along with their usage in CUPS.</P>
 
-<P>The access control rules are listed after the <TT>Limit</TT> line and are the same as those used for <A HREF="ref-cupsd-conf.html#Location"><TT>Location</TT></A> sections. In this case, we require the owner of the job ("@OWNER") or a member of the <A HREF="ref-cupsd-conf.html#SystemGroup"><TT>SystemGroup</TT></A> ("@SYSTEM") to do the operation. Because we do not include an <A HREF="ref-cupsd-conf.html#AuthType"><TT>AuthType</TT></A> 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, <em>do</em> use the <TT>AuthType</TT> directive, and so administrative operations need to be authenticated:</P>
+<P>The access control rules are listed after the <TT>Limit</TT> line and are the same as those used for <A HREF="man-cupsd.conf.html#Location"><TT>Location</TT></A> sections. In this case, we require the owner of the job ("@OWNER") or a member of the <A HREF="man-cups-files.conf.html#SystemGroup"><TT>SystemGroup</TT></A> ("@SYSTEM") to do the operation. Because we do not include an <A HREF="man-cupsd.conf.html#AuthType"><TT>AuthType</TT></A> 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, <em>do</em> use the <TT>AuthType</TT> directive, and so administrative operations need to be authenticated:</P>
 
 <PRE CLASS="example">
- 9      &lt;Limit CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class
+ 9      &lt;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
@@ -154,19 +154,39 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
 </THEAD>
 <TBODY>
 <TR>
-       <TD NOWRAP><TT>Print-Job</TT></TD>
-       <TD>Yes</TD>
-       <TD>Creates a print job with a single file.</TD>
+       <TD NOWRAP><TT>Activate-Printer</TT></TD>
+       <TD>No</TD>
+       <TD>Activates a printer or class.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Print-URI</TT></TD>
+       <TD NOWRAP><TT>Cancel-Current-Job</TT></TD>
        <TD>No</TD>
-       <TD>Create a print job with a single URI.</TD>
+       <TD>Cancels the current job on a printer or class.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Validate-Job</TT></TD>
+       <TD NOWRAP><TT>Cancel-Job</TT></TD>
        <TD>Yes</TD>
-       <TD>Validates a print request before printing.</TD>
+       <TD>Cancels a print job.</TD>
+</TR>
+<TR>
+       <TD NOWRAP><TT>Cancel-Jobs</TT></TD>
+       <TD>Yes</TD>
+       <TD>Cancels all print jobs.</TD>
+</TR>
+<TR>
+       <TD NOWRAP><TT>Cancel-My-Jobs</TT></TD>
+       <TD>Yes</TD>
+       <TD>Cancels a user's print job.</TD>
+</TR>
+<TR>
+       <TD NOWRAP><TT>Cancel-Subscription</TT></TD>
+       <TD>Yes</TD>
+       <TD>Cancels an event subscription.</TD>
+</TR>
+<TR>
+       <TD NOWRAP><TT>Close-Job</TT></TD>
+       <TD>Yes</TD>
+       <TD>Closes a user's print job so that it can be printed.</TD>
 </TR>
 <TR>
        <TD NOWRAP><TT>Create-Job</TT></TD>
@@ -174,19 +194,29 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
        <TD>Creates a print job with no files or URIs.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Send-Document</TT></TD>
+       <TD NOWRAP><TT>Create-Job-Subscriptions</TT></TD>
        <TD>Yes</TD>
-       <TD>Adds a file to a print job.</TD>
+       <TD>Creates one or more event subscriptions for a job.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Send-URI</TT></TD>
+       <TD NOWRAP><TT>Create-Printer-Subscriptions</TT></TD>
+       <TD>Yes</TD>
+       <TD>Creates one or more event subscriptions for a printer or the server.</TD>
+</TR>
+<TR>
+       <TD NOWRAP><TT>Deactivate-Printer</TT></TD>
        <TD>No</TD>
-       <TD>Adds a URI to a print job.</TD>
+       <TD>Deactivates a printer or class.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Cancel-Job</TT></TD>
+       <TD NOWRAP><TT>Disable-Printer</TT></TD>
        <TD>Yes</TD>
-       <TD>Cancels a print job.</TD>
+       <TD>Stops a printer or class.</TD>
+</TR>
+<TR>
+       <TD NOWRAP><TT>Enable-Printer</TT></TD>
+       <TD>Yes</TD>
+       <TD>Starts a printer or class.</TD>
 </TR>
 <TR>
        <TD NOWRAP><TT>Get-Job-Attributes</TT></TD>
@@ -199,78 +229,82 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
        <TD>Gets a list of jobs.</TD>
 </TR>
 <TR>
+       <TD NOWRAP><TT>Get-Notifications</TT></TD>
+       <TD>Yes</TD>
+       <TD>Gets (pending) events for an event subscription.</TD>
+</TR>
+<TR>
        <TD NOWRAP><TT>Get-Printer-Attributes</TT></TD>
        <TD>Yes</TD>
        <TD>Gets information and options associated with a printer or class.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Hold-Job</TT></TD>
+       <TD NOWRAP><TT>Get-Printer-Supported-Values</TT></TD>
        <TD>Yes</TD>
-       <TD>Holds a print job for printing.</TD>
+       <TD>Gets -supported attributes for a printer based on job
+       options.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Release-Job</TT></TD>
+       <TD NOWRAP><TT>Get-Subscription-Attributes</TT></TD>
        <TD>Yes</TD>
-       <TD>Releases a print job for printing.</TD>
+       <TD>Gets information for an event subscription.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Restart-Job</TT></TD>
+       <TD NOWRAP><TT>Get-Subscriptions</TT></TD>
        <TD>Yes</TD>
-       <TD>Reprints a print job.</TD>
+       <TD>Gets a list of event subscriptions.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Pause-Printer</TT></TD>
+       <TD NOWRAP><TT>Hold-Job</TT></TD>
        <TD>Yes</TD>
-       <TD>Stops a printer or class.</TD>
+       <TD>Holds a print job for printing.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Resume-Printer</TT></TD>
+       <TD NOWRAP><TT>Hold-New-Jobs</TT></TD>
        <TD>Yes</TD>
-       <TD>Starts a printer or class.</TD>
+       <TD>Holds new jobs submitted to a printer or class.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Purge-Jobs</TT></TD>
+       <TD NOWRAP><TT>Pause-Printer</TT></TD>
        <TD>Yes</TD>
-       <TD>Cancels all jobs on the server or a printer or class
-       and removes the job history information.</TD>
+       <TD>Stops a printer or class.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Set-Printer-Attributes</TT></TD>
+       <TD NOWRAP><TT>Pause-Printer-After-Current-Job</TT></TD>
        <TD>No</TD>
-       <TD>Sets printer or class information; CUPS uses
-       CUPS-Add-Modify-Printer and CUPS-Add-Modify-Class
-       instead.</TD>
+       <TD>Stops a printer or class after the current job is finished.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Set-Job-Attributes</TT></TD>
+       <TD NOWRAP><TT>Print-Job</TT></TD>
        <TD>Yes</TD>
-       <TD>Changes job options.</TD>
+       <TD>Creates a print job with a single file.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Get-Printer-Supported-Values</TT></TD>
+       <TD NOWRAP><TT>Print-URI</TT></TD>
        <TD>No</TD>
-       <TD>Gets -supported attributes for a printer based on job
-       options.</TD>
+       <TD>Create a print job with a single URI.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Create-Printer-Subscription</TT></TD>
-       <TD>Yes</TD>
-       <TD>Creates an event subscription for a printer or the server.</TD>
+       <TD NOWRAP><TT>Promote-Job</TT></TD>
+       <TD>No</TD>
+       <TD>Prints a job before others.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Create-Job-Subscription</TT></TD>
+       <TD NOWRAP><TT>Purge-Jobs</TT></TD>
        <TD>Yes</TD>
-       <TD>Creates an event subscription for a job.</TD>
+       <TD>Cancels all jobs on the server or a printer or class
+       and removes the job history information.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Get-Subscription-Attributes</TT></TD>
+       <TD NOWRAP><TT>Release-Held-New-Jobs</TT></TD>
        <TD>Yes</TD>
-       <TD>Gets information for an event subscription.</TD>
+       <TD>Releases jobs that were held because of the
+       Hold-New-Jobs operation.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Get-Subscriptions</TT></TD>
+       <TD NOWRAP><TT>Release-Job</TT></TD>
        <TD>Yes</TD>
-       <TD>Gets a list of event subscriptions.</TD>
+       <TD>Releases a print job for printing.</TD>
 </TR>
 <TR>
        <TD NOWRAP><TT>Renew-Subscription</TT></TD>
@@ -278,65 +312,62 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
        <TD>Renews an event subscription that is about to expire.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Cancel-Subscription</TT></TD>
-       <TD>Yes</TD>
-       <TD>Cancels an event subscription.</TD>
+       <TD NOWRAP><TT>Reprocess-Job</TT></TD>
+       <TD>No</TD>
+       <TD>Reprints a job on a different printer or class; CUPS has the
+       CUPS-Move-Job operation instead.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Get-Notifications</TT></TD>
+       <TD NOWRAP><TT>Restart-Job</TT></TD>
        <TD>Yes</TD>
-       <TD>Gets (pending) events for an event subscription.</TD>
+       <TD>Reprints a print job.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Send-Notifications</TT></TD>
+       <TD NOWRAP><TT>Restart-Printer</TT></TD>
        <TD>No</TD>
-       <TD>Sends events for an event subscription.</TD>
+       <TD>Restarts a printer or class, resuming print jobs as needed.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Get-Printer-Support-Files</TT></TD>
+       <TD NOWRAP><TT>Resubmit-Job</TT></TD>
        <TD>No</TD>
-       <TD>Gets printer driver files for a Novell client.</TD>
+       <TD>Reprints a job with new options.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Enable-Printer</TT></TD>
-       <TD>Yes</TD>
-       <TD>Starts a printer or class.</TD>
+       <TD NOWRAP><TT>Resume-Job</TT></TD>
+       <TD>No</TD>
+       <TD>Resumes printing of a stopped job.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Disable-Printer</TT></TD>
+       <TD NOWRAP><TT>Resume-Printer</TT></TD>
        <TD>Yes</TD>
-       <TD>Stops a printer or class.</TD>
-</TR>
-<TR>
-       <TD NOWRAP><TT>Pause-Printer-After-Current-Job</TT></TD>
-       <TD>No</TD>
-       <TD>Stops a printer or class after the current job is finished.</TD>
+       <TD>Starts a printer or class.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Hold-New-Jobs</TT></TD>
+       <TD NOWRAP><TT>Schedule-Job-After</TT></TD>
        <TD>No</TD>
-       <TD>Holds new jobs submitted to a printer or class.</TD>
+       <TD>Prints a job after others.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Release-Held-New-Jobs</TT></TD>
-       <TD>No</TD>
-       <TD>Releases jobs that were held because of the
-       Hold-New-Jobs operation.</TD>
+       <TD NOWRAP><TT>Send-Document</TT></TD>
+       <TD>Yes</TD>
+       <TD>Adds a file to a print job.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Deactivate-Printer</TT></TD>
+       <TD NOWRAP><TT>Send-URI</TT></TD>
        <TD>No</TD>
-       <TD>Deactivates a printer or class.</TD>
+       <TD>Adds a URI to a print job.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Activate-Printer</TT></TD>
-       <TD>No</TD>
-       <TD>Activates a printer or class.</TD>
+       <TD NOWRAP><TT>Set-Printer-Attributes</TT></TD>
+       <TD>Yes</TD>
+       <TD>Sets printer or class information; CUPS uses
+       CUPS-Add-Modify-Printer and CUPS-Add-Modify-Class
+       for most attributes instead.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Restart-Printer</TT></TD>
-       <TD>No</TD>
-       <TD>Restarts a printer or class, resuming print jobs as needed.</TD>
+       <TD NOWRAP><TT>Set-Job-Attributes</TT></TD>
+       <TD>Yes</TD>
+       <TD>Changes job options.</TD>
 </TR>
 <TR>
        <TD NOWRAP><TT>Shutdown-Printer</TT></TD>
@@ -349,45 +380,30 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
        <TD>Powers a printer or class on.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Reprocess-Job</TT></TD>
-       <TD>No</TD>
-       <TD>Reprints a job on a different printer or class; CUPS has the
-       CUPS-Move-Job operation instead.</TD>
-</TR>
-<TR>
-       <TD NOWRAP><TT>Cancel-Current-Job</TT></TD>
-       <TD>No</TD>
-       <TD>Cancels the current job on a printer or class.</TD>
-</TR>
-<TR>
        <TD NOWRAP><TT>Suspend-Current-Job</TT></TD>
        <TD>No</TD>
        <TD>Stops the current job on a printer or class.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Resume-Job</TT></TD>
+       <TD NOWRAP><TT>Validate-Document</TT></TD>
        <TD>No</TD>
-       <TD>Resumes printing of a stopped job.</TD>
+       <TD>Validates a document request before sending.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>Promote-Job</TT></TD>
-       <TD>No</TD>
-       <TD>Prints a job before others.</TD>
-</TR>
-<TR>
-       <TD NOWRAP><TT>Schedule-Job-After</TT></TD>
-       <TD>No</TD>
-       <TD>Prints a job after others.</TD>
+       <TD NOWRAP><TT>Validate-Job</TT></TD>
+       <TD>Yes</TD>
+       <TD>Validates a print request before printing.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>CUPS-Get-Default</TT> *</TD>
+       <TD NOWRAP><TT>CUPS-Accept-Jobs</TT></TD>
        <TD>Yes</TD>
-       <TD>Gets the server/network default printer or class.</TD>
+       <TD>Sets a printer's or class' printer-is-accepting-jobs
+       attribute to true.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>CUPS-Get-Printers</TT> *</TD>
+       <TD NOWRAP><TT>CUPS-Add-Modify-Class</TT></TD>
        <TD>Yes</TD>
-       <TD>Gets a list of printers and/or classes.</TD>
+       <TD>Adds or modifies a class.</TD>
 </TR>
 <TR>
        <TD NOWRAP><TT>CUPS-Add-Modify-Printer</TT></TD>
@@ -395,19 +411,9 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
        <TD>Adds or modifies a printer.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>CUPS-Delete-Printer</TT> *</TD>
-       <TD>Yes</TD>
-       <TD>Removes a printer.</TD>
-</TR>
-<TR>
-       <TD NOWRAP><TT>CUPS-Get-Classes</TT> *</TD>
-       <TD>Yes</TD>
-       <TD>Gets a list of classes.</TD>
-</TR>
-<TR>
-       <TD NOWRAP><TT>CUPS-Add-Modify-Class</TT></TD>
+       <TD NOWRAP><TT>CUPS-Authenticate-Job</TT></TD>
        <TD>Yes</TD>
-       <TD>Adds or modifies a class.</TD>
+       <TD>Authenticates a job for printing.</TD>
 </TR>
 <TR>
        <TD NOWRAP><TT>CUPS-Delete-Class</TT> *</TD>
@@ -415,21 +421,19 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
        <TD>Removes a class.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>CUPS-Accept-Jobs</TT></TD>
+       <TD NOWRAP><TT>CUPS-Delete-Printer</TT> *</TD>
        <TD>Yes</TD>
-       <TD>Sets a printer's or class' printer-is-accepting-jobs
-       attribute to true.</TD>
+       <TD>Removes a printer.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>CUPS-Reject-Jobs</TT></TD>
+       <TD NOWRAP><TT>CUPS-Get-Classes</TT> *</TD>
        <TD>Yes</TD>
-       <TD>Sets a printer's or class' printer-is-accepting-jobs
-       attribute to false.</TD>
+       <TD>Gets a list of classes.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>CUPS-Set-Default</TT> *</TD>
+       <TD NOWRAP><TT>CUPS-Get-Default</TT> *</TD>
        <TD>Yes</TD>
-       <TD>Sets the server/network default printer or class.</TD>
+       <TD>Gets the server/network default printer or class.</TD>
 </TR>
 <TR>
        <TD NOWRAP><TT>CUPS-Get-Devices</TT> *</TD>
@@ -437,24 +441,35 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
        <TD>Gets a list of printer devices.</TD>
 </TR>
 <TR>
+       <TD NOWRAP><TT>CUPS-Get-Document</TT></TD>
+       <TD>Yes</TD>
+       <TD>Retrieves a document file from a job.</TD>
+</TR>
+<TR>
        <TD NOWRAP><TT>CUPS-Get-PPDs</TT> *</TD>
        <TD>Yes</TD>
        <TD>Gets a list of printer drivers or manufacturers.</TD>
 </TR>
 <TR>
+       <TD NOWRAP><TT>CUPS-Get-Printers</TT> *</TD>
+       <TD>Yes</TD>
+       <TD>Gets a list of printers and/or classes.</TD>
+</TR>
+<TR>
        <TD NOWRAP><TT>CUPS-Move-Job</TT></TD>
        <TD>Yes</TD>
        <TD>Moves a job to a different printer or class.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>CUPS-Authenticate-Job</TT></TD>
+       <TD NOWRAP><TT>CUPS-Reject-Jobs</TT></TD>
        <TD>Yes</TD>
-       <TD>Authenticates a job for printing.</TD>
+       <TD>Sets a printer's or class' printer-is-accepting-jobs
+       attribute to false.</TD>
 </TR>
 <TR>
-       <TD NOWRAP><TT>CUPS-Get-Document</TT></TD>
+       <TD NOWRAP><TT>CUPS-Set-Default</TT> *</TD>
        <TD>Yes</TD>
-       <TD>Retrieves a document file from a job.</TD>
+       <TD>Sets the server/network default printer or class.</TD>
 </TR>
 </TBODY>
 </TABLE></DIV>
@@ -477,7 +492,7 @@ HREF="ref-cupsd-conf.html#LimitIPP"><TT>Limit</TT></A> subsections which list th
 &lt;/Limit>
 </PRE>
 
-<P>The directives inside the <TT>Limit</TT> subsection can use any of the normal limiting directives: <A HREF="ref-cupsd-conf.html#Allow"><TT>Allow</TT></A>, <A HREF="ref-cupsd-conf.html#AuthType"><TT>AuthType</TT></A>, <A HREF="ref-cupsd-conf.html#Deny"><TT>Deny</TT></A>, <A HREF="ref-cupsd-conf.html#Encryption"><TT>Encryption</TT></A>, <A HREF="ref-cupsd-conf.html#Require"><TT>Require</TT></A>, and <A HREF="ref-cupsd-conf.html#Satisfy"><TT>Satisfy</TT></A>. <A HREF="#TABLE02">Table 2</A> lists some basic "recipes" for different access control rules.</P>
+<P>The directives inside the <TT>Limit</TT> subsection can use any of the normal limiting directives: <A HREF="man-cupsd.conf.html#Allow"><TT>Allow</TT></A>, <A HREF="man-cupsd.conf.html#AuthType"><TT>AuthType</TT></A>, <A HREF="man-cupsd.conf.html#Deny"><TT>Deny</TT></A>, <A HREF="man-cupsd.conf.html#Encryption"><TT>Encryption</TT></A>, <A HREF="man-cupsd.conf.html#Require"><TT>Require</TT></A>, and <A HREF="man-cupsd.conf.html#Satisfy"><TT>Satisfy</TT></A>. <A HREF="#TABLE02">Table 2</A> lists some basic "recipes" for different access control rules.</P>
 
 <DIV CLASS="table"><TABLE WIDTH="80%" SUMMARY="Access Control Recipes">
 <CAPTION>Table 2: <A NAME="TABLE02">Access Control Recipes</A></CAPTION>
@@ -584,7 +599,7 @@ Allow from @LOCAL</PRE></TD>
 
 <H2 CLASS="title"><A NAME="SELECT">Using Policies</A></H2>
 
-<P>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 <A HREF="ref-cupsd-conf.html#DefaultPolicy"><TT>DefaultPolicy</TT></A> directive in the <VAR>cupsd.conf</VAR> file. For example, add the following line to the <VAR>cupsd.conf</VAR> file to use the "lab999" policy from the previous section:</P>
+<P>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 <A HREF="man-cupsd.conf.html#DefaultPolicy"><TT>DefaultPolicy</TT></A> directive in the <VAR>cupsd.conf</VAR> file. For example, add the following line to the <VAR>cupsd.conf</VAR> file to use the "lab999" policy from the previous section:</P>
 
 <PRE CLASS="example">
 DefaultPolicy lab999
index fde5890..1469f45 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
index 27decdb..729e268 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
index 0399f05..8055705 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
diff --git a/doc/help/ref-access_log.html b/doc/help/ref-access_log.html
deleted file mode 100644 (file)
index 015ea17..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
-       <TITLE>access_log</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">access_log</H1>
-
-<P>The <VAR>access_log</VAR> 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:</P>
-
-<P CLASS="command">
-
-host group user date-time \"method resource version\" status
-bytes ipp-operation ipp-status<BR>
-
-<BR>
-
-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<BR>
-
-localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1"
-200 0 - -<BR>
-
-localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1" 200
-157 CUPS-Get-Printers
-successful-ok-ignored-or-substituted-attributes<BR>
-
-localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1" 200
-1411 CUPS-Get-Devices -<BR>
-
-localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1"
-200 6667 - -<BR>
-
-</P>
-
-<P>The <I>host</I> field will normally only be an IP address
-unless you have enabled the <A
-HREF="ref-cupsd-conf.html#HostNameLookups"><CODE>HostNameLookups</CODE></A>
-directive in the <VAR>cupsd.conf</VAR> file or if the IP address
-corresponds to your local machine.</P>
-
-<P>The <I>group</I> field always contains "-".</P>
-
-<P>The <I>user</I> field is the authenticated username of the
-requesting user. If no username and password is supplied for the
-request then this field contains "-".</P>
-
-<P>The <I>date-time</I> field is the date and time of the request
-in local time and is in the format:</P>
-
-<P CLASS="command">
-[DD/MON/YYYY:HH:MM:SS +ZZZZ]
-</P>
-
-<P>The <I>method</I> field is the HTTP method used: "GET",
-"OPTIONS", "PUT", or "POST". "GET" requests are used to get files
-from the server, both for the web interface and to get
-configuration and log files. "OPTIONS" requests are used to
-upgrade connections to TLS encryption. "PUT" requests are used to
-upload configuration files. "POST" requests are used for web
-interface forms and IPP requests.</P>
-
-<P>The <I>resource</I> field is the filename of the requested
-resource.</P>
-
-<P>The <I>version</I> field is the HTTP specification version used by the
-client. For CUPS clients this will always be "HTTP/1.1".</P>
-
-<P>The <I>status</I> field contains the HTTP result status of the
-request, as follows:</P>
-
-<UL>
-
-       <LI><CODE>200</CODE> - Successful operation.</LI>
-
-       <LI><CODE>201</CODE> - File created/modified successfully.</LI>
-
-       <LI><CODE>304</CODE> - The requested file has not changed.</LI>
-
-       <LI><CODE>400</CODE> - Bad HTTP request; typically this
-       means that you have a malicious program trying to access
-       your server.</LI>
-
-       <LI><CODE>401</CODE> - Unauthorized, authentication
-       (username + password) is required.</LI>
-
-       <LI><CODE>403</CODE> - Access is forbidden; typically
-       this means that a client tried to access a file or
-       resource they do not have permission to access.</LI>
-
-       <LI><CODE>404</CODE> - The file or resource does not
-       exist.</LI>
-
-       <LI><CODE>405</CODE> - URL access method is not allowed;
-       typically this means you have a web browser using your
-       server as a proxy.</LI>
-
-       <LI><CODE>413</CODE> - Request too large; typically this
-       means that a client tried to print a file larger than the
-       <A
-       HREF="ref-cupsd-conf.html#MaxRequestSize"><CODE>MaxRequestSize</CODE></A>
-       allows.</LI>
-
-       <LI><CODE>426</CODE> - Upgrading to TLS-encrypted
-       connection.</LI>
-
-       <LI><CODE>500</CODE> - Server error; typically this
-       happens when the server is unable to open/create a file -
-       consult the <VAR>error_log</VAR> file for details.</LI>
-
-       <LI><CODE>501</CODE> - The client requested encryption
-       but encryption support is not enabled/compiled in.</LI>
-
-       <LI><CODE>505</CODE> - HTTP version number not supported;
-       typically this means that you have a malicious program
-       trying to access your server.</LI>
-
-</UL>
-
-<P>The <I>bytes</I> field contains the number of bytes in the
-request. For POST requests the <I>bytes</I> field contains the
-number of bytes of non-IPP data that is received from the
-client.</P>
-
-<P>The <I>ipp-operation</I> field contains either "-" for non-IPP
-requests or the IPP operation name for POST requests containing
-an IPP request.</P>
-
-<P>The <I>ipp-status</I> field contains either "-" for non-IPP
-requests or the IPP status code name for POST requests containing
-an IPP response.</P>
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-classes-conf.html b/doc/help/ref-classes-conf.html
deleted file mode 100644 (file)
index 4171bb2..0000000
+++ /dev/null
@@ -1,565 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
-       <TITLE>classes.conf</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">classes.conf</H1>
-
-<P>The CUPS scheduler (cupsd) uses the
-<VAR>/etc/cups/classes.conf</VAR> file to store the list of
-available classes. This file contains only locally defined
-classes, not remote classes that are created automatically via
-browsing. Each directive is listed on a line by itself followed
-by its value. Comments are introduced using the number sign ("#")
-character at the beginning of a line.</P>
-
-<P>While the class configuration file consists of plain text and
-can be modified using your favorite text editor, you should
-normally use the <A HREF="man-lpadmin.html">lpadmin(8)</A>
-command, web interface, or any of the available GUIs to manage
-your classes instead. If you do choose to edit this file
-manually, you will need to stop the scheduler first, make your
-changes, and then start the scheduler to make them active.</P>
-
-
-<H2 CLASS="title"><A NAME="Accepting">Accepting</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  Accepting yes
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Accepting</CODE> directive defines the initial state
-of the <VAR>printer-is-accepting-jobs</VAR> attribute. This state
-is also set by the <CODE>accept(8)</CODE> and
-<CODE>reject(8)</CODE> commands:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/accept classname
-/usr/sbin/reject classname</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="AllowUser">AllowUser</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  AllowUser foo_user
-  AllowUser @bar_group
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>AllowUser</CODE> directive adds a username or group
-name to the <VAR>requesting-user-name-allowed</VAR> attribute
-which can be set by the <CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -u allow:foo_user,@bar_group</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A> directive.
-This directive cannot be used with <A
-HREF="#DenyUser"><CODE>DenyUser</CODE></A>.</P>
-
-
-<H2 CLASS="title"><A NAME="Class">Class</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Class</CODE> directive begins a class definition.
-Classes are added using the <CODE>lpadmin(8)</CODE> command:
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -c classname</KBD>
-</PRE>
-
-
-<H2 CLASS="title"><A NAME="DefaultClass">DefaultClass</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;DefaultClass name&gt;
-  ...
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultClass</CODE> directive begins a class
-definition as the default server destination. The default server
-destination can be set using the <CODE>lpadmin(8)</CODE>
-command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -d classname</KBD>
-</PRE>
-
-<P>Note that the server default destination settings can be
-overridden by the user's default destination settings which are
-normally set using the <CODE>lpoptions(1)</CODE> command.</P>
-
-
-<H2 CLASS="title"><A NAME="DenyUser">DenyUser</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  DenyUser foo_user
-  DenyUser @bar_group
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DenyUser</CODE> directive adds a username or group
-name to the <VAR>requesting-user-name-denied</VAR> attribute
-which can be set by the <CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -u deny:foo_user,@bar_group</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A> directive.
-This directive cannot be used with <A
-HREF="#AllowUser"><CODE>AllowUser</CODE></A></P>
-
-
-<H2 CLASS="title"><A NAME="Info">Info</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  Info My Class
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Info</CODE> directive defines the string for the
-<VAR>printer-info</VAR> attribute. It is normally set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -D "My Class"</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="JobSheets">JobSheets</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  JobSheets none,standard
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobSheets</CODE> directive specifies the default
-banner pages  to print before and after a print job. In the above
-example, only a <VAR>standard</VAR> banner will print after each
-job. The <CODE>lpadmin(8)</CODE> command is normally used to set
-the default banners:
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -o job-sheets-default=none,standard</KBD>
-</PRE>
-
-<P>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.</P>
-
-<P>The available banner pages depend on the local system
-configuration; CUPS includes the following standard banner
-files:</P>
-
-<UL>
-
-       <LI><CODE>none</CODE> - Do not produce a banner
-       page.</LI>
-
-       <LI><CODE>classified</CODE> - A banner page with a
-       &quot;classified&quot; label at the top and bottom.</LI>
-
-       <LI><CODE>confidential</CODE> - A banner page with a
-       &quot;confidential&quot; label at the top and bottom.</LI>
-
-       <LI><CODE>secret</CODE> - A banner page with a
-       &quot;secret&quot; label at the top and bottom.</LI>
-
-       <LI><CODE>standard</CODE> - A banner page with no label
-       at the top and bottom.</LI>
-
-       <LI><CODE>topsecret</CODE> - A banner page with a
-       &quot;top secret&quot; label at the top and bottom.</LI>
-
-       <LI><CODE>unclassified</CODE> - A banner page with an
-       &quot;unclassified&quot; label at the top and bottom.</LI>
-
-</UL>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="KLimit">KLimit</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  KLimit 1234
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>KLimit</CODE> directive defines the value of the
-<VAR>job-k-limit</VAR> attribute. It is normally set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -o job-k-limit=1234</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="Location">Location</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  Location Building 3321
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Location</CODE> directive defines the string for the
-<VAR>printer-location</VAR> attribute. It is normally set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -L "Building 3321"</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="OpPolicy">OpPolicy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  OpPolicy default
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>OpPolicy</CODE> directive sets the operation policy
-that is used for the printer. The <CODE>lpadmin(8)</CODE> command
-sets the current operation policy:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -o printer-op-policy=default</KBD>
-</PRE>
-
-<P>The default policy is named "default". All policies correspond
-to those defined using the <VAR>cupsd.conf</VAR> <A
-HREF="ref-cupsd-conf.html#Policy"><CODE>Policy</CODE></A>
-section.</P>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="Option">Option</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  Option name value
-  Option scaling 100
-  Option page-left 72
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Option</CODE> directive specifies a default job
-template attribute value. It is mapped to
-<CODE>name-default</CODE> in the printer attributes and applied
-to jobs as <CODE>name</CODE>.</P>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="PageLimit">PageLimit</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  PageLimit 1234
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PageLimit</CODE> directive defines the value of the
-<VAR>job-page-limit</VAR> attribute. It can be set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -o job-page-limit=1234</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="Printer">Printer</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  Printer foo
-  Printer bar
-  Printer bleep
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Printer</CODE> directive adds a printer to a class.
-Printers are added to a class using the <CODE>lpadmin(8)</CODE>
-command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -c classname</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="QuotaPeriod">QuotaPeriod</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  QuotaPeriod 604800
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>QuotaPeriod</CODE> directive defines the value of
-the  <VAR>job-quota-period</VAR> attribute. Typical values are
-86400 (1 day), 604800 (1 week), 2592000 (1 month), and 31536000
-(1 year). It is set using the <CODE>lpadmin(8)</CODE>
-command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -o job-quota-period=604800</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="Shared">Shared</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  Shared yes
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Shared</CODE> directive defines the initial value of
-the <VAR>printer-is-shared</VAR> attribute. The strings
-<VAR>yes</VAR> and <VAR>no</VAR> correspond to the true and false
-values, respectively. The <CODE>lpadmin(8)</CODE> command sets
-the current state:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p classname -o printer-is-shared=true</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="State">State</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  State idle
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>State</CODE> directive defines the initial value of
-the <VAR>printer-state</VAR> attribute. The strings
-<VAR>idle</VAR> and <VAR>stopped</VAR> correspond to the IPP
-enumeration values 3 and 5, respectively. The
-<CODE>cupsenable(8)</CODE> and <CODE>cupsdisable(8)</CODE>
-commands set the current state:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/cupsenable classname</KBD>
-<KBD>/usr/sbin/cupsdisable classname</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="StateMessage">StateMessage</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  StateMessage Class is lonely.
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>StateMessage</CODE> directive defines the initial
-string for the  <VAR>printer-state-message</VAR> attribute. The
-following are some example messages:</P>
-
-<PRE CLASS="command">
-StateMessage Connected to host_name...
-StateMessage Connecting to printer_queue on port port_number...
-StateMessage Network host host_name is busy; will retry in 30 seconds...
-StateMessage Class busy; will retry in 10 seconds...
-StateMessage Class is busy; retrying print job...
-StateMessage Print file accepted - job ID id_number.
-StateMessage Waiting for job to complete
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="StateTime">StateTime</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Class name&gt;
-  ...
-  StateTime 1133542425
-&lt;/Class&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>StateTime</CODE> directive defines the UNIX time
-(seconds since Jan 1, 1970) for the last state change of the
-queue. It is mapped to the <VAR>printer-state-change-time</VAR>
-attribute.</P>
-
-<P>This directive must appear inside a <A
-HREF="#Class"><CODE>Class</CODE></A> or <A
-HREF="#DefaultClass"><CODE>DefaultClass</CODE></A>
-section.</P>
-
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-client-conf.html b/doc/help/ref-client-conf.html
deleted file mode 100644 (file)
index 03d1ea0..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
-       <TITLE>client.conf</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">client.conf</H1>
-
-<P>The <VAR>/etc/cups/client.conf</VAR> and
-<VAR>~/.cups/client.conf</VAR> files contain up to two directives
-that determine how the client behaves. Each directive is listed
-on a line by itself followed by its value. Comments are
-introduced using the number sign ("#") character at the beginning
-of a line.</P>
-
-<H2 CLASS="title"><A NAME="Encryption">Encryption</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Encryption Never
-Encryption IfRequested
-Encryption Required
-Encryption Always
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Encryption</CODE> directive specifies the default
-encryption settings for the client.</P>
-
-<P>The default setting is <VAR>IfRequested</VAR>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6/OS X 10.8</SPAN><A NAME="GSSServiceName">GSSServiceName</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-GSSServiceName http
-GSSServiceName ipp
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>GSSServiceName</CODE> directive sets the Kerberos service name to use. The default is <CODE>http</CODE> for compatibility with Microsoft Windows.</P>
-
-
-<H2 CLASS="title"><A NAME="ServerName">ServerName</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerName foo.bar.com
-ServerName 11.22.33.44
-ServerName foo.bar.com:8631
-<SPAN CLASS="info">CUPS 1.6</SPAN>ServerName foo.bar.com/version=1.1
-<SPAN CLASS="info">CUPS 1.6</SPAN>ServerName foo.bar.com:8631/version=1.1
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerName</CODE> directive specifies sets the remote server that is to be used for all client operations. That is, it redirects all client requests to the remote server.</P>
-
-<P>The default port number is 631 but can be overridden by adding a colon followed by the desired port number to the value.</P>
-
-<P>By default, CUPS 1.6 and later use IPP/2.0 to communicate with the server. Add "/version=1.1" to force IPP/1.1 which is required for CUPS 1.3.12 and earlier.</P>
-
-<P>The default is to use the local server ("<VAR>localhost</VAR>") or domain socket, if so configured.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-<P>Only one <CODE>ServerName</CODE> directive may appear. If multiple names are
-present, only the last one is used. This directive is not supported on OS X 10.7 or later.</P>
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6/OS X 10.8</SPAN><A NAME="User">User</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-User joe
-User bob
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>User</CODE> directive sets the user name to use. The default is the username associated with the current login.</P>
-
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-cups-files-conf.html.in b/doc/help/ref-cups-files-conf.html.in
deleted file mode 100644 (file)
index 07049d9..0000000
+++ /dev/null
@@ -1,538 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
-       <TITLE>cups-files.conf</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">cups-files.conf</H1>
-
-<P>The <VAR>/etc/cups/cups-files.conf</VAR> file contains configuration <I>directives</I> that control the files, directories. users. and groups that are used by the CUPS scheduler, <CODE>cupsd(8)</CODE>. Each directive is listed on a line by itself followed by its value. Comments are introduced using the number sign ("#") character at the beginning of a line.</P>
-
-<H2 CLASS="title"><A NAME="AccessLog">AccessLog</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-AccessLog /var/log/cups/access_log
-AccessLog /var/log/cups/access_log-%s
-AccessLog syslog
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>AccessLog</CODE> directive sets the name of the
-access log file. If the filename is not absolute then it is
-assumed to be relative to the <A
-HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-access log file is stored in "common log format" and can be used
-by any web access reporting tool to generate a report on CUPS
-server activity.</P>
-
-<P>The server name can be included in the filename by using
-<CODE>%s</CODE> in the name.</P>
-
-<P>The special name "syslog" can be used to send the access
-information to the system log instead of a plain file.</P>
-
-<P>The default access log file is
-<VAR>@CUPS_LOGDIR@/access_log</VAR>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.15</SPAN><A NAME="ConfigFilePerm">ConfigFilePerm</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ConfigFilePerm 0644
-ConfigFilePerm 0640
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ConfigFilePerm</CODE> directive specifies the permissions to use when the scheduler writes configuration and cache files, typically in response to IPP or HTTP requests. The default is @CUPS_CONFIG_FILE_PERM@.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>The permissions for the <VAR>printers.conf</VAR> file are always 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.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="DataDir">DataDir</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DataDir /usr/share/cups
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DataDir</CODE> directive sets the directory to use
-for data files.</P>
-
-
-<H2 CLASS="title"><A NAME="DocumentRoot">DocumentRoot</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DocumentRoot /usr/share/doc/cups
-DocumentRoot /foo/bar/doc/cups
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DocumentRoot</CODE> directive specifies the location
-of web content for the HTTP server in CUPS. If an absolute path
-is not specified then it is assumed to be relative to the <A
-HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default directory is <VAR>@CUPS_DOCROOT@</VAR>.</P>
-
-<P>Documents are first looked up in a sub-directory for the
-primary language requested by the client (e.g.
-<VAR>@CUPS_DOCROOT@/fr/...</VAR>) and then directly under
-the <CODE>DocumentRoot</CODE> directory (e.g.
-<VAR>@CUPS_DOCROOT@/...</VAR>), so it is possible to
-localize the web content by providing subdirectories for each
-language needed.</P>
-
-
-<H2 CLASS="title"><A NAME="ErrorLog">ErrorLog</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ErrorLog /var/log/cups/error_log
-ErrorLog /var/log/cups/error_log-%s
-ErrorLog syslog
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ErrorLog</CODE> directive sets the name of the error
-log file. If the filename is not absolute then it is assumed to
-be relative to the <A
-HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default error log file is <VAR>@CUPS_LOGDIR@/error_log</VAR>.</P>
-
-<P>The server name can be included in the filename by using
-<CODE>%s</CODE> in the name.</P>
-
-<P>The special name "syslog" can be used to send the error
-information to the system log instead of a plain file.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4/OS X 10.6</SPAN><A NAME="FatalErrors">FatalErrors</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-FatalErrors none
-FatalErrors all
-FatalErrors browse
-FatalErrors config
-FatalErrors listen
-FatalErrors log
-FatalErrors permissions
-FatalErrors all -permissions
-FatalErrors config permissions log
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>FatalErrors</CODE> directive determines whether certain kinds of
-errors are fatal. The following kinds of errors are currently recognized:</P>
-
-<UL>
-
-       <LI><CODE>none</CODE> - No errors are fatal</LI>
-
-       <LI><CODE>all</CODE> - All of the errors below are fatal</LI>
-
-       <LI><CODE>browse</CODE> - Browsing initialization errors are fatal,
-       for example failed binding to the CUPS browse port or failed connections
-       to LDAP servers</LI>
-
-       <LI><CODE>config</CODE> - Configuration file syntax errors are
-       fatal</LI>
-
-       <LI><CODE>listen</CODE> - Listen or Port errors are fatal, except for
-       IPv6 failures on the loopback or "any" addresses</LI>
-
-       <LI><CODE>log</CODE> - Log file creation or write errors are fatal</LI>
-
-       <LI><CODE>permissions</CODE> - Bad startup file permissions are
-       fatal, for example shared SSL certificate and key files with world-
-       read permissions</LI>
-
-</UL>
-
-<P>Multiple errors can be listed, and the form "-kind" can be used with
-<CODE>all</CODE> to remove specific kinds of errors. The default setting is
-<CODE>@CUPS_FATAL_ERRORS@</CODE>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.18</SPAN><A NAME="FileDevice">FileDevice</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-FileDevice Yes
-FileDevice No
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>FileDevice</CODE> directive determines whether the
-scheduler allows new printers to be added using device URIs of
-the form <CODE>file:/filename</CODE>. File devices are most often
-used to test new printer drivers and do not support raw file
-printing.</P>
-
-<P>The default setting is <CODE>No</CODE>.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>File devices are managed by the scheduler. Since the
-scheduler normally runs as the root user, file devices
-can be used to overwrite system files and potentially
-gain unauthorized access to the system. If you must
-create printers using file devices, we recommend that
-you set the <CODE>FileDevice</CODE> directive to
-<CODE>Yes</CODE> for only as long as you need to add the
-printers to the system, and then reset the directive to
-<CODE>No</CODE>.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.3</SPAN><A NAME="FontPath">FontPath</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-FontPath /foo/bar/fonts
-FontPath /usr/share/cups/fonts:/foo/bar/fonts
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>FontPath</CODE> directive specifies the font path to
-use when searching for fonts. The default font path is
-<CODE>/usr/share/cups/fonts</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="Group">Group</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Group lp
-Group nobody
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Group</CODE> directive specifies the UNIX group that
-filter and CGI programs run as. The default group is
-system-specific but is usually <CODE>lp</CODE> or
-<CODE>nobody</CODE>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.15</SPAN><A NAME="LogFilePerm">LogFilePerm</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-LogFilePerm 0644
-LogFilePerm 0600
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>LogFilePerm</CODE> directive specifies the
-permissions to use when writing log files. The default
-is @CUPS_LOG_FILE_PERM@.</P>
-
-
-<H2 CLASS="title"><A NAME="PageLog">PageLog</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-PageLog /var/log/cups/page_log
-PageLog /var/log/cups/page_log-%s
-PageLog syslog
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PageLog</CODE> directive sets the name of the page
-log file. If the filename is not absolute then it is assumed to
-be relative to the <A
-HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default page log file is <VAR>@CUPS_LOGDIR@/page_log</VAR>.</P>
-
-<P>The server name can be included in the filename by using
-<CODE>%s</CODE> in the name.</P>
-
-<P>The special name "syslog" can be used to send the page
-information to the system log instead of a plain file.</P>
-
-
-<H2 CLASS="title"><A NAME="Printcap">Printcap</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Printcap
-Printcap /etc/printcap
-Printcap /etc/printers.conf
-Printcap /Library/Preferences/org.cups.printers.plist
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Printcap</CODE> directive controls whether or not a
-printcap file is automatically generated and updated with a list
-of available printers. If specified with no value, then no
-printcap file will be generated. The default is to generate a
-file named <VAR>@CUPS_DEFAULT_PRINTCAP@</VAR>.</P>
-
-<P>When a filename is specified (e.g. <VAR>@CUPS_DEFAULT_PRINTCAP@</VAR>),
-the printcap file is written whenever a printer is added or
-removed. The printcap file can then be used by applications that
-are hardcoded to look at the printcap file for the available
-printers.</P>
-
-
-<H2 CLASS="title"><A NAME="PrintcapFormat">PrintcapFormat</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-PrintcapFormat BSD
-PrintcapFormat Solaris
-PrintcapFormat plist
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PrintcapFormat</CODE> directive controls the output format of the
-printcap file. The default is to generate the plist format on OS X, the
-Solaris format on Solaris, and the BSD format on other operating systems.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.3</SPAN><A NAME="RemoteRoot">RemoteRoot</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-RemoteRoot remroot
-RemoteRoot root
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>RemoteRoot</CODE> directive sets the username for
-unauthenticated root requests from remote hosts. The default
-username is <VAR>remroot</VAR>. Setting <CODE>RemoteRoot</CODE>
-to <VAR>root</VAR> effectively disables this security
-mechanism.</P>
-
-
-<H2 CLASS="title"><A NAME="RequestRoot">RequestRoot</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-RequestRoot /var/spool/cups
-RequestRoot /foo/bar/spool/cups
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>RequestRoot</CODE> directive sets the directory for
-incoming IPP requests and HTML forms. If an absolute path is not
-provided then it is assumed to be relative to the <A
-HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default request directory is <VAR>@CUPS_REQUESTS@</VAR>.</P>
-
-
-<H2 CLASS="title"><A NAME="ServerBin">ServerBin</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerBin /usr/lib/cups
-ServerBin /foo/bar/lib/cups
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerBin</CODE> directive sets the directory for
-server-run executables. If an absolute path is not provided then
-it is assumed to be relative to the <A
-HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default executable directory is <VAR>/usr/lib/cups</VAR>,
-<VAR>/usr/lib32/cups</VAR>, or <VAR>/usr/libexec/cups</VAR>
-depending on the operating system.</P>
-
-
-<H2 CLASS="title"><A NAME="ServerCertificate">ServerCertificate</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerCertificate /etc/cups/ssl/server.crt
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerCertificate</CODE> directive specifies the
-location of the SSL certificate file used by the server when
-negotiating encrypted connections. The certificate must not be
-encrypted (password protected) since the scheduler normally runs
-in the background and will be unable to ask for a password.</P>
-
-<P>The default certificate file is
-<VAR>/etc/cups/ssl/server.crt</VAR>.</P>
-
-
-<H2 CLASS="title"><A NAME="ServerKey">ServerKey</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerKey /etc/cups/ssl/server.key
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerKey</CODE> directive specifies the location of
-the SSL private key file used by the server when negotiating
-encrypted connections.</P>
-
-<P>The default key file is
-<VAR>/etc/cups/ssl/server.crt</VAR>.</P>
-
-
-<H2 CLASS="title"><A NAME="ServerRoot">ServerRoot</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerRoot /etc/cups
-ServerRoot /foo/bar/cups
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerRoot</CODE> directive specifies the absolute
-path to the server configuration and state files. It is also used
-to resolve relative paths in the <VAR>cupsd.conf</VAR> file. The
-default server directory is <VAR>/etc/cups</VAR>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6.4</SPAN><A NAME="SyncOnClose">SyncOnClose</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SyncOnClose No
-SyncOnClose Yes
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SyncOnClose</CODE> directive determines whether the scheduler
-flushes changes to configuration and state files to disk. The default is
-<CODE>No</CODE> which relies on the operating system to schedule a suitable
-time to write changes to disk.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>Setting <CODE>SyncOnClose</CODE> to <CODE>Yes</CODE> makes the scheduler use the <CODE>fsync(2)</CODE> system call to write all changes to disk, however the drive or network file system server may still delay writing data to disk. Do not depend on this functionality to prevent data loss in the event of unexpected hardware failure.</P>
-
-<P>Enabling <CODE>SyncOnClose</CODE> may also cause the scheduler to periodically become unresponsive while it waits for changes to be written.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="SystemGroup">SystemGroup</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SystemGroup lpadmin
-SystemGroup sys
-SystemGroup system
-SystemGroup root
-SystemGroup root lpadmin
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SystemGroup</CODE> directive specifies the system
-administration group for <CODE>System</CODE> authentication.
-Multiple groups can be listed, separated with spaces. The default
-group list is <CODE>@CUPS_SYSTEM_GROUPS@</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="TempDir">TempDir</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-TempDir /var/tmp
-TempDir /foo/bar/tmp
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>TempDir</CODE> directive specifies an absolute path
-for the directory to use for temporary files. The default
-directory is <VAR>@CUPS_REQUESTS@/tmp</VAR>.</P>
-
-<P>Temporary directories must be world-writable and should have
-the "sticky" permission bit enabled so that other users cannot
-delete filter temporary files. The following commands will create
-an appropriate temporary directory called
-<VAR>/foo/bar/tmp</VAR>:</P>
-
-<PRE CLASS="command">
-<KBD>mkdir /foo/bar/tmp</KBD>
-<KBD>chmod a+rwxt /foo/bar/tmp</KBD>
-</PRE>
-
-
-<H2 CLASS="title"><A NAME="User">User</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-User lp
-User guest
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>User</CODE> directive specifies the UNIX user that
-filter and CGI programs run as. The default user is
-<CODE>@CUPS_USER@</CODE>.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>You may not use user <CODE>root</CODE>, as that would expose
-the system to unacceptable security risks. The scheduler will
-automatically choose user <CODE>nobody</CODE> if you specify a
-user whose ID is 0.</P>
-
-</BLOCKQUOTE>
-
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-cupsd-conf.html.in b/doc/help/ref-cupsd-conf.html.in
deleted file mode 100644 (file)
index 989765d..0000000
+++ /dev/null
@@ -1,2162 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
-       <TITLE>cupsd.conf</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">cupsd.conf</H1>
-
-<P>The <VAR>/etc/cups/cupsd.conf</VAR> file contains
-configuration <I>directives</I> that control how the server
-functions. Each directive is listed on a line by itself followed
-by its value. Comments are introduced using the number sign ("#")
-character at the beginning of a line.</P>
-
-<P>Since the server configuration file consists of plain text,
-you can use your favorite text editor to make changes to it.
-After making any changes, restart the <CODE>cupsd(8)</CODE>
-process using the startup script for your operating system:</P>
-
-<UL>
-
-       <LI>AIX, IRIX, Linux, Solaris:
-       <PRE CLASS="command">
-/etc/init.d/cups restart
-       </PRE></LI>
-
-       <LI>HP-UX:
-       <PRE CLASS="command">
-/sbin/init.d/cups restart
-       </PRE></LI>
-
-       <LI>MacOS X:
-       <PRE CLASS="command">
-sudo launchctl unload /System/Library/LaunchDaemons/org.cups.cupsd.plist
-sudo launchctl load /System/Library/LaunchDaemons/org.cups.cupsd.plist
-       </PRE></LI>
-
-</UL>
-
-<P>You can also edit this file from the CUPS web interface, which
-automatically handles restarting the scheduler.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>The specification of time units ("w" for weeks, "h" for hours, etc.) in the various time interval directives is new in CUPS 1.6/OS X 10.8. Prior releases of CUPS only supported time intervals in seconds.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="AccessLogLevel">AccessLogLevel</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-AccessLogLevel config
-AccessLogLevel actions
-AccessLogLevel all
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>AccessLogLevel</CODE> directive controls which requests are logged
-to the access log file. The following levels are defined:</P>
-
-<UL>
-
-       <LI><CODE>config</CODE>; Log when printers and classes are added,
-       deleted, or modified and when configuration files are accessed or
-       updated.</LI>
-
-       <LI><CODE>actions</CODE>; Log when print jobs are submitted,
-       held, released, modified, or canceled, and any of the conditions
-       for <CODE>config</CODE>.</LI>
-
-       <LI><CODE>all</CODE>; Log all requests.</LI>
-
-</UL>
-
-<P>The default access log level is <CODE>@CUPS_ACCESS_LOG_LEVEL@</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="Allow">Allow</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
-  ...
-  Allow from All
-  Allow from None
-  Allow from *.example.com
-  Allow from .example.com
-  Allow from host.example.com
-  Allow from nnn.*
-  Allow from nnn.nnn.*
-  Allow from nnn.nnn.nnn.*
-  Allow from nnn.nnn.nnn.nnn
-  Allow from nnn.nnn.nnn.nnn/mm
-  Allow from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
-  Allow from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]
-  Allow from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]/mmm
-  Allow from @LOCAL
-  Allow from @IF(name)
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Allow</CODE> directive specifies a hostname, IP
-address, or network that is allowed access to the server.
-<CODE>Allow</CODE> directives are cumulative, so multiple
-<CODE>Allow</CODE> directives can be used to allow access for
-multiple hosts or networks.</P>
-
-<P>Host and domain name matching require that you enable the <A
-HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A>
-directive.</P>
-
-<P>The <CODE>/mm</CODE> notation specifies a CIDR netmask, as shown in
-<A HREF="#TABLE1">Table 1</A>.</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="CIDR Netmasks">
-<CAPTION>Table 1: <A NAME="TABLE1">CIDR Netmasks</A></CAPTION>
-<TR>
-       <TH WIDTH="10%">mm</TH>
-       <TH WIDTH="20%">netmask</TH>
-       <TH WIDTH="10%">mm</TH>
-       <TH WIDTH="20%">netmask</TH>
-</TR>
-<TR>
-       <TD ALIGN="CENTER">0</TD>
-       <TD ALIGN="CENTER">0.0.0.0</TD>
-       <TD ALIGN="CENTER">8</TD>
-       <TD ALIGN="CENTER">255.0.0.0</TD>
-</TR>
-<TR>
-       <TD ALIGN="CENTER">1</TD>
-       <TD ALIGN="CENTER">128.0.0.0</TD>
-       <TD ALIGN="CENTER">16</TD>
-       <TD ALIGN="CENTER">255.255.0.0</TD>
-</TR>
-<TR>
-       <TD ALIGN="CENTER">2</TD>
-       <TD ALIGN="CENTER">192.0.0.0</TD>
-       <TD ALIGN="CENTER">24</TD>
-       <TD ALIGN="CENTER">255.255.255.0</TD>
-</TR>
-<TR>
-       <TD ALIGN="CENTER">...</TD>
-       <TD ALIGN="CENTER">...</TD>
-       <TD ALIGN="CENTER">32</TD>
-       <TD ALIGN="CENTER">255.255.255.255</TD>
-</TR>
-</TABLE></DIV>
-
-<P>The <CODE>@LOCAL</CODE> name will allow access from all local
-interfaces. The <CODE>@IF(name)</CODE> name will allow access
-from the named interface. In both cases, CUPS only allows access
-from the network that the interface(s) are configured for -
-requests  arriving on the interface from a foreign network will
-<em>not</em> be accepted.</P>
-
-<P>The <CODE>Allow</CODE> directive must appear inside a <A
-HREF="#Location"><CODE>Location</CODE></A> or <A
-HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="AuthType">AuthType</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
-  ...
-  AuthType None
-  AuthType Basic
-  AuthType Digest
-  AuthType BasicDigest
-  AuthType Negotiate
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>AuthType</CODE> directive defines the type of
-authentication to perform:</P>
-
-<UL>
-
-       <LI><CODE>None</CODE> - No authentication should be
-       performed (default)</LI>
-
-       <LI><CODE>Basic</CODE> - Basic authentication should be
-       performed using the UNIX password and group files</LI>
-
-       <LI><CODE>Digest</CODE> - Digest authentication should be
-       performed using the <VAR>/etc/cups/passwd.md5</VAR>
-       file</LI>
-
-       <LI><CODE>BasicDigest</CODE> - Basic authentication
-       should be performed using the
-       <VAR>/etc/cups/passwd.md5</VAR> file</LI>
-
-       <LI><CODE>Negotiate</CODE> - Kerberos authentication
-       should be performed</LI>
-
-</UL>
-
-<P>When using <CODE>Basic</CODE>, <CODE>Digest</CODE>,
-<CODE>BasicDigest</CODE>, or <CODE>Negotiate</CODE> authentication,
-clients connecting through the <CODE>localhost</CODE> interface can
-also authenticate using certificates.</P>
-
-<P>The <CODE>AuthType</CODE> directive must appear inside a <A
-HREF="#Location"><CODE>Location</CODE></A> or <A
-HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="AutoPurgeJobs">AutoPurgeJobs</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-AutoPurgeJobs Yes
-AutoPurgeJobs No
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>AutoPurgeJobs</CODE> directive specifies whether or
-not to purge completed jobs once they are no longer required for
-quotas. This option has no effect if quotas are not enabled. The
-default setting is <CODE>No</CODE>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="BrowseLocalProtocols">BrowseLocalProtocols</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-BrowseLocalProtocols all
-BrowseLocalProtocols none
-BrowseLocalProtocols dnssd
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>BrowseLocalProtocols</CODE> directive specifies the
-protocols to use when advertising local shared printers on the
-network. Multiple protocols can be specified by separating them
-with spaces. The default is "<CODE>@CUPS_BROWSE_LOCAL_PROTOCOLS@</CODE>".</P>
-
-
-<H2 CLASS="title"><A NAME="BrowseWebIF">BrowseWebIF</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-BrowseWebIF On
-BrowseWebIF Off
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>BrowseWebIF</CODE> directive controls whether the CUPS web
-interface is advertised via DNS-SD. The default setting is
-<CODE>Off</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="Browsing">Browsing</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Browsing On
-Browsing Off
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Browsing</CODE> directive controls whether or not
-printer sharing is enabled. The default setting is
-<CODE>@CUPS_BROWSING@</CODE>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="Classification">Classification</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Classification
-Classification classified
-Classification confidential
-Classification secret
-Classification topsecret
-Classification unclassified
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Classification</CODE> directive sets the
-classification level on the server. When this option is set, at
-least one of the banner pages is forced to the classification
-level, and the classification is placed on each page of output.
-The default is no classification level.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.10</SPAN><A NAME="ClassifyOverride">ClassifyOverride</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ClassifyOverride Yes
-ClassifyOverride No
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ClassifyOverride</CODE> directive specifies whether
-users can override the default classification level on the
-server. When the server classification is set, users can change
-the classification using the <CODE>job-sheets</CODE> option and
-can choose to only print one security banner before or after the
-job. If the <CODE>job-sheets</CODE> option is set to
-<CODE>none</CODE> then the server default classification is
-used.</P>
-
-<P>The default is to not allow classification overrides.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="DefaultAuthType">DefaultAuthType</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DefaultAuthType Basic
-DefaultAuthType BasicDigest
-DefaultAuthType Digest
-DefaultAuthType Negotiate
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultAuthType</CODE> directive specifies the type
-of authentication to use for IPP operations that require a
-username. The default is <CODE>Basic</CODE>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="DefaultEncryption">DefaultEncryption</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DefaultEncryption Never
-DefaultEncryption IfRequested
-DefaultEncryption Required
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultEncryption</CODE> directive specifies the
-type of encryption to use when performing authentication. The
-default is <CODE>Required</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="DefaultLanguage">DefaultLanguage</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DefaultLanguage de
-DefaultLanguage en
-DefaultLanguage es
-DefaultLanguage fr
-DefaultLanguage it
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultLanguage</CODE> directive specifies the
-default language to use for client connections. Setting the
-default language also sets the default character set if a
-language localization file exists for it. The default language
-is "en" for English.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4/OS X 10.6</SPAN><A NAME="DefaultPaperSize">DefaultPaperSize</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DefaultPaperSize Letter
-DefaultPaperSize A4
-DefaultPaperSize Auto
-DefaultPaperSize None
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultPaperSize</CODE> directive specifies the default paper
-size to use when creating new printers. The default is <CODE>Auto</CODE>
-which uses a paper size appropriate for the system default locale. A value
-of <CODE>None</CODE> tells the scheduler to not set the default paper
-size.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="DefaultPolicy">DefaultPolicy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DefaultPolicy default
-DefaultPolicy authenticated
-DefaultPolicy foo
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultPolicy</CODE> directive specifies the default
-policy to use for IPP operation. The default is
-<CODE>default</CODE>. CUPS also includes a policy called
-<CODE>authenticated</CODE> that requires a username and password for printing
-and other job operations.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="DefaultShared">DefaultShared</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DefaultShared yes
-DefaultShared no
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultShared</CODE> directive specifies whether
-printers are shared (published) by default. The default is
-<CODE>@CUPS_DEFAULT_SHARED@</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="Deny">Deny</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
-  ..
-  Deny from All
-  Deny from None
-  Deny from *.example.com
-  Deny from .example.com
-  Deny from host.example.com
-  Deny from nnn.*
-  Deny from nnn.nnn.*
-  Deny from nnn.nnn.nnn.*
-  Deny from nnn.nnn.nnn.nnn
-  Deny from nnn.nnn.nnn.nnn/mm
-  Deny from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
-  Deny from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]
-  Deny from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]/mmm
-  Deny from @LOCAL
-  Deny from @IF(name)
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Deny</CODE> directive specifies a hostname, IP
-address, or network that is denied access to the server.
-<CODE>Deny</CODE> directives are cumulative, so multiple
-<CODE>Deny</CODE> directives can be used to deny access for
-multiple hosts or networks.</P>
-
-<P>Host and domain name matching require that you enable the <A
-HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A>
-directive.</P>
-
-<P>The <CODE>/mm</CODE> notation specifies a CIDR netmask, a shown in
-<A HREF="TABLE1">Table 1</A>.</P>
-
-<P>The <CODE>@LOCAL</CODE> name will deny access from all local
-interfaces. The <CODE>@IF(name)</CODE> name will deny access from
-the named interface. In both cases, CUPS only denies access from
-the network that the interface(s) are configured for - requests
-arriving on the interface from a foreign network will
-<em>not</em> be denied.</P>
-
-<P>The <CODE>Deny</CODE> directive must appear inside a <A
-HREF="#Location"><CODE>Location</CODE></A> or <A
-HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4/OS X 10.6</SPAN><A NAME="DirtyCleanInterval">DirtyCleanInterval</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DirtyCleanInterval 1w
-DirtyCleanInterval 1d
-DirtyCleanInterval 1h
-DirtyCleanInterval 1m
-DirtyCleanInterval 30
-DirtyCleanInterval 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DirtyCleanInterval</CODE> directive specifies the amount of time to wait before updating configuration and state files for printers, classes, subscriptions, and jobs in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix). A value of <CODE>0</CODE> causes the update to occur as soon as possible, typically within a few milliseconds.</P>
-
-<P>The default value is <CODE>30</CODE> (30 seconds).</P>
-
-
-<H2 CLASS="title"><A NAME="Encryption">Encryption</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
-  ...
-  Encryption Never
-  Encryption IfRequested
-  Encryption Required
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Encryption</CODE> directive must appear instead a <A
-HREF="#Location"><CODE>Location</CODE></A> or <A
-HREF="#Limit"><CODE>Limit</CODE></A> section and specifies the
-encryption settings for that location. The default setting is
-<CODE>IfRequested</CODE> for all locations.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.3/OS X 10.5</SPAN><A NAME="ErrorPolicy">ErrorPolicy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ErrorPolicy abort-job
-ErrorPolicy retry-job
-ErrorPolicy stop-printer
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ErrorPolicy</CODE> directive defines the default policy that
-is used when a backend is unable to send a print job to the
-printer.</P>
-
-<P>The following values are supported:</P>
-
-<UL>
-
-       <LI><CODE>abort-job</CODE> - Abort the job and proceed
-       with the next job in the queue</LI>
-
-       <LI><CODE>retry-job</CODE> - Retry the job after waiting
-       for N seconds; the <VAR>cupsd.conf</VAR> <A
-       HREF="#JobRetryInterval"><CODE>JobRetryInterval</CODE></A>
-       directive controls the value of N</LI>
-
-       <LI><CODE>retry-this-job</CODE> - Retry the current job immediately
-       and indefinitely.</LI>
-
-       <LI><CODE>stop-printer</CODE> - Stop the printer and keep
-       the job for future printing; this is the default
-       value</LI>
-
-</UL>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.3</SPAN><A NAME="FilterLimit">FilterLimit</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-FilterLimit 0
-FilterLimit 200
-FilterLimit 1000
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>FilterLimit</CODE> directive sets the maximum cost
-of all running job filters. It can be used to limit the number of
-filter programs that are run on a server to minimize disk,
-memory, and CPU resource problems. A limit of 0 disables filter
-limiting.</P>
-
-<P>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.</P>
-
-<P>The default limit is 0.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.16</SPAN><A NAME="FilterNice">FilterNice</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-FilterNice 0
-FilterNice 10
-FilterNice 19
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>FilterNice</CODE> directive sets the <B>nice(1)</B>
-value to assign to filter processes. The nice value ranges from
-0, the highest priority, to 19, the lowest priority. The default
-is 0.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6/OS X 10.8</SPAN><A NAME="GSSServiceName">GSSServiceName</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-GSSServiceName http
-GSSServiceName ipp
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>GSSServiceName</CODE> directive sets the Kerberos service name to use. The default is <CODE>@CUPS_DEFAULT_GSSSERVICE_NAME@</CODE> for compatibility with Microsoft Windows.</P>
-
-
-<H2 CLASS="title"><A NAME="HostNameLookups">HostNameLookups</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-HostNameLookups On
-HostNameLookups Off
-HostNameLookups Double
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>HostNameLookups</CODE> directive controls whether or
-not CUPS looks up the hostname for connecting clients. The
-<CODE>Double</CODE> setting causes CUPS to verify that the
-hostname resolved from the address matches one of the addresses
-returned for that hostname. <CODE>Double</CODE> lookups also
-prevent clients with unregistered addresses from connecting to
-your server.</P>
-
-<P>The default is <CODE>Off</CODE> to avoid the potential server
-performance problems with hostname lookups. Set this option to
-<CODE>On</CODE> or <CODE>Double</CODE> only if absolutely
-required.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.9</SPAN><A NAME="Include">Include</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Include filename
-Include /foo/bar/filename
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Include</CODE> directive includes the named file in
-the <CODE>cupsd.conf</CODE> file. If no leading path is provided,
-the file is assumed to be relative to the <A
-HREF="ref-cups-files-conf.html#ServerRoot"><CODE>ServerRoot</CODE></A> directory.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.5</SPAN><A NAME="JobPrivateAccess">JobPrivateAccess</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-JobPrivateAccess all
-JobPrivateAccess default
-JobPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM}+
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobPrivateAccess</CODE> directive specifies the 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.</P>
-
-<P>The <CODE>JobPrivateAccess</CODE> directive must appear inside a <A
-HREF="#Policy"><CODE>Policy</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.5</SPAN><A NAME="JobPrivateValues">JobPrivateValues</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-JobPrivateValues all
-JobPrivateValues default
-JobPrivateValues none
-JobPrivateValues attribute-name-1 [ ... attribute-name-N ]
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobPrivateValues</CODE> directive 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".</P>
-
-<P>The <CODE>JobPrivateValues</CODE> directive must appear inside a <A
-HREF="#Policy"><CODE>Policy</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="JobRetryInterval">JobRetryInterval</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-JobRetryInterval 1w
-JobRetryInterval 1d
-JobRetryInterval 1h
-JobRetryInterval 1m
-JobRetryInterval 30
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobRetryInterval</CODE> directive specifies the amount of time to wait before retrying a job in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix). This is typically used for fax queues but can also be used with normal print queues whose error policy is <CODE>retry-job</CODE> or <CODE>retry-current-job</CODE>.</P>
-
-<P>The default is <CODE>30</CODE> (30 seconds).</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4/OS X 10.6</SPAN><A NAME="JobKillDelay">JobKillDelay</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-JobKillDelay 1w
-JobKillDelay 1d
-JobKillDelay 1h
-JobKillDelay 1m
-JobKillDelay 30
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobKillDelay</CODE> directive specifies the amount of time to wait before killing the filters and backend associated with a canceled or held job in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<P>The default is <CODE>30</CODE> (30 seconds).</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="JobRetryLimit">JobRetryLimit</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-JobRetryLimit 5
-JobRetryLimit 50
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobRetryLimit</CODE> directive specifies the maximum
-number of times the scheduler will try to print a job. This is
-typically used for fax queues but can also be used with normal
-print queues whose error policy is <CODE>retry-job</CODE>. The
-default is 5 times.</P>
-
-
-<H2 CLASS="title"><A NAME="KeepAlive">KeepAlive</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-KeepAlive On
-KeepAlive Off
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>KeepAlive</CODE> directive controls whether or not
-to support persistent HTTP connections. The default is
-<CODE>On</CODE>.</P>
-
-<P>HTTP/1.1 clients automatically support persistent connections,
-while HTTP/1.0 clients must specifically request them using the
-<CODE>Keep-Alive</CODE> attribute in the <CODE>Connection:</CODE>
-field of each request.</P>
-
-
-<H2 CLASS="title"><A NAME="KeepAliveTimeout">KeepAliveTimeout</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-KeepAliveTimeout 1w
-KeepAliveTimeout 1d
-KeepAliveTimeout 1h
-KeepAliveTimeout 1m
-KeepAliveTimeout 30
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>KeepAliveTimeout</CODE> directive controls how long a persistent HTTP connection will remain open after the last request in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<P>The default is <CODE>30</CODE> (30 seconds).</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="Limit">Limit (Location)</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
-  &lt;Limit GET POST&gt;
-  ...
-  &lt;/Limit&gt;
-
-  &lt;Limit ALL&gt;
-  ...
-  &lt;/Limit&gt;
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Limit</CODE> directive groups access control
-directives for specific types of HTTP requests and must appear
-inside a <A HREF="#Location"><CODE>Location</CODE></A> section.
-Access can be limited for individual request types
-(<CODE>DELETE</CODE>, <CODE>GET</CODE>, <CODE>HEAD</CODE>,
-<CODE>OPTIONS</CODE>, <CODE>POST</CODE>, <CODE>PUT</CODE>, and
-<CODE>TRACE</CODE>) or for all request types (<CODE>ALL</CODE>).
-The request type names are case-sensitive for compatibility with
-Apache.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="LimitIPP">Limit (Policy)</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Policy name&gt;
-  &lt;Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer&gt;
-  ...
-  &lt;/Limit&gt;
-
-  &lt;Limit All&gt;
-  ...
-  &lt;/Limit&gt;
-&lt;/Policy&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>When included in <A HREF="#Policy"><CODE>Policy</CODE></A>
-sections, the <CODE>Limit</CODE> directive groups access control
-directives for specific IPP operations. Multiple operations can
-be listed, separated by spaces. Table 2 lists the supported
-operations.</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="Supported IPP Operations">
-<CAPTION>Table 2: <A NAME="TABLE2">Supported IPP Operations</A></CAPTION>
-<THEAD>
-<TR>
-       <TH>Operation Name</TH>
-       <TH>Description</TH>
-</TR>
-</THEAD>
-<TBODY>
-<TR>
-       <TD>All</TD>
-       <TD>All operations - used as the default limit for
-       operations that are not listed</TD>
-</TR>
-<TR>
-       <TD>Cancel-Job</TD>
-       <TD>Cancel a job</TD>
-</TR>
-<TR>
-       <TD>Cancel-Subscription</TD>
-       <TD>Cancel a subscription</TD>
-</TR>
-<TR>
-       <TD>Create-Job</TD>
-       <TD>Create a new, empty job</TD>
-</TR>
-<TR>
-       <TD>Create-Job-Subscription</TD>
-       <TD>Creates a notification subscription on a job</TD>
-</TR>
-<TR>
-       <TD>Create-Printer-Subscription</TD>
-       <TD>Creates a notification subscription on a printer</TD>
-</TR>
-<TR>
-       <TD>CUPS-Accept-Jobs</TD>
-       <TD>Sets the printer-is-accepting-jobs value for a printer to true</TD>
-</TR>
-<TR>
-       <TD>CUPS-Add-Modify-Class</TD>
-       <TD>Adds or modifies a class</TD>
-</TR>
-<TR>
-       <TD>CUPS-Add-Modify-Printer</TD>
-       <TD>Adds or modifies a printer</TD>
-</TR>
-<TR>
-       <TD>CUPS-Authenticate-Job</TD>
-       <TD>Authenticates a job for printing</TD>
-</TR>
-<TR>
-       <TD>CUPS-Delete-Class</TD>
-       <TD>Deletes a class</TD>
-</TR>
-<TR>
-       <TD>CUPS-Delete-Printer</TD>
-       <TD>Deletes a printer</TD>
-</TR>
-<TR>
-       <TD>CUPS-Get-Classes</TD>
-       <TD>Gets a list of classes</TD>
-</TR>
-<TR>
-       <TD>CUPS-Get-Default</TD>
-       <TD>Gets the (network/server) default printer or class</TD>
-</TR>
-<TR>
-       <TD>CUPS-Get-Devices</TD>
-       <TD>Gets a list of available devices</TD>
-</TR>
-<TR>
-       <TD>CUPS-Get-PPDs</TD>
-       <TD>Gets a list of available manufacturers or drivers</TD>
-</TR>
-<TR>
-       <TD>CUPS-Get-Printers</TD>
-       <TD>Gets a list of printers and/or classes</TD>
-</TR>
-<TR>
-       <TD>CUPS-Move-Job</TD>
-       <TD>Moves a job to a new destination</TD>
-</TR>
-<TR>
-       <TD>CUPS-Reject-Jobs</TD>
-       <TD>Sets the printer-is-accepting-jobs value for a printer to false</TD>
-</TR>
-<TR>
-       <TD>CUPS-Set-Default</TD>
-       <TD>Sets the network/server default printer or class</TD>
-</TR>
-<TR>
-       <TD>Disable-Printer</TD>
-       <TD>Sets the printer-state value for a printer to stopped</TD>
-</TR>
-<TR>
-       <TD>Enable-Printer</TD>
-       <TD>Sets the printer-state value for a printer to idle/processing</TD>
-</TR>
-<TR>
-       <TD>Get-Job-Attributes</TD>
-       <TD>Gets information about a job</TD>
-</TR>
-<TR>
-       <TD>Get-Jobs</TD>
-       <TD>Gets a list of jobs</TD>
-</TR>
-<TR>
-       <TD>Get-Notifications</TD>
-       <TD>Gets a list of events</TD>
-</TR>
-<TR>
-       <TD>Get-Printer-Attributes</TD>
-       <TD>Gets information about a printer or class</TD>
-</TR>
-<TR>
-       <TD>Get-Subscription-Attributes</TD>
-       <TD>Gets information about a notification subscription</TD>
-</TR>
-<TR>
-       <TD>Get-Subscriptions</TD>
-       <TD>Gets a list of notification subscriptions</TD>
-</TR>
-<TR>
-       <TD>Hold-Job</TD>
-       <TD>Holds a job for printing</TD>
-</TR>
-<TR>
-       <TD>Pause-Printer</TD>
-       <TD>Sets the printer-state value for a printer to stopped</TD>
-</TR>
-<TR>
-       <TD>Print-Job</TD>
-       <TD>Creates a job with a single file for printing</TD>
-</TR>
-<TR>
-       <TD>Purge-Jobs</TD>
-       <TD>Removes all jobs from a printer</TD>
-</TR>
-<TR>
-       <TD>Release-Job</TD>
-       <TD>Releases a previously held job for printing</TD>
-</TR>
-<TR>
-       <TD>Renew-Subscription</TD>
-       <TD>Renews a notification subscription</TD>
-</TR>
-<TR>
-       <TD>Restart-Job</TD>
-       <TD>Reprints a job</TD>
-</TR>
-<TR>
-       <TD>Resume-Printer</TD>
-       <TD>Sets the printer-state value for a printer to idle/processing</TD>
-</TR>
-<TR>
-       <TD>Send-Document</TD>
-       <TD>Adds a file to an job created with Create-Job</TD>
-</TR>
-<TR>
-       <TD>Set-Job-Attributes</TD>
-       <TD>Changes job options</TD>
-</TR>
-<TR>
-       <TD>Validate-Job</TD>
-       <TD>Validates job options prior to printing</TD>
-</TR>
-</TBODY>
-</TABLE></DIV>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="LimitExcept">LimitExcept</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
-  &lt;LimitExcept GET POST&gt;
-  ...
-  &lt;/LimitExcept&gt;
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>LimitExcept</CODE> directive groups access control
-directives for specific types of HTTP requests and must appear
-inside a <A HREF="#Location"><CODE>Location</CODE></A> section.
-Unlike the <A HREF="#Limit"><CODE>Limit</CODE></A> directive,
-<CODE>LimitExcept</CODE> restricts access for all requests
-<I>except</I> those listed on the <CODE>LimitExcept</CODE>
-line.</P>
-
-
-<H2 CLASS="title"><A NAME="LimitRequestBody">LimitRequestBody</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-LimitRequestBody 10485760
-LimitRequestBody 10m
-LimitRequestBody 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>LimitRequestBody</CODE> directive controls the
-maximum size of print files, IPP requests, and HTML form data in
-HTTP POST requests. The default limit is 0 which disables the
-limit check.</P>
-
-
-<H2 CLASS="title"><A NAME="Listen">Listen</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Listen 127.0.0.1:631
-Listen 192.0.2.1:631
-Listen [::1]:631
-Listen *:631
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Listen</CODE> directive specifies a network address
-and port to listen for connections. Multiple <CODE>Listen</CODE>
-directives can be provided to listen on multiple addresses.</P>
-
-<P>The <CODE>Listen</CODE> directive is similar to the <A
-HREF="#Port"><CODE>Port</CODE></A> directive but allows you to
-restrict access to specific interfaces or networks.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="ListenBackLog">ListenBackLog</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ListenBackLog 5
-ListenBackLog 10
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ListenBackLog</CODE> directive sets the maximum
-number of pending connections the scheduler will allow. This
-normally only affects very busy servers that have reached the <A
-HREF="#MaxClients"><CODE>MaxClients</CODE></A> 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.</P>
-
-
-<H2 CLASS="title"><A NAME="Location">Location</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /admin&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /admin/conf&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /admin/log&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /classes&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /classes/name&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /jobs&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /printers&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /printers/name&gt;
-...
-&lt;/Location&gt;
-
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Location</CODE> directive specifies access control
-and authentication options for the specified HTTP resource or
-path.  The  <A HREF="#Allow"><CODE>Allow</CODE></A>,  <A
-HREF="#AuthType"><CODE>AuthType</CODE></A>,  <A
-HREF="#Deny"><CODE>Deny</CODE></A>,  <A
-HREF="#Encryption"><CODE>Encryption</CODE></A>,  <A
-HREF="#Limit"><CODE>Limit</CODE></A>,  <A
-HREF="#LimitExcept"><CODE>LimitExcept</CODE></A>,  <A
-HREF="#Order"><CODE>Order</CODE></A>,  <A
-HREF="#Require"><CODE>Require</CODE></A>, and <A
-HREF="#Satisfy"><CODE>Satisfy</CODE></A> directives may all
-appear inside a location.</P>
-
-<P>Note that more specific resources override the less specific
-ones. So the directives inside the <CODE>/printers/name</CODE>
-location will override ones from <CODE>/printers</CODE>.
-Directives inside <CODE>/printers</CODE> will override ones from
-<CODE>/</CODE>. None of the directives are inherited.</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="Common Locations on the Server">
-<CAPTION>Table 3: <A NAME="TABLE3">Common Locations on the Server</A></CAPTION>
-<THEAD>
-<TR><TH>Location</TH><TH>Description</TH></TR>
-</THEAD>
-<TBODY>
-<TR><TD><CODE>/</CODE></TD><TD>The path for all get operations (get-printers, get-jobs, etc.)</TD></TR>
-<TR><TD><CODE>/admin</CODE></TD><TD>The path for all administration operations (add-printer, delete-printer, start-printer, etc.)</TD></TR>
-<TR><TD><CODE>/admin/conf</CODE></TD><TD>The path for access to the CUPS configuration files (cupsd.conf, client.conf, etc.)</TD></TR>
-<TR><TD><CODE>/admin/log</CODE></TD><TD>The path for access to the CUPS log files (access_log, error_log, page_log)</TD></TR>
-<TR><TD><CODE>/classes</CODE></TD><TD>The path for all classes</TD></TR>
-<TR><TD><CODE>/classes/name</CODE></TD><TD>The resource for class <CODE>name</CODE></TD></TR>
-<TR><TD><CODE>/jobs</CODE></TD><TD>The path for all jobs (hold-job, release-job, etc.)</TD></TR>
-<TR><TD><CODE>/jobs/id</CODE></TD><TD>The resource for job <CODE>id</CODE></TD></TR>
-<TR><TD><CODE>/printers</CODE></TD><TD>The path for all printers</TD></TR>
-<TR><TD><CODE>/printers/name</CODE></TD><TD>The path for printer <CODE>name</CODE></TD></TR>
-<TR><TD><CODE>/printers/name.ppd</CODE></TD><TD>The PPD file path for printer <CODE>name</CODE></TD></TR>
-</TBODY>
-</TABLE></DIV>
-
-
-<H2 CLASS="title"><A NAME="LogDebugHistory">LogDebugHistory</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-LogDebugHistory 0
-LogDebugHistory 200
-</PRE>
-
-<H3>Description</H3>
-
-<P>When <A HREF="#LogLevel"><CODE>LogLevel</CODE></A> is not set to
-<CODE>debug</CODE> or <CODE>debug2</CODE>, the <CODE>LogDebugHistory</CODE>
-directive specifies the number of debugging messages that are logged when an
-error occurs during printing. The default is 200 messages. A value of 0
-disables debugging history entirely and is not recommended.</P>
-
-
-<H2 CLASS="title"><A NAME="LogLevel">LogLevel</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-LogLevel none
-LogLevel emerg
-LogLevel alert
-LogLevel crit
-LogLevel error
-LogLevel warn
-LogLevel notice
-LogLevel info
-LogLevel debug
-LogLevel debug2
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>LogLevel</CODE> directive specifies the level of
-logging for the <A HREF="ref-cups-files-conf.html#ErrorLog"><CODE>ErrorLog</CODE></A>
-file. The following values are recognized (each level logs
-everything under the preceding levels):</P>
-
-<UL>
-
-       <LI><CODE>none</CODE> - Log nothing</LI>
-
-       <LI><CODE>emerg</CODE> - Log emergency conditions that
-       prevent the server from running</LI>
-
-       <LI><CODE>alert</CODE> - Log alerts that must be handled
-       immediately</LI>
-
-       <LI><CODE>crit</CODE> - Log critical errors that don't
-       prevent the server from running</LI>
-
-       <LI><CODE>error</CODE> - Log general errors</LI>
-
-       <LI><CODE>warn</CODE> - Log errors and warnings</LI>
-
-       <LI><CODE>notice</CODE> - Log temporary error conditions</LI>
-
-       <LI><CODE>info</CODE> - Log all requests and state
-       changes</LI>
-
-       <LI><CODE>debug</CODE> - Log basic debugging
-       information</LI>
-
-       <LI><CODE>debug2</CODE> - Log all debugging
-       information</LI>
-
-</UL>
-
-<p>The default <code>LogLevel</code> is <code>@CUPS_LOG_LEVEL@</code>.</p>
-
-
-<H2 CLASS="title"><A NAME="LogTimeFormat">LogTimeFormat</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-LogTimeFormat standard
-LogTimeFormat usecs
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>LogTimeFormat</CODE> directive specifies the format used for the
-date and time in the log files. <CODE>Standard</CODE> uses the standard Apache
-Common Log Format date and time while <CODE>usecs</CODE> adds microseconds.
-The default is <CODE>standard</CODE>.</P>
-
-
-<H2 CLASS="title"><A NAME="MaxClients">MaxClients</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxClients 100
-MaxClients 1024
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxClients</CODE> directive controls the maximum
-number of simultaneous clients that will be allowed by the
-server. The default is 100 clients.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>Since each print job requires a file descriptor for the status
-pipe, the scheduler internally limits the <CODE>MaxClients</CODE>
-value to 1/3 of the available file descriptors to avoid possible
-problems when printing large numbers of jobs.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.18</SPAN><A NAME="MaxClientsPerHost">MaxClientsPerHost</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxClientsPerHost 10
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxClientsPerHost</CODE> directive controls the
-maximum number of simultaneous clients that will be allowed from
-a single host by the server. The default is the
-<CODE>MaxClients</CODE> value.</P>
-
-<P>This directive provides a small measure of protection against
-Denial of Service attacks from a single host.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.16</SPAN><A NAME="MaxCopies">MaxCopies</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxCopies 100
-MaxCopies 65535
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxCopies</CODE> directive controls the maximum
-number of copies that a user can print of a job. The default is
-@CUPS_MAX_COPIES@ copies.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>Most HP PCL laser printers internally limit the number of
-copies to 100.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6/OS X 10.8</SPAN><A NAME="MaxHoldTime">MaxHoldTime</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxHoldTime 10800
-MaxHoldTime 3h
-MaxHoldTime 180m
-MaxHoldTime 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxHoldTime</CODE> directive controls the maximum number of seconds allowed for a job to remain in the "indefinite" hold state. The job is canceled automatically if it remains held indefinitely longer than the specified time interval in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<p>The default setting is <CODE>0</CODE> which disables this functionality.</P>
-
-
-<H2 CLASS="title"><A NAME="MaxJobs">MaxJobs</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxJobs 100
-MaxJobs 9999
-MaxJobs 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxJobs</CODE> directive controls the maximum number
-of jobs that are kept in memory. Once the number of jobs reaches
-the limit, the oldest completed job is automatically purged from
-the system to make room for the new one. If all of the known jobs
-are still pending or active then the new job will be
-rejected.</P>
-
-<P>Setting the maximum size to 0 disables this functionality. The
-default setting is 500.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="MaxJobsPerPrinter">MaxJobsPerPrinter</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxJobsPerPrinter 100
-MaxJobsPerPrinter 9999
-MaxJobsPerPrinter 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxJobsPerPrinter</CODE> directive controls the
-maximum number of active jobs that are allowed for each printer
-or class. Once a printer or class reaches the limit, new jobs
-will be rejected until one of the active jobs is completed,
-stopped, aborted, or canceled.</P>
-
-<P>Setting the maximum to 0 disables this functionality. The
-default setting is 0.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="MaxJobsPerUser">MaxJobsPerUser</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxJobsPerUser 100
-MaxJobsPerUser 9999
-MaxJobsPerUser 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxJobsPerUser</CODE> directive controls the maximum
-number of active jobs that are allowed for each user. Once a user
-reaches the limit, new jobs will be rejected until one of the
-active jobs is completed, stopped, aborted, or canceled.</P>
-
-<P>Setting the maximum to 0 disables this functionality. The
-default setting is 0.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6/OS X 10.8</SPAN><A NAME="MaxJobTime">MaxJobTime</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxJobTime 10800
-MaxJobTime 3h
-MaxJobTime 180m
-MaxJobTime 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxJobTime</CODE> directive controls the maximum number of
-seconds allowed for a job to complete printing before it is considered "stuck".
-The job is canceled automatically if it takes longer than the specified time to complete in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<p>Setting the maximum time to <CODE>0</CODE> disables this functionality. The default setting is <CODE>3h</CODE> (3 hours).</P>
-
-
-<H2 CLASS="title"><A NAME="MaxLogSize">MaxLogSize</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxLogSize 1048576
-MaxLogSize 1m
-MaxLogSize 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxLogSize</CODE> directive controls the maximum
-size of each log file. Once a log file reaches or exceeds the
-maximum size it is closed and renamed to <VAR>filename.O</VAR>.
-This allows you to rotate the logs automatically. The default
-size is 1048576 bytes (1MB).</P>
-
-<P>Setting the maximum size to 0 disables log rotation.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">Deprecated</SPAN><A NAME="MaxRequestSize">MaxRequestSize</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxRequestSize 10485760
-MaxRequestSize 10m
-MaxRequestSize 0
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxRequestSize</CODE> directive controls the maximum
-size of print files, IPP requests, and HTML form data in HTTP
-POST requests. The default limit is 0 which disables the limit
-check.</P>
-
-<P><B>This directive is deprecated and will be removed in a
-future CUPS release.</B> Use the <A
-HREF="#LimitRequestBody"><CODE>LimitRequestBody</CODE></A>
-directive instead.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4/OS X 10.6</SPAN><A NAME="MultipleOperationTimeout">MultipleOperationTimeout</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MultipleOperationTimeout 1w
-MultipleOperationTimeout 1d
-MultipleOperationTimeout 1h
-MultipleOperationTimeout 5m
-MultipleOperationTimeout 300
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MultipleOperationTimeout</CODE> directive sets the maximum amount of time between files in a multi-file print job in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<P>The default is <CODE>5m</CODE> (five minutes).</P>
-
-
-<H2 CLASS="title"><A NAME="Order">Order</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
-  ...
-  Order Allow,Deny
-  Order Deny,Allow
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Order</CODE> directive defines the default access
-control. The following values are supported:</P>
-
-<UL>
-
-       <LI><CODE>allow,deny</CODE> - Deny requests by default,
-       then check the <A HREF="#Allow"><CODE>Allow</CODE></A>
-       lines followed by the <A
-       HREF="#Deny"><CODE>Deny</CODE></A> lines</LI>
-
-       <LI><CODE>deny,allow</CODE> - Allow requests by default,
-       then check the <A HREF="#Deny"><CODE>Deny</CODE></A>
-       lines followed by the <A
-       HREF="#Allow"><CODE>Allow</CODE></A> lines</LI>
-
-</UL>
-
-<P>The <CODE>Order</CODE> directive must appear inside a <A
-HREF="#Location"><CODE>Location</CODE></A> or <A
-HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="PageLogFormat">PageLogFormat</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-PageLogFormat %p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}
-PageLogFormat PAGE %p %u %j %P %C %{job-billing} %{job-originating-host-name}
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PageLogFormat</CODE> directive sets the format of lines
-that are logged to the page log file. Sequences beginning with percent (%)
-characters are replaced with the corresponding information, while all other
-characters are copied literally. The following percent sequences are
-recognized:</P>
-
-<UL>
-
-       <LI><CODE>%%</CODE>: Inserts a single percent character.</LI>
-
-       <LI><CODE>%{name}</CODE>: Inserts the value of the specified IPP
-       attribute.</LI>
-
-       <LI><CODE>%C</CODE>: Inserts the number of copies for the current page.</LI>
-
-       <LI><CODE>%P</CODE>: Inserts the current page number.</LI>
-
-       <LI><CODE>%T</CODE>: Inserts the current date and time in common log
-       format.</LI>
-
-       <LI><CODE>%j</CODE>: Inserts the job ID.</LI>
-
-       <LI><CODE>%p</CODE>: Inserts the printer name.</LI>
-
-       <LI><CODE>%u</CODE>: Inserts the username.</LI>
-
-</UL>
-
-<P>The default is "%p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}".</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="PassEnv">PassEnv</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-PassEnv MY_ENV_VARIABLE
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PassEnv</CODE> directive specifies an environment
-variable that should be passed to child processes. Normally, the
-scheduler only passes the <CODE>DYLD_LIBRARY_PATH</CODE>,
-<CODE>LD_ASSUME_KERNEL</CODE>, <CODE>LD_LIBRARY_PATH</CODE>,
-<CODE>LD_PRELOAD</CODE>, <CODE>NLSPATH</CODE>,
-<CODE>SHLIB_PATH</CODE>, <CODE>TZ</CODE>, and <CODE>VGARGS</CODE>
-environment variables to child processes.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="Policy">Policy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Policy name&gt;
-  &lt;Limit operation ... operation&gt;
-  ...
-  &lt;/Limit&gt;
-  &lt;Limit operation ... operation&gt;
-  ...
-  &lt;/Limit&gt;
-  &lt;Limit All&gt;
-  ...
-  &lt;/Limit&gt;
-&lt;/Policy&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Policy</CODE> directive specifies IPP operation
-access control limits. Each policy contains 1 or more <A
-HREF="#LimitIPP"><CODE>Limit</CODE></A> sections to set the
-access control limits for specific operations - user limits,
-authentication, encryption, and allowed/denied addresses,
-domains, or hosts. The <CODE>&lt;Limit All&gt;</CODE> section
-specifies the default access control limits for operations that
-are not listed.</P>
-
-<P>Policies are named and associated with printers via the
-printer's operation policy setting
-(<CODE>printer-op-policy</CODE>). The default policy for the
-scheduler is specified using the <A
-HREF="#DefaultPolicy"><CODE>DefaultPolicy</CODE></A>
-directive.</P>
-
-
-<H2 CLASS="title"><A NAME="Port">Port</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Port 631
-Port 80
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Port</CODE> directive specifies a port to listen on.
-Multiple <CODE>Port</CODE> lines can be specified to listen on
-multiple ports. The <CODE>Port</CODE> directive is equivalent to
-"<CODE>Listen *:nnn</CODE>". The default port is 631.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>On systems that support IPv6, this directive will bind to both
-the IPv4 and IPv6 wildcard address.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="PreserveJobHistory">PreserveJobHistory</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-PreserveJobHistory On
-PreserveJobHistory Off
-PreserveJobHistory 1w
-PreserveJobHistory 7d
-PreserveJobHistory 168h
-PreserveJobHistory 10080m
-PreserveJobHistory 604800
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PreserveJobHistory</CODE> directive controls whether the history of completed, canceled, or aborted print jobs is retained by the scheduler. A value of <CODE>On</CODE> preserves job information until the administrator purges it with the <CODE>cancel</CODE> command. A value of <CODE>Off</CODE> removes the job information as soon as each job is completed, canceled, or aborted. Numeric values preserve job information for the specified number of seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<P>The default value is <CODE>On</CODE>.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>The <A HREF="#MaxJobs"><CODE>MaxJobs</CODE></A>, <A HREF="#MaxJobsPerPrinter"><CODE>MaxJobsPerPrinter</CODE></A>, and <A HREF="#MaxJobsPerUser"><CODE>MaxJobsPerUser</CODE></A> directives can cause job history to be discarded to make room for new jobs.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="PreserveJobFiles">PreserveJobFiles</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-PreserveJobFiles On
-PreserveJobFiles Off
-PreserveJobFiles 1w
-PreserveJobFiles 7d
-PreserveJobFiles 168h
-PreserveJobFiles 10080m
-PreserveJobFiles 604800
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PreserveJobFiles</CODE> directive controls whether the document files of completed, canceled, or aborted print jobs are retained. Jobs can be restarted (and reprinted) as desired until they are purged.</P>
-
-<P>A value of <CODE>On</CODE> preserves job files until the administrator purges them with the <CODE>cancel</CODE> command. A value of <CODE>Off</CODE> removes the job files as soon as each job is completed, canceled, or aborted. Numeric values preserve job files for the specified number of seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<P>The default value is <CODE>1d</CODE> (one day).</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>The <A HREF="#MaxJobs"><CODE>MaxJobs</CODE></A>, <A HREF="#MaxJobsPerPrinter"><CODE>MaxJobsPerPrinter</CODE></A>, <A HREF="#MaxJobsPerUser"><CODE>MaxJobsPerUser</CODE></A>, and <A HREF="#PreserveJobHistory"><CODE>PreserveJobHistory</CODE></A> directives can cause job files to be discarded sooner than specified.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.21</SPAN><A NAME="ReloadTimeout">ReloadTimeout</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ReloadTimeout 0
-ReloadTimeout 30
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ReloadTimeout</CODE> directive specifies the number
-of seconds the scheduler will wait for active jobs to complete
-before doing a restart. The default is 30 seconds.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="Require">Require</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
-  ...
-  Require group foo bar
-  Require user john mary
-  Require valid-user
-  Require user @groupname
-  Require user @SYSTEM
-  Require user @OWNER
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Require</CODE> directive specifies that
-authentication is required for the resource. The
-<CODE>group</CODE> keyword specifies that the authenticated user
-must be a member of one or more of the named groups that
-follow.</P>
-
-<P>The <CODE>user</CODE> keyword specifies that the
-authenticated user must be one of the named users or groups that
-follow. Group names are specified using the "@" prefix.</P>
-
-<P>The <CODE>valid-user</CODE> keyword specifies that any
-authenticated user may access the resource.</P>
-
-<P>The default is to do no authentication. This directive must
-appear inside a <A HREF="#Location"><CODE>Location</CODE></A> or
-<A HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="RIPCache">RIPCache</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-RIPCache 128m
-RIPCache 1g
-RIPCache 2048k
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>RIPCache</CODE> directive sets the size of the
-memory cache used by Raster Image Processor ("RIP") filters such
-as <CODE>imagetoraster</CODE> and <CODE>pstoraster</CODE>. The
-size can be suffixed with a "k" for kilobytes, "m" for megabytes,
-or "g" for gigabytes. The default cache size is "128m", or 128
-megabytes.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.16</SPAN><A NAME="RootCertDuration">RootCertDuration</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-RootCertDuration 0
-RootCertDuration 1w
-RootCertDuration 1d
-RootCertDuration 1h
-RootCertDuration 5m
-RootCertDuration 300
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>RootCertDuration</CODE> directive specifies the amount of time the <EM>root certificate</EM> remains valid in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix). The scheduler will generate a new certificate as needed when the given time interval has expired. If set to 0, the root certificate is generated only once on startup or on a restart.</P>
-
-<P>The default is <CODE>5m</CODE> (five minutes).</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.7</SPAN><A NAME="Satisfy">Satisfy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Location /path&gt;
-  ...
-  Satisfy all
-  Satisfy any
-&lt;/Location&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Satisfy</CODE> directive specifies whether all
-conditions must be satisfied to allow access to the resource. If
-set to <CODE>all</CODE>, then all authentication and access
-control conditions must be satisfied to allow access.</P>
-
-<P>Setting <CODE>Satisfy</CODE> to <CODE>any</CODE> allows a user
-to gain access if the authentication or access control
-requirements are satisfied. For example, you might require
-authentication for remote access, but allow local access without
-authentication.</P>
-
-<P>The default is <CODE>all</CODE>. This directive must appear
-inside a <A HREF="#Location"><CODE>Location</CODE></A> or <A
-HREF="#Limit"><CODE>Limit</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="ServerAdmin">ServerAdmin</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerAdmin user@host
-ServerAdmin root@foo.bar.com
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerAdmin</CODE> directive identifies the email
-address for the administrator on the system. By default the
-administrator email address is <CODE>root@server</CODE>, where
-<CODE>server</CODE> is the <A
-HREF="#ServerName"><CODE>ServerName</CODE></A>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.3.10</SPAN><A NAME="ServerAlias">ServerAlias</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerAlias althost
-ServerAlias foo.example.com
-ServerAlias bar.example.com
-ServerAlias one.example.com two.example.com
-ServerAlias *
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerAlias</CODE> directive specifies alternate names that the server is known by. By default it contains a list of all aliases associated with the <A HREF="#ServerName"><CODE>ServerName</CODE></A>. The special name "*" can be used to allow any hostname when accessing CUPS via an external network interfaces.</P>
-
-<BLOCKQUOTE><B>Note</B>
-
-<P>The <CODE>ServerAlias</CODE> 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 "*".</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="ServerName">ServerName</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerName foo.example.com
-ServerName myserver.example.com
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerName</CODE> directive specifies the hostname
-that is reported to clients. By default the server name is the
-hostname.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.1.21</SPAN><A NAME="ServerTokens">ServerTokens</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-ServerTokens None
-ServerTokens ProductOnly
-ServerTokens Major
-ServerTokens Minor
-ServerTokens Minimal
-ServerTokens OS
-ServerTokens Full
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ServerTokens</CODE> directive specifies the
-information that is included in the <CODE>Server:</CODE> header
-of all HTTP responses. Table 4 lists the token name along with
-the text that is returned. The default is
-<CODE>Minimal</CODE>.</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="ServerToken Names and Values">
-<CAPTION>Table 4: <A NAME="TABLE4">ServerToken Names and Values</A></CAPTION>
-<THEAD>
-<TR>
-       <TH>Name</TH>
-       <TH>Value</TH>
-</TR>
-</THEAD>
-<TBODY>
-<TR>
-       <TD>None</TD>
-       <TD>No <CODE>Server:</CODE> header is returned</TD>
-</TR>
-<TR>
-       <TD>ProductOnly</TD>
-       <TD>"CUPS"</TD>
-</TR>
-<TR>
-       <TD>Major</TD>
-       <TD>"CUPS 1"</TD>
-</TR>
-<TR>
-       <TD>Minor</TD>
-       <TD>"CUPS 1.2"</TD>
-</TR>
-<TR>
-       <TD>Minimal</TD>
-       <TD>"CUPS 1.2.N" where N is the patch release</TD>
-</TR>
-<TR>
-       <TD>OS</TD>
-       <TD>"CUPS 1.2.N (UNAME)" where N is the patch release and
-       UNAME is the output of the <B>uname(1)</B> command</TD>
-</TR>
-<TR>
-       <TD>Full</TD>
-       <TD>"CUPS 1.2.N (UNAME) IPP/1.1" where N is the patch
-       release and UNAME is the output of the <B>uname(1)</B>
-       command</TD>
-</TR>
-</TBODY>
-</TABLE></DIV>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2/OS X 10.5</SPAN><A NAME="SetEnv">SetEnv</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SetEnv PATH /usr/lib/cups/filter:/bin:/usr/bin:/usr/local/bin
-SetEnv MY_ENV_VAR foo
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SetEnv</CODE> directive specifies an environment
-variable that should be passed to child processes.</P>
-
-
-<H2 CLASS="title"><A NAME="SSLListen">SSLListen</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SSLListen 127.0.0.1:443
-SSLListen 192.0.2.1:443
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SSLListen</CODE> directive specifies a network
-address and port to listen for secure connections. Multiple
-<CODE>SSLListen</CODE> directives can be provided to listen on
-multiple addresses.</P>
-
-<P>The <CODE>SSLListen</CODE> directive is similar to the <A
-HREF="#SSLPort"><CODE>SSLPort</CODE></A> directive but allows you
-to restrict access to specific interfaces or networks.</P>
-
-
-<H2 CLASS="title"><A NAME="SSLOptions">SSLOptions</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SSLOptions None
-SSLOptions NoEmptyFragments
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SSLOptions</CODE> directive specifies additional SSL/TLS
-protocol options to use for encrypted connected. Currently only two
-options are supported - <code>None</code> (the default) for the most
-secure mode and <code>NoEmptyFragments</code> to allow CUPS to work with
-Microsoft Windows with the FIPS conformance mode enabled.</p>
-
-
-<H2 CLASS="title"><A NAME="SSLPort">SSLPort</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SSLPort 443
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SSLPort</CODE> directive specifies a port to listen
-on for secure connections. Multiple <CODE>SSLPort</CODE> lines
-can be specified to listen on multiple ports.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6</SPAN><A NAME="StrictConformance">StrictConformance</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-StrictConformance No
-StrictConformance Yes
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>StrictConformance</CODE> directive specifies whether the scheduler
-requires strict IPP conformance for client requests, for example to not allow
-document attributes in a Create-Job request. The default is
-<code>No</code>.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.5</SPAN><A NAME="SubscriptionPrivateAccess">SubscriptionPrivateAccess</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SubscriptionPrivateAccess all
-SubscriptionPrivateAccess default
-SubscriptionPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM}+
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SubscriptionPrivateAccess</CODE> directive specifies the 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.</P>
-
-<P>The <CODE>SubscriptionPrivateAccess</CODE> directive must appear inside a <A
-HREF="#Policy"><CODE>Policy</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.5</SPAN><A NAME="SubscriptionPrivateValues">SubscriptionPrivateValues</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SubscriptionPrivateValues all
-SubscriptionPrivateValues default
-SubscriptionPrivateValues none
-SubscriptionPrivateValues attribute-name-1 [ ... attribute-name-N ]
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SubscriptionPrivateValues</CODE> directive 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".</P>
-
-<P>The <CODE>SubscriptionPrivateValues</CODE> directive must appear inside a <A
-HREF="#Policy"><CODE>Policy</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="Timeout">Timeout</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Timeout 1w
-Timeout 1d
-Timeout 1h
-Timeout 5m
-Timeout 300
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Timeout</CODE> directive controls the amount of time
-to wait before an active HTTP or IPP request times out in seconds (no suffix), minutes ("m" suffix), hours ("h" suffix), days ("d" suffix), or weeks ("w" suffix).</P>
-
-<P>The default timeout is <CODE>5m</CODE> (five minutes).</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="INFO">CUPS 1.5</SPAN><A NAME="WebInterface">WebInterface</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-WebInterface yes
-WebInterface no
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>WebInterface</CODE> directive specifies whether the web interface is enabled. The default value is <CODE>@CUPS_WEBIF@</CODE>.</P>
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-error_log.html b/doc/help/ref-error_log.html
deleted file mode 100644 (file)
index 0109278..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
-       <TITLE>error_log</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">error_log</H1>
-
-<P>The <VAR>error_log</VAR> file lists messages from the
-scheduler - errors, warnings, etc. The <A
-HREF="ref-cupsd-conf.html#LogLevel"><CODE>LogLevel</CODE></A>
-directive controls which messages are logged:</P>
-
-<P CLASS="command">
-
-level date-time message<BR>
-
-<BR>
-
-I [20/May/1999:19:18:28 +0000] Job 1 queued on 'DeskJet' by 'mike'.<BR>
-
-I [20/May/1999:19:21:02 +0000] Job 2 queued on 'DeskJet' by 'mike'.<BR>
-
-I [20/May/1999:19:22:24 +0000] Job 2 was cancelled by 'mike'.<BR>
-
-</P>
-
-<P>The <I>level</I> field contains the type of message:</P>
-
-<UL>
-
-       <LI><CODE>A</CODE> - Alert message (LogLevel alert)
-       <LI><CODE>C</CODE> - Critical error message (LogLevel crit)
-       <LI><CODE>D</CODE> - Debugging message (LogLevel debug)
-       <LI><CODE>d</CODE> - Detailed debugging message (LogLevel debug2)
-       <LI><CODE>E</CODE> - Normal error message (LogLevel error)
-       <LI><CODE>I</CODE> - Informational message (LogLevel info)
-       <LI><CODE>N</CODE> - Notice message (LogLevel notice)
-       <LI><CODE>W</CODE> - Warning message (LogLevel warn)
-       <LI><CODE>X</CODE> - Emergency error message (LogLevel emerg)
-
-</UL>
-
-<P>The <I>date-time</I> field contains the date and time of when
-the page started printing. The format of this field is identical
-to the <I>data-time</I> field in the <VAR>access_log</VAR> file.</P>
-
-<P>The <I>message</I> fields contains a free-form textual
-message. Messages from job filters are prefixed with "<CODE>[Job
-NNN]</CODE>".</P>
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-mailto-conf.html b/doc/help/ref-mailto-conf.html
deleted file mode 100644 (file)
index 0b95132..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
-       <TITLE>mailto.conf</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">mailto.conf</H1>
-
-<P>The <VAR>/etc/cups/mailto.conf</VAR> file contains several
-directives that defines the local mail server and email
-notification preferences for CUPS. Each directive is listed on a
-line by itself followed by its value. Comments are introduced
-using the number sign ("#") character at the beginning of a
-line.</P>
-
-
-<H2 CLASS="title"><A NAME="Cc">Cc</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Cc bigbrother@example.com
-Cc John Doe &lt;jd@example.com>
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Cc</CODE> directive specifies an additional
-recipient ("carbon copy") for all email notifications. The
-default is to not send a copy to anyone but the subscriber.</P>
-
-
-<H2 CLASS="title"><A NAME="From">From</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-From printserver@example.com
-From Your Happy Printer &lt;printserver@example.com>
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>From</CODE> directive specifies the sender of email
-notifications. The default is the <A
-HREF="ref-cupsd-conf.html#ServerAdmin"><TT>ServerAdmin</TT><A>
-address defined in the <VAR>cupsd.conf</VAR> file.</P>
-
-
-<H2 CLASS="title"><A NAME="Sendmail">Sendmail</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Sendmail /usr/sbin/sendmail
-Sendmail /usr/lib/sendmail -bm -i
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Sendmail</CODE> directive specifies the command to
-run to deliver an email locally. This directive cannot be used
-with the <TT>SMTPServer</TT> directive, and if both
-<TT>Sendmail</TT> and <TT>SMTPServer</TT> lines appear in the
-<VAR>mailto.conf</VAR> file, only the last line is used. The
-default is <TT>/usr/sbin/sendmail</TT>.</P>
-
-
-<H2 CLASS="title"><A NAME="SMTPServer">SMTPServer</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-SMTPServer mail.example.com
-SMTPServer 192.168.2.1
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>SMTPServer</CODE> directive specifies a hostname or
-IP address of a (possibly remote) SMTP mail server. This
-directive cannot be used with the <TT>Sendmail</TT> directive,
-and if both <TT>Sendmail</TT> and <TT>SMTPServer</TT> lines
-appear in the <VAR>mailto.conf</VAR> file, only the last line is
-used. The default is to use the <TT>Sendmail</TT> command
-instead.</P>
-
-
-<H2 CLASS="title"><A NAME="Subject">Subject</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Subject [CUPS]
-Subject URGENT EMAIL NOTIFICATION
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Subject</CODE> directive specifies a prefix string to
-add to the subject of each email notification. The default is to
-not add a prefix string.</P>
-
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-page_log.html b/doc/help/ref-page_log.html
deleted file mode 100644 (file)
index 46453eb..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
-       <TITLE>page_log</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">page_log</H1>
-
-<P>The <VAR>page_log</VAR> file lists each page that is sent to a
-printer. By default, each line contains the following information:</P>
-
-<P CLASS="command">
-
-printer user job-id date-time page-number num-copies job-billing job-originating-host-name job-name media sides<BR>
-
-<BR>
-
-DeskJet root 2 [20/May/1999:19:21:05 +0000] 1 1 acme-123 localhost myjob letter one-sided<BR>
-
-DeskJet root 2 [20/May/1999:19:21:05 +0000] 2 1 acme-123 localhost myjob letter one-sided<BR>
-
-</P>
-
-<p>The <a href="ref-cupsd-conf.html#PageLogFormat"><code>PageLogFormat</code></a>
-directive can be used to change this information.</p>
-
-<P>The <I>printer</I> 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.</P>
-
-<P>The <I>user</I> field contains the name of the user (the IPP
-<CODE>requesting-user-name</CODE> attribute) that submitted this
-file for printing.</P>
-
-<P>The <I>job-id</I> field contains the job number of the page
-being printed. Job numbers are reset to 1 whenever the spool
-directory (<VAR>/var/spool/cups</VAR>) is cleared, so don't
-depend on this number being unique!</P>
-
-<P>The <I>date-time</I> field contains the date and time of when
-the page started printing. The format of this field is identical
-to the <I>data-time</I> field in the <VAR>access_log</VAR>
-file.</P>
-
-<P>The <I>page-number</I> and <I>num-copies</I> fields contain the
-page number and number of copies being printed of that page. For
-printers that cannot produce copies on their own, the
-<I>num-copies</I> field will always be 1.</P>
-
-<P>The <I>job-billing</I> field contains a copy of the
-<CODE>job-billing</CODE> attribute provided with the IPP
-<CODE>Create-Job</CODE> or <CODE>Print-Job</CODE> requests or "-"
-if none was provided.
-
-<P>The <I>job-originating-host-name</I> field contains the hostname or IP
-address of the client that printed the job.</P>
-
-<P>The <I>job-name</I> field contains a copy of the
-<CODE>job-name</CODE> attribute provided with the IPP
-<CODE>Create-Job</CODE> or <CODE>Print-Job</CODE> requests or "-"
-if none was provided.
-
-<P>The <I>media</I> field contains a copy of the
-<CODE>media</CODE> attribute provided with the IPP
-<CODE>Create-Job</CODE> or <CODE>Print-Job</CODE> requests or "-"
-if none was provided.
-
-<P>The <I>sides</I> field contains a copy of the
-<CODE>sides</CODE> attribute provided with the IPP
-<CODE>Create-Job</CODE> or <CODE>Print-Job</CODE> requests or "-"
-if none was provided.
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-printers-conf.html b/doc/help/ref-printers-conf.html
deleted file mode 100644 (file)
index bb44c4c..0000000
+++ /dev/null
@@ -1,719 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
-       <TITLE>printers.conf</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">printers.conf</H1>
-
-<P>The CUPS scheduler (cupsd) uses the
-<VAR>/etc/cups/printers.conf</VAR> file to store the list of
-available printers. This file contains only locally defined
-printers, not remote printers that are created automatically via
-browsing. Each directive is listed on a line by itself followed
-by its value. Comments are introduced using the number sign ("#")
-character at the beginning of a line.</P>
-
-<P>While the printer configuration file consists of plain text
-and can be modified using your favorite text editor, you should
-normally use the <A HREF="man-lpadmin.html">lpadmin(8)</A>
-command, web interface, or any of the available GUIs to manage
-your printers instead. If you do choose to edit this file
-manually, you will need to stop the scheduler first, make your
-changes, and then start the scheduler to make them active.</P>
-
-
-<H2 CLASS="title"><A NAME="Accepting">Accepting</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  Accepting yes
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Accepting</CODE> directive defines the initial state
-of the <VAR>printer-is-accepting-jobs</VAR> attribute. This state
-is also set by the <CODE>cupsaccept(8)</CODE> and
-<CODE>cupsreject(8)</CODE> commands:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/cupsaccept printername
-/usr/sbin/cupsreject printername</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="AllowUser">AllowUser</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  AllowUser foo_user
-  AllowUser @bar_group
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>AllowUser</CODE> directive adds a username or group
-name to the <VAR>requesting-user-name-allowed</VAR> attribute
-which can be set by the <CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -u allow:foo_user,@bar_group</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A> directive.
-This directive cannot be used with <A
-HREF="#DenyUser"><CODE>DenyUser</CODE></A>.</P>
-
-
-<H2 CLASS="title"><A NAME="DefaultPrinter">DefaultPrinter</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;DefaultPrinter name&gt;
-  ...
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DefaultPrinter</CODE> directive begins a printer
-definition as the default server destination. The default server
-destination can be set using the <CODE>lpadmin(8)</CODE>
-command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -d printername</KBD>
-</PRE>
-
-<P>Note that the server default destination settings can be
-overridden by the user's default destination settings which are
-normally set using the <CODE>lpoptions(1)</CODE> command.</P>
-
-
-<H2 CLASS="title"><A NAME="DenyUser">DenyUser</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  DenyUser foo_user
-  DenyUser @bar_group
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DenyUser</CODE> directive adds a username or group
-name to the <VAR>requesting-user-name-denied</VAR> attribute
-which can be set by the <CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -u deny:foo_user,@bar_group</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A> directive.
-This directive cannot be used with <A
-HREF="#AllowUser"><CODE>AllowUser</CODE></A></P>
-
-
-<H2 CLASS="title"><A NAME="DeviceURI">DeviceURI</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  DeviceURI socket://foo.bar.com:9100
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DeviceURI</CODE> directive defines the value of the
-<VAR>device-uri-attribute</VAR> attribute. It is normally set
-using the <CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -v device-uri</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="ErrorPolicy">ErrorPolicy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  ErrorPolicy abort-job
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ErrorPolicy</CODE> directive defines the policy that
-is used when a backend is unable to send a print job to the
-printer. The <CODE>lpadmin(8)</CODE> command sets the current
-error policy:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o printer-error-policy=stop-printer</KBD>
-</PRE>
-
-<P>The following values are supported:</P>
-
-<UL>
-
-       <LI><CODE>abort-job</CODE> - Abort the job and proceed
-       with the next job in the queue</LI>
-
-       <LI><CODE>retry-current-job</CODE> - Retry the current job
-       immediately</LI>
-
-       <LI><CODE>retry-job</CODE> - Retry the job after waiting
-       for N seconds; the <VAR>cupsd.conf</VAR> <A
-       HREF="ref-cupsd-conf.html#JobRetryInterval"><CODE>JobRetryInterval</CODE></A>
-       directive controls the value of N</LI>
-
-       <LI><CODE>stop-printer</CODE> - Stop the printer and keep
-       the job for future printing; this is the default
-       value</LI>
-
-</UL>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4</SPAN><A NAME="Filter">Filter</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  Filter mime/type 100 program
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Filter</CODE> directive lists a single filter program as defined
-in the printer's PPD file.</P>
-
-<P>This directive must appear inside a
-<A HREF="#Printer"><CODE>Printer</CODE></A> or
-<A HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="Info">Info</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  Info My Printer
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Info</CODE> directive defines the string for the
-<VAR>printer-info</VAR> attribute. It is normally set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -D "My Printer"</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="JobSheets">JobSheets</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  JobSheets none,standard
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobSheets</CODE> directive specifies the default
-banner pages  to print before and after a print job. In the above
-example, only a <VAR>standard</VAR> banner will print after each
-job. The <CODE>lpadmin(8)</CODE> command is normally used to set
-the default banners:
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o job-sheets-default=none,standard</KBD>
-</PRE>
-
-<P>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.</P>
-
-<P>The available banner pages depend on the local system
-configuration; CUPS includes the following standard banner
-files:</P>
-
-<UL>
-
-       <LI><CODE>none</CODE> - Do not produce a banner
-       page.</LI>
-
-       <LI><CODE>classified</CODE> - A banner page with a
-       &quot;classified&quot; label at the top and bottom.</LI>
-
-       <LI><CODE>confidential</CODE> - A banner page with a
-       &quot;confidential&quot; label at the top and bottom.</LI>
-
-       <LI><CODE>secret</CODE> - A banner page with a
-       &quot;secret&quot; label at the top and bottom.</LI>
-
-       <LI><CODE>standard</CODE> - A banner page with no label
-       at the top and bottom.</LI>
-
-       <LI><CODE>topsecret</CODE> - A banner page with a
-       &quot;top secret&quot; label at the top and bottom.</LI>
-
-       <LI><CODE>unclassified</CODE> - A banner page with an
-       &quot;unclassified&quot; label at the top and bottom.</LI>
-
-</UL>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="KLimit">KLimit</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  KLimit 1234
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>KLimit</CODE> directive defines the value of the
-<VAR>job-k-limit</VAR> attribute. It is normally set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o job-k-limit=1234</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="Location">Location</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  Location Building 3321
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Location</CODE> directive defines the string for the
-<VAR>printer-location</VAR> attribute. It is normally set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -L "Building 3321"</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="OpPolicy">OpPolicy</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  OpPolicy default
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>OpPolicy</CODE> directive sets the operation policy
-that is used for the printer. The <CODE>lpadmin(8)</CODE> command
-sets the current operation policy:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o printer-op-policy=default</KBD>
-</PRE>
-
-<P>The default policy is named "default". All policies correspond
-to those defined using the <VAR>cupsd.conf</VAR> <A
-HREF="ref-cupsd-conf.html#Policy"><CODE>Policy</CODE></A>
-section.</P>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="Option">Option</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  Option name value
-  Option scaling 100
-  Option page-left 72
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Option</CODE> directive specifies a default job
-template attribute value. It is mapped to
-<CODE>name-default</CODE> in the printer attributes and applied
-to jobs as <CODE>name</CODE>.</P>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="PageLimit">PageLimit</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  PageLimit 1234
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PageLimit</CODE> directive defines the value of the
-<VAR>job-page-limit</VAR> attribute. It can be set using the
-<CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o job-page-limit=1234</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="PortMonitor">PortMonitor</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  PortMonitor bcp
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PortMonitor</CODE> directive sets the filter program that
-is used for every print job, typically to encode or package the print
-data in a format acceptable for a particular printer interface. It is
-set using the <CODE>lpadmin(8)</CODE> command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o port-monitor=tbcp</KBD>
-</PRE>
-
-<P>The following standard port monitors are included with CUPS:</P>
-
-<UL>
-
-       <LI><CODE>bcp</CODE> - Encode PostScript print data using
-       the Adobe Binary Control Protocol (BCP)</LI>
-
-       <LI><CODE>none</CODE> - Do not use a port monitor</LI>
-
-       <LI><CODE>tbcp</CODE> - Encode PostScript print data
-       using the Adobe Tagged Binary Control Protocol
-       (TBCP)</LI>
-
-</UL>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4</SPAN><A NAME="PreFilter">PreFilter</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  PreFilter mime/type 100 program
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PreFilter</CODE> directive lists a single pre-filter program as
-defined in the printer's PPD file.</P>
-
-<P>This directive must appear inside a
-<A HREF="#Printer"><CODE>Printer</CODE></A> or
-<A HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="Printer">Printer</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Printer</CODE> directive begins a printer
-definition. Printers are added using the <CODE>lpadmin(8)</CODE>
-command:
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername ...</KBD>
-</PRE>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.4</SPAN><A NAME="Product">Product</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  Product Acme PaperWriter
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Product</CODE> directive defines the main product string from the
-printer's PPD file and is used when advertising the queue via DNS-SD.</P>
-
-<P>This directive must appear inside a
-<A HREF="#Printer"><CODE>Printer</CODE></A> or
-<A HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="QuotaPeriod">QuotaPeriod</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  QuotaPeriod 604800
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>QuotaPeriod</CODE> directive defines the value of
-the  <VAR>job-quota-period</VAR> attribute. Typical values are
-86400 (1 day), 604800 (1 week), 2592000 (1 month), and 31536000
-(1 year). It is set using the <CODE>lpadmin(8)</CODE>
-command:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o job-quota-period=604800</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="Shared">Shared</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  Shared yes
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Shared</CODE> directive defines the initial value of
-the <VAR>printer-is-shared</VAR> attribute. The strings
-<VAR>yes</VAR> and <VAR>no</VAR> correspond to the true and false
-values, respectively. The <CODE>lpadmin(8)</CODE> command sets
-the current state:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/lpadmin -p printername -o printer-is-shared=true</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="State">State</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  State idle
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>State</CODE> directive defines the initial value of
-the <VAR>printer-state</VAR> attribute. The strings
-<VAR>idle</VAR> and <VAR>stopped</VAR> correspond to the IPP
-enumeration values 3 and 5, respectively. The
-<CODE>cupsenable(8)</CODE> and <CODE>cupsdisable(8)</CODE>
-commands set the current state:</P>
-
-<PRE CLASS="command">
-<KBD>/usr/sbin/cupsenable printername</KBD>
-<KBD>/usr/sbin/cupsdisable printername</KBD>
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="StateMessage">StateMessage</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  StateMessage Printer is lonely.
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>StateMessage</CODE> directive defines the initial
-string for the  <VAR>printer-state-message</VAR> attribute. The
-following are some example messages:</P>
-
-<PRE CLASS="command">
-StateMessage Connected to host_name...
-StateMessage Connecting to printer_queue on port port_number...
-StateMessage Network host host_name is busy; will retry in 30 seconds...
-StateMessage Printer busy; will retry in 10 seconds...
-StateMessage Printer is busy; retrying print job...
-StateMessage Print file accepted - job ID id_number.
-StateMessage Waiting for job to complete
-</PRE>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.2</SPAN><A NAME="StateTime">StateTime</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Printer name&gt;
-  ...
-  StateTime 1133542425
-&lt;/Printer&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>StateTime</CODE> directive defines the UNIX time
-(seconds since Jan 1, 1970) for the last state change of the
-queue. It is mapped to the <VAR>printer-state-change-time</VAR>
-attribute.</P>
-
-<P>This directive must appear inside a <A
-HREF="#Printer"><CODE>Printer</CODE></A> or <A
-HREF="#DefaultPrinter"><CODE>DefaultPrinter</CODE></A>
-section.</P>
-
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-snmp-conf.html b/doc/help/ref-snmp-conf.html
deleted file mode 100644 (file)
index 4cab237..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
-       <TITLE>snmp.conf</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">snmp.conf</H1>
-
-<P>The <VAR>/etc/cups/snmp.conf</VAR> file contains several
-directives that determine how the SNMP printer discovery backend
-behaves. Each directive is listed on a line by itself followed
-by its value. Comments are introduced using the number sign ("#")
-character at the beginning of a line.</P>
-
-<P>The SNMP backend uses the SNMPv1 protocol to discover network
-printers, collecting information from the Host MIB along with
-intelligent port probes to determine the correct device URI and
-make and model for each printer. Future versions of CUPS will
-likely support the new Port Monitor MIB as well.</P>
-
-<H2 CLASS="title"><A NAME="Address">Address</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Address @LOCAL
-Address @IF(name)
-Address 255.255.255.255
-Address 192.168.2.255
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Address</CODE> directive specifies a broadcast
-address to use when discovering printers. Multiple
-<CODE>Address</CODE> lines can be provided to scan different
-subnets.</P>
-
-<P>The default address is <VAR>@LOCAL</VAR>, which broadcasts to
-all LANs.</P>
-
-
-<H2 CLASS="title"><A NAME="Community">Community</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-Community public
-Community easysw
-Community BigCorp
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Community</CODE> directive specifies a community
-name to use when discovering printers and reporting status and supply
-levels for network printers.</P>
-
-<P>The default community is "public".</P>
-
-
-<H2 CLASS="title"><A NAME="DebugLevel">DebugLevel</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DebugLevel 0
-DebugLevel 1
-DebugLevel 2
-DebugLevel 3
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DebugLevel</CODE> directive specifies the debugging
-level to use when searching for network printers. Level 0
-produces no debugging information. Level 1 produces basic
-debugging information. Level 2 adds printing of the SNMP
-messages. Level 3 adds a hex dump of the network data.</P>
-
-<P>The default setting is <VAR>0</VAR>.</P>
-
-<H2 CLASS="title"><A NAME="DeviceURI">DeviceURI</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-DeviceURI "HP.*JetDirect.*" socket://%s:9100 socket://%s:9101 socket://%s:9102
-DeviceURI "HP.*" socket://%s
-DeviceURI "Acme.*Laser.*" lpd://%s/print
-DeviceURI "Xerox.*"
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>DeviceURI</CODE> directive specifies a regular expression
-(enclosed in double quotes) that is matched against the SNMP device
-description OID returned by a printer. If the description matches the
-regular expression, each device URI that follows the regular expression
-is listed by the backend, with any occurrences of <CODE>%s</CODE>
-replaced by the device's hostname or IP address. If no URIs are listed,
-the device is ignored.</P>
-
-<P>The <CODE>DeviceURI</CODE> directives are processed serially in
-the order specified in the <VAR>snmp.conf</VAR> file until a match
-is found.</P>
-
-
-<H2 CLASS="title"><A NAME="HostNameLookups">HostNameLookups</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-HostNameLookups on
-HostNameLookups off
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>HostNameLookups</CODE> directive specifies whether printer
-addresses are converted to hostnames or left as numeric IP addresses.</P>
-
-<P>The default setting is <VAR>off</VAR>.</P>
-
-<H2 CLASS="title"><A NAME="MaxRunTime">MaxRunTime</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-MaxRunTime 10
-MaxRunTime 300
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>MaxRunTime</CODE> directive specifies the maximum
-number of seconds that the SNMP backend will spend looking for
-printer devices on the network.</P>
-
-<P>The default setting is <VAR>10</VAR>.</P>
-
-</BODY>
-</HTML>
diff --git a/doc/help/ref-subscriptions-conf.html b/doc/help/ref-subscriptions-conf.html
deleted file mode 100644 (file)
index 06cfc72..0000000
+++ /dev/null
@@ -1,354 +0,0 @@
-<HTML>
-<!-- SECTION: References -->
-<HEAD>
-       <TITLE>subscriptions.conf</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">subscriptions.conf</H1>
-
-<P>The CUPS scheduler (cupsd) uses the
-<VAR>/etc/cups/subscriptions.conf</VAR> file  to store the list
-of active subscriptions. Each directive is listed on a line by
-itself followed by its value.  Comments are introduced using the
-number sign ("#") character at the beginning of a line.
-
-<P>While the subscriptions configuration file consists of plain
-text and can be modified using your favorite text editor, you
-should normally use the command-line programs (<A
-HREF="man-lp.html">lp(1)</A> and <A
-HREF="man-lpr.html">lpr(1)</A>) or specific applications via IPP
-requests to manage your subscriptions.</P>
-
-<H2 CLASS="title"><A NAME="Events">Events</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
-  ...
-  Events job-completed
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Events</CODE> directive lists the events, separated
-by spaces, that the subscriber is interested in. Table 1 lists
-the supported event names.</P>
-
-<P>The <CODE>Events</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="Event Names">
-<CAPTION>Table 1: <A NAME="TABLE1">Event Names</A></CAPTION>
-<THEAD>
-<TR>
-       <TH>Name</TH>
-       <TH>Description</TH>
-</TR>
-</THEAD>
-<TBODY>
-<TR>
-       <TD>all</TD>
-       <TD>All events</TD>
-</TR>
-<TR>
-       <TD>job-completed</TD>
-       <TD>Send notification when the job is completed</TD>
-</TR>
-<TR>
-       <TD>job-config-changed</TD>
-       <TD>Send notification when the job is changed</TD>
-</TR>
-<TR>
-       <TD>job-created</TD>
-       <TD>Send notification when a job is created</TD>
-</TR>
-<TR>
-       <TD>job-progress</TD>
-       <TD>Send notification for job progress</TD>
-</TR>
-<TR>
-       <TD>job-state-changed</TD>
-       <TD>Send notification when the job-state changes</TD>
-</TR>
-<TR>
-       <TD>job-stopped</TD>
-       <TD>Send notification when the job is stopped</TD>
-</TR>
-<TR>
-       <TD>printer-added</TD>
-       <TD>Send notification when a printer is added</TD>
-</TR>
-<TR>
-       <TD>printer-changed</TD>
-       <TD>Send notification when a printer is changed</TD>
-</TR>
-<TR>
-       <TD>printer-config-changed</TD>
-       <TD>Send notification when a printer's configuration is changed</TD>
-</TR>
-<TR>
-       <TD>printer-deleted</TD>
-       <TD>Send notification when a printer is deleted</TD>
-</TR>
-<TR>
-       <TD>printer-modified</TD>
-       <TD>Send notification when a printer is modified</TD>
-</TR>
-<TR>
-       <TD>printer-state-changed</TD>
-       <TD>Send notification when the printer-state changes</TD>
-</TR>
-<TR>
-       <TD>printer-stopped</TD>
-       <TD>Send notification when a printer is stopped</TD>
-</TR>
-<TR>
-       <TD>server-audit</TD>
-       <TD>Send notification when a bad request, security error, or
-       authentication error occurs</TD>
-</TR>
-<TR>
-       <TD>server-restarted</TD>
-       <TD>Send notification when the server is restarted</TD>
-</TR>
-<TR>
-       <TD>server-started</TD>
-       <TD>Send notification when the server is initially started</TD>
-</TR>
-<TR>
-       <TD>server-stopped</TD>
-       <TD>Send notification when the server is shutdown</TD>
-</TR>
-</TBODY>
-</TABLE></DIV>
-
-
-<H2 CLASS="title"><A NAME="ExpirationTime">ExpirationTime</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
-  ...
-  ExpirationTime 1012563145
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>ExpirationTime</CODE> directive specifies the
-expiration time of the subscription as a UNIX time value. It is 0
-for subscriptions with no predefined expiration time.</P>
-
-<P>The <CODE>ExpirationTime</CODE> directive must appear inside a
-<A HREF="#Subscription"><CODE>Subscription</CODE></A>
-section.</P>
-
-
-<H2 CLASS="title"><A NAME="Interval">Interval</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
-  ...
-  Interval 30
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Interval</CODE> directive specifies the preferred
-time interval for event notifications in seconds.</P>
-
-<P>The <CODE>Interval</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="JobId">JobId</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
-  ...
-  JobId 123
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>JobId</CODE> directive specifies the
-<CODE>job-id</CODE> for job subscriptions.</P>
-
-<P>The <CODE>JobId</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="LeaseDuration">LeaseDuration</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
-  ...
-  LeaseDuration
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>LeaseDuration</CODE> directive specifies the number
-of seconds that the subscription is valid. A value of 0 means
-that the subscription will last forever or the life of the print
-job the subscription is attached to.</P>
-
-<P>The <CODE>LeaseDuration</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="NextEventId">NextEventId</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
-  ...
-  NextEventId 999
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>NextEventId</CODE> directive specifies the
-<CODE>notify-sequence-number</CODE> value for the next
-notification event. It starts at 1 and increases for every event
-that is delivered for the subscription.</P>
-
-<P>The <CODE>NextEventId</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="NextSubscriptionId">NextSubscriptionId</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-NextSubscriptionId 999
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>NextSubscriptionId</CODE> directive specifies the
-next subscription ID to use. It defaults to 1 more than the
-highest subscription number seen.</P>
-
-
-<H2 CLASS="title"><A NAME="Owner">Owner</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
-  ...
-  Owner username
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Owner</CODE> directive specifies the user that owns
-this subscription.</P>
-
-<P>The <CODE>Owner</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="PrinterName">PrinterName</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
-  ...
-  PrinterName name
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>PrinterName</CODE> directive specifies the name of
-the printer or class that is associated with this
-subscription.</P>
-
-<P>The <CODE>PrinterName</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="Recipient">Recipient</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
-  ...
-  Recipient mailto:foo@domain.com
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Recipient</CODE> directive specifies the
-<CODE>notify-recipient-uri</CODE> value for push-type
-notifications. The URI scheme name determines which notifier
-program is used to send the event(s).</P>
-
-<P>The <CODE>Recipient</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-
-<H2 CLASS="title"><A NAME="Subscription">Subscription</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
-  ...
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>Subscription</CODE> section defines a single
-subscription in the system. Each subscription is assigned a
-unique (to the server) number starting at 1.</P>
-
-
-<H2 CLASS="title"><A NAME="UserData">UserData</A></H2>
-
-<H3>Examples</H3>
-
-<PRE CLASS="command">
-&lt;Subscription NNN&gt;
-  ...
-  UserData mailto:bar&lt;40&gt;example.com
-&lt;/Subscription&gt;
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>UserData</CODE> directive specifies the
-<CODE>notify-user-data</CODE> value, which is normally the "to"
-address used in <CODE>mailto</CODE> notifications. Binary values
-are introduced by encoding the bytes as hexadecimal values inside
-angle brackets, e.g. "&lt;1234&gt;".</P>
-
-<P>The <CODE>UserData</CODE> directive must appear inside a <A
-HREF="#Subscription"><CODE>Subscription</CODE></A> section.</P>
-
-</BODY>
-</HTML>
index 3bd5642..d96cbf0 100644 (file)
@@ -19,10 +19,7 @@ server.</P>
 
 <H2 CLASS="title"><A NAME="AUTHENTICATION">Authentication Issues</A></H2>
 
-<P>When you enable remote administration, the server will use
-Basic authentication for administration tasks. The current CUPS
-server supports Basic, Digest, Kerberos, and local certificate
-authentication:</P>
+<P>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:</P>
 
 <OL>
 
@@ -38,18 +35,6 @@ authentication:</P>
        username and password information - this is the default on
        MacOS X and systems with GNU TLS or OpenSSL installed.</P></LI>
 
-       <LI>Digest authentication uses an MD5 checksum of the
-       username, password, and domain ("CUPS"), so the original
-       username and password is not sent over the network.
-
-       <P>The current implementation does not authenticate the
-       entire message and uses the client's IP address for the
-       nonce value, making it possible to launch "man in the
-       middle" and replay attacks from the same client.</P>
-
-       <P><B>Recommendation:</B> Enable encryption to hide the
-       username and password information.</P></LI>
-
        <LI>Local certificate authentication passes 128-bit
        "certificates" that identify an authenticated user.
        Certificates are created on-the-fly from random data and
@@ -101,20 +86,6 @@ variety of denial of service attacks:</P>
 
        <P><B>Recommendation:</B> None.</P></LI>
 
-       <LI>Flooding the network with broadcast packets on port
-       631.
-
-       <P>It might be possible to disable browsing if this
-       condition is detected by the CUPS software, however if
-       there are large numbers of printers available on the
-       network such an algorithm might think that an attack was
-       occurring when instead a valid update was being
-       received.</P>
-
-       <P><B>Recommendation:</B> Block browse packets from
-       foreign or untrusted networks using a router or
-       firewall.</P></LI>
-
        <LI>Sending partial IPP requests; specifically, sending
        part of an attribute value and then stopping
        transmission.
@@ -146,27 +117,7 @@ variety of denial of service attacks:</P>
 
 <H2 CLASS="title"><A NAME="ENCRYPTION">Encryption Issues</A></H2>
 
-<P>CUPS supports 128-bit SSL 3.0 and TLS 1.0 encryption of
-network connections via the OpenSSL, GNU TLS, and CDSA encryption
-libraries. In additional to the potential security issues posed
-by the SSL and TLS protocols, CUPS currently has the following
-additional issue:</P>
-
-<OL>
-
-       <LI>Certification validation/revocation; currently CUPS
-       does not validate or revoke server or client certificates
-       when establishing a secure connection. This can
-       potentially lead to "man in the middle" and
-       impersonation/spoofing attacks over unsecured networks.
-       Future versions of CUPS will support both validation and
-       revocation of server certificates.
-
-       <P><B>Recommendation:</B> Do not depend on encryption for
-       security when connecting to servers over the Internet or
-       untrusted WAN links.</P></LI>
-
-</OL>
+<P>CUPS supports 128-bit TLS encryption of network connections via the GNU TLS library, OS X Security framework, and Windows Schannel APIs. Secure deployment of TLS depends on proper certificate management and software maintenance.</P>
 
 </BODY>
 </HTML>
diff --git a/doc/help/spec-browsing.html b/doc/help/spec-browsing.html
deleted file mode 100644 (file)
index 3a29132..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<!-- SECTION: Specifications -->
-<head>
-       <title>CUPS Browse Protocol</title>
-       <meta name='keywords' content='Programming'>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</head>
-<body>
-<!--
-  "$Id$"
-
-  CUPS Browse Protocol specification for CUPS.
-
-  Copyright 2008-2012 by Apple Inc.
-  Copyright 1997-2005 by Easy Software Products.
-
-  These coded instructions, statements, and computer programs are the
-  property of Apple Inc. and are protected by Federal copyright
-  law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-  which should have been included with this file.  If this file is
-  file is missing or damaged, see the license at "http://www.cups.org/".
--->
-
-<BLOCKQUOTE><B>Note:</B>
-
-<P>The CUPS Browse Protocol was deprecated in CUPS 1.4 and is no longer supported.</P>
-
-</BLOCKQUOTE>
-
-<H1 CLASS="title">CUPS Browse Protocol</H1>
-
-<h2><a name='INTRO'>Introduction</a></h2>
-
-<p>This specification describes the CUPS browsing protocol which was used for
-printer sharing. The protocol was a UDP/IP-based broadcast service that
-operated on IP service port 631 by default. Each broadcast packet described
-a single printer or class being shared.</p>
-
-<p>For simple networks with a single subnet, a CUPS system sharing a printer
-(the <em>server</em>) would periodically broadcast that printer's availability
-and status information to the subnet. Every other CUPS system on the subnet
-(the <em>clients</em>) would receive the broadcast and make that printer
-available to local users. If a client stopped receiving broadcasts from the
-server, or if the server sent a special "deleted" broadcast message, the
-client would remove its copy of the printer.</p>
-
-<p>For larger networks with multiple subnets, a relay configuration could be used
-where one or more client systems polled the server and then broadcast the
-availability and status information for the server's shared printers to the
-clients' local subnets.</p>
-
-<p>A key feature of CUPS printer sharing was support for <em>implicit
-classes</em>, which are automatically-created classes for printers that are
-shared by multiple servers. These implicit classes provided automatic load
-balancing and fail-safe printing functionality transparently to the user.</p>
-
-
-<h2><a name='SECURITY'>Security Considerations</a></h2>
-
-<p>Like most discovery protocols, CUPS browse packets were not encrypted or
-signed, so it was possible for malicious systems on a network to advertise
-or remove printers on that network to cause denial of service or information
-disclosure. In order to combat this, CUPS logged incoming browse packets and
-provided access controls to limit browse packet reception to known hosts.</p>
-
-
-<h2><a name='FORMAT'>Browse Packet Format</a></h2>
-
-<p>Each broadcast packet is an ASCII text string of up to 1450 bytes ending
-with a line feed (0x0a). The general format is:</p>
-
-<p class='summary'>
-printer-type printer-state printer-uri "printer-location" "printer-info"
-"printer-make-and-model" name=value name2=value2 ...
-</p>
-
-<p>Each of the fields contains the value of the corresponding IPP attribute.
-The trailing "name=value" information is used to convey default job template
-attribute values (job-sheets-default, media-default, etc.), authentication
-requirements (auth-info-required), and additional IPP URI options that are
-requested by the server (ipp-options).</p>
-
-<h3>ABNF Definition</h3>
-
-<p>The following ABNF definition [RFC4234, RFC3986] defines the format of each
-browse packet:</p>
-
-<pre class='command'>
-PACKET         = TYPE WSP STATE WSP URI WSP LOCATION WSP INFO WSP
-                 MAKE-AND-MODEL WSP *[ WSP ATTR-NAME "=" ATTR-VALUE ] LF
-
-TYPE           = 1*HEXDIG
-
-STATE          = "3" / "4" / "5"
-
-URI            = "ipp://" ( 1*NAMECHAR / IP-literal / IPv4address )
-                 [ ":" 1*DIGIT ] ( "/printers/" / "/classes/" ) 1*NAMECHAR
-NAMECHAR       = %x21.22.24.26-2E.30-7E / %x25 HEXDIG HEXDIG
-IP-literal     = See RFC 3986
-IPv4address    = See RFC 3986
-
-LOCATION       = QUOTED-STRING
-INFO           = QUOTED-STRING
-MAKE-AND-MODEL = QUOTED-STRING
-
-ATTR-NAME      = 1*( ALPHA / DIGIT / "-" / "." )
-ATTR-VALUE     = QUOTED-STRING / 1*UNQUOTE-CHAR
-
-QUOTED-STRING  = DQUOTE *QUOTED-CHAR DQUOTE
-QUOTED-CHAR    = %x20.21.23-5B.5D-7E / UTF8-CHAR / %x5C %x5C / %x5C %x22
-UNQUOTE-CHAR   = %x21.23-26.28-5B.5D-7E / UTF8-CHAR
-UTF8-CHAR      = %xC0.DF %x80.BF / %xE0.EF %x80.BF %x80.BF /
-                 %xF0.F7 %x80.BF %x80.BF %x80.BF
-</pre>
-
-</body>
-</html>
index 2c66e32..d2a44ac 100644 (file)
@@ -1,4 +1,4 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!DOCTYPE html>
 <HTML>
 <!-- SECTION: Specifications -->
 <HEAD>
 
 <P>This developer guide documents the guidelines and processes we use when developing and maintaining CUPS and related software. Our goal is to provide reliable and efficient software and documentation that addresses the needs of our users.</P>
 
+
 <H2 CLASS="title"><A NAME="OVERVIEW">Overview</A></H2>
 
-<P>CUPS is developed by Apple Inc. and distributed as open source software under a combination of GNU GPL2 and GNU LGPL2 licenses with exceptions to allow linking to OpenSSL (which has a GPL-incompatible license) and for developers on Apple's operating systems to develop CUPS-based software until alternate license terms. Significant contributions to CUPS must be licensed to Apple using the <A HREF="http://www.cups.org/AppleContributorAgreement_2011-03-10.pdf">Apple Contributor Agreement</A>.</P>
+<P>CUPS is developed by Apple Inc. and distributed as open source software under a combination of GNU GPL2 and GNU LGPL2 licenses with exceptions to allow developers on Apple's operating systems to develop CUPS-based software under alternate license terms. Significant contributions to CUPS must be licensed to Apple using the <A HREF="https://www.cups.org/AppleContributorAgreement_2011-03-10.pdf">Apple Contributor Agreement</A>.</P>
 
 <P>Apple releases updates to the CUPS software approximately every three months. Each release has a version number consisting of the major version (currently 1), minor version (currently 6), and patch version (starting at 0) separated by the period, for example "1.6.0". Releases where only the patch version number changes will contain only bug fixes to the previous release, for example "1.6.1" includes bug fixes for the "1.6.0" release. New features require the major or minor version numbers to change, for example "1.6.0" release contains new features compared to the "1.5.3" release. Multiple beta and "candidate" releases generally precede each new feature release, for example "1.5b1", "1.5b2", and "1.5rc1" preceded the "1.5.0" release. Finally, we also post regular Subversion snapshot releases, for example "1.6svn-r10486", which represent a snapshot of the development for the next feature release.</P>
 
 
 <H3><A NAME="CONTACT">How to Contact the Developers</A></H3>
 
-<P>The <A HREF="http://lists.cups.org/">CUPS Mailing Lists</A> 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. Table 1 shows the available mailing lists and their focus:</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="CUPS Forums">
-<CAPTION>Table 1: CUPS Mailing Lists</CAPTION>
-<TR>
-       <TH>List</TH>
-       <TH>Focus/Purpose</TH>
-</TR>
-<TR>
-       <TD>cups</TD>
-       <TD>General discussion and usage questions for the CUPS software</TD>
-</TR>
-<TR>
-       <TD>cups-bugs</TD>
-       <TD>Discussion of bugs and issues in the CUPS software</TD>
-</TR>
-<TR>
-       <TD>cups-commit</TD>
-       <TD>Report of all commits to the Subversion repository (read-only)</TD>
-</TR>
-<TR>
-       <TD>cups-dev</TD>
-       <TD>Development questions and discussion of new features in the CUPS software</TD>
-</TR>
-</TABLE></DIV>
+<P>The <A HREF="https://www.cups.org/lists.php">CUPS.org mailing lists</A> 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 <a href="https://www.cups.org/mailman/listinfo/cups">cups&#x40;cups.org</a> mailing list is intended for CUPS usage questions and new software announcements while the <a href="https://www.cups.org/mailman/listinfo/cups-devel">cups-devel&#x40;cups.org</a> mailing list provides a forum for CUPS developers and monitoring new bugs.</p>
 
 
 <H3><A NAME="SUBMIT">How to Submit a Bug Report or Feature Request</A></H3>
 
-<P>The CUPS "<A HREF="http://www.cups.org/str.php">Bugs &amp; Features</A>" page provides access to the CUPS <em>Software Trouble Report</em> (STR) database and is the formal way to submit a bug report or feature request to the CUPS developers. Please note, however, that we <em>do not</em> provide answers to usage questions or resolve problems in third-party software on this page - use the <A HREF="#CONTACT">CUPS Mailing Lists</A> for that instead.</P>
+<P>The CUPS.org <A HREF="https://www.cups.org/str.php">Bugs</A> page provides access to the CUPS <em>Software Trouble Report</em> (STR) database and is the formal way to submit a bug report or feature request to the CUPS developers. Please note, however, that we <em>do not</em> provide answers to usage questions or resolve problems in third-party software on this page - use the <A HREF="#CONTACT">CUPS.org mailing lists</A> for that instead.</P>
 
-<P>Unlike discussions that occur on the CUPS Mailing Lists, formal bug reports and feature requests must be acted on by the CUPS developers. This does not mean that every bug report is resolved or every feature request is implemented, but we do respond and keep track of them all for posterity.</P>
+<P>Unlike discussions that occur on the CUPS.org mailing lists, formal bug reports and feature requests must be acted on by the CUPS developers. This does not mean that every bug report is resolved or every feature request is implemented, but we do respond and keep track of them all for posterity.</P>
 
-<BLOCKQUOTE>Please use the search feature of the Bugs &amp; Features page before submitting a new bug report or feature request. If you see an existing report that matches your issue, please post a message to that report ("I have this issue as well", "I would also like to see", etc.) rather than submitting a new report. This helps speed the resolution of your issue by reducing the CUPS developers' work load and identifying popular issues.</BLOCKQUOTE>
+<BLOCKQUOTE><B>Note:</B>
+
+<P>Please use the search feature of the Bugs page before submitting a new bug report or feature request. If you see an existing report that matches your issue, please post a message to that report ("I have this issue as well", "I would also like to see", etc.) rather than submitting a new report. This helps speed the resolution of your issue by reducing the CUPS developers' work load and identifying popular issues.</P></BLOCKQUOTE>
 
 
 <H3><A NAME="PATCH">How to Prepare a Patch</A></H3>
 
-<P>When submitting a bug report or feature request, you can include patch files that resolve the bug or implement the feature to speed the inclusion of that bug fix or feature in a new CUPS release. For changes to existing files, we prefer a unified diff against the current Subversion <VAR>trunk</VAR> branch, which can be generated easily using the following Subversion command:</P>
+<P>When submitting a bug report or feature request, you can include patch files that resolve the bug or implement the feature to speed the inclusion of that bug fix or feature in a new CUPS release. For changes to existing files, we prefer a unified diff against the current GIT "master" branch, which can be generated easily using the following Git command:</P>
 
 <PRE CLASS="command">
-svn diff >filename.patch
+git format-patch remotes/trunk >filename.patch
 </PRE>
 
 <P>If you produce a patch using a released source archive, use one of the following commands instead:</P>
@@ -82,7 +61,7 @@ diff -urN olddirectory directory >filename.patch
 
 <BLOCKQUOTE><B>Note:</B>
 
-<P>Patches and files must conform to the standards outlined in the "<A HREF="#CODING">Coding Guidelines</A>" and "<A HREF="#MAKEFILES">Makefile Guidelines</A>" sections in this document. In addition, since Apple Inc. provides CUPS under multiple licenses, we require that you <A HREF="http://www.cups.org/AppleContributorAgreement_2011-03-10.pdf">license</A>  significant changes and files to us for inclusion in CUPS. The CUPS developers will inform you if licensing is required.</P></BLOCKQUOTE>
+<P>Patches and files must conform to the standards outlined in the "<A HREF="#CODING">Coding Guidelines</A>" and "<A HREF="#MAKEFILES">Makefile Guidelines</A>" sections in this document. In addition, since Apple Inc. provides CUPS under multiple licenses, we require that you <A HREF="https://www.cups.org/AppleContributorAgreement_2011-03-10.pdf">license</A> significant changes and files to us for inclusion in CUPS. The CUPS developers will inform you if licensing is required.</P></BLOCKQUOTE>
 
 
 <H2 CLASS="title"><A NAME="PRACTICES">Software Development Practices</A></H2>
@@ -151,6 +130,8 @@ MAJOR.MINORsvn-rREV
 <A HREF="http://subversion.apache.org/" TARGET="_blank">subversion.apache.org</A>
 </PRE>
 
+<p>A public read-only Git mirror is maintained for external developers. Details can be found on the CUPS.org <a href="https://www.cups.org/software.php">Software</a> page.</P>
+
 <P>Source files are "checked in" with each change so that modifications can be tracked, and each checkin must reference any applicable STRs. The following format <em>must</em> be used for commit log messages:</P>
 
 <PRE CLASS="command">
@@ -159,27 +140,7 @@ Summary of the change on one line followed by bug number (STR #NNNN)
 Detailed list of changes.
 </PRE>
 
-<P>Primary development occurs on the <var>trunk</var> branch, with changes merged back to release branches as needed. Table 2 shows the URLs developers use for the various CUPS sub-projects and branches:</P>
-
-<DIV CLASS="table"><TABLE SUMMARY="CUPS Subversion URLs">
-<CAPTION>Table 2: CUPS Subversion URLs</CAPTION>
-<TR>
-       <TH>URL</TH>
-       <TH>Purpose</TH>
-</TR>
-<TR>
-       <TD><A HREF="http://svn.cups.org/public/cups/trunk/">https://svn.cups.org/public/cups/trunk/</A></TD>
-       <TD>Primary CUPS development branch</TD>
-</TR>
-<TR>
-       <TD><A HREF="http://svn.cups.org/public/cups/branches/">https://svn.cups.org/public/cups/branches/</A></TD>
-       <TD>CUPS maintenance branches (merge-only)</TD>
-</TR>
-<TR>
-       <TD><A HREF="http://svn.cups.org/public/cups/tags/">https://svn.cups.org/public/cups/tags/</A></TD>
-       <TD>CUPS release tags (read-only)</TD>
-</TR>
-</TABLE></DIV>
+<P>Primary development occurs on the <var>trunk</var> branch, with changes merged back to release branches as needed.</P>
 
 <P>The branch for a MAJOR.MINOR release are created when the first production release (MAJOR.MINOR.0) is made using the name "branch-MAJOR.MINOR". Release tags are created for every beta, candidate, and production release using the name "release-MAJOR.MINORbNUMBER", "release-MAJOR.MINORrcNUMBER", or "release-MAJOR.MINOR.PATCH", respectively. No release tags are created for developer snapshots.</P>
 
@@ -193,7 +154,7 @@ Detailed list of changes.
 
 <H3>Build System</H3>
 
-<P>The CUPS build system uses <A HREF="http://www.gnu.org/software/autoconf/">GNU autoconf</A> to tailor the library to the local operating system. Project files for the current release of Visual C++ are also provided for Microsoft Windows<SUP>&reg;</SUP>. To improve portability, makefiles must not make use of features unique to <A HREF="http://www.gnu.org/software/make/">GNU make</A>. See the <A HREF="#MAKEFILES">Makefile Guidelines</A> section for a description of the allowed make features and makefile guidelines.</P>
+<P>The CUPS build system uses <A HREF="http://www.gnu.org/software/autoconf/">GNU autoconf</A> 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<SUP>&reg;</SUP>. To improve portability, makefiles must not make use of features unique to <A HREF="http://www.gnu.org/software/make/">GNU make</A>. See the <A HREF="#MAKEFILES">Makefile Guidelines</A> section for a description of the allowed make features and makefile guidelines.</P>
 
 <P>Additional GNU build programs such as <A HREF="http://www.gnu.org/software/automake">GNU automake</A> and <A HREF="http://www.gnu.org/software/libtool">GNU libtool</A> 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.</P>
 
@@ -216,7 +177,7 @@ tools/makesrcdist <I>version</I>
 rpmbuild -ta cups-<I>version</I>-source.tar.gz
 </PRE>
 
-<P>The <VAR>cups.list</VAR> file is generated by the <VAR>configure</VAR> script and produces binary packages for many platforms using the <A HREF="http://www.epmhome.org/" TARGET="_blank">EPM</A> software. Table 3 shows the targets that are available for each type of binary package:</P>
+<P>The <VAR>cups.list</VAR> file is generated by the <VAR>configure</VAR> script and produces binary packages for many platforms using the <A HREF="https://www.msweet.org/projects.php?Z2" TARGET="_blank">EPM</A> software. Table 3 shows the targets that are available for each type of binary package:</P>
 
 <DIV CLASS="table"><TABLE SUMMARY="Binary Package Targets">
 <CAPTION>Table 3: Binary Package Targets</CAPTION>
@@ -225,10 +186,6 @@ rpmbuild -ta cups-<I>version</I>-source.tar.gz
        <TH>Type of Package</TH>
 </TR>
 <TR>
-       <TD>aix</TD>
-       <TD>AIX installp</TD>
-</TR>
-<TR>
        <TD>bsd</TD>
        <TD>*BSD pkg_install</TD>
 </TR>
@@ -237,18 +194,10 @@ rpmbuild -ta cups-<I>version</I>-source.tar.gz
        <TD>Debian dpkg</TD>
 </TR>
 <TR>
-       <TD>depot</TD>
-       <TD>HP-UX swinstall</TD>
-</TR>
-<TR>
        <TD>epm</TD>
        <TD>Portable tarball with install script</TD>
 </TR>
 <TR>
-       <TD>inst</TD>
-       <TD>IRIX inst/tardist</TD>
-</TR>
-<TR>
        <TD>pkg</TD>
        <TD>Solaris pkgadd</TD>
 </TR>
@@ -257,28 +206,16 @@ rpmbuild -ta cups-<I>version</I>-source.tar.gz
        <TD>RPM binary</TD>
 </TR>
 <TR>
-       <TD>setld</TD>
-       <TD>Tru64 UNIX setld</TD>
-</TR>
-<TR>
        <TD>slackware</TD>
        <TD>Slackware install</TD>
 </TR>
-<TR>
-       <TD>swinstall</TD>
-       <TD>HP-UX swinstall</TD>
-</TR>
-<TR>
-       <TD>tardist</TD>
-       <TD>IRIX inst/tardist</TD>
-</TR>
 </TABLE></DIV>
 
 <P>Finally, the <VAR>tools/testrpm</VAR> and <VAR>tools/testosx</VAR> scripts can be used to create binary packages from the current working copy for testing on Linux and OS X, respectively:</P>
 
 <PRE CLASS="command">
 tools/testrpm
-sudo rpm -U /usr/src/redhat/RPMS/i386/cups*.rpm
+sudo rpm -U /usr/src/redhat/RPMS/{arm,i386,x64_64}/cups*.rpm
 
 sudo tools/testosx
 open cups.pkg
@@ -298,7 +235,7 @@ make test
 
 <H2 CLASS="title"><A NAME="STR">Trouble Report Processing</A></H2>
 
-<P>A Software Trouble Report ("STR") must be submitted every time a user or vendor experiences a problem with the CUPS software. Trouble reports are maintained on the <A HREF="http://www.cups.org/str.php" TARGET="_blank">Bugs &amp; Features</A> page with one of the following states:</P>
+<P>A Software Trouble Report ("STR") must be submitted every time a user or vendor experiences a problem with the CUPS software. Trouble reports are maintained on the <A HREF="https://www.cups.org/str.php" TARGET="_blank">Bugs</A> page with one of the following states:</P>
 
 <OL>
 
@@ -415,34 +352,28 @@ make test
 
 <P>The ".cxx" extension is used because it is the only common C++ extension between Linux, OS X, UNIX, and Windows.</P></BLOCKQUOTE>
 
-<P>The top of each source file contains a header giving the name of the file, the purpose or nature of the source file, the copyright and licensing notice, and the functions contained in the file.  The file name and revision information is provided by the Subversion "&#36;Id$" tag:</P>
+<P>The top of each source file contains a header giving the name of the file, the purpose or nature of the source file, and the copyright and licensing notice.  The file name and revision information is provided by the Subversion "&#36;Id$" tag:</P>
 
 <PRE CLASS="command">
 /*
  * "&#36;Id$"
  *
- *   Description of file contents.
+ * Description of file contents.
  *
- *   Copyright 2012 by Apple Inc.
+ * Copyright 2013 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   function1() - Description 1.
- *   function2() - Description 2.
- *   function3() - Description 3.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 </PRE>
 
 <P>For source files that are subject to the Apple OS-Developed Software exception, the following additional comment appears after the contact information:</P>
 
 <PRE CLASS="command">
- *   This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
 </PRE>
 
 <P>The bottom of each source file contains a trailer giving the name of the file using the Subversion "&#36;Id$" tag. The primary purpose of this is to mark the end of a source file; if the trailer is missing it is possible that code has been lost near the end of the file:</P>
@@ -454,6 +385,17 @@ make test
 </PRE>
 
 
+<H3>Header Files</H3>
+
+<P>All public header files must include the <var>versioning.h</var> header file, or a header that does so. Function declarations are then "decorated" with the correct <tt>_CUPS_API_major_minor</tt> macro to define its availability based on the build environment, for example:</p>
+
+<PRE CLASS="command">
+extern int cupsDoThis(int foo, int bar) _CUPS_API_2_0;
+</PRE>
+
+<P>Private API header files must be named with the suffix "-private", for example the <var>cups.h</var> header file defines all of the public CUPS APIs while the <var>cups-private.h</var> 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.</P>
+
+
 <H3>Comments</H3>
 
 <P>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"):</P>
@@ -645,15 +587,15 @@ enum
 #
 # "&#36;Id$"
 #
-#   Makefile for ...
+# Makefile for ...
 #
-#   Copyright 2012 by Apple Inc.
+# Copyright 2013 by Apple Inc.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 </PRE>
 
@@ -889,7 +831,7 @@ libname.a: $(OBJECTS)
 
 <H3>Shared Libraries</H3>
 
-<P>Shared libraries have a prefix of "lib" and the extension ".dylib", ".sl", ".so", or "_s.a" depending on the operating system. A typical shared library is composed of several targets that look like:</P>
+<P>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:</P>
 
 <PRE CLASS="command">
 libname.so: $(OBJECTS)
@@ -899,13 +841,6 @@ libname.so: $(OBJECTS)
 &rarr; $(LN) libname.so.$(DSOVERSION) libname.so.$(DSOMAJOR)
 &rarr; $(LN) libname.so.$(DSOVERSION) libname.so
 
-libname.sl: $(OBJECTS)
-&rarr; echo $(DSOCOMMAND) libname.sl.$(DSOVERSION) ...
-&rarr; $(DSOCOMMAND) libname.sl.$(DSOVERSION) $(OBJECTS)
-&rarr; $(RM) libname.sl libname.sl.$(DSOMAJOR)
-&rarr; $(LN) libname.sl.$(DSOVERSION) libname.sl.$(DSOMAJOR)
-&rarr; $(LN) libname.sl.$(DSOVERSION) libname.sl
-
 libname.dylib: $(OBJECTS)
 &rarr; echo $(DSOCOMMAND) libname.$(DSOVERSION).dylib ...
 &rarr; $(DSOCOMMAND) libname.$(DSOVERSION).dylib \
@@ -917,14 +852,6 @@ libname.dylib: $(OBJECTS)
 &rarr; $(RM) libname.$(DSOMAJOR).dylib
 &rarr; $(LN) libname.$(DSOVERSION).dylib libname.$(DSOMAJOR).dylib
 &rarr; $(LN) libname.$(DSOVERSION).dylib libname.dylib
-
-libname_s.a: $(OBJECTS)
-&rarr; echo $(DSOCOMMAND) libname_s.o ...
-&rarr; $(DSOCOMMAND) libname_s.o $(OBJECTS) $(LIBS)
-&rarr; echo $(LIBCOMMAND) libname_s.a libname_s.o
-&rarr; $(RM) $@
-&rarr; $(LIBCOMMAND) libname_s.a libname_s.o
-&rarr; $(CHMOD) +x libname_s.a
 </PRE>
 
 
index 28a14eb..76cbd9c 100644 (file)
@@ -31,7 +31,7 @@ WIDTH="768" HEIGHT="768" ALT="CUPS Block Diagram"></TD></TR>
 
 <H4>Config Files</H4>
 
-<P>The scheduler uses several configuration files to store the server settings (<A HREF="ref-cupsd-conf.html">cupsd.conf</A>), available classes (<A HREF="ref-classes-conf.html">classes.conf</A>), available printers (<A HREF="ref-printers-conf.html">printers.conf</A>), current notification subscriptions (<A HREF="ref-subscriptions-conf.html">subscriptions.conf</A>), and supported file types and filters (<A HREF="man-mime.types.html">mime.types</A>, <A HREF="man-mime.convs.html">mime.convs</A>). In addition, PostScript Printer Description ("PPD") files or interface scripts 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.</P>
+<P>The scheduler uses several configuration files to store the server settings (<A HREF="man-cupsd.conf.html">cupsd.conf</A>), available classes (<A HREF="man-classes.conf.html">classes.conf</A>), available printers (<A HREF="man-printers.conf.html">printers.conf</A>), current notification subscriptions (<A HREF="man-subscriptions.conf.html">subscriptions.conf</A>), and supported file types and filters (<A HREF="man-mime.types.html">mime.types</A>, <A HREF="man-mime.convs.html">mime.convs</A>). In addition, PostScript Printer Description ("PPD") files or interface scripts 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.</P>
 
 <H4>Job Files</H4>
 
@@ -41,8 +41,8 @@ WIDTH="768" HEIGHT="768" ALT="CUPS Block Diagram"></TD></TR>
 
 <H4>Log Files</H4>
 
-<P>The scheduler keeps three kinds of log files which are normally stored in the <VAR>/var/log/cups</VAR> directory. The <A HREF="ref-access_log.html">access_log</A> file lists every HTTP and IPP request that is processed by the scheduler. The <A HREF="ref-error_log.html">error_log</A> file contains messages from the scheduler and its helper applications that can be used
-to track down problems. The <A HREF="ref-page_log.html">page_log</A> file lists every page that is printed, allowing for simple print accounting.</P>
+<P>The scheduler keeps three kinds of log files which are normally stored in the <VAR>/var/log/cups</VAR> directory. The <A HREF="man-cupsd-logs.html">access_log</A> file lists every HTTP and IPP request that is processed by the scheduler. The <A HREF="man-cupsd-logs.html">error_log</A> file contains messages from the scheduler and its helper applications that can be used
+to track down problems. The <A HREF="man-cupsd-logs.html">page_log</A> file lists every page that is printed, allowing for simple print accounting.</P>
 
 <P>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 <B>logrotated(8)</B> program to rotate them instead.</P>
 
@@ -148,7 +148,7 @@ CUPS_SERVERBIN/notifier/foo recipient user-data
 
 <P>Backends (<A HREF="man-backend.html">backend(7)</A>) send print data to the printer and enumerate available printers/devices as needed. Backends use the same interface as filters.</P>
 
-<P>CUPS includes backends for AppSocket (JetDirect), IPP, LPD, parallel, SCSI, serial, and USB connections. Additional backends can be added as needed without additional configuration.</P>
+<P>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.</P>
 
 
 <H2 CLASS="title"><A NAME="PROGRAMMING">Programming Interfaces</A></H2>
index e06270c..3a9fd6c 100644 (file)
@@ -12,7 +12,7 @@
 
   CUPS IPP specification for CUPS.
 
-  Copyright 2007-2012 by Apple Inc.
+  Copyright 2007-2013 by Apple Inc.
   Copyright 1997-2007 by Easy Software Products.
 
   These coded instructions, statements, and computer programs are the
@@ -369,7 +369,8 @@ Print-Job request:
 
        <dd>The client OPTIONALLY supplies one or more authentication values as specified by the "auth-info-required" attribute.
 
-       <dt>"job-billing" (text(MAX)):<span class='info'>CUPS 1.1</span>
+       <dt>"job-billing" (text(MAX))<span class='info'>CUPS 1.1</span> or
+       "job-account-id (text(MAX))"<span class='info'>CUPS 1.7</span>:
 
        <dd>The client OPTIONALLY supplies a billing string that is logged
        with the page accounting information.
@@ -476,7 +477,8 @@ Create-Job request:
 
        <dd>The client OPTIONALLY supplies one or more authentication values as specified by the "auth-info-required" attribute.
 
-       <dt>"job-billing" (text(MAX)):<span class='info'>CUPS 1.1</span>
+       <dt>"job-billing" (text(MAX))<span class='info'>CUPS 1.1</span> or
+       "job-account-id (text(MAX))<span class='info'>CUPS 1.7</span>:
 
        <dd>The client OPTIONALLY supplies a billing string that is logged
        with the page accounting information.
@@ -2169,6 +2171,12 @@ document (fit-to-page=false). The default value is false.
 <p>The job-billing attribute provides a text value to associate with a job
 for billing purposes.
 
+<blockquote><b>Note:</b> This attribute has been superceded by the "job-account-id" attribute defined in PWG 5100.11: Job and Printer Extensions - Set 2.</blockquote>
+
+<h4><a name="job-cancel-after">job-cancel-after (integer(1:MAX))</a><span class='info'>CUPS 2.0</span></h4>
+
+<p>The job-cancel-after attribute provides the maximum number of seconds that are allowed for processing a job.</p>
+
 <h4><a name="job-hold-until">job-hold-until (keyword | name(MAX))</a><span class='info'>CUPS 1.1</span></h4>
 
 <p>The job-hold-until attribute specifies a hold time. In addition to the
index 407f478..7276c90 100644 (file)
@@ -9,16 +9,7 @@
 
 <H1 CLASS="title">CUPS PDF Format</H1>
 
-<P>CUPS PDF files (application/vnd.cups-pdf) are device-dependent
-PDF/A files that contain a job ticket information. These files
-are typically produced by the CUPS <CODE>pdftopdf</CODE> filter
-which handles job ticket generation, imposition, page labeling,
-scaling, and other formatting options requested by the user. CUPS
-PDF files are intended for direct consumption by a PDF-capable
-printer, PDF RIP, or the <CODE>pdftops</CODE> filter.</P>
-
-<P>More information will be posted here as the PDF workflow
-filters are added to CUPS.</P>
+<P>CUPS PDF files (application/vnd.cups-pdf) are device-dependent PDF files that contain a job ticket information.</P>
 
 </BODY>
 </HTML>
index 75a927f..58c50f7 100644 (file)
@@ -38,7 +38,19 @@ 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.example {
   background: #eeeeee;
   border: dotted thin #999999;
@@ -77,7 +89,7 @@ A:link:hover IMG {
 }
 
 A:link, A:visited {
-  font-weight: normal;
+  font-weight: inherit;
   text-decoration: none;
 }
 
@@ -410,7 +422,11 @@ div.contents ul.subcontents li {
        <li><a href="#cupsIPPFinishings">cupsIPPFinishings</a></li>
        <li><a href="#cupsIPPReason">cupsIPPReason</a></li>
        <li><a href="#cupsIPPSupplies">cupsIPPSupplies</a></li>
+       <li><a href="#cupsJobAccountId">cupsJobAccountId</a></li>
+       <li><a href="#cupsJobAccountingUserId">cupsJobAccountingUserId</a></li>
+       <li><a href="#cupsJobPassword">cupsJobPassword</a></li>
        <li><a href="#cupsLanguages">cupsLanguages</a></li>
+       <li><a href="#cupsMandatory">cupsMandatory</a></li>
        <li><a href="#cupsManualCopies">cupsManualCopies</a></li>
        <li><a href="#cupsMarkerName">cupsMarkerName</a></li>
        <li><a href="#cupsMarkerNotice">cupsMarkerNotice</a></li>
@@ -1706,6 +1722,49 @@ http://www.vendor.com/help"
 *cupsIPPSupplies: False
 </pre>
 
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsJobAccountId'>cupsJobAccountId</a></h3>
+
+<p class='summary'>*cupsJobAccountId: boolean</p>
+
+<p>This keyword defines whether the printer accepts the job-account-id IPP attribute.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify the printer accepts the job-account-id IPP attribute.</em>
+*cupsJobAccountId: True
+</pre>
+
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsJobAccountingUserId'>cupsJobAccountingUserId</a></h3>
+
+<p class='summary'>*cupsJobAccountingUserId: boolean</p>
+
+<p>This keyword defines whether the printer accepts the job-accounting-user-id IPP attribute.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify the printer accepts the job-accounting-user-id IPP attribute.</em>
+*cupsJobAccountingUserId: True
+</pre>
+
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsJobPassword'>cupsJobPassword</a></h3>
+
+<p class='summary'>*cupsJobPassword: "format"</p>
+
+<p>This keyword defines the format of the job-password IPP attribute, if supported by the printer. Currently the only supported format is "1111" indicating a 4-digit PIN code.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify the printer supports 4-digit PIN codes.</em>
+*cupsJobPassword: "1111"
+</pre>
+
+
 <h3><span class='info'>CUPS 1.2/OS X 10.5</span><a name='cupsLanguages'>cupsLanguages</a></h3>
 
 <p class='summary'>*cupsLanguages: "locale list"</p>
@@ -1721,6 +1780,21 @@ list of locale names ("en", "en_US", "fr_CA", etc.)</p>
 *cupsLanguages: "en_CA en_UK en_US fr_CA fr_FR"
 </pre>
 
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsMandatory'>cupsMandatory</a></h3>
+
+<p class='summary'>*cupsMandatory: "attribute1 attribute2 ... attributeN"</p>
+
+<p>This keyword defines a list of IPP attributes that must be provided when submitting a print job creation request.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify that the user must supply a job-password</em>
+*cupsMandatory: "job-password job-password-encryption"
+</pre>
+
+
 <h3><a name='cupsManualCopies'>cupsManualCopies</a></h3>
 
 <p class='summary'>*cupsManualCopies: boolean</p>
@@ -1953,7 +2027,7 @@ PPD file extensions was used. Currently it must be the string
 
 <p class="summary">*JCLToPDFInterpreter: "JCL"</p>
 
-<p>This keyword provfides the JCL command to insert a PDF job file into a printer-ready data stream. The JCL command is added after the <tt>JCLBegin</tt> value and any commands for JCL options in the PPD file.</p>
+<p>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 <tt>JCLBegin</tt> value and any commands for JCL options in the PPD file.</p>
 
 <p>Example:</p>
 
@@ -2249,6 +2323,18 @@ the device.</p>
 
 <h2 class='title'><a name='HISTORY'>Change History</a></h2>
 
+<h3>Changes in CUPS 1.7</h3>
+
+<ul>
+
+       <li>Added <a href="#cupsJobAccountId"><tt>cupsJobAccountId</tt></a>,
+       <a href="#cupsJobAccountingUserId"><tt>cupsJobAccountingUserId</tt></a>,
+       <a href="#cupsJobPassword"><tt>cupsJobPassword</tt></a>,
+       <a href="#cupsMandatory"><tt>cupsMandatory</tt></a> keywords.</li>
+
+</ul>
+
+
 <h3>Changes in CUPS 1.6</h3>
 
 <ul>
diff --git a/doc/help/standard.html.in b/doc/help/standard.html.in
deleted file mode 100644 (file)
index f957fe2..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-<HTML>
-<!-- SECTION: Getting Started -->
-<HEAD>
-       <TITLE>Standard Configuration</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">Standard Configuration</H1>
-
-<P>This document describes the standard configuration for this CUPS
-server.</P>
-
-<BLOCKQUOTE><B>Note:</B>
-
-<!-- Packagers: Change the following statement and the following sections
-     if you make any changes to the standard CUPS distribution that are
-     not automatically updated by the configure script. -->
-<P>This file reflects the standard CUPS configuration as distributed
-by Apple Inc, the developer of CUPS.</P>
-
-</BLOCKQUOTE>
-
-
-<H2 CLASS="title"><A NAME="CUPSD">cupsd Configuration</A></H2>
-
-<P><CODE>cupsd(8)</CODE> is configured by default to show
-printers shared by other systems and only allow local access to
-the system and its printers. Administration operations require
-Basic authentication with membership in the group
-"@CUPS_GROUP@".</P>
-
-<P>Connections are accepted via domain socket
-(<VAR>@CUPS_DEFAULT_DOMAINSOCKET@</VAR>) or "localhost"
-(127.0.0.1).</P>
-
-<H3><A NAME="SETTINGS">Settings</A></H3>
-
-<DIV CLASS="table"><TABLE SUMMARY="Default Values">
-<CAPTION>Table 1: Default Values</CAPTION>
-<TR>
-       <TH>Directive</TH>
-       <TH>Value</TH>
-</TR>
-<TR>
-       <TD><CODE><A HREF="ref-cupsd-conf.html#Browsing">Browsing</A></CODE></TD>
-       <TD><CODE>@CUPS_BROWSING@</CODE></TD>
-</TR>
-<TR>
-       <TD><CODE><A HREF="ref-cupsd-conf.html#BrowseLocalProtocols">BrowseLocalProtocols</A></CODE></TD>
-       <TD><CODE>@CUPS_BROWSE_LOCAL_PROTOCOLS@</CODE></TD>
-</TR>
-<TR>
-       <TD><CODE><A HREF="ref-cupsd-conf.html#BrowseRemoteProtocols">BrowseRemoteProtocols</A></CODE></TD>
-       <TD><CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE></TD>
-</TR>
-<TR>
-       <TD><CODE><A HREF="ref-cupsd-conf.html#BrowseShortNames">BrowseShortNames</A></CODE></TD>
-       <TD><CODE>@CUPS_BROWSE_SHORT_NAMES@</CODE></TD>
-</TR>
-<TR>
-       <TD><CODE><A HREF="ref-cupsd-conf.html#ConfigFilePerm">ConfigFilePerm</A></CODE></TD>
-       <TD><CODE>@CUPS_CONFIG_FILE_PERM@</CODE></TD>
-</TR>
-<TR>
-       <TD><CODE><A HREF="ref-cupsd-conf.html#DefaultShared">DefaultShared</A></CODE></TD>
-       <TD><CODE>@CUPS_DEFAULT_SHARED@</CODE></TD>
-</TR>
-<TR>
-       <TD><CODE><A HREF="ref-cupsd-conf.html#ImplicitClasses">ImplicitClasses</A></CODE></TD>
-       <TD><CODE>@CUPS_IMPLICIT_CLASSES@</CODE></TD>
-</TR>
-<TR>
-       <TD><CODE><A HREF="ref-cupsd-conf.html#LogFilePerm">LogFilePerm</A></CODE></TD>
-       <TD><CODE>@CUPS_LOG_FILE_PERM@</CODE></TD>
-</TR>
-<TR>
-       <TD><CODE><A HREF="ref-cupsd-conf.html#MaxCopies">MaxCopies</A></CODE></TD>
-       <TD><CODE>@CUPS_MAX_COPIES@</CODE></TD>
-</TR>
-<TR>
-       <TD><CODE><A HREF="ref-cupsd-conf.html#UseNetworkDefault">UseNetworkDefault</A></CODE></TD>
-       <TD><CODE>@CUPS_USE_NETWORK_DEFAULT@</CODE></TD>
-</TR>
-</TABLE></DIV>
-
-
-<H2 CLASS="title"><A NAME="DIRECTORIES">Directories</A></H2>
-
-<DIV CLASS="table"><TABLE SUMMARY="Directories">
-<CAPTION>Table 2: Directories</CAPTION>
-<TR>
-       <TH>Directory</TH>
-       <TH>Purpose</TH>
-</TR>
-<TR>
-       <TD><VAR>@CUPS_SERVERROOT@</VAR></TD>
-       <TD>The location of configuration files such as
-       <VAR>printers.conf</VAR>. Overridden by the <A
-       HREF="ref-cupsd-conf.html#ServerRoot"><CODE>ServerRoot</CODE></A>
-       directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
-       <TD><VAR>@bindir@</VAR></TD>
-       <TD>The location of user programs.</TD>
-</TR>
-<TR>
-       <TD><VAR>@includedir@</VAR></TD>
-       <TD>The location of CUPS include files.</TD>
-</TR>
-<TR>
-       <TD><VAR>@libdir@</VAR></TD>
-       <TD>The location of CUPS library files.</TD>
-</TR>
-<TR>
-       <TD><VAR>@CUPS_SERVERBIN@</VAR></TD>
-       <TD>The location of server programs such as backends and
-       filters. Overridden by the <A
-       HREF="ref-cupsd-conf.html#ServerBin"><CODE>ServerBin</CODE></A>
-       directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
-       <TD><VAR>@sbindir@</VAR></TD>
-       <TD>The location of administrator programs.</TD>
-</TR>
-<TR>
-       <TD><VAR>@CUPS_DATADIR@</VAR></TD>
-       <TD>The location of data files such as fonts. Overridden
-       by the <A
-       HREF="ref-cupsd-conf.html#DataDir"><CODE>DataDir</CODE></A>
-       directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
-       <TD><VAR>@CUPS_DOCROOT@</VAR></TD>
-       <TD>The location of documentation files. Overridden by
-       the <A
-       HREF="ref-cupsd-conf.html#DocumentRoot"><CODE>DocumentRoot</CODE></A>
-       directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
-       <TD><VAR>@CUPS_LOCALEDIR@</VAR></TD>
-       <TD>The location of localization files.</TD>
-</TR>
-<TR>
-       <TD><VAR>@CUPS_CACHEDIR@</VAR></TD>
-       <TD>The location of cache files such as
-       <VAR>ppds.dat</VAR> and <VAR>remote.cache</VAR>.
-       Overridden by the <A
-       HREF="ref-cupsd-conf.html#CacheDir"><CODE>CacheDir</CODE></A>
-       directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
-       <TD><VAR>@CUPS_LOGDIR@</VAR></TD>
-       <TD>The location of the <VAR>access_log</VAR>,
-       <VAR>error_log</VAR>, and <VAR>page_log</VAR> files.
-       Overridden by the <A
-       HREF="ref-cupsd-conf.html#AccessLog"><CODE>AccessLog</CODE></A>,
-       <A
-       HREF="ref-cupsd-conf.html#ErrorLog"><CODE>ErrorLog</CODE></A>,
-       <A
-       HREF="ref-cupsd-conf.html#PageLog"><CODE>PageLog</CODE></A>,
-       directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
-       <TD><VAR>@CUPS_STATEDIR@</VAR></TD>
-       <TD>The location of the domain socket file and state data
-       such as authentication certificates. Overridden by the <A
-       HREF="ref-cupsd-conf.html#StateDir"><CODE>StateDir</CODE></A>
-       directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-<TR>
-       <TD><VAR>@CUPS_REQUESTS@</VAR></TD>
-       <TD>The location of spooled print jobs. Overridden by the
-       <A
-       HREF="ref-cupsd-conf.html#RequestRoot"><CODE>RequestRoot</CODE></A>
-       directive in <VAR>cupsd.conf</VAR>.</TD>
-</TR>
-</TABLE></DIV>
-
-</BODY>
-</HTML>
diff --git a/doc/help/whatsnew.html b/doc/help/whatsnew.html
deleted file mode 100644 (file)
index 1d77c67..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<HTML>
-<!-- SECTION: Getting Started -->
-<HEAD>
-       <TITLE>What's New in CUPS 1.6</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="../cups-printable.css">
-</HEAD>
-<BODY>
-
-<H1 CLASS="title">What's New in CUPS 1.6</H1>
-
-<P>CUPS 1.6 provides many changes and new features to CUPS 1.5.x. This page provides a high-level outline of these changes. If you have never used CUPS before, read the <A HREF="overview.html">"Overview of CUPS"</A> document instead.</P>
-
-<H2 CLASS="title"><A NAME="COMMANDS">General</A></H2>
-
-<OL START="1">
-
-       <LI><EM>Bonjour Support;</EM> Bonjour printer sharing and discovery is now also supported using Avahi.</LI>
-
-       <LI><EM>Color Management;</EM> ICC profiles referenced by PPD files are now registered on systems with D-BUS and colord installed.</LI>
-
-       <LI><EM>Default Username;</EM> CUPS now supports the <CODE>CUPS_USER</CODE> environment variable and <CODE>User</CODE> directive in the <VAR>client.conf</VAR> file to override the default username.</LI>
-
-       <LI><EM>Open Printing Filters;</EM> The parallel and serial backends, php_cups scripting module, and bannertops, commandtoescpx, commandtopclx, imagetops, imagetoraster, pdftops, rastertoescpx, rastertopclx, and texttops filters are now provided as part of a separate cups-filters project hosted by the Linux Foundation.</LI>
-
-       <LI><EM>Passwords;</EM> Passwords up to 127 characters are now supported.</LI>
-
-       <LI><EM>Printer Options;</EM> The "brightness", "columns", "fitplot", "gamma", "hue", "natural-scaling", "penwidth", "position", "ppi", "saturation", and "scaling" options are not longer supported by CUPS directly, while the "page-bottom", "page-left", "page-right", "page-top", "prettyprint", and "wrap" options have been deprecated.</LI>
-
-</OL>
-
-
-<H2 CLASS="title"><A NAME="SCHEDULER">Scheduler</A></H2>
-
-<OL START="7">
-
-       <LI><EM>Authentication;</EM> The scheduler now supports a <CODE>DefaultAuthType</CODE> value of <CODE>auto</CODE> which automatically chooses between Basic (username/password) and Negotiate (Kerberos) authentication.</LI>
-
-       <LI><EM>IPP Conformance;</EM> The scheduler now correctly reports the "number-of-documents" attribute for jobs and fully conforms to the latest IPP/2.1 test suite.</LI>
-
-       <LI><EM>Permissions;</EM> Filters and backends may no longer have group write permissions enabled.</LI>
-
-       <LI><EM>PPD Files;</EM> PPD files can now be packaged and installed as compressed tar files to reduce the amount of disk space required. Dynamic PPD updates are now also consolidated so that a printer's PPD file is updated once at the end of a job.</LI>
-
-       <LI><EM>Sharing Protocols;</EM> The scheduler no longer supports the CUPS, LDAP, or SLP protocols for printer sharing.</LI>
-
-       <LI><EM>Time-Based Job Limits;</EM> New <CODE>MaxHoldTime</CODE> and <CODE>MaxJobTime</CODE> directives, combined with support for time values in the <CODE>PreserveJobFiles</CODE> and <CODE>PreserveJobHistory</CODE> directives, allow administrators to define time-based job limits and behaviors.</LI>
-
-</OL>
-
-
-<H2 CLASS="title"><A NAME="CUPSAPI">CUPS API</A></H2>
-
-<OL START="13">
-
-       <LI><EM>Destination-Based Printing;</EM> Inspired by IPP Everywhere, new dynamic destination-based APIs allow applications to discover, query, and use both shared and network printers directly and display localized user interfaces with full conflict resolution without static configuration files. These APIs provide equivalent functionality offered by PPD-based printer drivers without the disadvantages of static configuration files.</LI>
-
-       <LI><EM>IPP;</EM> IPP requests now default to protocol version 2.0, and the <CODE>ipp_t</CODE> and <CODE>ipp_value_t</CODE> structures are now private by default. New software should be developed using the corresponding accessor functions instead of directly accessing these structures.</LI>
-
-       <LI><EM>PPD;</EM> The PPD functions are now officially deprecated in favor of the new destination-based printing APIs.</LI>
-
-       <LI><EM>SNMP Support;</EM> The <CODE>cupsSideChannelSNMPGet</CODE> and <CODE>cupsSideChannelSNMPWalk</CODE> functions now support OIDs and values up to 64k in length.</LI>
-
-</OL>
-
-</BODY>
-</HTML>
diff --git a/doc/images/generic.png b/doc/images/generic.png
new file mode 100644 (file)
index 0000000..08430fc
Binary files /dev/null and b/doc/images/generic.png differ
index 5838144..8ec1d2f 100644 (file)
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;Home&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;Administration&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;Classes&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;Online&nbsp;Help&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;Jobs&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;Printers&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS is the standards-based, open source printing system developed by
-<A HREF="http://www.apple.com/">Apple Inc.</A> for OS<SUP>&reg;</SUP> X and
-other UNIX<SUP>&reg;</SUP>-like operating systems.</P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>CUPS for Users</H2>
-
-<P><A HREF="help/overview.html">Overview of CUPS</A></P>
-
-<P><A HREF="help/options.html">Command-Line Printing and Options</A></P>
-
-<P><A HREF="help/whatsnew.html">What's New in CUPS 1.6</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">User Forum</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>CUPS for Administrators</H2>
-
-<P><A HREF="admin">Adding Printers and Classes</A></P>
-
-<P><A HREF="help/policies.html">Managing Operation Policies</A></P>
-
-<P><A HREF="help/accounting.html">Printer Accounting Basics</A></P>
-
-<P><A HREF="help/security.html">Server Security</A></P>
-
-<P><A HREF="help/kerberos.html">Using Kerberos Authentication</A></P>
-
-<P><A HREF="help/network.html">Using Network Printers</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">cupsd.conf Reference</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">Find Printer Drivers</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>CUPS for Developers</H2>
-
-<P><A HREF="help/api-overview.html">Introduction to CUPS Programming</A></P>
-
-<P><A HREF="help/api-cups.html">CUPS API</A></P>
-
-<P><A HREF="help/api-filter.html">Filter and Backend Programming</A></P>
-
-<P><A HREF="help/api-httpipp.html">HTTP and IPP APIs</A></P>
-
-<P><A HREF="help/api-ppd.html">PPD API</A></P>
-
-<P><A HREF="help/api-raster.html">Raster API</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">PPD Compiler Driver Information File Reference</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Developer Forum</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS and the CUPS logo are trademarks of
-<A HREF="http://www.apple.com">Apple Inc.</A> Copyright 2007-2013 Apple
-Inc. All rights reserved.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <link rel="stylesheet" href="/cups.css" type="text/css">
+    <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=9">
+    <meta name="viewport" content="width=device-width">
+    <title>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+  </head>
+  <body>
+    <div class="header">
+      <ul>
+       <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+       <li><a class="active" href="/">Home</a></li>
+       <li><a href="/admin">Administration</a></li>
+       <li><a href="/classes/">Classes</a></li>
+       <li><a href="/help/">Help</a></li>
+       <li><a href="/jobs/">Jobs</a></li>
+       <li><a href="/printers/">Printers</a></li>
+      </ul>
+    </div>
+    <div class="body">
+      <div class="row">
+       <h1>CUPS @CUPS_VERSION@</h1>
+       <p>CUPS is the standards-based, open source printing system developed by <a href="http://www.apple.com/">Apple Inc.</a> for OS X<sup>&reg;</sup> and other UNIX<sup>&reg;</sup>-like operating systems.</p>
+      </div>
+      <div class="row">
+       <div class="thirds">
+         <h2>CUPS for Users</h2>
+         <p><a href="help/overview.html">Overview of CUPS</a></p>
+         <p><a href="help/options.html">Command-Line Printing and Options</a></p>
+         <p><a href="http://www.cups.org/lists.php?LIST=cups">User Forum</a></p>
+       </div>
+       <div class="thirds">
+         <h2>CUPS for Administrators</h2>
+         <p><a href="admin">Adding Printers and Classes</a></p>
+         <p><a href="help/policies.html">Managing Operation Policies</a></p>
+         <p><a href="help/network.html">Using Network Printers</a></p>
+         <p><a href="help/man-cupsd.conf.html">cupsd.conf Reference</a></p>
+       </div>
+       <div class="thirds">
+         <h2>CUPS for Developers</h2>
+         <p><a href="help/api-overview.html">Introduction to CUPS Programming</a></p>
+         <p><a href="help/api-cups.html">CUPS API</a></p>
+         <p><a href="help/api-filter.html">Filter and Backend Programming</a></p>
+         <p><a href="help/api-httpipp.html">HTTP and IPP APIs</a></p>
+         <p><a href="http://www.cups.org/lists.php?LIST=cups-devel">Developer Forum</a></p>
+       </div>
+      </div>
+    </div>
+    <div class="footer">CUPS and the CUPS logo are trademarks of <a href="http://www.apple.com">Apple Inc.</a> Copyright &copy; 2007-2015 Apple Inc. All rights reserved.</div>
+  </body>
+</html>
index e62d8f1..61e9d08 100644 (file)
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>ホーム - CUPS 1.6</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;ホーム&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;管理&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;クラス&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;ヘルプ&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;ジョブ&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;プリンター&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS は、OS<SUP>&reg;</SUP> X およびその他の UNIX <SUP>&reg;</SUP> 系 OS のために、
-<A HREF="http://www.apple.com/">Apple Inc.</A>
-によって開発された標準ベースのオープンソース印刷システムです。</P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>ユーザー向け</H2>
-
-<P><A HREF="help/overview.html">CUPS の概要</A></P>
-
-<P><A HREF="help/options.html">コマンドラインからの印刷とオプション</A></P>
-
-<P><A HREF="help/whatsnew.html">CUPS 1.6 の新機能</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">ユーザーフォーラム</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>管理者向け</H2>
-
-<P><A HREF="admin">プリンターとクラスの追加</A></P>
-
-<P><A HREF="help/policies.html">操作ポリシーの管理について</A></P>
-
-<P><A HREF="help/accounting.html">プリンターアカウンティングの基本</A></P>
-
-<P><A HREF="help/security.html">サーバーのセキュリティー</A></P>
-
-<P><A HREF="help/kerberos.html">Kerberos 認証の使い方</A></P>
-
-<P><A HREF="help/network.html">ネットワークプリンターの使い方</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">cupsd.conf リファレンス</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">プリンタードライバーの検索</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>開発者向け</H2>
-
-<P><A HREF="help/api-overview.html">CUPS プログラミングのイントロダクション</A></P>
-
-<P><A HREF="help/api-cups.html">CUPS API</A></P>
-
-<P><A HREF="help/api-filter.html">フィルタとバックエンドのプログラミング</A></P>
-
-<P><A HREF="help/api-httpipp.html">HTTP と IPP の API</A></P>
-
-<P><A HREF="help/api-ppd.html">PPD API</A></P>
-
-<P><A HREF="help/api-raster.html">ラスター API</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">PPD コンパイラー用ドライバー情報ファイル リファレンス</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">開発者フォーラム</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS and the CUPS logo are trademarks of
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS is copyright 2007-2013 Apple
-Inc. All rights reserved.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <link rel="stylesheet" href="/cups.css" type="text/css">
+    <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=9">
+    <meta name="viewport" content="width=device-width">
+    <title>ホーム - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+  </head>
+  <body>
+    <div class="header">
+      <ul>
+       <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+       <li><a class="active" href="/">ホーム</a></li>
+       <li><a href="/admin">管理</a></li>
+       <li><a href="/classes/">クラス</a></li>
+       <li><a href="/help/">ヘルプ</a></li>
+       <li><a href="/jobs/">ジョブ</a></li>
+       <li><a href="/printers/">プリンター</a></li>
+      </ul>
+    </div>
+    <div class="body">
+      <div class="row">
+       <h1>CUPS @CUPS_VERSION@</h1>
+       <p>CUPS は、OS X<sup>&reg;</sup> およびその他の UNIX <SUP>&reg;</sup> 系 OS のために、<a href="http://www.apple.com/">Apple Inc.</a> によって開発された標準ベースのオープンソース印刷システムです。</p>
+      </div>
+      <div class="row">
+       <div class="thirds">
+         <h2>CUPS ユーザー向け</h2>
+         <p><a href="help/overview.html">CUPS の概要</a></p>
+         <p><a href="help/options.html">コマンドラインからの印刷とオプション</a></p>
+         <p><a href="http://www.cups.org/lists.php?LIST=cups">ユーザーフォーラム</a></p>
+       </div>
+       <div class="thirds">
+         <h2>CUPS 管理者向け</h2>
+         <p><a href="admin">プリンターとクラスの追加</a></p>
+         <p><a href="help/policies.html">操作ポリシーの管理</a></p>
+         <p><a href="help/network.html">ネットワークプリンターの使い方</a></p>
+         <p><a href="help/man-cupsd.conf.html">ネットワークプリンターの使い方</a></p>
+       </div>
+       <div class="thirds">
+         <h2>CUPS 開発者向け</h2>
+         <p><a href="help/api-overview.html">CUPS プログラミングの導入</a></p>
+         <p><a href="help/api-cups.html">CUPS API</a></p>
+         <p><a href="help/api-filter.html">フィルタとバックエンドのプログラミング</a></p>
+         <p><a href="help/api-httpipp.html">HTTP と IPP の API</a></p>
+         <p><a href="http://www.cups.org/lists.php?LIST=cups-devel">開発者フォーラム</a></p>
+       </div>
+      </div>
+    </div>
+    <div class="footer">CUPS and the CUPS logo are trademarks of <a href="http://www.apple.com">Apple Inc.</a> Copyright &copy; 2007-2015 Apple Inc. All rights reserved.</div>
+  </body>
+</html>
index d1300e1..ccbfdde 100644 (file)
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>Начало - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="sel"><A HREF="/">&nbsp;&nbsp;Начало&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/admin">&nbsp;&nbsp;Администрирование&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/classes/">&nbsp;&nbsp;Группы&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/help/">&nbsp;&nbsp;Справка&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/jobs/">&nbsp;&nbsp;Задания&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel"><A HREF="/printers/">&nbsp;&nbsp;Принтеры&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD STYLE="padding-right: 20px;">
-
-<H1>CUPS @CUPS_VERSION@</H1>
-
-<P>CUPS — поддерживающая большинство стандартов, свободная подсистема печати, разрабатываемая компанией <A HREF="http://www.apple.com/">Apple Inc.</A> для операционной системы Mac OS<SUP>&reg;</SUP> X и других UNIX<SUP>&reg;</SUP>-подобных операционных систем.</P>
-
-</TD>
-<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
-HEIGHT="128" ALT="CUPS"></A></TD>
-</TR>
-</TABLE>
-
-<TABLE CLASS="indent" SUMMARY="">
-<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
-
-<H2>CUPS для пользователей</H2>
-
-<P><A HREF="help/overview.html">Введение в CUPS</A></P>
-
-<P><A HREF="help/options.html">Печать из командной строки</A></P>
-
-<P><A HREF="help/whatsnew.html">Что нового в CUPS 1.6</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Форум пользователей</A></P>
-
-</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
-
-<H2>CUPS для администраторов</H2>
-
-<P><A HREF="admin">Добавление принтеров и групп</A></P>
-
-<P><A HREF="help/policies.html">Управление доступом</A></P>
-
-<P><A HREF="help/accounting.html">Использование ресурсов</A></P>
-
-<P><A HREF="help/security.html">Безопасность системы</A></P>
-
-<P><A HREF="help/kerberos.html">Использование аутентификации Kerberos</A></P>
-
-<P><A HREF="help/network.html">Использование сетевых принтеров</A></P>
-
-<P><A HREF="help/ref-cupsd-conf.html">Справочник по cupsd.conf</A></P>
-
-<P><A HREF="http://www.cups.org/ppd.php">Поиск драйверов принтера</A></P>
-
-</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
-
-<H2>CUPS для разработчиков</H2>
-
-<P><A HREF="help/api-overview.html">Введение в разработку CUPS</A></P>
-
-<P><A HREF="help/api-cups.html">CUPS API</A></P>
-
-<P><A HREF="help/api-filter.html">Разработка фильтров и модулей</A></P>
-
-<P><A HREF="help/api-httpipp.html">API доступа по HTTP и IPP</A></P>
-
-<P><A HREF="help/api-ppd.html">PPD API</A></P>
-
-<P><A HREF="help/api-raster.html">Raster API</A></P>
-
-<P><A HREF="help/ref-ppdcfile.html">Справочник по компилятору PPD</A></P>
-
-<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Форум разработчиков</A></P>
-
-</TD></TR>
-</TABLE>
-
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS а также логотип CUPS являются зарегистрированными торговыми марками <A HREF="http://www.apple.com">Apple Inc.</A> Авторские права на CUPS принадлежат (2007-2013) компании Apple Inc. Все права защищены.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <link rel="stylesheet" href="/cups.css" type="text/css">
+    <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=9">
+    <meta name="viewport" content="width=device-width">
+       <title>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+  </head>
+  <body>
+    <div class="header">
+      <ul>
+       <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+       <li><a class="active" href="/">Начало</a></li>
+       <li><a href="/admin">Администрирование</a></li>
+       <li><a href="/classes/">Группы</a></li>
+       <li><a href="/help/">Справка</a></li>
+       <li><a href="/jobs/">Задания</a></li>
+       <li><a href="/printers/">Принтеры</a></li>
+      </ul>
+    </div>
+    <div class="body">
+      <div class="row">
+       <h1>CUPS 2.0.1</h1>
+       <P>CUPS — поддерживающая большинство стандартов, свободная подсистема печати, разрабатываемая компанией <A HREF="http://www.apple.com/">Apple Inc.</A> для операционной системы Mac OS<SUP>&reg;</SUP> X и других UNIX<SUP>&reg;</SUP>-подобных операционных систем.</P>
+      </div>
+      <div class="row">
+       <div class="thirds">
+         <H2>CUPS для пользователей</H2>
+         <P><A HREF="help/overview.html">Введение в CUPS</A></P>
+         <P><A HREF="help/options.html">Печать из командной строки</A></P>
+         <P><A HREF="http://www.cups.org/lists.php?LIST=cups">Форум пользователей</A></P>
+       </div>
+       <div class="thirds">
+         <H2>CUPS для администраторов</H2>
+         <P><A HREF="admin">Добавление принтеров и групп</A></P>
+         <P><A HREF="help/policies.html">Управление доступом</A></P>
+         <P><A HREF="help/network.html">Использование сетевых принтеров</A></P>
+         <p><a href="help/man-cupsd.conf.html">Справочник по cupsd.conf</a></p>
+       </div>
+       <div class="thirds">
+
+         <H2>CUPS для разработчиков</H2>
+         <P><A HREF="help/api-overview.html">Введение в разработку CUPS</A></P>
+         <P><A HREF="help/api-cups.html">CUPS API</A></P>
+         <P><A HREF="help/api-filter.html">Разработка фильтров и модулей</A></P>
+         <P><A HREF="help/api-httpipp.html">API доступа по HTTP и IPP</A></P>
+         <P><A HREF="http://www.cups.org/lists.php?LIST=cups-devel">Форум разработчиков</A></P>
+</div>
+      </div>
+    </div>
+    <div class="footer">CUPS а также логотип CUPS являются зарегистрированными торговыми марками <A HREF="http://www.apple.com">Apple Inc.</A> Авторские права на CUPS принадлежат (2007-2014) компании Apple Inc. Все права защищены.</div>
+  </body>
+</html>
index 2a3b1b7..f4737a6 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 3247 2011-05-12 06:22:31Z msweet $"
 #
 #   PPD compiler example makefile for CUPS.
 #
@@ -124,5 +124,5 @@ uninstall:
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 3247 2011-05-12 06:22:31Z msweet $".
 #
index 86961f0..920f8db 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: ppdx.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ppdx.c 3833 2012-05-23 22:51:18Z msweet $"
  *
  *   Example code for encoding and decoding large amounts of data in a PPD file.
  *   This would typically be used in a driver to save configuration/state
@@ -310,5 +310,5 @@ ppdxWriteData(const char *name,             /* I - Base name of keyword */
 
 
 /*
- * End of "$Id: ppdx.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ppdx.c 3833 2012-05-23 22:51:18Z msweet $".
  */
index 40a459d..14f34b3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: ppdx.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ppdx.h 3833 2012-05-23 22:51:18Z msweet $"
  *
  *   Header for PPD data encoding example code.
  *
@@ -78,5 +78,5 @@ extern void   ppdxWriteData(const char *name, const void *data,
 #endif /* !_PPDX_H */
 
 /*
- * End of "$Id: ppdx.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ppdx.h 3833 2012-05-23 22:51:18Z msweet $".
  */
index daa147b..372f3d5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: testppdx.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testppdx.c 3833 2012-05-23 22:51:18Z msweet $"
  *
  *   Test program for PPD data encoding example code.
  *
@@ -113,5 +113,5 @@ main(void)
 
 
 /*
- * End of "$Id: testppdx.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testppdx.c 3833 2012-05-23 22:51:18Z msweet $".
  */
index 159135b..3087485 100644 (file)
@@ -1,61 +1,68 @@
 error.o: error.c ../cups/raster-private.h ../cups/raster.h ../cups/cups.h \
   ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h \
-  ../cups/array.h ../cups/language.h ../cups/ppd.h \
+  ../cups/array.h ../cups/language.h ../cups/pwg.h ../cups/ppd.h \
   ../cups/debug-private.h ../cups/string-private.h ../config.h
 interpret.o: interpret.c ../cups/raster-private.h ../cups/raster.h \
   ../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h \
-  ../cups/debug-private.h ../cups/string-private.h ../config.h
+  ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
+  ../cups/ppd.h ../cups/debug-private.h ../cups/string-private.h \
+  ../config.h
 raster.o: raster.c ../cups/raster-private.h ../cups/raster.h \
   ../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h \
-  ../cups/debug-private.h ../cups/string-private.h ../config.h
+  ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
+  ../cups/ppd.h ../cups/debug-private.h ../cups/string-private.h \
+  ../config.h
 commandtops.o: commandtops.c ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/sidechannel.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/sidechannel.h
 gziptoany.o: gziptoany.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
 common.o: common.c common.h ../cups/string-private.h ../config.h \
   ../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h
+  ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
+  ../cups/ppd.h
 pstops.o: pstops.c common.h ../cups/string-private.h ../config.h \
   ../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h \
-  ../cups/language-private.h ../cups/transcode.h
+  ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
+  ../cups/ppd.h ../cups/language-private.h ../cups/transcode.h
 rasterbench.o: rasterbench.c ../config.h ../cups/raster.h ../cups/cups.h \
   ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h \
-  ../cups/array.h ../cups/language.h ../cups/ppd.h
+  ../cups/array.h ../cups/language.h ../cups/pwg.h ../cups/ppd.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/ppd.h ../cups/string-private.h ../config.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/raster.h
+  ../cups/language.h ../cups/pwg.h ../cups/ppd.h \
+  ../cups/string-private.h ../config.h ../cups/language-private.h \
+  ../cups/transcode.h ../cups/raster.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/ppd.h ../cups/string-private.h ../config.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/raster.h
+  ../cups/language.h ../cups/pwg.h ../cups/ppd.h \
+  ../cups/string-private.h ../config.h ../cups/language-private.h \
+  ../cups/transcode.h ../cups/raster.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/ppd.h ../cups/string-private.h ../config.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/raster.h
+  ../cups/language.h ../cups/pwg.h ../cups/ppd.h \
+  ../cups/string-private.h ../config.h ../cups/language-private.h \
+  ../cups/transcode.h ../cups/raster.h
 rastertopwg.o: rastertopwg.c ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/raster.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/raster.h
 testraster.o: testraster.c ../cups/raster-private.h ../cups/raster.h \
   ../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h \
-  ../cups/debug-private.h ../cups/string-private.h ../config.h
+  ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
+  ../cups/ppd.h ../cups/debug-private.h ../cups/string-private.h \
+  ../config.h
index ea27f12..322705b 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12568 2015-03-25 13:49:23Z msweet $"
 #
 #   Filter makefile for CUPS.
 #
@@ -110,6 +110,7 @@ install-exec:
                $(INSTALL_DIR) $(SYMROOT); \
                for file in $(FILTERS); do \
                        cp $$file $(SYMROOT); \
+                       dsymutil $(SYMROOT)/$$file; \
                done \
        fi
 
@@ -139,6 +140,7 @@ install-libs: $(INSTALLSTATIC)
        if test "x$(SYMROOT)" != "x"; then \
                $(INSTALL_DIR) $(SYMROOT); \
                cp $(LIBCUPSIMAGE) $(SYMROOT); \
+               dsymutil $(SYMROOT)/$(LIBCUPSIMAGE); \
        fi
 
 installstatic:
@@ -365,6 +367,12 @@ rastertopwg:       rastertopwg.o ../cups/$(LIBCUPS) $(LIBCUPSIMAGE)
        echo Linking $@...
        $(CC) $(LDFLAGS) -o $@ rastertopwg.o $(LINKCUPSIMAGE) $(IMGLIBS) $(LIBS)
 
+rastertopwg-static:    rastertopwg.o ../cups/$(LIBCUPSSTATIC) libcupsimage.a
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o $@ rastertopwg.o libcupsimage.a \
+               ../cups/$(LIBCUPSSTATIC) $(IMGLIBS) $(DSOLIBS) $(COMMONLIBS) \
+               $(SSLLIBS) $(DNSSDLIBS) $(LIBGSSAPI)
+
 
 #
 # testraster
@@ -396,5 +404,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12568 2015-03-25 13:49:23Z msweet $".
 #
index f44a5ef..a5f0609 100644 (file)
@@ -1,26 +1,15 @@
 /*
- * "$Id: commandtops.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: commandtops.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   PostScript command filter for CUPS.
+ * PostScript command filter for CUPS.
  *
- *   Copyright 2008-2012 by Apple Inc.
+ * Copyright 2008-2014 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- *
- * Contents:
- *
- *   main()                 - Process a CUPS command file.
- *   auto_configure()       - Automatically configure the printer using
- *                            PostScript query commands and/or SNMP lookups.
- *   begin_ps()             - Send the standard PostScript prolog.
- *   end_ps()               - Send the standard PostScript trailer.
- *   print_self_test_page() - Print a self-test page.
- *   report_levels()        - Report supply levels.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -309,9 +298,7 @@ auto_configure(ppd_file_t *ppd,             /* I - PPD file */
 
     bufptr    = buffer;
     buffer[0] = '\0';
-    while ((bytes = cupsBackChannelRead(bufptr,
-                                       sizeof(buffer) - (bufptr - buffer) - 1,
-                                       10.0)) > 0)
+    while ((bytes = cupsBackChannelRead(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer) - 1, 10.0)) > 0)
     {
      /*
       * No newline at the end? Go on reading ...
@@ -534,5 +521,5 @@ report_levels(ppd_file_t *ppd,              /* I - PPD file */
 
 
 /*
- * End of "$Id: commandtops.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: commandtops.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 6f62642..73fb370 100644 (file)
@@ -1,29 +1,18 @@
 /*
- * "$Id: common.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: common.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Common filter routines for CUPS.
+ * Common filter routines for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   SetCommonOptions() - Set common filter options for media size,
- *                        etc.
- *   UpdatePageVars()   - Update the page variables for the orientation.
- *   WriteComment()     - Write a DSC comment.
- *   WriteCommon()      - Write common procedures...
- *   WriteLabelProlog() - Write the prolog with the classification
- *                        and page label.
- *   WriteLabels()      - Write the actual page labels.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -481,7 +470,7 @@ WriteTextComment(const char *name,  /* I - Comment name ("Title", etc.) */
   */
 
   printf("%%%%%s: (", name);
-  len = 5 + strlen(name);
+  len = 5 + (int)strlen(name);
 
   while (*value)
   {
@@ -531,5 +520,5 @@ WriteTextComment(const char *name,  /* I - Comment name ("Title", etc.) */
 
 
 /*
- * End of "$Id: common.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: common.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 49f36de..9693ce8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: common.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: common.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Common filter definitions for CUPS.
  *
@@ -74,5 +74,5 @@ extern void   WriteTextComment(const char *name, const char *value);
 
 
 /*
- * End of "$Id: common.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: common.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index a91f0ca..4331365 100644 (file)
@@ -1,27 +1,18 @@
 /*
- * "$Id: error.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: error.c 12747 2015-06-24 15:55:05Z msweet $"
  *
- *   Raster error handling for CUPS.
+ * Raster error handling for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   _cupsRasterAddError()   - Add an error message to the error buffer.
- *   _cupsRasterClearError() - Clear the error buffer.
- *   cupsRasterErrorString() - Return the last error from a raster function.
- *   get_error_buffer()      - Return a pointer to thread local storage.
- *   raster_init()           - Initialize error buffer once.
- *   raster_destructor()     - Free memory allocated by get_error_buffer().
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -62,9 +53,11 @@ _cupsRasterAddError(const char *f,   /* I - Printf-style error message */
                                        /* Error buffer */
   va_list      ap;                     /* Pointer to additional arguments */
   char         s[2048];                /* Message string */
-  size_t       bytes;                  /* Bytes in 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);
@@ -72,12 +65,14 @@ _cupsRasterAddError(const char *f,  /* I - Printf-style error message */
   if (bytes <= 0)
     return;
 
+  DEBUG_printf(("1_cupsRasterAddError: %s", s));
+
   bytes ++;
 
-  if (bytes >= sizeof(s))
+  if ((size_t)bytes >= sizeof(s))
     return;
 
-  if (bytes > (size_t)(buf->end - buf->current))
+  if (bytes > (ssize_t)(buf->end - buf->current))
   {
    /*
     * Allocate more memory...
@@ -87,7 +82,7 @@ _cupsRasterAddError(const char *f,    /* I - Printf-style error message */
     size_t     size;                   /* Size of buffer */
 
 
-    size = buf->end - buf->start + 2 * bytes + 1024;
+    size = (size_t)(buf->end - buf->start + 2 * bytes + 1024);
 
     if (buf->start)
       temp = realloc(buf->start, size);
@@ -110,7 +105,7 @@ _cupsRasterAddError(const char *f,  /* I - Printf-style error message */
   * Append the message to the end of the current string...
   */
 
-  memcpy(buf->current, s, bytes);
+  memcpy(buf->current, s, (size_t)bytes);
   buf->current += bytes - 1;
 }
 
@@ -167,8 +162,7 @@ cupsRasterErrorString(void)
  * Local globals...
  */
 
-static pthread_key_t   raster_key = -1;
-                                       /* Thread local storage key */
+static pthread_key_t   raster_key = 0; /* Thread local storage key */
 static pthread_once_t  raster_key_once = PTHREAD_ONCE_INIT;
                                        /* One-time initialization object */
 
@@ -195,7 +189,7 @@ get_error_buffer(void)
   * Initialize the global data exactly once...
   */
 
-  DEBUG_puts("get_error_buffer()");
+  DEBUG_puts("3get_error_buffer()");
 
   pthread_once(&raster_key_once, raster_init);
 
@@ -206,7 +200,7 @@ get_error_buffer(void)
   if ((buf = (_cups_raster_error_t *)pthread_getspecific(raster_key))
           == NULL)
   {
-    DEBUG_puts("get_error_buffer: allocating memory for thread...");
+    DEBUG_puts("4get_error_buffer: allocating memory for thread.");
 
    /*
     * No, allocate memory as set the pointer for the key...
@@ -215,7 +209,7 @@ get_error_buffer(void)
     buf = calloc(1, sizeof(_cups_raster_error_t));
     pthread_setspecific(raster_key, buf);
 
-    DEBUG_printf(("    buf=%p\n", buf));
+    DEBUG_printf(("4get_error_buffer: buf=%p", buf));
   }
 
  /*
@@ -235,8 +229,7 @@ raster_init(void)
 {
   pthread_key_create(&raster_key, raster_destructor);
 
-  DEBUG_printf(("raster_init(): raster_key=%x(%u)\n", (unsigned)raster_key,
-                (unsigned)raster_key));
+  DEBUG_printf(("3raster_init(): raster_key=%x(%u)", (unsigned)raster_key, (unsigned)raster_key));
 }
 
 
@@ -251,7 +244,7 @@ raster_destructor(void *value)              /* I - Data to free */
                                        /* Error buffer */
 
 
-  DEBUG_printf(("raster_destructor(value=%p)\n", value));
+  DEBUG_printf(("3raster_destructor(value=%p)", value));
 
   if (buf->start)
     free(buf->start);
@@ -282,5 +275,5 @@ get_error_buffer(void)
 
 
 /*
- * End of "$Id: error.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: error.c 12747 2015-06-24 15:55:05Z msweet $".
  */
index 079a8c7..9af404d 100644 (file)
@@ -1,22 +1,18 @@
 /*
- * "$Id: gziptoany.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: gziptoany.c 12655 2015-05-22 17:26:40Z msweet $"
  *
- *   GZIP/raw pre-filter for CUPS.
+ * GZIP/raw pre-filter for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1993-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main() - Copy (and uncompress) files to stdout.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -36,7 +32,7 @@ main(int  argc,                               /* I - Number of command-line arguments */
 {
   cups_file_t  *fp;                    /* File */
   char         buffer[8192];           /* Data buffer */
-  int          bytes;                  /* Number of bytes read/written */
+  ssize_t      bytes;                  /* Number of bytes read/written */
   int          copies;                 /* Number of copies */
 
 
@@ -44,7 +40,7 @@ main(int  argc,                               /* I - Number of command-line arguments */
   * Check command-line...
   */
 
-  if (argc != 7)
+  if (argc < 6 || argc > 7)
   {
     _cupsLangPrintf(stderr,
                     _("Usage: %s job-id user title copies options [file]"),
@@ -66,8 +62,14 @@ main(int  argc,                              /* I - Number of command-line arguments */
   * Open the file...
   */
 
-  if ((fp = cupsFileOpen(argv[6], "r")) == NULL)
+  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);
   }
@@ -84,12 +86,13 @@ main(int  argc,                             /* I - Number of command-line arguments */
     cupsFileRewind(fp);
 
     while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0)
-      if (write(1, buffer, bytes) < bytes)
+      if (write(1, buffer, (size_t)bytes) < bytes)
       {
        _cupsLangPrintFilter(stderr, "ERROR",
                             _("Unable to write uncompressed print data: %s"),
                             strerror(errno));
-       cupsFileClose(fp);
+        if (argc == 7)
+         cupsFileClose(fp);
 
        return (1);
       }
@@ -101,12 +104,13 @@ main(int  argc,                           /* I - Number of command-line arguments */
   * Close the file and return...
   */
 
-  cupsFileClose(fp);
+  if (argc == 7)
+    cupsFileClose(fp);
 
   return (0);
 }
 
 
 /*
- * End of "$Id: gziptoany.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: gziptoany.c 12655 2015-05-22 17:26:40Z msweet $".
  */
index 2a2f352..624a2a7 100644 (file)
@@ -1,39 +1,18 @@
 /*
- * "$Id: interpret.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: interpret.c 12746 2015-06-24 13:28:36Z msweet $"
  *
- *   PPD command interpreter for CUPS.
+ * PPD command interpreter for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1993-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsRasterInterpretPPD() - Interpret PPD commands to create a page header.
- *   _cupsRasterExecPS()      - Execute PostScript code to initialize a page
- *                              header.
- *   cleartomark_stack()      - Clear to the last mark ([) on the stack.
- *   copy_stack()             - Copy the top N stack objects.
- *   delete_stack()           - Free memory used by a stack.
- *   error_object()           - Add an object's value to the current error
- *                              message.
- *   error_stack()            - Add a stack to the current error message.
- *   index_stack()            - Copy the Nth value on the stack.
- *   new_stack()              - Create a new stack.
- *   pop_stock()              - Pop the top object off the stack.
- *   push_stack()             - Push an object on the stack.
- *   roll_stack()             - Rotate stack objects.
- *   scan_ps()                - Scan a string for the next PS object.
- *   setpagedevice()          - Simulate the PostScript setpagedevice operator.
- *   DEBUG_object()           - Print an object value.
- *   DEBUG_stack()            - Print a stack.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -112,8 +91,8 @@ static int           setpagedevice(_cups_ps_stack_t *st,
                                        cups_page_header2_t *h,
                                        int *preferred_bits);
 #ifdef DEBUG
-static void            DEBUG_object(_cups_ps_obj_t *obj);
-static void            DEBUG_stack(_cups_ps_stack_t *st);
+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 */
 
 
@@ -162,7 +141,8 @@ cupsRasterInterpretPPD(
   float                left,                   /* Left position */
                bottom,                 /* Bottom position */
                right,                  /* Right position */
-               top;                    /* Top position */
+               top,                    /* Top position */
+               temp1, temp2;           /* Temporary variables for swapping */
   int          preferred_bits;         /* Preferred bits per color */
 
 
@@ -189,7 +169,7 @@ cupsRasterInterpretPPD(
   h->PageSize[1]                 = 792;
   h->HWResolution[0]             = 100;
   h->HWResolution[1]             = 100;
-  h->cupsBitsPerColor            =  1;
+  h->cupsBitsPerColor            = 1;
   h->cupsColorOrder              = CUPS_ORDER_CHUNKED;
   h->cupsColorSpace              = CUPS_CSPACE_K;
   h->cupsBorderlessScalingFactor = 1.0f;
@@ -200,7 +180,7 @@ cupsRasterInterpretPPD(
   h->cupsImagingBBox[2]          = 612.0f;
   h->cupsImagingBBox[3]          = 792.0f;
 
-  strcpy(h->cupsPageSizeName, "Letter");
+  strlcpy(h->cupsPageSizeName, "Letter", sizeof(h->cupsPageSizeName));
 
 #ifdef __APPLE__
  /*
@@ -301,6 +281,67 @@ cupsRasterInterpretPPD(
     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] *
@@ -352,9 +393,9 @@ cupsRasterInterpretPPD(
   * Compute the bitmap parameters...
   */
 
-  h->cupsWidth  = (int)((right - left) * h->cupsBorderlessScalingFactor *
+  h->cupsWidth  = (unsigned)((right - left) * h->cupsBorderlessScalingFactor *
                         h->HWResolution[0] / 72.0f + 0.5f);
-  h->cupsHeight = (int)((top - bottom) * h->cupsBorderlessScalingFactor *
+  h->cupsHeight = (unsigned)((top - bottom) * h->cupsBorderlessScalingFactor *
                         h->HWResolution[1] / 72.0f + 0.5f);
 
   switch (h->cupsColorSpace)
@@ -470,6 +511,7 @@ _cupsRasterExecPS(
     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 */
@@ -477,7 +519,7 @@ _cupsRasterExecPS(
 
 
   DEBUG_printf(("_cupsRasterExecPS(h=%p, preferred_bits=%p, code=\"%s\")\n",
-                h, preferred_bits, code ? code : "(null)"));
+                h, preferred_bits, code));
 
  /*
   * Copy the PostScript code and create a stack...
@@ -505,8 +547,8 @@ _cupsRasterExecPS(
   while ((obj = scan_ps(st, &codeptr)) != NULL)
   {
 #ifdef DEBUG
-    DEBUG_printf(("_cupsRasterExecPS: Stack (%d objects)\n", st->num_objs));
-    DEBUG_object(obj);
+    DEBUG_printf(("_cupsRasterExecPS: Stack (%d objects)", st->num_objs));
+    DEBUG_object("_cupsRasterExecPS", obj);
 #endif /* DEBUG */
 
     switch (obj->type)
@@ -519,11 +561,11 @@ _cupsRasterExecPS(
           pop_stack(st);
 
          if (cleartomark_stack(st))
-           _cupsRasterAddError("cleartomark: Stack underflow!\n");
+           _cupsRasterAddError("cleartomark: Stack underflow.\n");
 
 #ifdef DEBUG
-          DEBUG_puts("    dup: ");
-         DEBUG_stack(st);
+          DEBUG_puts("1_cupsRasterExecPS:    dup");
+         DEBUG_stack("_cupsRasterExecPS", st);
 #endif /* DEBUG */
           break;
 
@@ -535,7 +577,7 @@ _cupsRasterExecPS(
 
 #ifdef DEBUG
             DEBUG_puts("_cupsRasterExecPS: copy");
-           DEBUG_stack(st);
+           DEBUG_stack("_cupsRasterExecPS", st);
 #endif /* DEBUG */
           }
           break;
@@ -546,7 +588,7 @@ _cupsRasterExecPS(
 
 #ifdef DEBUG
           DEBUG_puts("_cupsRasterExecPS: dup");
-         DEBUG_stack(st);
+         DEBUG_stack("_cupsRasterExecPS", st);
 #endif /* DEBUG */
           break;
 
@@ -558,7 +600,7 @@ _cupsRasterExecPS(
 
 #ifdef DEBUG
             DEBUG_puts("_cupsRasterExecPS: index");
-           DEBUG_stack(st);
+           DEBUG_stack("_cupsRasterExecPS", st);
 #endif /* DEBUG */
           }
           break;
@@ -569,7 +611,7 @@ _cupsRasterExecPS(
 
 #ifdef DEBUG
           DEBUG_puts("_cupsRasterExecPS: pop");
-         DEBUG_stack(st);
+         DEBUG_stack("_cupsRasterExecPS", st);
 #endif /* DEBUG */
           break;
 
@@ -588,7 +630,7 @@ _cupsRasterExecPS(
 
 #ifdef DEBUG
               DEBUG_puts("_cupsRasterExecPS: roll");
-             DEBUG_stack(st);
+             DEBUG_stack("_cupsRasterExecPS", st);
 #endif /* DEBUG */
             }
          }
@@ -600,7 +642,7 @@ _cupsRasterExecPS(
 
 #ifdef DEBUG
           DEBUG_puts("_cupsRasterExecPS: setpagedevice");
-         DEBUG_stack(st);
+         DEBUG_stack("_cupsRasterExecPS", st);
 #endif /* DEBUG */
           break;
 
@@ -611,13 +653,13 @@ _cupsRasterExecPS(
          break;
 
       case CUPS_PS_OTHER :
-          _cupsRasterAddError("Unknown operator \"%s\"!\n", obj->value.other);
-          DEBUG_printf(("_cupsRasterExecPS: Unknown operator \"%s\"!\n",
-                       obj->value.other));
+          _cupsRasterAddError("Unknown operator \"%s\".\n", obj->value.other);
+         error = 1;
+          DEBUG_printf(("_cupsRasterExecPS: Unknown operator \"%s\".", obj->value.other));
           break;
     }
 
-    if (obj && obj->type == CUPS_PS_OTHER)
+    if (error)
       break;
   }
 
@@ -632,8 +674,8 @@ _cupsRasterExecPS(
     error_stack(st, "Stack not empty:");
 
 #ifdef DEBUG
-    DEBUG_puts("_cupsRasterExecPS: Stack not empty:");
-    DEBUG_stack(st);
+    DEBUG_puts("_cupsRasterExecPS: Stack not empty");
+    DEBUG_stack("_cupsRasterExecPS", st);
 #endif /* DEBUG */
 
     delete_stack(st);
@@ -904,7 +946,7 @@ push_stack(_cups_ps_stack_t *st,    /* I - Stack */
 
     st->alloc_objs += 32;
 
-    if ((temp = realloc(st->objs, st->alloc_objs *
+    if ((temp = realloc(st->objs, (size_t)st->alloc_objs *
                                   sizeof(_cups_ps_obj_t))) == NULL)
       return (NULL);
 
@@ -934,7 +976,7 @@ roll_stack(_cups_ps_stack_t *st,    /* I - Stack */
   int                  n;              /* Index into array */
 
 
-  DEBUG_printf(("    roll_stack(st=%p, s=%d, c=%d)\n", st, s, c));
+  DEBUG_printf(("3roll_stack(st=%p, s=%d, c=%d)", st, s, c));
 
  /*
   * Range check input...
@@ -965,12 +1007,12 @@ roll_stack(_cups_ps_stack_t *st, /* I - Stack */
 
     s = -s;
 
-    if ((temp = calloc(s, sizeof(_cups_ps_obj_t))) == NULL)
+    if ((temp = calloc((size_t)s, sizeof(_cups_ps_obj_t))) == NULL)
       return (-1);
 
-    memcpy(temp, st->objs + n, s * sizeof(_cups_ps_obj_t));
-    memmove(st->objs + n, st->objs + n + s, (c - s) * sizeof(_cups_ps_obj_t));
-    memcpy(st->objs + n + c - s, temp, s * sizeof(_cups_ps_obj_t));
+    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
   {
@@ -978,13 +1020,12 @@ roll_stack(_cups_ps_stack_t *st, /* I - Stack */
     * Shift up...
     */
 
-    if ((temp = calloc(s, sizeof(_cups_ps_obj_t))) == NULL)
+    if ((temp = calloc((size_t)s, sizeof(_cups_ps_obj_t))) == NULL)
       return (-1);
 
-    memcpy(temp, st->objs + n + c - s, s * sizeof(_cups_ps_obj_t));
-    memmove(st->objs + n + s, st->objs + n,
-            (c - s) * sizeof(_cups_ps_obj_t));
-    memcpy(st->objs + n, temp, s * sizeof(_cups_ps_obj_t));
+    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);
@@ -1103,7 +1144,7 @@ scan_ps(_cups_ps_stack_t *st,             /* I  - Stack */
                ch = (ch << 3) + *cur - '0';
              }
 
-             *valptr++ = ch;
+             *valptr++ = (char)ch;
            }
            else if (*cur == '\r')
            {
@@ -1180,7 +1221,7 @@ scan_ps(_cups_ps_stack_t *st,             /* I  - Stack */
                ch |= tolower(*cur) - 'a' + 10;
             }
 
-           *valptr++ = ch;
+           *valptr++ = (char)ch;
           }
 
           if (*cur != '>')
@@ -1393,7 +1434,7 @@ setpagedevice(
   * Now pull /name and value pairs from the dictionary...
   */
 
-  DEBUG_puts("setpagedevice: Dictionary:");
+  DEBUG_puts("3setpagedevice: Dictionary:");
 
   for (obj ++; obj < end; obj ++)
   {
@@ -1408,8 +1449,8 @@ setpagedevice(
     obj ++;
 
 #ifdef DEBUG
-    DEBUG_printf(("setpagedevice: /%s ", name));
-    DEBUG_object(obj);
+    DEBUG_printf(("4setpagedevice: /%s ", name));
+    DEBUG_object("setpagedevice", obj);
 #endif /* DEBUG */
 
    /*
@@ -1559,7 +1600,7 @@ setpagedevice(
       * Ignore unknown name+value...
       */
 
-      DEBUG_printf(("    Unknown name (\"%s\") or value...\n", name));
+      DEBUG_printf(("4setpagedevice: Unknown name (\"%s\") or value...\n", name));
 
       while (obj[1].type != CUPS_PS_NAME && obj < end)
         obj ++;
@@ -1576,91 +1617,92 @@ setpagedevice(
  */
 
 static void
-DEBUG_object(_cups_ps_obj_t *obj)      /* I - Object to print */
+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(("/%s\n", obj->value.name));
+       DEBUG_printf(("4%s: /%s\n", prefix, obj->value.name));
        break;
 
     case CUPS_PS_NUMBER :
-       DEBUG_printf(("%g\n", obj->value.number));
+       DEBUG_printf(("4%s: %g\n", prefix, obj->value.number));
        break;
 
     case CUPS_PS_STRING :
-       DEBUG_printf(("(%s)\n", obj->value.string));
+       DEBUG_printf(("4%s: (%s)\n", prefix, obj->value.string));
        break;
 
     case CUPS_PS_BOOLEAN :
        if (obj->value.boolean)
-         DEBUG_puts("true");
+         DEBUG_printf(("4%s: true", prefix));
        else
-         DEBUG_puts("false");
+         DEBUG_printf(("4%s: false", prefix));
        break;
 
     case CUPS_PS_NULL :
-       DEBUG_puts("null");
+       DEBUG_printf(("4%s: null", prefix));
        break;
 
     case CUPS_PS_START_ARRAY :
-       DEBUG_puts("[");
+       DEBUG_printf(("4%s: [", prefix));
        break;
 
     case CUPS_PS_END_ARRAY :
-       DEBUG_puts("]");
+       DEBUG_printf(("4%s: ]", prefix));
        break;
 
     case CUPS_PS_START_DICT :
-       DEBUG_puts("<<");
+       DEBUG_printf(("4%s: <<", prefix));
        break;
 
     case CUPS_PS_END_DICT :
-       DEBUG_puts(">>");
+       DEBUG_printf(("4%s: >>", prefix));
        break;
 
     case CUPS_PS_START_PROC :
-       DEBUG_puts("{");
+       DEBUG_printf(("4%s: {", prefix));
        break;
 
     case CUPS_PS_END_PROC :
-       DEBUG_puts("}");
+       DEBUG_printf(("4%s: }", prefix));
        break;
 
     case CUPS_PS_CLEARTOMARK :
-       DEBUG_puts("--cleartomark--");
+       DEBUG_printf(("4%s: --cleartomark--", prefix));
         break;
 
     case CUPS_PS_COPY :
-       DEBUG_puts("--copy--");
+       DEBUG_printf(("4%s: --copy--", prefix));
         break;
 
     case CUPS_PS_DUP :
-       DEBUG_puts("--dup--");
+       DEBUG_printf(("4%s: --dup--", prefix));
         break;
 
     case CUPS_PS_INDEX :
-       DEBUG_puts("--index--");
+       DEBUG_printf(("4%s: --index--", prefix));
         break;
 
     case CUPS_PS_POP :
-       DEBUG_puts("--pop--");
+       DEBUG_printf(("4%s: --pop--", prefix));
         break;
 
     case CUPS_PS_ROLL :
-       DEBUG_puts("--roll--");
+       DEBUG_printf(("4%s: --roll--", prefix));
         break;
 
     case CUPS_PS_SETPAGEDEVICE :
-       DEBUG_puts("--setpagedevice--");
+       DEBUG_printf(("4%s: --setpagedevice--", prefix));
         break;
 
     case CUPS_PS_STOPPED :
-       DEBUG_puts("--stopped--");
+       DEBUG_printf(("4%s: --stopped--", prefix));
         break;
 
     case CUPS_PS_OTHER :
-       DEBUG_printf(("--%s--\n", obj->value.other));
+       DEBUG_printf(("4%s: --%s--", prefix, obj->value.other));
        break;
   }
 }
@@ -1671,18 +1713,19 @@ DEBUG_object(_cups_ps_obj_t *obj)       /* I - Object to print */
  */
 
 static void
-DEBUG_stack(_cups_ps_stack_t *st)      /* I - Stack */
+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(obj);
+    DEBUG_object(prefix, obj);
 }
 #endif /* DEBUG */
 
 
 /*
- * End of "$Id: interpret.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: interpret.c 12746 2015-06-24 13:28:36Z msweet $".
  */
index 3f7d0f4..2cdde86 100644 (file)
@@ -1,51 +1,18 @@
 /*
- * "$Id: pstops.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: pstops.c 12655 2015-05-22 17:26:40Z msweet $"
  *
- *   PostScript filter for CUPS.
+ * PostScript filter for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1993-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()               - Main entry.
- *   add_page()           - Add a page to the pages array.
- *   cancel_job()         - Flag the job as canceled.
- *   check_range()        - Check to see if the current page is selected for
- *                          printing.
- *   copy_bytes()         - Copy bytes from the input file to stdout.
- *   copy_comments()      - Copy all of the comments section.
- *   copy_dsc()           - Copy a DSC-conforming document.
- *   copy_non_dsc()       - Copy a document that does not conform to the DSC.
- *   copy_page()          - Copy a page description.
- *   copy_prolog()        - Copy the document prolog section.
- *   copy_setup()         - Copy the document setup section.
- *   copy_trailer()       - Copy the document trailer.
- *   do_prolog()          - Send the necessary document prolog commands.
- *   do_setup()           - Send the necessary document setup commands.
- *   doc_printf()         - Send a formatted string to stdout and/or the temp
- *                          file.
- *   doc_puts()           - Send a nul-terminated string to stdout and/or the
- *                          temp file.
- *   doc_write()          - Send data to stdout and/or the temp file.
- *   end_nup()            - End processing for N-up printing.
- *   include_feature()    - Include a printer option/feature command.
- *   parse_text()         - Parse a text value in a comment.
- *   set_pstops_options() - Set pstops options.
- *   skip_page()          - Skip past a page that won't be printed.
- *   start_nup()          - Start processing for N-up printing.
- *   write_label_prolog() - Write the prolog with the classification and page
- *                          label.
- *   write_labels()       - Write the actual page labels.
- *   write_options()      - Write options provided via %%IncludeFeature.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -236,7 +203,7 @@ main(int  argc,                             /* I - Number of command-line args */
   int          num_options;            /* Number of print options */
   cups_option_t        *options;               /* Print options */
   char         line[8192];             /* Line buffer */
-  size_t       len;                    /* Length of 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 */
@@ -297,7 +264,12 @@ main(int  argc,                            /* I - Number of command-line args */
 
     if ((fp = cupsFileOpen(argv[6], "r")) == NULL)
     {
-      _cupsLangPrintError("ERROR", _("Unable to open print file"));
+      if (!JobCanceled)
+      {
+        fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", argv[6]);
+        _cupsLangPrintError("ERROR", _("Unable to open print file"));
+      }
+
       return (1);
     }
   }
@@ -306,7 +278,7 @@ main(int  argc,                             /* I - Number of command-line args */
   * Read the first line to see if we have DSC comments...
   */
 
-  if ((len = cupsFileGetLine(fp, line, sizeof(line))) == 0)
+  if ((len = (ssize_t)cupsFileGetLine(fp, line, sizeof(line))) == 0)
   {
     fputs("DEBUG: The print file is empty.\n", stderr);
     return (1);
@@ -355,13 +327,13 @@ main(int  argc,                           /* I - Number of command-line args */
     fputs("DEBUG: Skipping PJL header...\n", stderr);
 
     while (strstr(line, "ENTER LANGUAGE") == NULL && strncmp(line, "%!", 2))
-      if ((len = cupsFileGetLine(fp, line, sizeof(line))) == 0)
+      if ((len = (ssize_t)cupsFileGetLine(fp, line, sizeof(line))) == 0)
         break;
 
     if (!strncmp(line, "%!", 2))
       break;
 
-    if ((len = cupsFileGetLine(fp, line, sizeof(line))) == 0)
+    if ((len = (ssize_t)cupsFileGetLine(fp, line, sizeof(line))) == 0)
       break;
   }
 
@@ -511,11 +483,11 @@ check_range(pstops_doc_t *doc,            /* I - Document information */
     {
       lower = 1;
       range ++;
-      upper = strtol(range, (char **)&range, 10);
+      upper = (int)strtol(range, (char **)&range, 10);
     }
     else
     {
-      lower = strtol(range, (char **)&range, 10);
+      lower = (int)strtol(range, (char **)&range, 10);
 
       if (*range == '-')
       {
@@ -523,7 +495,7 @@ check_range(pstops_doc_t *doc,              /* I - Document information */
        if (!isdigit(*range & 255))
          upper = 65535;
        else
-         upper = strtol(range, (char **)&range, 10);
+         upper = (int)strtol(range, (char **)&range, 10);
       }
       else
         upper = lower;
@@ -569,14 +541,14 @@ copy_bytes(cups_file_t *fp,               /* I - File to read from */
     if (nleft > sizeof(buffer) || length == 0)
       nbytes = sizeof(buffer);
     else
-      nbytes = nleft;
+      nbytes = (ssize_t)nleft;
 
-    if ((nbytes = cupsFileRead(fp, buffer, nbytes)) < 1)
+    if ((nbytes = cupsFileRead(fp, buffer, (size_t)nbytes)) < 1)
       return;
 
-    nleft -= nbytes;
+    nleft -= (size_t)nbytes;
 
-    fwrite(buffer, 1, nbytes, stdout);
+    fwrite(buffer, 1, (size_t)nbytes, stdout);
   }
 }
 
@@ -741,13 +713,13 @@ copy_comments(cups_file_t  *fp,           /* I - File to read from */
     }
     else if (!strcmp(line, "%%EndComments"))
     {
-      linelen = cupsFileGetLine(fp, line, linesize);
+      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 = cupsFileGetLine(fp, line, linesize)) == 0)
+    if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0)
       break;
   }
 
@@ -860,9 +832,9 @@ copy_dsc(cups_file_t  *fp,          /* I - File to read from */
 
   while (strncmp(line, "%%Page:", 7) && strncmp(line, "%%Trailer", 9))
   {
-    doc_write(doc, line, linelen);
+    doc_write(doc, line, (size_t)linelen);
 
-    if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0)
+    if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0)
       break;
   }
 
@@ -905,7 +877,7 @@ copy_dsc(cups_file_t  *fp,          /* I - File to read from */
     doc_puts(doc, "showpage\n");
     end_nup(doc, doc->number_up);
 
-    pageinfo->length = cupsFileTell(doc->temp) - pageinfo->offset;
+    pageinfo->length = (ssize_t)(cupsFileTell(doc->temp) - pageinfo->offset);
   }
 
   if (doc->slow_duplex && (doc->page & 1))
@@ -929,7 +901,7 @@ copy_dsc(cups_file_t  *fp,          /* I - File to read from */
     doc_puts(doc, "showpage\n");
     end_nup(doc, doc->number_up);
 
-    pageinfo->length = cupsFileTell(doc->temp) - pageinfo->offset;
+    pageinfo->length = (ssize_t)(cupsFileTell(doc->temp) - pageinfo->offset);
   }
 
  /*
@@ -1006,7 +978,7 @@ copy_dsc(cups_file_t  *fp,         /* I - File to read from */
       if (!number)
       {
         pageinfo = (pstops_page_t *)cupsArrayFirst(doc->pages);
-       copy_bytes(doc->temp, 0, pageinfo->offset);
+       copy_bytes(doc->temp, 0, (size_t)pageinfo->offset);
       }
 
      /*
@@ -1041,7 +1013,7 @@ copy_dsc(cups_file_t  *fp,                /* I - File to read from */
                 pageinfo->bounding_box[2], pageinfo->bounding_box[3]);
        }
 
-       copy_bytes(doc->temp, pageinfo->offset, pageinfo->length);
+       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);
@@ -1079,11 +1051,13 @@ copy_non_dsc(cups_file_t  *fp,          /* I - File to read from */
             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 */
-  int  bytes;                          /* Number of bytes copied */
+  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...
@@ -1175,17 +1149,17 @@ copy_non_dsc(cups_file_t  *fp,          /* I - File to read from */
   puts("%%EndPageSetup");
   puts("%%BeginDocument: nondsc");
 
-  fwrite(line, linelen, 1, stdout);
+  fwrite(line, (size_t)linelen, 1, stdout);
 
   if (doc->temp)
-    cupsFileWrite(doc->temp, line, linelen);
+    cupsFileWrite(doc->temp, line, (size_t)linelen);
 
   while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0)
   {
-    fwrite(buffer, 1, bytes, stdout);
+    fwrite(buffer, 1, (size_t)bytes, stdout);
 
     if (doc->temp)
-      cupsFileWrite(doc->temp, buffer, bytes);
+      cupsFileWrite(doc->temp, buffer, (size_t)bytes);
   }
 
   puts("%%EndDocument");
@@ -1303,7 +1277,8 @@ copy_page(cups_file_t  *fp,               /* I - File to read from */
 
   if (doc->ap_input_slot || doc->ap_manual_feed)
   {
-    if (doc->page == 1)
+    if ((doc->page == 1 && (!doc->slow_order || !Duplex)) ||
+        (doc->page == 2 && doc->slow_order && Duplex))
     {
      /*
       * First page/sheet gets AP_FIRSTPAGE_* options...
@@ -1366,7 +1341,7 @@ copy_page(cups_file_t  *fp,               /* I - File to read from */
 
   memcpy(bounding_box, doc->bounding_box, sizeof(bounding_box));
 
-  while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0)
+  while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0)
   {
     if (!strncmp(line, "%%PageBoundingBox:", 18))
     {
@@ -1399,24 +1374,24 @@ copy_page(cups_file_t  *fp,             /* I - File to read from */
         switch (Orientation)
        {
          case 1 : /* Landscape */
-             bounding_box[0] = PageLength - temp_bbox[3];
+             bounding_box[0] = (int)(PageLength - temp_bbox[3]);
              bounding_box[1] = temp_bbox[0];
-             bounding_box[2] = PageLength - temp_bbox[1];
+             bounding_box[2] = (int)(PageLength - temp_bbox[1]);
              bounding_box[3] = temp_bbox[2];
               break;
 
          case 2 : /* Reverse Portrait */
-             bounding_box[0] = PageWidth - temp_bbox[2];
-             bounding_box[1] = PageLength - temp_bbox[3];
-             bounding_box[2] = PageWidth - temp_bbox[0];
-             bounding_box[3] = PageLength - temp_bbox[1];
+             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] = PageWidth - temp_bbox[2];
+             bounding_box[1] = (int)(PageWidth - temp_bbox[2]);
              bounding_box[2] = temp_bbox[3];
-             bounding_box[3] = PageWidth - temp_bbox[0];
+             bounding_box[3] = (int)(PageWidth - temp_bbox[0]);
               break;
        }
 
@@ -1549,7 +1524,7 @@ copy_page(cups_file_t  *fp,               /* I - File to read from */
   {
     int        feature = 0;                    /* In a Begin/EndFeature block? */
 
-    while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0)
+    while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0)
     {
       if (!strncmp(line, "%%EndPageSetup", 14))
        break;
@@ -1581,7 +1556,7 @@ copy_page(cups_file_t  *fp,               /* I - File to read from */
         break;
 
       if (!feature || (doc->number_up == 1 && !doc->fit_to_page))
-       doc_write(doc, line, linelen);
+       doc_write(doc, line, (size_t)linelen);
     }
 
    /*
@@ -1589,7 +1564,7 @@ copy_page(cups_file_t  *fp,               /* I - File to read from */
     */
 
     if (linelen > 0 && !strncmp(line, "%%EndPageSetup", 14))
-      linelen = cupsFileGetLine(fp, line, linesize);
+      linelen = (ssize_t)cupsFileGetLine(fp, line, linesize);
   }
 
   if (first_page)
@@ -1638,14 +1613,14 @@ copy_page(cups_file_t  *fp,             /* I - File to read from */
     else if (!strncmp(line, "%%BeginDocument", 15) ||
             !strncmp(line, "%ADO_BeginApplication", 21))
     {
-      doc_write(doc, line, linelen);
+      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, linelen);
+      doc_write(doc, line, (size_t)linelen);
 
       level --;
     }
@@ -1660,16 +1635,16 @@ copy_page(cups_file_t  *fp,             /* I - File to read from */
       int      bytes;                  /* Bytes of data */
 
 
-      doc_write(doc, line, linelen);
+      doc_write(doc, line, (size_t)linelen);
 
       bytes = atoi(strchr(line, ':') + 1);
 
       while (bytes > 0)
       {
-       if (bytes > linesize)
+       if ((size_t)bytes > linesize)
          linelen = cupsFileRead(fp, line, linesize);
        else
-         linelen = cupsFileRead(fp, line, bytes);
+         linelen = cupsFileRead(fp, line, (size_t)bytes);
 
        if (linelen < 1)
        {
@@ -1678,15 +1653,15 @@ copy_page(cups_file_t  *fp,             /* I - File to read from */
          return (0);
        }
 
-        doc_write(doc, line, linelen);
+        doc_write(doc, line, (size_t)linelen);
 
        bytes -= linelen;
       }
     }
     else
-      doc_write(doc, line, linelen);
+      doc_write(doc, line, (size_t)linelen);
   }
-  while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0);
+  while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0);
 
  /*
   * Finish up this page and return...
@@ -1694,7 +1669,7 @@ copy_page(cups_file_t  *fp,               /* I - File to read from */
 
   end_nup(doc, number);
 
-  pageinfo->length = cupsFileTell(doc->temp) - pageinfo->offset;
+  pageinfo->length = (ssize_t)(cupsFileTell(doc->temp) - pageinfo->offset);
 
   return (linelen);
 }
@@ -1720,9 +1695,9 @@ copy_prolog(cups_file_t  *fp,             /* I - File to read from */
     if (!strncmp(line, "%%BeginSetup", 12) || !strncmp(line, "%%Page:", 7))
       break;
 
-    doc_write(doc, line, linelen);
+    doc_write(doc, line, (size_t)linelen);
 
-    if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0)
+    if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0)
       break;
   }
 
@@ -1732,18 +1707,18 @@ copy_prolog(cups_file_t  *fp,           /* I - File to read from */
 
   if (!strncmp(line, "%%BeginProlog", 13))
   {
-    while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0)
+    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, linelen);
+      doc_write(doc, line, (size_t)linelen);
     }
 
     if (!strncmp(line, "%%EndProlog", 11))
-      linelen = cupsFileGetLine(fp, line, linesize);
+      linelen = (ssize_t)cupsFileGetLine(fp, line, linesize);
     else
       fputs("DEBUG: The %%EndProlog comment is missing.\n", stderr);
   }
@@ -1778,9 +1753,9 @@ copy_setup(cups_file_t  *fp,              /* I - File to read from */
     if (!strncmp(line, "%%Page:", 7))
       break;
 
-    doc_write(doc, line, linelen);
+    doc_write(doc, line, (size_t)linelen);
 
-    if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0)
+    if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0)
       break;
   }
 
@@ -1807,14 +1782,14 @@ copy_setup(cups_file_t  *fp,            /* I - File to read from */
          num_options = include_feature(ppd, line, num_options, &options);
       }
       else if (strncmp(line, "%%BeginSetup", 12))
-        doc_write(doc, line, linelen);
+        doc_write(doc, line, (size_t)linelen);
 
-      if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0)
+      if ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) == 0)
        break;
     }
 
     if (!strncmp(line, "%%EndSetup", 10))
-      linelen = cupsFileGetLine(fp, line, linesize);
+      linelen = (ssize_t)cupsFileGetLine(fp, line, linesize);
     else
       fputs("DEBUG: The %%EndSetup comment is missing.\n", stderr);
   }
@@ -1851,6 +1826,8 @@ copy_trailer(cups_file_t  *fp,            /* I - File to read from */
   * Write the trailer comments...
   */
 
+  (void)ppd;
+
   puts("%%Trailer");
 
   while (linelen > 0)
@@ -1860,9 +1837,9 @@ copy_trailer(cups_file_t  *fp,            /* I - File to read from */
     else if (strncmp(line, "%%Trailer", 9) &&
              strncmp(line, "%%Pages:", 8) &&
              strncmp(line, "%%BoundingBox:", 14))
-      fwrite(line, 1, linelen, stdout);
+      fwrite(line, 1, (size_t)linelen, stdout);
 
-    linelen = cupsFileGetLine(fp, line, linesize);
+    linelen = (ssize_t)cupsFileGetLine(fp, line, linesize);
   }
 
   fprintf(stderr, "DEBUG: Wrote %d pages...\n", number);
@@ -2044,21 +2021,21 @@ doc_printf(pstops_doc_t *doc,           /* I - Document information */
 {
   va_list      ap;                     /* Pointer to arguments */
   char         buffer[1024];           /* Output buffer */
-  size_t       bytes;                  /* Number of bytes to write */
+  ssize_t      bytes;                  /* Number of bytes to write */
 
 
   va_start(ap, format);
   bytes = vsnprintf(buffer, sizeof(buffer), format, ap);
   va_end(ap);
 
-  if (bytes > sizeof(buffer))
+  if ((size_t)bytes > sizeof(buffer))
   {
     _cupsLangPrintFilter(stderr, "ERROR",
                          _("Buffer overflow detected, aborting."));
     exit(1);
   }
 
-  doc_write(doc, buffer, bytes);
+  doc_write(doc, buffer, (size_t)bytes);
 }
 
 
@@ -2704,7 +2681,7 @@ skip_page(cups_file_t *fp,                /* I - File to read from */
 
   level = 0;
 
-  while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0)
+  while ((linelen = (ssize_t)cupsFileGetLine(fp, line, linesize)) > 0)
   {
     if (level == 0 &&
         (!strncmp(line, "%%Page:", 7) || !strncmp(line, "%%Trailer", 9)))
@@ -2723,17 +2700,16 @@ skip_page(cups_file_t *fp,              /* I - File to read from */
       * Skip binary data...
       */
 
-      int      bytes;                  /* Bytes of data */
-
+      ssize_t  bytes;                  /* Bytes of data */
 
       bytes = atoi(strchr(line, ':') + 1);
 
       while (bytes > 0)
       {
-       if (bytes > linesize)
-         linelen = cupsFileRead(fp, line, linesize);
+       if ((size_t)bytes > linesize)
+         linelen = (ssize_t)cupsFileRead(fp, line, linesize);
        else
-         linelen = cupsFileRead(fp, line, bytes);
+         linelen = (ssize_t)cupsFileRead(fp, line, (size_t)bytes);
 
        if (linelen < 1)
        {
@@ -2763,15 +2739,15 @@ start_nup(pstops_doc_t *doc,            /* I - Document information */
 {
   int          pos;                    /* Position on page */
   int          x, y;                   /* Relative position of subpage */
-  float                w, l,                   /* Width and length of subpage */
+  double       w, l,                   /* Width and length of subpage */
                tx, ty;                 /* Translation values for subpage */
-  float                pagew,                  /* Printable width of page */
+  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 */
-  float                margin = 0;             /* Current margin for border */
+  double       margin = 0;             /* Current margin for border */
 
 
   if (doc->number_up > 1)
@@ -2792,8 +2768,8 @@ start_nup(pstops_doc_t *doc,              /* I - Document information */
   {
     bboxx = 0;
     bboxy = 0;
-    bboxw = PageWidth;
-    bboxl = PageLength;
+    bboxw = (int)PageWidth;
+    bboxl = (int)PageLength;
   }
 
   fprintf(stderr, "DEBUG: pagew = %.1f, pagel = %.1f\n", pagew, pagel);
@@ -3124,7 +3100,7 @@ start_nup(pstops_doc_t *doc,              /* I - Document information */
   if (doc->page_border && show_border)
   {
     int                rects;                  /* Number of border rectangles */
-    float      fscale;                 /* Scaling value for points */
+    double     fscale;                 /* Scaling value for points */
 
 
     rects  = (doc->page_border & PSTOPS_BORDERDOUBLE) ? 2 : 1;
@@ -3364,7 +3340,7 @@ write_options(
 {
   int          i;              /* Looping var */
   ppd_option_t *option;        /* PPD option */
-  int          min_order;      /* Minimum OrderDependency value */
+  float                min_order;      /* Minimum OrderDependency value */
   char         *doc_setup,     /* DocumentSetup commands to send */
                *any_setup;     /* AnySetup commands to send */
 
@@ -3429,5 +3405,5 @@ write_options(
 
 
 /*
- * End of "$Id: pstops.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: pstops.c 12655 2015-05-22 17:26:40Z msweet $".
  */
index 29522e5..5251f31 100644 (file)
@@ -1,44 +1,20 @@
 /*
- * "$Id: raster.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: raster.c 12945 2015-10-26 19:46:02Z msweet $"
  *
- *   Raster file routines for CUPS.
+ * Raster file routines for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   This file is part of the CUPS Imaging library.
+ * This file is part of the CUPS Imaging library.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   cupsRasterClose()         - Close a raster stream.
- *   cupsRasterOpen()          - Open a raster stream using a file descriptor.
- *   cupsRasterOpenIO()        - Open a raster stream using a callback function.
- *   cupsRasterReadHeader()    - Read a raster page header and store it in a
- *                               version 1 page header structure.
- *   cupsRasterReadHeader2()   - Read a raster page header and store it in a
- *                               version 2 page header structure.
- *   cupsRasterReadPixels()    - Read raster pixels.
- *   cupsRasterWriteHeader()   - Write a raster page header from a version 1
- *                               page header structure.
- *   cupsRasterWriteHeader2()  - Write a raster page header from a version 2
- *                               page header structure.
- *   cupsRasterWritePixels()   - Write raster pixels.
- *   cups_raster_read_header() - Read a raster page header.
- *   cups_raster_read()        - Read through the raster buffer.
- *   cups_raster_update()      - Update the raster header and row count for the
- *                               current page.
- *   cups_raster_write()       - Write a row of compressed raster data...
- *   cups_read_fd()            - Read bytes from a file.
- *   cups_swap()               - Swap bytes in raster data...
- *   cups_write_fd()           - Write bytes to a file.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -62,7 +38,7 @@ struct _cups_raster_s                 /**** Raster stream data ****/
   cups_raster_iocb_t   iocb;           /* IO callback */
   cups_mode_t          mode;           /* Read/write mode */
   cups_page_header2_t  header;         /* Raster header for current page */
-  int                  count,          /* Current row run-length count */
+  unsigned             count,          /* Current row run-length count */
                        remaining,      /* Remaining rows in page image */
                        bpp;            /* Bytes per pixel/color */
   unsigned char                *pixels,        /* Pixels for current row */
@@ -74,6 +50,9 @@ struct _cups_raster_s                 /**** Raster stream data ****/
                        *bufptr,        /* Current (read) position in buffer */
                        *bufend;        /* End of current (read) buffer */
   size_t               bufsize;        /* Buffer size */
+#ifdef DEBUG
+  size_t               iocount;        /* Number of bytes read/written */
+#endif /* DEBUG */
 };
 
 
@@ -81,15 +60,15 @@ struct _cups_raster_s                       /**** Raster stream data ****/
  * Local functions...
  */
 
-static int     cups_raster_io(cups_raster_t *r, unsigned char *buf, int bytes);
+static ssize_t cups_raster_io(cups_raster_t *r, unsigned char *buf, size_t bytes);
 static unsigned        cups_raster_read_header(cups_raster_t *r);
-static int     cups_raster_read(cups_raster_t *r, unsigned char *buf,
-                                int bytes);
-static void    cups_raster_update(cups_raster_t *r);
-static int     cups_raster_write(cups_raster_t *r,
+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 ssize_t cups_read_fd(void *ctx, unsigned char *buf, size_t bytes);
-static void    cups_swap(unsigned char *buf, int bytes);
+static void    cups_swap(unsigned char *buf, size_t bytes);
 static ssize_t cups_write_fd(void *ctx, unsigned char *buf, size_t bytes);
 
 
@@ -217,7 +196,7 @@ cupsRasterOpenIO(
         r->sync == CUPS_RASTER_REVSYNCv2)
       r->swapped = 1;
 
-    DEBUG_printf(("r->swapped=%d, r->sync=%08x\n", r->swapped, r->sync));
+    DEBUG_printf(("1cupsRasterOpenIO: r->swapped=%d, r->sync=%08x\n", r->swapped, r->sync));
   }
   else
   {
@@ -244,8 +223,7 @@ cupsRasterOpenIO(
          break;
     }
 
-    if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync))
-            < sizeof(r->sync))
+    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));
@@ -281,7 +259,10 @@ cupsRasterReadHeader(
   */
 
   if (!cups_raster_read_header(r))
+  {
+    memset(h, 0, sizeof(cups_page_header_t));
     return (0);
+  }
 
  /*
   * Copy the header to the user-supplied buffer...
@@ -309,8 +290,13 @@ cupsRasterReadHeader2(
   * Get the raster header...
   */
 
+  DEBUG_printf(("cupsRasterReadHeader2(r=%p, h=%p)", r, h));
+
   if (!cups_raster_read_header(r))
+  {
+    memset(h, 0, sizeof(cups_page_header2_t));
     return (0);
+  }
 
  /*
   * Copy the header to the user-supplied buffer...
@@ -335,18 +321,25 @@ cupsRasterReadPixels(cups_raster_t *r,    /* I - Raster stream */
                      unsigned char *p, /* I - Pointer to pixel buffer */
                     unsigned      len) /* I - Number of bytes to read */
 {
-  int          bytes;                  /* Bytes 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 */
-  int          count;                  /* Repetition count */
+  unsigned     count;                  /* Repetition count */
+
 
+  DEBUG_printf(("cupsRasterReadPixels(r=%p, p=%p, len=%u)", r, p, len));
 
   if (r == NULL || r->mode != CUPS_RASTER_READ || r->remaining == 0 ||
       r->header.cupsBytesPerLine == 0)
+  {
+    DEBUG_puts("1cupsRasterReadPixels: Returning 0.");
     return (0);
+  }
+
+  DEBUG_printf(("1cupsRasterReadPixels: compressed=%d, remaining=%u", r->compressed, r->remaining));
 
   if (!r->compressed)
   {
@@ -357,7 +350,10 @@ cupsRasterReadPixels(cups_raster_t *r,     /* I - Raster stream */
     r->remaining -= len / r->header.cupsBytesPerLine;
 
     if (cups_raster_io(r, p, len) < (ssize_t)len)
+    {
+      DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0.");
       return (0);
+    }
 
    /*
     * Swap bytes as needed...
@@ -373,6 +369,8 @@ cupsRasterReadPixels(cups_raster_t *r,      /* I - Raster stream */
     * Return...
     */
 
+    DEBUG_printf(("1cupsRasterReadPixels: Returning %u", len));
+
     return (len);
   }
 
@@ -401,15 +399,18 @@ cupsRasterReadPixels(cups_raster_t *r,    /* I - Raster stream */
       */
 
       if (!cups_raster_read(r, &byte, 1))
+      {
+       DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0.");
        return (0);
+      }
 
-      r->count = byte + 1;
+      r->count = (unsigned)byte + 1;
 
       if (r->count > 1)
        ptr = r->pixels;
 
       temp  = ptr;
-      bytes = cupsBytesPerLine;
+      bytes = (ssize_t)cupsBytesPerLine;
 
       while (bytes > 0)
       {
@@ -418,7 +419,10 @@ cupsRasterReadPixels(cups_raster_t *r,     /* I - Raster stream */
        */
 
         if (!cups_raster_read(r, &byte, 1))
+       {
+         DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0.");
          return (0);
+       }
 
        if (byte & 128)
        {
@@ -426,13 +430,16 @@ cupsRasterReadPixels(cups_raster_t *r,    /* I - Raster stream */
          * Copy N literal pixels...
          */
 
-         count = (257 - byte) * r->bpp;
+         count = (unsigned)(257 - byte) * r->bpp;
 
-          if (count > bytes)
-           count = bytes;
+          if (count > (unsigned)bytes)
+           count = (unsigned)bytes;
 
           if (!cups_raster_read(r, temp, count))
+         {
+           DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0.");
            return (0);
+         }
 
          temp  += count;
          bytes -= count;
@@ -443,9 +450,9 @@ cupsRasterReadPixels(cups_raster_t *r,      /* I - Raster stream */
          * Repeat the next N bytes...
          */
 
-          count = (byte + 1) * r->bpp;
-          if (count > bytes)
-           count = bytes;
+          count = ((unsigned)byte + 1) * r->bpp;
+          if (count > (unsigned)bytes)
+           count = (unsigned)bytes;
 
           if (count < r->bpp)
            break;
@@ -453,7 +460,10 @@ cupsRasterReadPixels(cups_raster_t *r,     /* I - Raster stream */
          bytes -= count;
 
           if (!cups_raster_read(r, temp, r->bpp))
+         {
+           DEBUG_puts("1cupsRasterReadPixels: Read error, returning 0.");
            return (0);
+         }
 
          temp  += r->bpp;
          count -= r->bpp;
@@ -475,7 +485,7 @@ cupsRasterReadPixels(cups_raster_t *r,      /* I - Raster stream */
            r->header.cupsBitsPerPixel == 12 ||
            r->header.cupsBitsPerPixel == 16) &&
           r->swapped)
-        cups_swap(ptr, bytes);
+        cups_swap(ptr, (size_t)bytes);
 
      /*
       * Update pointers...
@@ -483,14 +493,14 @@ cupsRasterReadPixels(cups_raster_t *r,    /* I - Raster stream */
 
       if (remaining >= cupsBytesPerLine)
       {
-       bytes       = cupsBytesPerLine;
+       bytes       = (ssize_t)cupsBytesPerLine;
         r->pcurrent = r->pixels;
        r->count --;
        r->remaining --;
       }
       else
       {
-       bytes       = remaining;
+       bytes       = (ssize_t)remaining;
         r->pcurrent = r->pixels + bytes;
       }
 
@@ -499,7 +509,7 @@ cupsRasterReadPixels(cups_raster_t *r,      /* I - Raster stream */
       */
 
       if (ptr != p)
-        memcpy(p, ptr, bytes);
+        memcpy(p, ptr, (size_t)bytes);
     }
     else
     {
@@ -508,9 +518,9 @@ cupsRasterReadPixels(cups_raster_t *r,      /* I - Raster stream */
       */
 
       if ((unsigned)(bytes = (int)(r->pend - r->pcurrent)) > remaining)
-        bytes = remaining;
+        bytes = (ssize_t)remaining;
 
-      memcpy(p, r->pcurrent, bytes);
+      memcpy(p, r->pcurrent, (size_t)bytes);
       r->pcurrent += bytes;
 
       if (r->pcurrent >= r->pend)
@@ -521,10 +531,12 @@ cupsRasterReadPixels(cups_raster_t *r,    /* I - Raster stream */
       }
     }
 
-    remaining -= bytes;
+    remaining -= (unsigned)bytes;
     p         += bytes;
   }
 
+  DEBUG_printf(("1cupsRasterReadPixels: Returning %u", len));
+
   return (len);
 }
 
@@ -554,7 +566,8 @@ cupsRasterWriteHeader(
   memset(&(r->header), 0, sizeof(r->header));
   memcpy(&(r->header), h, sizeof(cups_page_header_t));
 
-  cups_raster_update(r);
+  if (!cups_raster_update(r))
+    return (0);
 
  /*
   * Write the raster header...
@@ -628,8 +641,9 @@ cupsRasterWriteHeader(
     fh.cupsInteger[15]       = htonl(r->header.cupsInteger[15]);
                                        /* VendorLength */
 
-    memcpy(fh.cupsReal, r->header.cupsReal,
-           sizeof(fh.cupsReal) + sizeof(fh.cupsString));
+    void *dst = fh.cupsReal; /* Bypass bogus compiler warning */
+    void *src = r->header.cupsReal;
+    memcpy(dst, src, sizeof(fh.cupsReal) + sizeof(fh.cupsString));
                                        /* VendorData */
 
     strlcpy(fh.cupsRenderingIntent, r->header.cupsRenderingIntent,
@@ -669,7 +683,8 @@ cupsRasterWriteHeader2(
 
   memcpy(&(r->header), h, sizeof(cups_page_header2_t));
 
-  cups_raster_update(r);
+  if (!cups_raster_update(r))
+    return (0);
 
  /*
   * Write the raster header...
@@ -724,14 +739,10 @@ cupsRasterWriteHeader2(
     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]));
-    fh.cupsInteger[4]        = htonl((unsigned)(r->header.cupsImagingBBox[1] *
-                                                r->header.HWResolution[1]));
-    fh.cupsInteger[5]        = htonl((unsigned)(r->header.cupsImagingBBox[2] *
-                                                r->header.HWResolution[0]));
-    fh.cupsInteger[6]        = htonl((unsigned)(r->header.cupsImagingBBox[3] *
-                                                r->header.HWResolution[1]));
+    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));
@@ -755,7 +766,7 @@ cupsRasterWritePixels(cups_raster_t *r,     /* I - Raster stream */
                       unsigned char *p,        /* I - Bytes to write */
                      unsigned      len)/* I - Number of bytes to write */
 {
-  int          bytes;                  /* Bytes read */
+  ssize_t      bytes;                  /* Bytes read */
   unsigned     remaining;              /* Bytes remaining */
 
 
@@ -817,24 +828,29 @@ cupsRasterWritePixels(cups_raster_t *r,   /* I - Raster stream */
       * Write the byte-swapped buffer...
       */
 
-      return (cups_raster_io(r, r->buffer, len));
+      bytes = cups_raster_io(r, r->buffer, len);
     }
     else
-      return (cups_raster_io(r, p, len));
+      bytes = cups_raster_io(r, p, len);
+
+    if (bytes < len)
+      return (0);
+    else
+      return (len);
   }
 
  /*
   * Otherwise, compress each line...
   */
 
-  for (remaining = len; remaining > 0; remaining -= bytes, p += bytes)
+  for (remaining = len; remaining > 0; remaining -= (unsigned)bytes, p += bytes)
   {
    /*
     * Figure out the number of remaining bytes on the current line...
     */
 
-    if ((bytes = remaining) > (int)(r->pend - r->pcurrent))
-      bytes = (int)(r->pend - r->pcurrent);
+    if ((bytes = (ssize_t)remaining) > (ssize_t)(r->pend - r->pcurrent))
+      bytes = (ssize_t)(r->pend - r->pcurrent);
 
     if (r->count > 0)
     {
@@ -842,9 +858,9 @@ cupsRasterWritePixels(cups_raster_t *r,     /* I - Raster stream */
       * Check to see if this line is the same as the previous line...
       */
 
-      if (memcmp(p, r->pcurrent, bytes))
+      if (memcmp(p, r->pcurrent, (size_t)bytes))
       {
-        if (!cups_raster_write(r, r->pixels))
+        if (cups_raster_write(r, r->pixels) <= 0)
          return (0);
 
        r->count = 0;
@@ -873,10 +889,15 @@ cupsRasterWritePixels(cups_raster_t *r,   /* I - Raster stream */
          r->remaining --;
 
          if (r->remaining == 0)
-           return (cups_raster_write(r, r->pixels));
+         {
+           if (cups_raster_write(r, r->pixels) <= 0)
+             return (0);
+           else
+             return (len);
+         }
          else if (r->count == 256)
          {
-           if (cups_raster_write(r, r->pixels) == 0)
+           if (cups_raster_write(r, r->pixels) <= 0)
              return (0);
 
            r->count = 0;
@@ -893,7 +914,7 @@ cupsRasterWritePixels(cups_raster_t *r,     /* I - Raster stream */
       * Copy the raster data to the buffer...
       */
 
-      memcpy(r->pcurrent, p, bytes);
+      memcpy(r->pcurrent, p, (size_t)bytes);
 
       r->pcurrent += bytes;
 
@@ -913,7 +934,10 @@ cupsRasterWritePixels(cups_raster_t *r,    /* I - Raster stream */
        r->remaining --;
 
        if (r->remaining == 0)
-         return (cups_raster_write(r, r->pixels));
+       {
+         if (cups_raster_write(r, r->pixels) <= 0)
+           return (0);
+       }
       }
     }
   }
@@ -930,12 +954,16 @@ static unsigned                           /* O - 1 on success, 0 on fail */
 cups_raster_read_header(
     cups_raster_t *r)                  /* I - Raster stream */
 {
-  int  len;                            /* Length for read/swap */
+  size_t       len;                    /* Length for read/swap */
+
 
+  DEBUG_printf(("3cups_raster_read_header(r=%p), r->mode=%d", r, r ? r->mode : 0));
 
   if (r == NULL || r->mode != CUPS_RASTER_READ)
     return (0);
 
+  DEBUG_printf(("4cups_raster_read_header: r->iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount));
+
  /*
   * Get the length of the raster header...
   */
@@ -945,14 +973,19 @@ cups_raster_read_header(
   else
     len = sizeof(cups_page_header2_t);
 
+  DEBUG_printf(("4cups_raster_read_header: len=%d", (int)len));
+
  /*
   * Read the header...
   */
 
   memset(&(r->header), 0, sizeof(r->header));
 
-  if (cups_raster_read(r, (unsigned char *)&(r->header), len) < len)
+  if (cups_raster_read(r, (unsigned char *)&(r->header), len) < (ssize_t)len)
+  {
+    DEBUG_printf(("4cups_raster_read_header: EOF, r->iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount));
     return (0);
+  }
 
  /*
   * Swap bytes as needed...
@@ -964,21 +997,19 @@ cups_raster_read_header(
                temp;                   /* Temporary copy */
 
 
-    DEBUG_puts("Swapping header bytes...");
+    DEBUG_puts("4cups_raster_read_header: Swapping header bytes.");
 
     for (len = 81, s = &(r->header.AdvanceDistance);
         len > 0;
         len --, s ++)
     {
-      DEBUG_printf(("%08x =>", *s));
-
       temp = *s;
       *s   = ((temp & 0xff) << 24) |
              ((temp & 0xff00) << 8) |
              ((temp & 0xff0000) >> 8) |
              ((temp & 0xff000000) >> 24);
 
-      DEBUG_printf((" %08x\n", *s));
+      DEBUG_printf(("4cups_raster_read_header: %08x => %08x", temp, *s));
     }
   }
 
@@ -986,9 +1017,12 @@ cups_raster_read_header(
   * Update the header and row count...
   */
 
-  cups_raster_update(r);
+  if (!cups_raster_update(r))
+    return (0);
+
+  DEBUG_printf(("4cups_raster_read_header: cupsBitsPerPixel=%u, cupsBitsPerColor=%u, cupsBytesPerLine=%u, cupsWidth=%u, cupsHeight=%u, r->bpp=%d", r->header.cupsBitsPerPixel, r->header.cupsBitsPerColor, r->header.cupsBytesPerLine, r->header.cupsWidth, r->header.cupsHeight, r->bpp));
 
-  return (r->header.cupsBytesPerLine != 0 && r->header.cupsHeight != 0);
+  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);
 }
 
 
@@ -996,30 +1030,41 @@ cups_raster_read_header(
  * 'cups_raster_io()' - Read/write bytes from a context, handling interruptions.
  */
 
-static int                             /* O - Bytes read or -1 */
+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 */
-           int           bytes)                /* I - Number of bytes to read/write */
+               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 */
-  size_t       total;                  /* Total bytes read/written */
+  ssize_t      count,                  /* Number of bytes read/written */
+               total;                  /* Total bytes read/written */
 
 
-  DEBUG_printf(("4cups_raster_io(r=%p, buf=%p, bytes=%d)", r, buf, bytes));
+  DEBUG_printf(("5cups_raster_io(r=%p, buf=%p, bytes=" CUPS_LLFMT ")", r, buf, CUPS_LLCAST bytes));
 
-  for (total = 0; total < (size_t)bytes; total += count, buf += count)
+  for (total = 0; total < (ssize_t)bytes; total += count, buf += count)
   {
-    count = (*r->iocb)(r->ctx, buf, bytes - total);
+    count = (*r->iocb)(r->ctx, buf, bytes - (size_t)total);
 
-    DEBUG_printf(("5cups_raster_io: count=%d, total=%d", (int)count,
-                  (int)total));
+    DEBUG_printf(("6cups_raster_io: count=%d, total=%d", (int)count, (int)total));
     if (count == 0)
+    {
+      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 */
   }
 
-  return ((int)total);
+  DEBUG_printf(("6cups_raster_io: Returning " CUPS_LLFMT ".", CUPS_LLCAST total));
+
+  return (total);
 }
 
 
@@ -1027,17 +1072,17 @@ cups_raster_io(cups_raster_t *r,        /* I - Raster stream */
  * 'cups_raster_read()' - Read through the raster buffer.
  */
 
-static int                             /* O - Number of bytes read */
+static ssize_t                         /* O - Number of bytes read */
 cups_raster_read(cups_raster_t *r,     /* I - Raster stream */
                  unsigned char *buf,   /* I - Buffer */
-                 int           bytes)  /* I - Number of bytes to read */
+                 size_t        bytes)  /* I - Number of bytes to read */
 {
-  int          count,                  /* Number of bytes read */
+  ssize_t      count,                  /* Number of bytes read */
                remaining,              /* Remaining bytes in buffer */
                total;                  /* Total bytes read */
 
 
-  DEBUG_printf(("cups_raster_read(r=%p, buf=%p, bytes=%d)\n", r, buf, bytes));
+  DEBUG_printf(("5cups_raster_read(r=%p, buf=%p, bytes=" CUPS_LLFMT ")\n", r, buf, CUPS_LLCAST bytes));
 
   if (!r->compressed)
     return (cups_raster_io(r, buf, bytes));
@@ -1046,20 +1091,21 @@ cups_raster_read(cups_raster_t *r,      /* I - Raster stream */
   * Allocate a read buffer as needed...
   */
 
-  count = 2 * r->header.cupsBytesPerLine;
+  count = (ssize_t)(2 * r->header.cupsBytesPerLine);
+  if (count < 65536)
+    count = 65536;
 
   if ((size_t)count > r->bufsize)
   {
-    int offset = (int)(r->bufptr - r->buffer);
+    ssize_t offset = r->bufptr - r->buffer;
                                        /* Offset to current start of buffer */
-    int end = (int)(r->bufend - r->buffer);
-                                       /* Offset to current end 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, count);
+      rptr = realloc(r->buffer, (size_t)count);
     else
-      rptr = malloc(count);
+      rptr = malloc((size_t)count);
 
     if (!rptr)
       return (0);
@@ -1067,7 +1113,7 @@ cups_raster_read(cups_raster_t *r,        /* I - Raster stream */
     r->buffer  = rptr;
     r->bufptr  = rptr + offset;
     r->bufend  = rptr + end;
-    r->bufsize = count;
+    r->bufsize = (size_t)count;
   }
 
  /*
@@ -1075,13 +1121,12 @@ cups_raster_read(cups_raster_t *r,      /* I - Raster stream */
   */
 
   for (total = 0, remaining = (int)(r->bufend - r->bufptr);
-       total < bytes;
+       total < (ssize_t)bytes;
        total += count, buf += count)
   {
-    count = bytes - total;
+    count = (ssize_t)bytes - total;
 
-    DEBUG_printf(("count=%d, remaining=%d, buf=%p, bufptr=%p, bufend=%p...\n",
-                  count, remaining, buf, r->bufptr, r->bufend));
+    DEBUG_printf(("6cups_raster_read: count=" CUPS_LLFMT ", remaining=" CUPS_LLFMT ", buf=%p, bufptr=%p, bufend=%p", CUPS_LLCAST count, CUPS_LLCAST remaining, buf, r->bufptr, r->bufend));
 
     if (remaining == 0)
     {
@@ -1097,6 +1142,10 @@ cups_raster_read(cups_raster_t *r,       /* I - Raster stream */
 
        r->bufptr = r->buffer;
        r->bufend = r->buffer + remaining;
+
+#ifdef DEBUG
+        r->iocount += (size_t)remaining;
+#endif /* DEBUG */
       }
       else
       {
@@ -1104,11 +1153,15 @@ cups_raster_read(cups_raster_t *r,      /* I - Raster stream */
         * Read directly into "buf"...
        */
 
-       count = (*r->iocb)(r->ctx, buf, count);
+       count = (*r->iocb)(r->ctx, buf, (size_t)count);
 
        if (count <= 0)
          return (0);
 
+#ifdef DEBUG
+        r->iocount += (size_t)count;
+#endif /* DEBUG */
+
        continue;
       }
     }
@@ -1152,12 +1205,14 @@ cups_raster_read(cups_raster_t *r,      /* I - Raster stream */
       * Use memcpy() for a large read...
       */
 
-      memcpy(buf, r->bufptr, count);
+      memcpy(buf, r->bufptr, (size_t)count);
       r->bufptr += count;
       remaining -= count;
     }
   }
 
+  DEBUG_printf(("6cups_raster_read: Returning %ld", (long)total));
+
   return (total);
 }
 
@@ -1167,7 +1222,7 @@ cups_raster_read(cups_raster_t *r,        /* I - Raster stream */
  *                          current page.
  */
 
-static void
+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 ||
@@ -1248,6 +1303,10 @@ cups_raster_update(cups_raster_t *r)     /* I - Raster stream */
           r->header.cupsNumColors = r->header.cupsColorSpace -
                                    CUPS_CSPACE_DEVICE1 + 1;
          break;
+
+      default :
+          /* Unknown color space */
+          return (0);
     }
   }
 
@@ -1260,6 +1319,9 @@ cups_raster_update(cups_raster_t *r)      /* I - Raster stream */
   else
     r->bpp = (r->header.cupsBitsPerColor + 7) / 8;
 
+  if (r->bpp == 0)
+    r->bpp = 1;
+
  /*
   * Set the number of remaining rows...
   */
@@ -1278,11 +1340,21 @@ cups_raster_update(cups_raster_t *r)    /* I - Raster stream */
     if (r->pixels != NULL)
       free(r->pixels);
 
-    r->pixels   = calloc(r->header.cupsBytesPerLine, 1);
+    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);
 }
 
 
@@ -1290,7 +1362,7 @@ cups_raster_update(cups_raster_t *r)      /* I - Raster stream */
  * 'cups_raster_write()' - Write a row of compressed raster data...
  */
 
-static int                             /* O - Number of bytes written */
+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 */
@@ -1300,17 +1372,20 @@ cups_raster_write(
                        *pend,          /* End of raster buffer */
                        *plast;         /* Pointer to last pixel */
   unsigned char                *wptr;          /* Pointer into write buffer */
-  int                  bpp,            /* Bytes per pixel */
+  unsigned             bpp,            /* Bytes per pixel */
                        count;          /* Count */
 
 
-  DEBUG_printf(("cups_raster_write(r=%p, pixels=%p)\n", r, pixels));
+  DEBUG_printf(("3cups_raster_write(r=%p, pixels=%p)\n", r, pixels));
 
  /*
   * 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)
@@ -1319,7 +1394,10 @@ cups_raster_write(
       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;
@@ -1333,7 +1411,7 @@ cups_raster_write(
   pend    = pixels + r->header.cupsBytesPerLine;
   plast   = pend - bpp;
   wptr    = r->buffer;
-  *wptr++ = r->count - 1;
+  *wptr++ = (unsigned char)(r->count - 1);
 
  /*
   * Write using a modified PackBits compression...
@@ -1364,7 +1442,7 @@ cups_raster_write(
         if (memcmp(ptr, ptr + bpp, bpp))
          break;
 
-      *wptr++ = count - 1;
+      *wptr++ = (unsigned char)(count - 1);
       for (count = bpp; count > 0; count --)
         *wptr++ = *ptr++;
     }
@@ -1384,7 +1462,7 @@ cups_raster_write(
        ptr += bpp;
       }
 
-      *wptr++ = 257 - count;
+      *wptr++ = (unsigned char)(257 - count);
 
       count *= bpp;
       memcpy(wptr, start, count);
@@ -1392,7 +1470,9 @@ cups_raster_write(
     }
   }
 
-  return (cups_raster_io(r, r->buffer, (int)(wptr - r->buffer)));
+  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)));
 }
 
 
@@ -1416,7 +1496,12 @@ cups_read_fd(void          *ctx, /* I - File descriptor as pointer */
   while ((count = read(fd, buf, bytes)) < 0)
 #endif /* WIN32 */
     if (errno != EINTR && errno != EAGAIN)
+    {
+      DEBUG_printf(("4cups_read_fd: %s", strerror(errno)));
       return (-1);
+    }
+
+  DEBUG_printf(("4cups_read_fd: Returning %d bytes.", (int)count));
 
   return (count);
 }
@@ -1428,7 +1513,7 @@ cups_read_fd(void          *ctx,  /* I - File descriptor as pointer */
 
 static void
 cups_swap(unsigned char *buf,          /* I - Buffer to swap */
-          int           bytes)         /* I - Number of bytes to swap */
+          size_t        bytes)         /* I - Number of bytes to swap */
 {
   unsigned char        even, odd;              /* Temporary variables */
 
@@ -1468,12 +1553,15 @@ cups_write_fd(void          *ctx,       /* I - File descriptor pointer */
   while ((count = write(fd, buf, bytes)) < 0)
 #endif /* WIN32 */
     if (errno != EINTR && errno != EAGAIN)
+    {
+      DEBUG_printf(("4cups_write_fd: %s", strerror(errno)));
       return (-1);
+    }
 
   return (count);
 }
 
 
 /*
- * End of "$Id: raster.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: raster.c 12945 2015-10-26 19:46:02Z msweet $".
  */
index b21df91..56d2778 100644 (file)
@@ -1,25 +1,18 @@
 /*
- * "$Id: rasterbench.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: rasterbench.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Raster benchmark program for CUPS.
+ * Raster benchmark program for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()           - Benchmark the raster read/write functions.
- *   compute_median() - Compute the median time for a test.
- *   read_test()      - Benchmark the raster read functions.
- *   write_test()     - Benchmark the raster write functions.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -181,7 +174,7 @@ get_time(void)
 static void
 read_test(int fd)                      /* I - File descriptor to read from */
 {
-  int                  y;              /* Looping var */
+  unsigned             y;              /* Looping var */
   cups_raster_t                *r;             /* Raster stream */
   cups_page_header2_t  header;         /* Page header */
   unsigned char                buffer[8 * TEST_WIDTH];
@@ -263,8 +256,8 @@ static void
 write_test(int         fd,             /* I - File descriptor to write to */
            cups_mode_t mode)           /* I - Write mode */
 {
-  int                  page, x, y;     /* Looping vars */
-  int                  count;          /* Number of bytes to set */
+  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];
@@ -295,7 +288,7 @@ write_test(int         fd,          /* I - File descriptor to write to */
          break;
       }
 
-      data[y][x] = CUPS_RAND();
+      data[y][x] = (unsigned char)CUPS_RAND();
     }
   }
 
@@ -351,5 +344,5 @@ write_test(int         fd,          /* I - File descriptor to write to */
 
 
 /*
- * End of "$Id: rasterbench.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: rasterbench.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 8533b77..578b0e7 100644 (file)
@@ -1,28 +1,18 @@
 /*
- * "$Id: rastertoepson.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: rastertoepson.c 12945 2015-10-26 19:46:02Z msweet $"
  *
- *   EPSON ESC/P and ESC/P2 filter for CUPS.
+ * EPSON ESC/P and ESC/P2 filter for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1993-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   Setup()        - Prepare the printer for printing.
- *   StartPage()    - Start a page of graphics.
- *   EndPage()      - Finish a page of graphics.
- *   Shutdown()     - Shutdown the printer.
- *   CompressData() - Compress a line of graphics.
- *   OutputLine()   - Output a line of graphics.
- *   main()         - Main entry and processing of driver.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -66,17 +56,17 @@ unsigned char       *Planes[6],             /* Output buffers */
                *CompBuffer,            /* Compression buffer */
                *LineBuffers[2];        /* Line bitmap buffers */
 int            Model,                  /* Model number */
-               NumPlanes,              /* Number of color planes */
+               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 */
-               EjectPage;              /* Eject the page when done? */
-int            DotBit,                 /* Bit in buffers */
+               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 */
-               Shingling,              /* Shingle output? */
-               Canceled;               /* Has the current job been canceled? */
+               OddOffset;              /* Offset into 'odd' buffers */
 
 
 /*
@@ -89,8 +79,8 @@ void  EndPage(const cups_page_header2_t *header);
 void   Shutdown(void);
 
 void   CancelJob(int sig);
-void   CompressData(const unsigned char *line, int length, int plane,
-                    int type, int xstep, int ystep);
+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);
 
@@ -125,9 +115,33 @@ StartPage(
     const ppd_file_t         *ppd,     /* I - PPD file */
     const cups_page_header2_t *header) /* I - Page header */
 {
-  int  n, t;                           /* Numbers */
-  int  plane;                          /* Looping var */
+  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.
@@ -211,27 +225,26 @@ StartPage(
         if (Model < EPSON_ICOLOR)
        {
          pwrite("\033(U\001\000", 5);          /* Resolution/units */
-         putchar(3600 / header->HWResolution[1]);
+         putchar((int)(3600 / header->HWResolution[1]));
         }
        else
        {
          pwrite("\033(U\005\000", 5);
-         putchar(1440 / header->HWResolution[1]);
-         putchar(1440 / header->HWResolution[1]);
-         putchar(1440 / header->HWResolution[0]);
+         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 = header->PageSize[1] * header->HWResolution[1] / 72.0;
+       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 = (ppd->sizes[1].length - ppd->sizes[1].top) *
-             header->HWResolution[1] / 72.0;
+         t = (int)((ppd->sizes[1].length - ppd->sizes[1].top) * header->HWResolution[1] / 72.0);
         else
          t = 0;
 
@@ -274,7 +287,7 @@ StartPage(
   * Allocate memory for a line/row of graphics...
   */
 
-  if ((Planes[0] = malloc(header->cupsBytesPerLine)) == NULL)
+  if ((Planes[0] = malloc(header->cupsBytesPerLine + NumPlanes)) == NULL)
   {
     fputs("ERROR: Unable to allocate memory\n", stderr);
     exit(1);
@@ -285,7 +298,7 @@ StartPage(
 
   if (header->cupsCompression || DotBytes)
   {
-    if ((CompBuffer = calloc(2, header->cupsWidth)) == NULL)
+    if ((CompBuffer = calloc(2, header->cupsWidth + 1)) == NULL)
     {
       fputs("ERROR: Unable to allocate memory\n", stderr);
       exit(1);
@@ -296,8 +309,7 @@ StartPage(
 
   if (DotBytes)
   {
-    if ((LineBuffers[0] = calloc(DotBytes,
-                                 header->cupsWidth * (Shingling + 1))) == NULL)
+    if ((LineBuffers[0] = calloc((size_t)DotBytes, header->cupsWidth * (size_t)(Shingling + 1))) == NULL)
     {
       fputs("ERROR: Unable to allocate memory\n", stderr);
       exit(1);
@@ -398,11 +410,11 @@ CancelJob(int sig)                        /* I - Signal */
 
 void
 CompressData(const unsigned char *line,        /* I - Data to compress */
-             int                 length,/* I - Number of bytes */
-            int                 plane, /* I - Color plane */
-            int                 type,  /* I - Type of compression */
-            int                 xstep, /* I - X resolution */
-            int                 ystep) /* I - Y resolution */
+             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 */
@@ -509,7 +521,7 @@ CompressData(const unsigned char *line,     /* I - Data to compress */
               count ++;
            }
 
-           *comp_ptr++ = 257 - count;
+           *comp_ptr++ = (unsigned char)(257 - count);
            *comp_ptr++ = *line_ptr++;
          }
          else
@@ -530,9 +542,9 @@ CompressData(const unsigned char *line,     /* I - Data to compress */
               count ++;
            }
 
-           *comp_ptr++ = count - 1;
+           *comp_ptr++ = (unsigned char)(count - 1);
 
-           memcpy(comp_ptr, start, count);
+           memcpy(comp_ptr, start, (size_t)count);
            comp_ptr += count;
          }
        }
@@ -572,12 +584,12 @@ CompressData(const unsigned char *line,   /* I - Data to compress */
 
     length *= 8;
     printf("\033.");                   /* Raster graphics */
-    putchar(type);
-    putchar(ystep);
-    putchar(xstep);
+    putchar((int)type);
+    putchar((int)ystep);
+    putchar((int)xstep);
     putchar(1);
-    putchar(length);
-    putchar(length >> 8);
+    putchar((int)length);
+    putchar((int)(length >> 8));
   }
   else
   {
@@ -587,15 +599,15 @@ CompressData(const unsigned char *line,   /* I - Data to compress */
 
     printf("\033i");
     putchar(ctable[plane]);
-    putchar(type);
+    putchar((int)type);
     putchar(1);
-    putchar(length & 255);
-    putchar(length >> 8);
+    putchar((int)length);
+    putchar((int)(length >> 8));
     putchar(1);
     putchar(0);
   }
 
-  pwrite(line_ptr, line_end - line_ptr);
+  pwrite(line_ptr, (size_t)(line_end - line_ptr));
   fflush(stdout);
 }
 
@@ -610,11 +622,11 @@ OutputLine(
 {
   if (header->cupsRowCount)
   {
-    int                        width;
+    unsigned           width;
     unsigned char      *tempptr,
                        *evenptr,
                        *oddptr;
-    register int       x;
+    unsigned int       x;
     unsigned char      bit;
     const unsigned char        *pixel;
     unsigned char      *temp;
@@ -667,13 +679,19 @@ OutputLine(
         }
 
         for (width = header->cupsWidth, tempptr = CompBuffer;
-             width > 0;
+             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
       {
@@ -724,10 +742,9 @@ OutputLine(
   }
   else
   {
-    int        plane;          /* Current plane */
-    int        bytes;          /* Bytes per plane */
-    int        xstep, ystep;   /* X & Y resolutions */
-
+    unsigned   plane;          /* Current plane */
+    unsigned   bytes;          /* Bytes per plane */
+    unsigned   xstep, ystep;   /* X & Y resolutions */
 
    /*
     * Write a single line of bitmap data as needed...
@@ -744,7 +761,7 @@ OutputLine(
       */
 
       if (!Planes[plane][0] &&
-          memcmp(Planes[plane], Planes[plane] + 1, bytes - 1) == 0)
+          memcmp(Planes[plane], Planes[plane] + 1, (size_t)bytes - 1) == 0)
        continue;
 
      /*
@@ -754,14 +771,13 @@ OutputLine(
       if (Feed > 0)
       {
        pwrite("\033(v\002\000", 5);    /* Relative vertical position */
-       putchar(Feed);
-       putchar(Feed >> 8);
+       putchar((int)Feed);
+       putchar((int)(Feed >> 8));
 
        Feed = 0;
       }
 
-      CompressData(Planes[plane], bytes, plane, header->cupsCompression, xstep,
-                   ystep);
+      CompressData(Planes[plane], bytes, plane, header->cupsCompression, xstep, ystep);
     }
 
     Feed ++;
@@ -778,8 +794,8 @@ OutputRows(
     const cups_page_header2_t *header, /* I - Page image header */
     int                      row)      /* I - Row number (0 or 1) */
 {
-  unsigned     i, n;                   /* Looping vars */
-  int          dot_count,              /* Number of bytes to print */
+  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 */
@@ -788,8 +804,7 @@ OutputRows(
   dot_min = DotBytes * DotColumns;
 
   if (LineBuffers[row][0] != 0 ||
-      memcmp(LineBuffers[row], LineBuffers[row] + 1,
-             header->cupsWidth * DotBytes - 1))
+      memcmp(LineBuffers[row], LineBuffers[row] + 1, header->cupsWidth * DotBytes - 1))
   {
    /*
     * Skip leading space...
@@ -826,8 +841,8 @@ OutputRows(
     {
       putchar(0x1b);
       putchar('$');
-      putchar(i & 255);
-      putchar(i >> 8);
+      putchar((int)(i & 255));
+      putchar((int)(i >> 8));
     }
 
    /*
@@ -867,9 +882,9 @@ OutputRows(
           break;
     }
 
-    n = (unsigned)dot_count / DotBytes;
-    putchar(n & 255);
-    putchar(n / 256);
+    n = dot_count / DotBytes;
+    putchar((int)(n & 255));
+    putchar((int)(n / 256));
 
    /*
     * Write the graphics data...
@@ -888,6 +903,9 @@ OutputRows(
        putchar(0);
       }
 
+      if (dot_count & 1)
+        putchar(*ptr);
+
      /*
       * Move the head back and print the odd bytes...
       */
@@ -898,8 +916,8 @@ OutputRows(
       {
        putchar(0x1b);
        putchar('$');
-       putchar(i & 255);
-       putchar(i >> 8);
+       putchar((int)(i & 255));
+       putchar((int)(i >> 8));
       }
 
       if (header->HWResolution[0] == 120)
@@ -908,14 +926,17 @@ OutputRows(
        printf("\033*\003");            /* Select bit image */
 
       n = (unsigned)dot_count / DotBytes;
-      putchar(n & 255);
-      putchar(n / 256);
+      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);
@@ -958,7 +979,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
   cups_page_header2_t  header;         /* Page header from file */
   ppd_file_t           *ppd;           /* PPD file */
   int                  page;           /* Current page */
-  int                  y;              /* Current line */
+  unsigned             y;              /* Current line */
 #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
   struct sigaction action;             /* Actions for POSIX signals */
 #endif /* HAVE_SIGACTION && !HAVE_SIGSET */
@@ -1090,9 +1111,9 @@ main(int  argc,                           /* I - Number of command-line arguments */
       if ((y & 127) == 0)
       {
         _cupsLangPrintFilter(stderr, "INFO",
-                            _("Printing page %d, %d%% complete."),
+                            _("Printing page %d, %u%% complete."),
                             page, 100 * y / header.cupsHeight);
-        fprintf(stderr, "ATTR: job-media-progress=%d\n",
+        fprintf(stderr, "ATTR: job-media-progress=%u\n",
                100 * y / header.cupsHeight);
       }
 
@@ -1153,5 +1174,5 @@ main(int  argc,                           /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: rastertoepson.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: rastertoepson.c 12945 2015-10-26 19:46:02Z msweet $".
  */
index e016e5f..1f54f92 100644 (file)
@@ -1,29 +1,18 @@
 /*
- * "$Id: rastertohp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: rastertohp.c 12945 2015-10-26 19:46:02Z msweet $"
  *
- *   Hewlett-Packard Page Control Language filter for CUPS.
+ * Hewlett-Packard Page Control Language filter for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1993-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1993-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   Setup()        - Prepare the printer for printing.
- *   StartPage()    - Start a page of graphics.
- *   EndPage()      - Finish a page of graphics.
- *   Shutdown()     - Shutdown the printer.
- *   CancelJob()    - Cancel the current job...
- *   CompressData() - Compress a line of graphics.
- *   OutputLine()   - Output a line of graphics.
- *   main()         - Main entry and processing of driver.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
 unsigned char  *Planes[4],             /* Output buffers */
                *CompBuffer,            /* Compression buffer */
                *BitBuffer;             /* Buffer for output bits */
-int            NumPlanes,              /* Number of color planes */
+unsigned       NumPlanes,              /* Number of color planes */
                ColorBits,              /* Number of bits per color */
-               Feed,                   /* Number of lines to skip */
-               Duplex,                 /* Current duplex mode */
+               Feed;                   /* Number of lines to skip */
+int            Duplex,                 /* Current duplex mode */
                Page,                   /* Current page number */
                Canceled;               /* Has the current job been canceled? */
 
@@ -65,7 +54,7 @@ void  EndPage(void);
 void   Shutdown(void);
 
 void   CancelJob(int sig);
-void   CompressData(unsigned char *line, int length, int plane, int type);
+void   CompressData(unsigned char *line, unsigned length, unsigned plane, unsigned type);
 void   OutputLine(cups_page_header2_t *header);
 
 
@@ -93,7 +82,7 @@ void
 StartPage(ppd_file_t         *ppd,     /* I - PPD file */
           cups_page_header2_t *header) /* I - Page header */
 {
-  int  plane;                          /* Looping var */
+  unsigned     plane;                  /* Looping var */
 
 
  /*
@@ -101,39 +90,15 @@ StartPage(ppd_file_t         *ppd, /* I - PPD file */
   */
 
   fprintf(stderr, "DEBUG: StartPage...\n");
-  fprintf(stderr, "DEBUG: MediaClass = \"%s\"\n", header->MediaClass);
-  fprintf(stderr, "DEBUG: MediaColor = \"%s\"\n", header->MediaColor);
-  fprintf(stderr, "DEBUG: MediaType = \"%s\"\n", header->MediaType);
-  fprintf(stderr, "DEBUG: OutputType = \"%s\"\n", header->OutputType);
-
-  fprintf(stderr, "DEBUG: AdvanceDistance = %d\n", header->AdvanceDistance);
-  fprintf(stderr, "DEBUG: AdvanceMedia = %d\n", header->AdvanceMedia);
-  fprintf(stderr, "DEBUG: Collate = %d\n", header->Collate);
-  fprintf(stderr, "DEBUG: CutMedia = %d\n", header->CutMedia);
   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: InsertSheet = %d\n", header->InsertSheet);
-  fprintf(stderr, "DEBUG: Jog = %d\n", header->Jog);
-  fprintf(stderr, "DEBUG: LeadingEdge = %d\n", header->LeadingEdge);
-  fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0],
-          header->Margins[1]);
+  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: MediaWeight = %d\n", header->MediaWeight);
-  fprintf(stderr, "DEBUG: MirrorPrint = %d\n", header->MirrorPrint);
-  fprintf(stderr, "DEBUG: NegativePrint = %d\n", header->NegativePrint);
   fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies);
   fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation);
-  fprintf(stderr, "DEBUG: OutputFaceUp = %d\n", header->OutputFaceUp);
-  fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0],
-          header->PageSize[1]);
-  fprintf(stderr, "DEBUG: Separations = %d\n", header->Separations);
-  fprintf(stderr, "DEBUG: TraySwitch = %d\n", header->TraySwitch);
-  fprintf(stderr, "DEBUG: Tumble = %d\n", header->Tumble);
+  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);
@@ -287,33 +252,33 @@ StartPage(ppd_file_t         *ppd,        /* I - PPD file */
 
     printf("\033*g26W");
     putchar(2);                                        /* Format 2 */
-    putchar(NumPlanes);                                /* Output planes */
+    putchar((int)NumPlanes);                   /* Output planes */
 
-    putchar(header->HWResolution[0] >> 8);     /* Black resolution */
-    putchar(header->HWResolution[0]);
-    putchar(header->HWResolution[1] >> 8);
-    putchar(header->HWResolution[1]);
+    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(header->HWResolution[0] >> 8);     /* Cyan resolution */
-    putchar(header->HWResolution[0]);
-    putchar(header->HWResolution[1] >> 8);
-    putchar(header->HWResolution[1]);
+    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(header->HWResolution[0] >> 8);     /* Magenta resolution */
-    putchar(header->HWResolution[0]);
-    putchar(header->HWResolution[1] >> 8);
-    putchar(header->HWResolution[1]);
+    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(header->HWResolution[0] >> 8);     /* Yellow resolution */
-    putchar(header->HWResolution[0]);
-    putchar(header->HWResolution[1] >> 8);
-    putchar(header->HWResolution[1]);
+    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 */
 
@@ -321,7 +286,7 @@ StartPage(ppd_file_t         *ppd,  /* I - PPD file */
   }
   else
   {
-    printf("\033*t%dR", header->HWResolution[0]);
+    printf("\033*t%uR", header->HWResolution[0]);
                                                /* Set resolution */
 
     if (header->cupsColorSpace == CUPS_CSPACE_KCMY)
@@ -341,8 +306,8 @@ StartPage(ppd_file_t         *ppd,  /* I - PPD file */
     * Set size and position of graphics...
     */
 
-    printf("\033*r%dS", header->cupsWidth);    /* Set width */
-    printf("\033*r%dT", header->cupsHeight);   /* Set height */
+    printf("\033*r%uS", header->cupsWidth);    /* Set width */
+    printf("\033*r%uT", header->cupsHeight);   /* Set height */
 
     printf("\033&a0H");                                /* Set horizontal position */
 
@@ -356,7 +321,7 @@ StartPage(ppd_file_t         *ppd,  /* I - PPD file */
   printf("\033*r1A");                          /* Start graphics */
 
   if (header->cupsCompression)
-    printf("\033*b%dM",                                /* Set compression */
+    printf("\033*b%uM",                                /* Set compression */
            header->cupsCompression);
 
   Feed = 0;                                    /* No blank lines yet */
@@ -365,7 +330,7 @@ StartPage(ppd_file_t         *ppd,  /* I - PPD file */
   * Allocate memory for a line of graphics...
   */
 
-  if ((Planes[0] = malloc(header->cupsBytesPerLine)) == NULL)
+  if ((Planes[0] = malloc(header->cupsBytesPerLine + NumPlanes)) == NULL)
   {
     fputs("ERROR: Unable to allocate memory\n", stderr);
     exit(1);
@@ -380,7 +345,7 @@ StartPage(ppd_file_t         *ppd,  /* I - PPD file */
     BitBuffer = NULL;
 
   if (header->cupsCompression)
-    CompBuffer = malloc(header->cupsBytesPerLine * 2);
+    CompBuffer = malloc(header->cupsBytesPerLine * 2 + 2);
   else
     CompBuffer = NULL;
 }
@@ -463,15 +428,15 @@ CancelJob(int sig)                        /* I - Signal */
 
 void
 CompressData(unsigned char *line,      /* I - Data to compress */
-             int           length,     /* I - Number of bytes */
-            int           plane,       /* I - Color plane */
-            int           type)        /* I - Type of compression */
+             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 */
-  int           count;                 /* Count of bytes for output */
+  unsigned     count;                  /* Count of bytes for output */
 
 
   switch (type)
@@ -501,7 +466,7 @@ CompressData(unsigned char *line,   /* I - Data to compress */
                   count < 256;
                count ++);
 
-         comp_ptr[0] = count - 1;
+         comp_ptr[0] = (unsigned char)(count - 1);
          comp_ptr[1] = line_ptr[0];
        }
 
@@ -546,7 +511,7 @@ CompressData(unsigned char *line,   /* I - Data to compress */
               count ++;
            }
 
-           *comp_ptr++ = 257 - count;
+           *comp_ptr++ = (unsigned char)(257 - count);
            *comp_ptr++ = *line_ptr++;
          }
          else
@@ -567,7 +532,7 @@ CompressData(unsigned char *line,   /* I - Data to compress */
               count ++;
            }
 
-           *comp_ptr++ = count - 1;
+           *comp_ptr++ = (unsigned char)(count - 1);
 
            memcpy(comp_ptr, start, count);
            comp_ptr += count;
@@ -584,7 +549,7 @@ CompressData(unsigned char *line,   /* I - Data to compress */
   */
 
   printf("\033*b%d%c", (int)(line_end - line_ptr), plane);
-  fwrite(line_ptr, line_end - line_ptr, 1, stdout);
+  fwrite(line_ptr, (size_t)(line_end - line_ptr), 1, stdout);
 }
 
 
@@ -595,7 +560,7 @@ CompressData(unsigned char *line,   /* I - Data to compress */
 void
 OutputLine(cups_page_header2_t *header)        /* I - Page header */
 {
-  int          plane,                  /* Current plane */
+  unsigned     plane,                  /* Current plane */
                bytes,                  /* Bytes to write */
                count;                  /* Bytes to convert */
   unsigned char        bit,                    /* Current plane data */
@@ -644,15 +609,15 @@ OutputLine(cups_page_header2_t *header)   /* I - Page header */
       {
         bit = plane_ptr[0];
 
-        bit0 = ((bit & 64) << 1) | ((bit & 16) << 2) | ((bit & 4) << 3) | ((bit & 1) << 4);
-        bit1 = (bit & 128) | ((bit & 32) << 1) | ((bit & 8) << 2) | ((bit & 2) << 3);
+        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 |= (bit & 1) | ((bit & 4) >> 1) | ((bit & 16) >> 2) | ((bit & 64) >> 3);
-          bit1 |= ((bit & 2) >> 1) | ((bit & 8) >> 2) | ((bit & 32) >> 3) | ((bit & 128) >> 4);
+          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;
@@ -683,7 +648,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
   int                  fd;             /* File descriptor */
   cups_raster_t                *ras;           /* Raster stream for printing */
   cups_page_header2_t  header;         /* Page header from file */
-  int                  y;              /* Current line */
+  unsigned             y;              /* Current line */
   ppd_file_t           *ppd;           /* PPD file */
 #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
   struct sigaction action;             /* Actions for POSIX signals */
@@ -814,9 +779,9 @@ main(int  argc,                             /* I - Number of command-line arguments */
       if ((y & 127) == 0)
       {
         _cupsLangPrintFilter(stderr, "INFO",
-                            _("Printing page %d, %d%% complete."),
+                            _("Printing page %d, %u%% complete."),
                             Page, 100 * y / header.cupsHeight);
-        fprintf(stderr, "ATTR: job-media-progress=%d\n",
+        fprintf(stderr, "ATTR: job-media-progress=%u\n",
                100 * y / header.cupsHeight);
       }
 
@@ -882,5 +847,5 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: rastertohp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: rastertohp.c 12945 2015-10-26 19:46:02Z msweet $".
  */
index cb2847c..f5c6d12 100644 (file)
@@ -1,29 +1,18 @@
 /*
- * "$Id: rastertolabel.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: rastertolabel.c 12945 2015-10-26 19:46:02Z msweet $"
  *
- *   Label printer filter for CUPS.
+ * Label printer filter for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 2001-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 2001-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   Setup()        - Prepare the printer for printing.
- *   StartPage()    - Start a page of graphics.
- *   EndPage()      - Finish a page of graphics.
- *   CancelJob()    - Cancel the current job...
- *   OutputLine()   - Output a line of graphics.
- *   PCLCompress()  - Output a PCL (mode 3) compressed line.
- *   ZPLCompress()  - Output a run-length compression sequence.
- *   main()         - Main entry and processing of driver.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
 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 */
-               Feed,                   /* Number of lines to skip */
                Canceled;               /* Non-zero if job is canceled */
 
 
@@ -93,9 +82,9 @@ 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, int y);
-void   PCLCompress(unsigned char *line, int length);
-void   ZPLCompress(char repeat_char, int repeat_count);
+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);
 
 
 /*
@@ -169,7 +158,7 @@ StartPage(ppd_file_t         *ppd,  /* I - PPD file */
           cups_page_header2_t *header) /* I - Page header */
 {
   ppd_choice_t *choice;                /* Marked choice */
-  int          length;                 /* Actual label length */
+  unsigned     length;                 /* Actual label length */
 
 
  /*
@@ -177,39 +166,15 @@ StartPage(ppd_file_t         *ppd,        /* I - PPD file */
   */
 
   fprintf(stderr, "DEBUG: StartPage...\n");
-  fprintf(stderr, "DEBUG: MediaClass = \"%s\"\n", header->MediaClass);
-  fprintf(stderr, "DEBUG: MediaColor = \"%s\"\n", header->MediaColor);
-  fprintf(stderr, "DEBUG: MediaType = \"%s\"\n", header->MediaType);
-  fprintf(stderr, "DEBUG: OutputType = \"%s\"\n", header->OutputType);
-
-  fprintf(stderr, "DEBUG: AdvanceDistance = %d\n", header->AdvanceDistance);
-  fprintf(stderr, "DEBUG: AdvanceMedia = %d\n", header->AdvanceMedia);
-  fprintf(stderr, "DEBUG: Collate = %d\n", header->Collate);
-  fprintf(stderr, "DEBUG: CutMedia = %d\n", header->CutMedia);
   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: InsertSheet = %d\n", header->InsertSheet);
-  fprintf(stderr, "DEBUG: Jog = %d\n", header->Jog);
-  fprintf(stderr, "DEBUG: LeadingEdge = %d\n", header->LeadingEdge);
-  fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0],
-          header->Margins[1]);
+  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: MediaWeight = %d\n", header->MediaWeight);
-  fprintf(stderr, "DEBUG: MirrorPrint = %d\n", header->MirrorPrint);
-  fprintf(stderr, "DEBUG: NegativePrint = %d\n", header->NegativePrint);
   fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies);
   fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation);
-  fprintf(stderr, "DEBUG: OutputFaceUp = %d\n", header->OutputFaceUp);
-  fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0],
-          header->PageSize[1]);
-  fprintf(stderr, "DEBUG: Separations = %d\n", header->Separations);
-  fprintf(stderr, "DEBUG: TraySwitch = %d\n", header->TraySwitch);
-  fprintf(stderr, "DEBUG: Tumble = %d\n", header->Tumble);
+  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);
@@ -219,9 +184,6 @@ StartPage(ppd_file_t         *ppd,  /* I - PPD file */
   fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder);
   fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace);
   fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression);
-  fprintf(stderr, "DEBUG: cupsRowCount = %d\n", header->cupsRowCount);
-  fprintf(stderr, "DEBUG: cupsRowFeed = %d\n", header->cupsRowFeed);
-  fprintf(stderr, "DEBUG: cupsRowStep = %d\n", header->cupsRowStep);
 
   switch (ModelNumber)
   {
@@ -289,7 +251,7 @@ StartPage(ppd_file_t         *ppd,  /* I - PPD file */
        if ((choice = ppdFindMarkedChoice(ppd, "zePrintRate")) != NULL &&
            strcmp(choice->choice, "Default"))
        {
-         float val = atof(choice->choice);
+         double val = atof(choice->choice);
 
          if (val >= 3.0)
            printf("S%.0f\n", val);
@@ -302,13 +264,13 @@ StartPage(ppd_file_t         *ppd,        /* I - PPD file */
        */
 
         if (header->cupsCompression > 0 && header->cupsCompression <= 100)
-         printf("D%d\n", 15 * header->cupsCompression / 100);
+         printf("D%u\n", 15 * header->cupsCompression / 100);
 
        /*
         * Set label size...
        */
 
-        printf("q%d\n", (header->cupsWidth + 7) & ~7);
+        printf("q%u\n", (header->cupsWidth + 7) & ~7U);
         break;
 
     case ZEBRA_ZPL :
@@ -317,13 +279,13 @@ StartPage(ppd_file_t         *ppd,        /* I - PPD file */
        */
 
         if (header->cupsCompression > 0 && header->cupsCompression <= 100)
-         printf("~SD%02d\n", 30 * header->cupsCompression / 100);
+         printf("~SD%02u\n", 30 * header->cupsCompression / 100);
 
        /*
         * Start bitmap graphics...
        */
 
-        printf("~DGR:CUPS.GRF,%d,%d,\n",
+        printf("~DGR:CUPS.GRF,%u,%u,\n",
               header->cupsHeight * header->cupsBytesPerLine,
               header->cupsBytesPerLine);
 
@@ -344,8 +306,8 @@ StartPage(ppd_file_t         *ppd,  /* I - PPD file */
         printf("! 0 %u %u %u %u\r\n", header->HWResolution[0],
               header->HWResolution[1], header->cupsHeight,
               header->NumCopies);
-       printf("PAGE-WIDTH %d\r\n", header->cupsWidth);
-       printf("PAGE-HEIGHT %d\r\n", header->cupsWidth);
+       printf("PAGE-WIDTH %u\r\n", header->cupsWidth);
+       printf("PAGE-HEIGHT %u\r\n", header->cupsWidth);
         break;
 
     case INTELLITECH_PCL :
@@ -391,14 +353,15 @@ StartPage(ppd_file_t         *ppd,        /* I - PPD file */
              break;
 
           default : /* Custom size */
-             printf("\033!f%dZ", header->PageSize[1] * 300 / 72);
+             printf("\033!f%uZ", header->PageSize[1] * 300 / 72);
              break;
        }
 
-       printf("\033&l%dP",             /* Set page length */
+       printf("\033&l%uP",             /* Set page length */
                header->PageSize[1] / 12);
        printf("\033&l0E");             /* Set top margin to 0 */
-        printf("\033&l%dX", header->NumCopies);
+        if (header->NumCopies)
+         printf("\033&l%uX", header->NumCopies);
                                        /* Set number copies */
         printf("\033&l0L");            /* Turn off perforation skip */
 
@@ -409,11 +372,11 @@ StartPage(ppd_file_t         *ppd,        /* I - PPD file */
        if (Page == 1)
        {
           if (header->cupsRowFeed)     /* inPrintRate */
-           printf("\033!p%dS", header->cupsRowFeed);
+           printf("\033!p%uS", header->cupsRowFeed);
 
-          if (header->cupsCompression != ~0)
+          if (header->cupsCompression != ~0U)
                                        /* inPrintDensity */
-           printf("\033&d%dA", 30 * header->cupsCompression / 100 - 15);
+           printf("\033&d%uA", 30 * header->cupsCompression / 100 - 15);
 
          if ((choice = ppdFindMarkedChoice(ppd, "inPrintMode")) != NULL)
          {
@@ -424,14 +387,14 @@ StartPage(ppd_file_t         *ppd,        /* I - PPD file */
              fputs("\033!p1M", stdout);
 
               if (header->cupsRowCount)        /* inTearInterval */
-               printf("\033!n%dT", header->cupsRowCount);
+               printf("\033!n%uT", header->cupsRowCount);
             }
            else
            {
              fputs("\033!p2M", stdout);
 
               if (header->cupsRowStep) /* inCutInterval */
-               printf("\033!n%dC", header->cupsRowStep);
+               printf("\033!n%uC", header->cupsRowStep);
             }
          }
         }
@@ -440,12 +403,12 @@ StartPage(ppd_file_t         *ppd,        /* I - PPD file */
        * Setup graphics...
        */
 
-       printf("\033*t%dR", header->HWResolution[0]);
+       printf("\033*t%uR", header->HWResolution[0]);
                                        /* Set resolution */
 
-       printf("\033*r%dS", header->cupsWidth);
+       printf("\033*r%uS", header->cupsWidth);
                                        /* Set width */
-       printf("\033*r%dT", header->cupsHeight);
+       printf("\033*r%uT", header->cupsHeight);
                                        /* Set height */
 
        printf("\033&a0H");             /* Set horizontal position */
@@ -567,7 +530,7 @@ EndPage(ppd_file_t *ppd,            /* I - PPD file */
        */
 
        if (header->cupsRowStep != 200)
-         printf("^LT%u\n", header->cupsRowStep);
+         printf("^LT%d\n", header->cupsRowStep);
 
        /*
         * Set media type...
@@ -639,13 +602,6 @@ EndPage(ppd_file_t *ppd,           /* I - PPD file */
 
         puts("^IDR:CUPS.GRF^FS");
        puts("^XZ");
-
-       /*
-        * Free compression buffers...
-       */
-
-       free(CompBuffer);
-       free(LastBuffer);
         break;
 
     case ZEBRA_CPCL :
@@ -714,6 +670,18 @@ EndPage(ppd_file_t *ppd,           /* I - PPD file */
   */
 
   free(Buffer);
+
+  if (CompBuffer)
+  {
+    free(CompBuffer);
+    CompBuffer = NULL;
+  }
+
+  if (LastBuffer)
+  {
+    free(LastBuffer);
+    LastBuffer = NULL;
+  }
 }
 
 
@@ -741,17 +709,19 @@ CancelJob(int sig)                        /* I - Signal */
 void
 OutputLine(ppd_file_t         *ppd,    /* I - PPD file */
            cups_page_header2_t *header,        /* I - Page header */
-           int                y)       /* I - Line number */
+           unsigned           y)       /* I - Line number */
 {
-  int          i;                      /* Looping var */
+  unsigned     i;                      /* Looping var */
   unsigned char        *ptr;                   /* Pointer into buffer */
   unsigned char        *compptr;               /* Pointer into compression buffer */
-  char         repeat_char;            /* Repeated character */
-  int          repeat_count;           /* Number of repeated characters */
-  static const char *hex = "0123456789ABCDEF";
+  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 :
@@ -777,17 +747,6 @@ OutputLine(ppd_file_t         *ppd,        /* I - PPD file */
           putchar(0x16);
          fwrite(Buffer, header->cupsBytesPerLine, 1, stdout);
          fflush(stdout);
-
-#ifdef __sgi
-        /*
-          * This hack works around a bug in the IRIX serial port driver when
-         * run at high baud rates (e.g. 115200 baud)...  This results in
-         * slightly slower label printing, but at least the labels come
-         * out properly.
-         */
-
-         sginap(1);
-#endif /* __sgi */
        }
        else
           Feed ++;
@@ -919,14 +878,14 @@ OutputLine(ppd_file_t         *ppd,       /* I - PPD file */
 
 void
 PCLCompress(unsigned char *line,       /* I - Line to compress */
-            int           length)      /* I - Length of line */
+            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 */
-  int           count,                 /* Count of bytes for output */
+  unsigned     count,                  /* Count of bytes for output */
                offset;                 /* Offset of bytes for output */
 
 
@@ -956,7 +915,7 @@ PCLCompress(unsigned char *line,    /* I - Line to compress */
 
       offset = 0;
 
-      if ((count = line_end - line_ptr) > 8)
+      if ((count = (unsigned)(line_end - line_ptr)) > 8)
        count = 8;
 
       line_ptr += count;
@@ -977,7 +936,7 @@ PCLCompress(unsigned char *line,    /* I - Line to compress */
       if (line_ptr == line_end)
         break;
 
-      offset = line_ptr - start;
+      offset = (unsigned)(line_ptr - start);
 
      /*
       * Find up to 8 non-matching bytes...
@@ -1006,7 +965,7 @@ PCLCompress(unsigned char *line,   /* I - Line to compress */
       * Output multi-byte offset...
       */
 
-      *comp_ptr++ = ((count - 1) << 5) | 31;
+      *comp_ptr++ = (unsigned char)(((count - 1) << 5) | 31);
 
       offset -= 31;
       while (offset >= 255)
@@ -1015,7 +974,7 @@ PCLCompress(unsigned char *line,   /* I - Line to compress */
         offset    -= 255;
       }
 
-      *comp_ptr++ = offset;
+      *comp_ptr++ = (unsigned char)offset;
     }
     else
     {
@@ -1023,7 +982,7 @@ PCLCompress(unsigned char *line,   /* I - Line to compress */
       * Output single-byte offset...
       */
 
-      *comp_ptr++ = ((count - 1) << 5) | offset;
+      *comp_ptr++ = (unsigned char)(((count - 1) << 5) | offset);
     }
 
     memcpy(comp_ptr, start, count);
@@ -1035,7 +994,7 @@ PCLCompress(unsigned char *line,   /* I - Line to compress */
   */
 
   printf("\033*b%dW", (int)(comp_ptr - CompBuffer));
-  fwrite(CompBuffer, comp_ptr - CompBuffer, 1, stdout);
+  fwrite(CompBuffer, (size_t)(comp_ptr - CompBuffer), 1, stdout);
 
  /*
   * Save this line as a "seed" buffer for the next...
@@ -1051,8 +1010,8 @@ PCLCompress(unsigned char *line,  /* I - Line to compress */
  */
 
 void
-ZPLCompress(char repeat_char,          /* I - Character to repeat */
-           int  repeat_count)          /* I - Number of repeated characters */
+ZPLCompress(unsigned char repeat_char, /* I - Character to repeat */
+           unsigned      repeat_count) /* I - Number of repeated characters */
 {
   if (repeat_count > 1)
   {
@@ -1073,7 +1032,7 @@ ZPLCompress(char repeat_char,             /* I - Character to repeat */
 
     if (repeat_count >= 20)
     {
-      putchar('f' + repeat_count / 20);
+      putchar((int)('f' + repeat_count / 20));
       repeat_count %= 20;
     }
 
@@ -1082,14 +1041,14 @@ ZPLCompress(char repeat_char,           /* I - Character to repeat */
     */
 
     if (repeat_count > 0)
-      putchar('F' + repeat_count);
+      putchar((int)('F' + repeat_count));
   }
 
  /*
   * Then the character to be repeated...
   */
 
-  putchar(repeat_char);
+  putchar((int)repeat_char);
 }
 
 
@@ -1104,7 +1063,7 @@ main(int  argc,                           /* I - Number of command-line arguments */
   int                  fd;             /* File descriptor */
   cups_raster_t                *ras;           /* Raster stream for printing */
   cups_page_header2_t  header;         /* Page header from file */
-  int                  y;              /* Current line */
+  unsigned             y;              /* Current line */
   ppd_file_t           *ppd;           /* PPD file */
   int                  num_options;    /* Number of options */
   cups_option_t                *options;       /* Options */
@@ -1246,9 +1205,9 @@ main(int  argc,                           /* I - Number of command-line arguments */
       if ((y & 15) == 0)
       {
         _cupsLangPrintFilter(stderr, "INFO",
-                            _("Printing page %d, %d%% complete."),
+                            _("Printing page %d, %u%% complete."),
                             Page, 100 * y / header.cupsHeight);
-        fprintf(stderr, "ATTR: job-media-progress=%d\n",
+        fprintf(stderr, "ATTR: job-media-progress=%u\n",
                100 * y / header.cupsHeight);
       }
 
@@ -1308,5 +1267,5 @@ main(int  argc,                           /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: rastertolabel.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: rastertolabel.c 12945 2015-10-26 19:46:02Z msweet $".
  */
index 7011885..0388bf4 100644 (file)
@@ -1,21 +1,17 @@
 /*
- * "$Id: rastertopwg.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: rastertopwg.c 12945 2015-10-26 19:46:02Z msweet $"
  *
- *   CUPS raster to PWG raster format filter for CUPS.
+ * CUPS raster to PWG raster format filter for CUPS.
  *
- *   Copyright 2011 Apple Inc.
+ * Copyright 2011, 2014-2015 Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright law.
- *   Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright law.
+ * Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main() - Main entry for filter.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -41,9 +37,9 @@ main(int  argc,                               /* I - Number of command-line args */
                        *outras;        /* Output raster stream */
   cups_page_header2_t  inheader,       /* Input raster page header */
                        outheader;      /* Output raster page header */
-  int                  y;              /* Current line */
+  unsigned             y;              /* Current line */
   unsigned char                *line;          /* Line buffer */
-  int                  page = 0,       /* Current page */
+  unsigned             page = 0,       /* Current page */
                        page_width,     /* Actual page width */
                        page_height,    /* Actual page height */
                        page_top,       /* Top margin */
@@ -94,6 +90,29 @@ main(int  argc,                              /* I - Number of command-line args */
   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...
     */
 
@@ -101,18 +120,21 @@ main(int  argc,                           /* I - Number of command-line args */
 
     fprintf(stderr, "PAGE: %d %d\n", page, inheader.NumCopies);
 
-    page_width  = (int)(inheader.cupsPageSize[0] * inheader.HWResolution[0] /
-                        72.0);
-    page_height = (int)(inheader.cupsPageSize[1] * inheader.HWResolution[1] /
-                        72.0);
-    page_left   = (int)(inheader.cupsImagingBBox[0] *
-                        inheader.HWResolution[0] / 72.0);
-    page_bottom = (int)(inheader.cupsImagingBBox[1] *
-                        inheader.HWResolution[1] / 72.0);
+    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 :
@@ -192,14 +214,14 @@ main(int  argc,                           /* I - Number of command-line args */
                 sizeof(outheader.OutputType));
       else
       {
-        fprintf(stderr, "DEBUG: Unsupported print-content-type \"%s\".\n", val);
+        fputs("DEBUG: Unsupported print-content-optimize value.\n", stderr);
         outheader.OutputType[0] = '\0';
       }
     }
 
     if ((val = cupsGetOption("print-quality", num_options, options)) != NULL)
     {
-      int quality = atoi(val);         /* print-quality value */
+      unsigned quality = (unsigned)atoi(val);          /* print-quality value */
 
       if (quality >= IPP_QUALITY_DRAFT && quality <= IPP_QUALITY_HIGH)
        outheader.cupsInteger[8] = quality;
@@ -233,8 +255,7 @@ main(int  argc,                             /* I - Number of command-line args */
                 sizeof(outheader.cupsRenderingIntent));
       else
       {
-        fprintf(stderr, "DEBUG: Unsupported print-rendering-intent \"%s\".\n",
-                val);
+        fputs("DEBUG: Unsupported print-rendering-intent value.\n", stderr);
         outheader.cupsRenderingIntent[0] = '\0';
       }
     }
@@ -270,7 +291,7 @@ main(int  argc,                             /* I - Number of command-line args */
       {
         if (inheader.Tumble)
         {
-         outheader.cupsInteger[1] = -1;/* CrossFeedTransform */
+         outheader.cupsInteger[1] = ~0U;/* CrossFeedTransform */
          outheader.cupsInteger[2] = 1; /* FeedTransform */
 
          outheader.cupsInteger[3] = page_width - page_left -
@@ -286,7 +307,7 @@ main(int  argc,                             /* I - Number of command-line args */
         else
         {
          outheader.cupsInteger[1] = 1; /* CrossFeedTransform */
-         outheader.cupsInteger[2] = -1;/* FeedTransform */
+         outheader.cupsInteger[2] = ~0U;/* FeedTransform */
 
          outheader.cupsInteger[3] = page_left;
                                        /* ImageBoxLeft */
@@ -302,8 +323,8 @@ main(int  argc,                             /* I - Number of command-line args */
       {
         if (inheader.Tumble)
         {
-         outheader.cupsInteger[1] = -1;/* CrossFeedTransform */
-         outheader.cupsInteger[2] = -1;/* FeedTransform */
+         outheader.cupsInteger[1] = ~0U;/* CrossFeedTransform */
+         outheader.cupsInteger[2] = ~0U;/* FeedTransform */
 
          outheader.cupsInteger[3] = page_width - page_left -
                                     inheader.cupsWidth;
@@ -334,8 +355,8 @@ main(int  argc,                             /* I - Number of command-line args */
       {
         if (inheader.Tumble)
         {
-         outheader.cupsInteger[1] = -1;/* CrossFeedTransform */
-         outheader.cupsInteger[2] = -1;/* FeedTransform */
+         outheader.cupsInteger[1] = ~0U;/* CrossFeedTransform */
+         outheader.cupsInteger[2] = ~0U;/* FeedTransform */
 
          outheader.cupsInteger[3] = page_width - page_left -
                                     inheader.cupsWidth;
@@ -368,7 +389,7 @@ main(int  argc,                             /* I - Number of command-line args */
         * Unsupported value...
         */
 
-        fprintf(stderr, "DEBUG: Unsupported cupsBackSide \"%s\".\n", back->value);
+        fputs("DEBUG: Unsupported cupsBackSide value.\n", stderr);
 
        outheader.cupsInteger[1] = 1;   /* CrossFeedTransform */
        outheader.cupsInteger[2] = 1;   /* FeedTransform */
@@ -409,6 +430,9 @@ main(int  argc,                             /* I - Number of command-line args */
     * Copy raster data...
     */
 
+    if (linesize < inheader.cupsBytesPerLine)
+      linesize = inheader.cupsBytesPerLine;
+
     line = malloc(linesize);
 
     memset(line, white, linesize);
@@ -423,7 +447,14 @@ main(int  argc,                            /* I - Number of command-line args */
 
     for (y = inheader.cupsHeight; y > 0; y --)
     {
-      cupsRasterReadPixels(inras, line + lineoffset, inheader.cupsBytesPerLine);
+      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."));
@@ -457,5 +488,5 @@ main(int  argc,                             /* I - Number of command-line args */
 
 
 /*
- * End of "$Id: rastertopwg.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: rastertopwg.c 12945 2015-10-26 19:46:02Z msweet $".
  */
index b6bdcc4..89d7060 100644 (file)
@@ -1264,6 +1264,49 @@ http://www.vendor.com/help"
 *cupsIPPSupplies: False
 </pre>
 
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsJobAccountId'>cupsJobAccountId</a></h3>
+
+<p class='summary'>*cupsJobAccountId: boolean</p>
+
+<p>This keyword defines whether the printer accepts the job-account-id IPP attribute.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify the printer accepts the job-account-id IPP attribute.</em>
+*cupsJobAccountId: True
+</pre>
+
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsJobAccountingUserId'>cupsJobAccountingUserId</a></h3>
+
+<p class='summary'>*cupsJobAccountingUserId: boolean</p>
+
+<p>This keyword defines whether the printer accepts the job-accounting-user-id IPP attribute.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify the printer accepts the job-accounting-user-id IPP attribute.</em>
+*cupsJobAccountingUserId: True
+</pre>
+
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsJobPassword'>cupsJobPassword</a></h3>
+
+<p class='summary'>*cupsJobPassword: "format"</p>
+
+<p>This keyword defines the format of the job-password IPP attribute, if supported by the printer. Currently the only supported format is "1111" indicating a 4-digit PIN code.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify the printer supports 4-digit PIN codes.</em>
+*cupsJobPassword: "1111"
+</pre>
+
+
 <h3><span class='info'>CUPS 1.2/OS X 10.5</span><a name='cupsLanguages'>cupsLanguages</a></h3>
 
 <p class='summary'>*cupsLanguages: "locale list"</p>
@@ -1279,6 +1322,21 @@ list of locale names ("en", "en_US", "fr_CA", etc.)</p>
 *cupsLanguages: "en_CA en_UK en_US fr_CA fr_FR"
 </pre>
 
+
+<h3><span class='info'>CUPS 1.7/OS X 10.9</span><a name='cupsMandatory'>cupsMandatory</a></h3>
+
+<p class='summary'>*cupsMandatory: "attribute1 attribute2 ... attributeN"</p>
+
+<p>This keyword defines a list of IPP attributes that must be provided when submitting a print job creation request.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+<em>*% Specify that the user must supply a job-password</em>
+*cupsMandatory: "job-password job-password-encryption"
+</pre>
+
+
 <h3><a name='cupsManualCopies'>cupsManualCopies</a></h3>
 
 <p class='summary'>*cupsManualCopies: boolean</p>
@@ -1511,7 +1569,7 @@ PPD file extensions was used. Currently it must be the string
 
 <p class="summary">*JCLToPDFInterpreter: "JCL"</p>
 
-<p>This keyword provfides the JCL command to insert a PDF job file into a printer-ready data stream. The JCL command is added after the <tt>JCLBegin</tt> value and any commands for JCL options in the PPD file.</p>
+<p>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 <tt>JCLBegin</tt> value and any commands for JCL options in the PPD file.</p>
 
 <p>Example:</p>
 
@@ -1807,6 +1865,18 @@ the device.</p>
 
 <h2 class='title'><a name='HISTORY'>Change History</a></h2>
 
+<h3>Changes in CUPS 1.7</h3>
+
+<ul>
+
+       <li>Added <a href="#cupsJobAccountId"><tt>cupsJobAccountId</tt></a>,
+       <a href="#cupsJobAccountingUserId"><tt>cupsJobAccountingUserId</tt></a>,
+       <a href="#cupsJobPassword"><tt>cupsJobPassword</tt></a>,
+       <a href="#cupsMandatory"><tt>cupsMandatory</tt></a> keywords.</li>
+
+</ul>
+
+
 <h3>Changes in CUPS 1.6</h3>
 
 <ul>
index dc5dbe6..b2220b2 100644 (file)
@@ -1,27 +1,18 @@
 /*
- * "$Id: testraster.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testraster.c 12746 2015-06-24 13:28:36Z msweet $"
  *
- *   Raster test program routines for CUPS.
+ * Raster test program routines for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()            - Test the raster functions.
- *   do_ppd_tests()    - Test the default option commands in a PPD file.
- *   do_ps_tests()     - Test standard PostScript commands.
- *   do_ras_file()     - Test reading of a raster file.
- *   do_raster_tests() - Test reading and writing of raster data.
- *   print_changes()   - Print differences in the page header.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -29,6 +20,7 @@
  */
 
 #include <cups/raster-private.h>
+#include <math.h>
 
 
 /*
@@ -172,13 +164,12 @@ static cups_page_header2_t setpagedevice_header =
   1,                                   /* cupsRowFeed */
   1,                                   /* cupsRowStep */
   0,                                   /* cupsNumColors */
-  1.001                              /* cupsBorderlessScalingFactor */
-  { 612.0, 792.1 },                    /* cupsPageSize */
-  { 0.0, 0.0, 0.0, 0.0 },              /* cupsImagingBBox */
+  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.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, 10.1, 11.1, 12.1, 13.1,
-    14.1, 15.1, 16.1 },                        /* cupsReal[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 */
@@ -505,6 +496,8 @@ do_ras_file(const char *filename)   /* I - Filename */
     free(data);
   }
 
+  printf("EOF at %ld\n", (long)lseek(fd, SEEK_CUR, 0));
+
   cupsRasterClose(ras);
   close(fd);
 
@@ -519,7 +512,7 @@ do_ras_file(const char *filename)   /* I - Filename */
 static int                             /* O - Number of errors */
 do_raster_tests(cups_mode_t mode)      /* O - Write mode */
 {
-  int                  page, x, y;     /* Looping vars */
+  unsigned             page, x, y;     /* Looping vars */
   FILE                 *fp;            /* Raster file */
   cups_raster_t                *r;             /* Raster stream */
   cups_page_header2_t  header,         /* Page header */
@@ -610,7 +603,7 @@ do_raster_tests(cups_mode_t mode)   /* O - Write mode */
     else
     {
       for (x = 0; x < header.cupsBytesPerLine; x ++)
-       data[x] = x;
+       data[x] = (unsigned char)x;
 
       for (y = 0; y < 64; y ++)
        if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine))
@@ -636,7 +629,7 @@ do_raster_tests(cups_mode_t mode)   /* O - Write mode */
        else
        {
          for (x = 0; x < header.cupsBytesPerLine; x ++)
-           data[x] = x / 4;
+           data[x] = (unsigned char)(x / 4);
 
          for (y = 0; y < 64; y ++)
            if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine))
@@ -1020,22 +1013,21 @@ print_changes(
     printf("    cupsNumColors %d, expected %d\n", header->cupsNumColors,
            expected->cupsNumColors);
 
-  if (header->cupsBorderlessScalingFactor !=
-          expected->cupsBorderlessScalingFactor)
+  if (fabs(header->cupsBorderlessScalingFactor - expected->cupsBorderlessScalingFactor) > 0.001)
     printf("    cupsBorderlessScalingFactor %g, expected %g\n",
            header->cupsBorderlessScalingFactor,
            expected->cupsBorderlessScalingFactor);
 
-  if (header->cupsPageSize[0] != expected->cupsPageSize[0] ||
-      header->cupsPageSize[1] != expected->cupsPageSize[1])
+  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 (header->cupsImagingBBox[0] != expected->cupsImagingBBox[0] ||
-      header->cupsImagingBBox[1] != expected->cupsImagingBBox[1] ||
-      header->cupsImagingBBox[2] != expected->cupsImagingBBox[2] ||
-      header->cupsImagingBBox[3] != expected->cupsImagingBBox[3])
+  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],
@@ -1048,7 +1040,7 @@ print_changes(
              expected->cupsInteger[i]);
 
   for (i = 0; i < 16; i ++)
-    if (header->cupsReal[i] != expected->cupsReal[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]);
 
@@ -1074,5 +1066,5 @@ print_changes(
 
 
 /*
- * End of "$Id: testraster.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testraster.c 12746 2015-06-24 13:28:36Z msweet $".
  */
index 41d944e..956458f 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# "$Id$"
+# "$Id: install-sh 11025 2013-06-07 01:00:33Z msweet $"
 #
 # Install a program, script, or datafile.
 #
index 7a08bb2..29e13ce 100644 (file)
@@ -1,22 +1,16 @@
 checkpo.o: checkpo.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
 po2strings.o: po2strings.c ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h
 strings2po.o: strings2po.c
-translate.o: translate.c ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
index 22aca43..bd7185b 100644 (file)
@@ -1,23 +1,23 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12233 2014-10-25 00:03:02Z msweet $"
 #
-#   Locale file makefile for CUPS.
+# Locale file makefile for CUPS.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 1993-2007 by Easy Software Products.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1993-2007 by Easy Software Products.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 include ../Makedefs
 
 
-OBJS   =       checkpo.o po2strings.o strings2po.o translate.o
-TARGETS        =       checkpo po2strings strings2po translate
+OBJS   =       checkpo.o po2strings.o strings2po.o
+TARGETS        =       checkpo po2strings strings2po
 
 
 #
@@ -159,7 +159,7 @@ pot:        checkpo po2strings
 #
 
 checkpo:       checkpo.o ../cups/$(LIBCUPSSTATIC)
-       echo Linking $<...
+       echo Linking $@...
        $(CC) $(ARCHFLAGS) $(LDFLAGS) -o checkpo checkpo.o \
                ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
                $(COMMONLIBS) $(LIBZ)
@@ -178,7 +178,7 @@ checkall:   checkpo
 #
 
 po2strings:    po2strings.o ../cups/$(LIBCUPSSTATIC)
-       echo Linking $<...
+       echo Linking $@...
        $(CC) $(ARCHFLAGS) $(LDFLAGS) -o po2strings po2strings.o \
                ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
                $(COMMONLIBS) $(LIBZ)
@@ -192,25 +192,11 @@ po2strings:       po2strings.o ../cups/$(LIBCUPSSTATIC)
 #
 
 strings2po:    strings2po.o
-       echo Linking $<...
+       echo Linking $@...
        $(CC) $(ARCHFLAGS) $(LDFLAGS) -o strings2po strings2po.o
 
 
 #
-# translate - A simple utility which uses Google to translate the cups.pot
-#             file to one of several languages.
-#
-# translate outfile language
-#
-
-translate:     translate.o ../cups/$(LIBCUPSSTATIC)
-       echo Linking $<...
-       $(CC) $(ARCHFLAGS) $(LDFLAGS) -o translate translate.o \
-               ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \
-               $(COMMONLIBS) $(LIBZ)
-
-
-#
 # Dependencies...
 #
 
@@ -218,5 +204,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12233 2014-10-25 00:03:02Z msweet $".
 #
index 002e64f..14e74a2 100644 (file)
@@ -1,10 +1,10 @@
 /*
- * "$Id: checkpo.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: checkpo.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Verify that translations in the .po file have the same number and type of
  *   printf-style format strings.
  *
- *   Copyright 2007-2010 by Apple Inc.
+ *   Copyright 2007-2012 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -338,7 +338,7 @@ abbreviate(const char *s,           /* I - String to abbreviate */
   }
 
   if (*s)
-    strcpy(bufptr, "...");
+    memcpy(bufptr, "...", 4);
   else
     *bufptr = '\0';
 
@@ -409,5 +409,5 @@ free_formats(cups_array_t *fmts)    /* I - Array of format strings */
 
 
 /*
- * End of "$Id: checkpo.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: checkpo.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 275aef4..85dcb39 100644 (file)
@@ -1,16 +1,16 @@
 #
 # "$Id$"
 #
-#   Message catalog template for CUPS.
+# Message catalog template for CUPS.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 2005-2007 by Easy Software Products.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 2005-2007 by Easy Software Products.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 #
index dbeeec3..e6c5beb 100644 (file)
@@ -1,16 +1,16 @@
 #
 # "$Id$"
 #
-#   Message catalog template for CUPS.
+# Message catalog template for CUPS.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 2005-2007 by Easy Software Products.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 2005-2007 by Easy Software Products.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 #
@@ -30,7 +30,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 1.6\n"
 "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2013-07-08 07:38-0400\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -39,363 +39,363 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: systemv/lpstat.c:1992 systemv/lpstat.c:2117
+#: systemv/lpstat.c:1867 systemv/lpstat.c:1990
 msgid "\t\t(all)"
 msgstr ""
 
-#: systemv/lpstat.c:1995 systemv/lpstat.c:1998 systemv/lpstat.c:2120
-#: systemv/lpstat.c:2123
+#: systemv/lpstat.c:1870 systemv/lpstat.c:1873 systemv/lpstat.c:1993
+#: systemv/lpstat.c:1996
 msgid "\t\t(none)"
 msgstr ""
 
-#: berkeley/lpc.c:434
+#: berkeley/lpc.c:426
 #, c-format
 msgid "\t%d entries"
 msgstr ""
 
-#: systemv/lpstat.c:841 systemv/lpstat.c:857
+#: systemv/lpstat.c:783 systemv/lpstat.c:799
 #, c-format
 msgid "\t%s"
 msgstr ""
 
-#: systemv/lpstat.c:1973 systemv/lpstat.c:2098
+#: systemv/lpstat.c:1848 systemv/lpstat.c:1971
 msgid "\tAfter fault: continue"
 msgstr ""
 
-#: systemv/lpstat.c:1591 systemv/lpstat.c:1942 systemv/lpstat.c:2068
+#: systemv/lpstat.c:1471 systemv/lpstat.c:1817 systemv/lpstat.c:1941
 #, c-format
 msgid "\tAlerts: %s"
 msgstr ""
 
-#: systemv/lpstat.c:1996 systemv/lpstat.c:2121
+#: systemv/lpstat.c:1871 systemv/lpstat.c:1994
 msgid "\tBanner required"
 msgstr ""
 
-#: systemv/lpstat.c:1997 systemv/lpstat.c:2122
+#: systemv/lpstat.c:1872 systemv/lpstat.c:1995
 msgid "\tCharset sets:"
 msgstr ""
 
-#: systemv/lpstat.c:1961 systemv/lpstat.c:2086
+#: systemv/lpstat.c:1836 systemv/lpstat.c:1959
 msgid "\tConnection: direct"
 msgstr ""
 
-#: systemv/lpstat.c:1952 systemv/lpstat.c:2078
+#: systemv/lpstat.c:1827 systemv/lpstat.c:1951
 msgid "\tConnection: remote"
 msgstr ""
 
-#: systemv/lpstat.c:1916 systemv/lpstat.c:2042
+#: systemv/lpstat.c:1793 systemv/lpstat.c:1917
 msgid "\tContent types: any"
 msgstr ""
 
-#: systemv/lpstat.c:2000 systemv/lpstat.c:2125
+#: systemv/lpstat.c:1875 systemv/lpstat.c:1998
 msgid "\tDefault page size:"
 msgstr ""
 
-#: systemv/lpstat.c:1999 systemv/lpstat.c:2124
+#: systemv/lpstat.c:1874 systemv/lpstat.c:1997
 msgid "\tDefault pitch:"
 msgstr ""
 
-#: systemv/lpstat.c:2001 systemv/lpstat.c:2126
+#: systemv/lpstat.c:1876 systemv/lpstat.c:1999
 msgid "\tDefault port settings:"
 msgstr ""
 
-#: systemv/lpstat.c:1922 systemv/lpstat.c:2048
+#: systemv/lpstat.c:1799 systemv/lpstat.c:1923
 #, c-format
 msgid "\tDescription: %s"
 msgstr ""
 
-#: systemv/lpstat.c:1915 systemv/lpstat.c:2041
+#: systemv/lpstat.c:1792 systemv/lpstat.c:1916
 msgid "\tForm mounted:"
 msgstr ""
 
-#: systemv/lpstat.c:1994 systemv/lpstat.c:2119
+#: systemv/lpstat.c:1869 systemv/lpstat.c:1992
 msgid "\tForms allowed:"
 msgstr ""
 
-#: systemv/lpstat.c:1956 systemv/lpstat.c:2082
+#: systemv/lpstat.c:1831 systemv/lpstat.c:1955
 #, c-format
 msgid "\tInterface: %s.ppd"
 msgstr ""
 
-#: systemv/lpstat.c:1965 systemv/lpstat.c:2090
+#: systemv/lpstat.c:1840 systemv/lpstat.c:1963
 #, c-format
 msgid "\tInterface: %s/interfaces/%s"
 msgstr ""
 
-#: systemv/lpstat.c:1969 systemv/lpstat.c:2094
+#: systemv/lpstat.c:1844 systemv/lpstat.c:1967
 #, c-format
 msgid "\tInterface: %s/ppd/%s.ppd"
 msgstr ""
 
-#: systemv/lpstat.c:1947 systemv/lpstat.c:2073
+#: systemv/lpstat.c:1822 systemv/lpstat.c:1946
 #, c-format
 msgid "\tLocation: %s"
 msgstr ""
 
-#: systemv/lpstat.c:1972 systemv/lpstat.c:2097
+#: systemv/lpstat.c:1847 systemv/lpstat.c:1970
 msgid "\tOn fault: no alert"
 msgstr ""
 
-#: systemv/lpstat.c:1917 systemv/lpstat.c:2043
+#: systemv/lpstat.c:1794 systemv/lpstat.c:1918
 msgid "\tPrinter types: unknown"
 msgstr ""
 
-#: systemv/lpstat.c:1572
+#: systemv/lpstat.c:1454
 #, c-format
 msgid "\tStatus: %s"
 msgstr ""
 
-#: systemv/lpstat.c:1977 systemv/lpstat.c:1991 systemv/lpstat.c:2102
-#: systemv/lpstat.c:2116
+#: systemv/lpstat.c:1852 systemv/lpstat.c:1866 systemv/lpstat.c:1975
+#: systemv/lpstat.c:1989
 msgid "\tUsers allowed:"
 msgstr ""
 
-#: systemv/lpstat.c:1984 systemv/lpstat.c:2109
+#: systemv/lpstat.c:1859 systemv/lpstat.c:1982
 msgid "\tUsers denied:"
 msgstr ""
 
-#: berkeley/lpc.c:436
+#: berkeley/lpc.c:428
 msgid "\tdaemon present"
 msgstr ""
 
-#: berkeley/lpc.c:432
+#: berkeley/lpc.c:424
 msgid "\tno entries"
 msgstr ""
 
-#: berkeley/lpc.c:404 berkeley/lpc.c:416
+#: berkeley/lpc.c:396 berkeley/lpc.c:408
 #, c-format
 msgid "\tprinter is on device '%s' speed -1"
 msgstr ""
 
-#: berkeley/lpc.c:429
+#: berkeley/lpc.c:421
 msgid "\tprinting is disabled"
 msgstr ""
 
-#: berkeley/lpc.c:427
+#: berkeley/lpc.c:419
 msgid "\tprinting is enabled"
 msgstr ""
 
-#: systemv/lpstat.c:1594
+#: systemv/lpstat.c:1474
 #, c-format
 msgid "\tqueued for %s"
 msgstr ""
 
-#: berkeley/lpc.c:424
+#: berkeley/lpc.c:416
 msgid "\tqueuing is disabled"
 msgstr ""
 
-#: berkeley/lpc.c:422
+#: berkeley/lpc.c:414
 msgid "\tqueuing is enabled"
 msgstr ""
 
-#: systemv/lpstat.c:1908 systemv/lpstat.c:2034
+#: systemv/lpstat.c:1785 systemv/lpstat.c:1909
 msgid "\treason unknown"
 msgstr ""
 
-#: systemv/cupstestppd.c:454
+#: systemv/cupstestppd.c:434
 msgid ""
 "\n"
 "    DETAILED CONFORMANCE TEST RESULTS"
 msgstr ""
 
-#: systemv/cupstestppd.c:3800
+#: systemv/cupstestppd.c:3864
 msgid "                          Ignore specific warnings."
 msgstr ""
 
-#: systemv/cupstestppd.c:3804
+#: systemv/cupstestppd.c:3868
 msgid "                          Issue warnings instead of errors."
 msgstr ""
 
-#: systemv/cupstestppd.c:410 systemv/cupstestppd.c:415
+#: systemv/cupstestppd.c:390 systemv/cupstestppd.c:395
 msgid "                REF: Page 15, section 3.1."
 msgstr ""
 
-#: systemv/cupstestppd.c:405
+#: systemv/cupstestppd.c:385
 msgid "                REF: Page 15, section 3.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:425
+#: systemv/cupstestppd.c:405
 msgid "                REF: Page 19, section 3.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:378
+#: systemv/cupstestppd.c:358
 msgid "                REF: Page 20, section 3.4."
 msgstr ""
 
-#: systemv/cupstestppd.c:430
+#: systemv/cupstestppd.c:410
 msgid "                REF: Page 27, section 3.5."
 msgstr ""
 
-#: systemv/cupstestppd.c:373
+#: systemv/cupstestppd.c:353
 msgid "                REF: Page 42, section 5.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:420
+#: systemv/cupstestppd.c:400
 msgid "                REF: Pages 16-17, section 3.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:390
+#: systemv/cupstestppd.c:370
 msgid "                REF: Pages 42-45, section 5.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:384
+#: systemv/cupstestppd.c:364
 msgid "                REF: Pages 45-46, section 5.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:395
+#: systemv/cupstestppd.c:375
 msgid "                REF: Pages 48-49, section 5.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:400
+#: systemv/cupstestppd.c:380
 msgid "                REF: Pages 52-54, section 5.2."
 msgstr ""
 
-#: berkeley/lpq.c:559
+#: berkeley/lpq.c:528
 #, c-format
 msgid "        %-39.39s %.0f bytes"
 msgstr ""
 
-#: systemv/cupstestppd.c:589
+#: systemv/cupstestppd.c:569
 #, c-format
 msgid "        PASS    Default%s"
 msgstr ""
 
-#: systemv/cupstestppd.c:524
+#: systemv/cupstestppd.c:504
 msgid "        PASS    DefaultImageableArea"
 msgstr ""
 
-#: systemv/cupstestppd.c:558
+#: systemv/cupstestppd.c:538
 msgid "        PASS    DefaultPaperDimension"
 msgstr ""
 
-#: systemv/cupstestppd.c:631
+#: systemv/cupstestppd.c:611
 msgid "        PASS    FileVersion"
 msgstr ""
 
-#: systemv/cupstestppd.c:675
+#: systemv/cupstestppd.c:655
 msgid "        PASS    FormatVersion"
 msgstr ""
 
-#: systemv/cupstestppd.c:695
+#: systemv/cupstestppd.c:675
 msgid "        PASS    LanguageEncoding"
 msgstr ""
 
-#: systemv/cupstestppd.c:715
+#: systemv/cupstestppd.c:695
 msgid "        PASS    LanguageVersion"
 msgstr ""
 
-#: systemv/cupstestppd.c:769
+#: systemv/cupstestppd.c:749
 msgid "        PASS    Manufacturer"
 msgstr ""
 
-#: systemv/cupstestppd.c:809
+#: systemv/cupstestppd.c:789
 msgid "        PASS    ModelName"
 msgstr ""
 
-#: systemv/cupstestppd.c:829
+#: systemv/cupstestppd.c:809
 msgid "        PASS    NickName"
 msgstr ""
 
-#: systemv/cupstestppd.c:889
+#: systemv/cupstestppd.c:869
 msgid "        PASS    PCFileName"
 msgstr ""
 
-#: systemv/cupstestppd.c:964
+#: systemv/cupstestppd.c:944
 msgid "        PASS    PSVersion"
 msgstr ""
 
-#: systemv/cupstestppd.c:869
+#: systemv/cupstestppd.c:849
 msgid "        PASS    PageRegion"
 msgstr ""
 
-#: systemv/cupstestppd.c:849
+#: systemv/cupstestppd.c:829
 msgid "        PASS    PageSize"
 msgstr ""
 
-#: systemv/cupstestppd.c:924
+#: systemv/cupstestppd.c:904
 msgid "        PASS    Product"
 msgstr ""
 
-#: systemv/cupstestppd.c:999
+#: systemv/cupstestppd.c:979
 msgid "        PASS    ShortNickName"
 msgstr ""
 
-#: systemv/cupstestppd.c:1374
+#: systemv/cupstestppd.c:1354
 #, c-format
 msgid "        WARN    %s has no corresponding options."
 msgstr ""
 
-#: systemv/cupstestppd.c:1486
+#: systemv/cupstestppd.c:1466
 #, c-format
 msgid ""
 "        WARN    %s shares a common prefix with %s\n"
 "                REF: Page 15, section 3.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:1345
+#: systemv/cupstestppd.c:1325
 #, 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:1744
+#: systemv/cupstestppd.c:1724
 msgid "        WARN    File contains a mix of CR, LF, and CR LF line endings."
 msgstr ""
 
-#: systemv/cupstestppd.c:1390
+#: systemv/cupstestppd.c:1370
 msgid ""
 "        WARN    LanguageEncoding required by PPD 4.3 spec.\n"
 "                REF: Pages 56-57, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1726
+#: systemv/cupstestppd.c:1706
 #, c-format
 msgid "        WARN    Line %d only contains whitespace."
 msgstr ""
 
-#: systemv/cupstestppd.c:1398
+#: systemv/cupstestppd.c:1378
 msgid ""
 "        WARN    Manufacturer required by PPD 4.3 spec.\n"
 "                REF: Pages 58-59, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1749
+#: systemv/cupstestppd.c:1729
 msgid "        WARN    Non-Windows PPD files should use lines ending with only LF, not CR LF."
 msgstr ""
 
-#: systemv/cupstestppd.c:1382
+#: systemv/cupstestppd.c:1362
 #, c-format
 msgid ""
 "        WARN    Obsolete PPD version %.1f.\n"
 "                REF: Page 42, section 5.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:1413
+#: systemv/cupstestppd.c:1393
 msgid ""
 "        WARN    PCFileName longer than 8.3 in violation of PPD spec.\n"
 "                REF: Pages 61-62, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1421
+#: systemv/cupstestppd.c:1401
 msgid ""
 "        WARN    PCFileName should contain a unique filename.\n"
 "                REF: Pages 61-62, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1456
+#: systemv/cupstestppd.c:1436
 msgid ""
 "        WARN    Protocols contains PJL but JCL attributes are not set.\n"
 "                REF: Pages 78-79, section 5.7."
 msgstr ""
 
-#: systemv/cupstestppd.c:1447
+#: systemv/cupstestppd.c:1427
 msgid ""
 "        WARN    Protocols contains both PJL and BCP; expected TBCP.\n"
 "                REF: Pages 78-79, section 5.7."
 msgstr ""
 
-#: systemv/cupstestppd.c:1430
+#: systemv/cupstestppd.c:1410
 msgid ""
 "        WARN    ShortNickName required by PPD 4.3 spec.\n"
 "                REF: Pages 64-65, section 5.3."
@@ -409,376 +409,376 @@ msgstr ""
 msgid "       cupstestdsc [options] -"
 msgstr ""
 
-#: systemv/cupstestppd.c:3795
+#: systemv/cupstestppd.c:3859
 msgid "       program | cupstestppd [options] -"
 msgstr ""
 
-#: systemv/cupstestppd.c:3727
+#: systemv/cupstestppd.c:3791
 #, c-format
 msgid ""
 "      %s  \"%s %s\" conflicts with \"%s %s\"\n"
 "                (constraint=\"%s %s %s %s\")."
 msgstr ""
 
-#: systemv/cupstestppd.c:2248
+#: systemv/cupstestppd.c:2228
 #, c-format
 msgid "      %s  %s %s does not exist."
 msgstr ""
 
-#: systemv/cupstestppd.c:3884
+#: systemv/cupstestppd.c:3948
 #, c-format
 msgid "      %s  %s file \"%s\" has the wrong capitalization."
 msgstr ""
 
-#: systemv/cupstestppd.c:2318
+#: systemv/cupstestppd.c:2298
 #, c-format
 msgid ""
 "      %s  Bad %s choice %s.\n"
 "                REF: Page 122, section 5.17"
 msgstr ""
 
-#: systemv/cupstestppd.c:3487 systemv/cupstestppd.c:3536
-#: systemv/cupstestppd.c:3575
+#: systemv/cupstestppd.c:3551 systemv/cupstestppd.c:3600
+#: systemv/cupstestppd.c:3639
 #, c-format
 msgid "      %s  Bad UTF-8 \"%s\" translation string for option %s, choice %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:3441
+#: systemv/cupstestppd.c:3505
 #, c-format
 msgid "      %s  Bad UTF-8 \"%s\" translation string for option %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:2389
+#: systemv/cupstestppd.c:2369 systemv/cupstestppd.c:2391
 #, c-format
 msgid "      %s  Bad cupsFilter value \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:2475
+#: systemv/cupstestppd.c:2487 systemv/cupstestppd.c:2509
 #, c-format
 msgid "      %s  Bad cupsFilter2 value \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:2964
+#: systemv/cupstestppd.c:3008
 #, c-format
 msgid "      %s  Bad cupsICCProfile %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:2571
+#: systemv/cupstestppd.c:2615
 #, c-format
 msgid "      %s  Bad cupsPreFilter value \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:1822
+#: systemv/cupstestppd.c:1802
 #, c-format
 msgid "      %s  Bad cupsUIConstraints %s: \"%s\""
 msgstr ""
 
-#: systemv/cupstestppd.c:3391
+#: systemv/cupstestppd.c:3455
 #, c-format
 msgid "      %s  Bad language \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:2433 systemv/cupstestppd.c:2529
-#: systemv/cupstestppd.c:2615 systemv/cupstestppd.c:2673
-#: systemv/cupstestppd.c:2728 systemv/cupstestppd.c:2783
-#: systemv/cupstestppd.c:2838 systemv/cupstestppd.c:2891
-#: systemv/cupstestppd.c:3013
+#: systemv/cupstestppd.c:2445 systemv/cupstestppd.c:2573
+#: systemv/cupstestppd.c:2659 systemv/cupstestppd.c:2717
+#: systemv/cupstestppd.c:2772 systemv/cupstestppd.c:2827
+#: systemv/cupstestppd.c:2882 systemv/cupstestppd.c:2935
+#: systemv/cupstestppd.c:3057
 #, c-format
 msgid "      %s  Bad permissions on %s file \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:2373 systemv/cupstestppd.c:2459
-#: systemv/cupstestppd.c:2555 systemv/cupstestppd.c:2642
-#: systemv/cupstestppd.c:2697 systemv/cupstestppd.c:2752
-#: systemv/cupstestppd.c:2807 systemv/cupstestppd.c:2862
+#: systemv/cupstestppd.c:2353 systemv/cupstestppd.c:2471
+#: systemv/cupstestppd.c:2599 systemv/cupstestppd.c:2686
+#: systemv/cupstestppd.c:2741 systemv/cupstestppd.c:2796
+#: systemv/cupstestppd.c:2851 systemv/cupstestppd.c:2906
 #, c-format
 msgid "      %s  Bad spelling of %s - should be %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:2907
+#: systemv/cupstestppd.c:2951
 #, c-format
 msgid "      %s  Cannot provide both APScanAppPath and APScanAppBundleID."
 msgstr ""
 
-#: systemv/cupstestppd.c:2205
+#: systemv/cupstestppd.c:2185
 #, c-format
 msgid "      %s  Default choices conflicting."
 msgstr ""
 
-#: systemv/cupstestppd.c:1803
+#: systemv/cupstestppd.c:1783
 #, c-format
 msgid "      %s  Empty cupsUIConstraints %s"
 msgstr ""
 
-#: systemv/cupstestppd.c:3519 systemv/cupstestppd.c:3559
+#: systemv/cupstestppd.c:3583 systemv/cupstestppd.c:3623
 #, c-format
 msgid "      %s  Missing \"%s\" translation string for option %s, choice %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:3427
+#: systemv/cupstestppd.c:3491
 #, c-format
 msgid "      %s  Missing \"%s\" translation string for option %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:2418 systemv/cupstestppd.c:2514
-#: systemv/cupstestppd.c:2600 systemv/cupstestppd.c:2658
-#: systemv/cupstestppd.c:2713 systemv/cupstestppd.c:2768
-#: systemv/cupstestppd.c:2823 systemv/cupstestppd.c:2875
-#: systemv/cupstestppd.c:2998
+#: systemv/cupstestppd.c:2430 systemv/cupstestppd.c:2558
+#: systemv/cupstestppd.c:2644 systemv/cupstestppd.c:2702
+#: systemv/cupstestppd.c:2757 systemv/cupstestppd.c:2812
+#: systemv/cupstestppd.c:2867 systemv/cupstestppd.c:2919
+#: systemv/cupstestppd.c:3042
 #, c-format
 msgid "      %s  Missing %s file \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:3121
+#: systemv/cupstestppd.c:3165
 #, c-format
 msgid ""
 "      %s  Missing REQUIRED PageRegion option.\n"
 "                REF: Page 100, section 5.14."
 msgstr ""
 
-#: systemv/cupstestppd.c:3106
+#: systemv/cupstestppd.c:3150
 #, c-format
 msgid ""
 "      %s  Missing REQUIRED PageSize option.\n"
 "                REF: Page 99, section 5.14."
 msgstr ""
 
-#: systemv/cupstestppd.c:2013 systemv/cupstestppd.c:2054
+#: systemv/cupstestppd.c:1993 systemv/cupstestppd.c:2034
 #, c-format
 msgid "      %s  Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:1908
+#: systemv/cupstestppd.c:1888
 #, c-format
 msgid "      %s  Missing choice *%s %s in cupsUIConstraints %s: \"%s\""
 msgstr ""
 
-#: systemv/cupstestppd.c:1840
+#: systemv/cupstestppd.c:1820
 #, c-format
 msgid "      %s  Missing cupsUIResolver %s"
 msgstr ""
 
-#: systemv/cupstestppd.c:1999 systemv/cupstestppd.c:2040
+#: systemv/cupstestppd.c:1979 systemv/cupstestppd.c:2020
 #, c-format
 msgid "      %s  Missing option %s in UIConstraints \"*%s %s *%s %s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:1892
+#: systemv/cupstestppd.c:1872
 #, c-format
 msgid "      %s  Missing option %s in cupsUIConstraints %s: \"%s\""
 msgstr ""
 
-#: systemv/cupstestppd.c:3613
+#: systemv/cupstestppd.c:3677
 #, c-format
 msgid "      %s  No base translation \"%s\" is included in file."
 msgstr ""
 
-#: systemv/cupstestppd.c:2294
+#: systemv/cupstestppd.c:2274
 #, c-format
 msgid ""
 "      %s  REQUIRED %s does not define choice None.\n"
 "                REF: Page 122, section 5.17"
 msgstr ""
 
-#: systemv/cupstestppd.c:3180 systemv/cupstestppd.c:3194
+#: systemv/cupstestppd.c:3224 systemv/cupstestppd.c:3238
 #, c-format
 msgid "      %s  Size \"%s\" defined for %s but not for %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:3160
+#: systemv/cupstestppd.c:3204
 #, c-format
 msgid "      %s  Size \"%s\" has unexpected dimensions (%gx%g)."
 msgstr ""
 
-#: systemv/cupstestppd.c:3332
+#: systemv/cupstestppd.c:3395
 #, c-format
 msgid "      %s  Size \"%s\" should be \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:3292
+#: systemv/cupstestppd.c:3344
 #, c-format
 msgid "      %s  Size \"%s\" should be the Adobe standard name \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:3041
+#: systemv/cupstestppd.c:3085
 #, c-format
 msgid "      %s  cupsICCProfile %s hash value collides with %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:1963
+#: systemv/cupstestppd.c:1943
 #, c-format
 msgid "      %s  cupsUIResolver %s causes a loop."
 msgstr ""
 
-#: systemv/cupstestppd.c:1945
+#: systemv/cupstestppd.c:1925
 #, c-format
 msgid "      %s  cupsUIResolver %s does not list at least two different options."
 msgstr ""
 
-#: systemv/cupstestppd.c:1168
+#: systemv/cupstestppd.c:1148
 #, c-format
 msgid ""
 "      **FAIL**  %s must be 1284DeviceID\n"
 "                REF: Page 72, section 5.5"
 msgstr ""
 
-#: systemv/cupstestppd.c:580
+#: systemv/cupstestppd.c:560
 #, c-format
 msgid ""
 "      **FAIL**  Bad Default%s %s\n"
 "                REF: Page 40, section 4.5."
 msgstr ""
 
-#: systemv/cupstestppd.c:514
+#: systemv/cupstestppd.c:494
 #, c-format
 msgid ""
 "      **FAIL**  Bad DefaultImageableArea %s\n"
 "                REF: Page 102, section 5.15."
 msgstr ""
 
-#: systemv/cupstestppd.c:550
+#: systemv/cupstestppd.c:530
 #, c-format
 msgid ""
 "      **FAIL**  Bad DefaultPaperDimension %s\n"
 "                REF: Page 103, section 5.15."
 msgstr ""
 
-#: systemv/cupstestppd.c:623
+#: systemv/cupstestppd.c:603
 #, c-format
 msgid ""
 "      **FAIL**  Bad FileVersion \"%s\"\n"
 "                REF: Page 56, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:667
+#: systemv/cupstestppd.c:647
 #, c-format
 msgid ""
 "      **FAIL**  Bad FormatVersion \"%s\"\n"
 "                REF: Page 56, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1025
+#: systemv/cupstestppd.c:1005
 msgid ""
 "      **FAIL**  Bad JobPatchFile attribute in file\n"
 "                REF: Page 24, section 3.4."
 msgstr ""
 
-#: systemv/cupstestppd.c:1213
+#: systemv/cupstestppd.c:1193
 #, c-format
 msgid "      **FAIL**  Bad LanguageEncoding %s - must be ISOLatin1."
 msgstr ""
 
-#: systemv/cupstestppd.c:1227
+#: systemv/cupstestppd.c:1207
 #, c-format
 msgid "      **FAIL**  Bad LanguageVersion %s - must be English."
 msgstr ""
 
-#: systemv/cupstestppd.c:743 systemv/cupstestppd.c:760
+#: systemv/cupstestppd.c:723 systemv/cupstestppd.c:740
 #, c-format
 msgid ""
 "      **FAIL**  Bad Manufacturer (should be \"%s\")\n"
 "                REF: Page 211, table D.1."
 msgstr ""
 
-#: systemv/cupstestppd.c:800
+#: systemv/cupstestppd.c:780
 #, c-format
 msgid ""
 "      **FAIL**  Bad ModelName - \"%c\" not allowed in string.\n"
 "                REF: Pages 59-60, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:956
+#: systemv/cupstestppd.c:936
 msgid ""
 "      **FAIL**  Bad PSVersion - not \"(string) int\".\n"
 "                REF: Pages 62-64, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:917
+#: systemv/cupstestppd.c:897
 msgid ""
 "      **FAIL**  Bad Product - not \"(string)\".\n"
 "                REF: Page 62, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:991
+#: systemv/cupstestppd.c:971
 msgid ""
 "      **FAIL**  Bad ShortNickName - longer than 31 chars.\n"
 "                REF: Pages 64-65, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1149
+#: systemv/cupstestppd.c:1129
 #, c-format
 msgid ""
 "      **FAIL**  Bad option %s choice %s\n"
 "                REF: Page 84, section 5.9"
 msgstr ""
 
-#: systemv/cupstestppd.c:3754 systemv/cupstestppd.c:3776
+#: systemv/cupstestppd.c:3818 systemv/cupstestppd.c:3840
 #, c-format
 msgid "      **FAIL**  Default option code cannot be interpreted: %s"
 msgstr ""
 
-#: systemv/cupstestppd.c:1286
+#: systemv/cupstestppd.c:1266
 #, c-format
 msgid "      **FAIL**  Default translation string for option %s choice %s contains 8-bit characters."
 msgstr ""
 
-#: systemv/cupstestppd.c:1259
+#: systemv/cupstestppd.c:1239
 #, c-format
 msgid "      **FAIL**  Default translation string for option %s contains 8-bit characters."
 msgstr ""
 
-#: systemv/cupstestppd.c:2101
+#: systemv/cupstestppd.c:2081
 #, c-format
 msgid "      **FAIL**  Group names %s and %s differ only by case."
 msgstr ""
 
-#: systemv/cupstestppd.c:2146
+#: systemv/cupstestppd.c:2126
 #, c-format
 msgid "      **FAIL**  Multiple occurrences of option %s choice name %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:2163
+#: systemv/cupstestppd.c:2143
 #, c-format
 msgid "      **FAIL**  Option %s choice names %s and %s differ only by case."
 msgstr ""
 
-#: systemv/cupstestppd.c:2123
+#: systemv/cupstestppd.c:2103
 #, c-format
 msgid "      **FAIL**  Option names %s and %s differ only by case."
 msgstr ""
 
-#: systemv/cupstestppd.c:600
+#: systemv/cupstestppd.c:580
 #, c-format
 msgid ""
 "      **FAIL**  REQUIRED Default%s\n"
 "                REF: Page 40, section 4.5."
 msgstr ""
 
-#: systemv/cupstestppd.c:499
+#: systemv/cupstestppd.c:479
 msgid ""
 "      **FAIL**  REQUIRED DefaultImageableArea\n"
 "                REF: Page 102, section 5.15."
 msgstr ""
 
-#: systemv/cupstestppd.c:535
+#: systemv/cupstestppd.c:515
 msgid ""
 "      **FAIL**  REQUIRED DefaultPaperDimension\n"
 "                REF: Page 103, section 5.15."
 msgstr ""
 
-#: systemv/cupstestppd.c:641
+#: systemv/cupstestppd.c:621
 msgid ""
 "      **FAIL**  REQUIRED FileVersion\n"
 "                REF: Page 56, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:685
+#: systemv/cupstestppd.c:665
 msgid ""
 "      **FAIL**  REQUIRED FormatVersion\n"
 "                REF: Page 56, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1076
+#: systemv/cupstestppd.c:1056
 #, c-format
 msgid ""
 "      **FAIL**  REQUIRED ImageableArea for PageSize %s\n"
@@ -786,68 +786,68 @@ msgid ""
 "                REF: Page 102, section 5.15."
 msgstr ""
 
-#: systemv/cupstestppd.c:705
+#: systemv/cupstestppd.c:685
 msgid ""
 "      **FAIL**  REQUIRED LanguageEncoding\n"
 "                REF: Pages 56-57, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:725
+#: systemv/cupstestppd.c:705
 msgid ""
 "      **FAIL**  REQUIRED LanguageVersion\n"
 "                REF: Pages 57-58, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:779
+#: systemv/cupstestppd.c:759
 msgid ""
 "      **FAIL**  REQUIRED Manufacturer\n"
 "                REF: Pages 58-59, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:819
+#: systemv/cupstestppd.c:799
 msgid ""
 "      **FAIL**  REQUIRED ModelName\n"
 "                REF: Pages 59-60, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:839
+#: systemv/cupstestppd.c:819
 msgid ""
 "      **FAIL**  REQUIRED NickName\n"
 "                REF: Page 60, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:899
+#: systemv/cupstestppd.c:879
 msgid ""
 "      **FAIL**  REQUIRED PCFileName\n"
 "                REF: Pages 61-62, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:974
+#: systemv/cupstestppd.c:954
 msgid ""
 "      **FAIL**  REQUIRED PSVersion\n"
 "                REF: Pages 62-64, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:879
+#: systemv/cupstestppd.c:859
 msgid ""
 "      **FAIL**  REQUIRED PageRegion\n"
 "                REF: Page 100, section 5.14."
 msgstr ""
 
-#: systemv/cupstestppd.c:1045
+#: systemv/cupstestppd.c:1025
 msgid ""
 "      **FAIL**  REQUIRED PageSize\n"
 "                REF: Page 41, section 5.\n"
 "                REF: Page 99, section 5.14."
 msgstr ""
 
-#: systemv/cupstestppd.c:859
+#: systemv/cupstestppd.c:839
 msgid ""
 "      **FAIL**  REQUIRED PageSize\n"
 "                REF: Pages 99-100, section 5.14."
 msgstr ""
 
-#: systemv/cupstestppd.c:1098
+#: systemv/cupstestppd.c:1078
 #, c-format
 msgid ""
 "      **FAIL**  REQUIRED PaperDimension for PageSize %s\n"
@@ -855,25 +855,25 @@ msgid ""
 "                REF: Page 103, section 5.15."
 msgstr ""
 
-#: systemv/cupstestppd.c:934
+#: systemv/cupstestppd.c:914
 msgid ""
 "      **FAIL**  REQUIRED Product\n"
 "                REF: Page 62, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1009
+#: systemv/cupstestppd.c:989
 msgid ""
 "      **FAIL**  REQUIRED ShortNickName\n"
 "                REF: Page 64-65, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:334 systemv/cupstestppd.c:353
-#: systemv/cupstestppd.c:365
+#: systemv/cupstestppd.c:314 systemv/cupstestppd.c:333
+#: systemv/cupstestppd.c:345
 #, c-format
 msgid "      **FAIL**  Unable to open PPD file - %s on line %d."
 msgstr ""
 
-#: systemv/cupstestppd.c:1498
+#: systemv/cupstestppd.c:1478
 #, c-format
 msgid "    %d ERRORS FOUND"
 msgstr ""
@@ -942,7 +942,7 @@ msgid ""
 "        REF: Page 43, %%Pages:"
 msgstr ""
 
-#: systemv/cupstestppd.c:1500
+#: systemv/cupstestppd.c:1480
 msgid "    NO ERRORS FOUND"
 msgstr ""
 
@@ -975,6 +975,14 @@ msgstr ""
 msgid "    Warning: obsolete DSC version %.1f in file."
 msgstr ""
 
+#: test/ippfind.c:2796
+msgid "  ! expression            Unary NOT of expression."
+msgstr ""
+
+#: test/ippfind.c:2795
+msgid "  ( expressions )         Group expressions."
+msgstr ""
+
 #: systemv/cupsctl.c:210
 msgid "  --[no-]debug-logging    Turn debug logging on/off."
 msgstr ""
@@ -995,35 +1003,135 @@ msgstr ""
 msgid "  --[no-]user-cancel-any  Allow/prevent users to cancel any job."
 msgstr ""
 
-#: ppdc/ppdc.cxx:455
+#: ppdc/ppdc.cxx:450
 msgid "  --cr                    End lines with CR (Mac OS 9)."
 msgstr ""
 
-#: ppdc/ppdc.cxx:457
+#: ppdc/ppdc.cxx:452
 msgid "  --crlf                  End lines with CR + LF (Windows)."
 msgstr ""
 
-#: ppdc/ppdc.cxx:459
+#: test/ippfind.c:2777
+msgid "  --domain regex          Match domain to regular expression."
+msgstr ""
+
+#: test/ippfind.c:2778
+msgid ""
+"  --exec utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+
+#: test/ippfind.c:2798
+msgid "  --false                 Always false."
+msgstr ""
+
+#: test/ipptool.c:4858
+msgid "  --help                  Show help."
+msgstr ""
+
+#: test/ippfind.c:2760
+msgid "  --help                  Show this help."
+msgstr ""
+
+#: test/ippfind.c:2780
+msgid "  --host regex            Match hostname to regular expression."
+msgstr ""
+
+#: ppdc/ppdc.cxx:454
 msgid "  --lf                    End lines with LF (UNIX/Linux/OS X)."
 msgstr ""
 
-#: test/ipptool.c:4485
+#: scheduler/cupsfilter.c:1483
+msgid "  --list-filters          List filters that will be used."
+msgstr ""
+
+#: test/ippfind.c:2782
+msgid "  --local                 True if service is local."
+msgstr ""
+
+#: test/ippfind.c:2781
+msgid "  --ls                    List attributes."
+msgstr ""
+
+#: test/ippfind.c:2783
+msgid "  --name regex            Match service name to regular expression."
+msgstr ""
+
+#: test/ippfind.c:2797
+msgid "  --not expression        Unary NOT of expression."
+msgstr ""
+
+#: test/ippfind.c:2784
+msgid "  --path regex            Match resource path to regular expression."
+msgstr ""
+
+#: test/ippfind.c:2785
+msgid "  --port number[-number]  Match port to number or range."
+msgstr ""
+
+#: test/ippfind.c:2786
+msgid "  --print                 Print URI if true."
+msgstr ""
+
+#: test/ippfind.c:2787
+msgid "  --print-name            Print service name if true."
+msgstr ""
+
+#: test/ippfind.c:2788
+msgid "  --quiet                 Quietly report match via exit code."
+msgstr ""
+
+#: test/ippfind.c:2789
+msgid "  --remote                True if service is remote."
+msgstr ""
+
+#: test/ipptool.c:4859
+msgid ""
+"  --stop-after-include-error\n"
+"                          Stop tests after a failed INCLUDE."
+msgstr ""
+
+#: test/ippfind.c:2799
+msgid "  --true                  Always true."
+msgstr ""
+
+#: test/ippfind.c:2790
+msgid "  --txt key               True if the TXT record contains the key."
+msgstr ""
+
+#: test/ippfind.c:2791
+msgid "  --txt-* regex           Match TXT record key to regular expression."
+msgstr ""
+
+#: test/ippfind.c:2792
+msgid "  --uri regex             Match URI to regular expression."
+msgstr ""
+
+#: test/ippfind.c:2761
+msgid "  --version               Show program version."
+msgstr ""
+
+#: test/ipptool.c:4861
+msgid "  --version               Show version."
+msgstr ""
+
+#: test/ippfind.c:2754 test/ipptool.c:4862
 msgid "  -4                      Connect using IPv4."
 msgstr ""
 
-#: test/ipptool.c:4486
+#: test/ippfind.c:2755 test/ipptool.c:4863
 msgid "  -6                      Connect using IPv6."
 msgstr ""
 
-#: test/ipptool.c:4487
+#: test/ipptool.c:4864
 msgid "  -C                      Send requests using chunking (default)."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1434
+#: scheduler/cupsfilter.c:1484
 msgid "  -D                      Remove the input file when finished."
 msgstr ""
 
-#: ppdc/ppdc.cxx:438 ppdc/ppdhtml.cxx:175 ppdc/ppdpo.cxx:255
+#: ppdc/ppdc.cxx:433 ppdc/ppdhtml.cxx:180 ppdc/ppdpo.cxx:250
 msgid "  -D name=value           Set named variable to value."
 msgstr ""
 
@@ -1031,11 +1139,11 @@ msgstr ""
 msgid "  -E                      Encrypt the connection."
 msgstr ""
 
-#: test/ipptool.c:4489
+#: test/ipptool.c:4866
 msgid "  -E                      Test with HTTP Upgrade to TLS."
 msgstr ""
 
-#: scheduler/main.c:2057
+#: scheduler/main.c:2180
 msgid "  -F                      Run in the foreground but detach from console."
 msgstr ""
 
@@ -1043,450 +1151,828 @@ msgstr ""
 msgid "  -H samba-server         Use the named SAMBA server."
 msgstr ""
 
-#: test/ipptool.c:4491
+#: test/ipptool.c:4868
 msgid "  -I                      Ignore errors."
 msgstr ""
 
-#: ppdc/ppdc.cxx:440 ppdc/ppdhtml.cxx:177 ppdc/ppdi.cxx:131 ppdc/ppdpo.cxx:257
+#: ppdc/ppdc.cxx:435 ppdc/ppdhtml.cxx:182 ppdc/ppdi.cxx:131 ppdc/ppdpo.cxx:252
 msgid "  -I include-dir          Add include directory to search path."
 msgstr ""
 
-#: systemv/cupstestppd.c:3799
+#: systemv/cupstestppd.c:3863
 msgid "  -I {filename,filters,none,profiles}"
 msgstr ""
 
-#: test/ipptool.c:4492
+#: test/ipptool.c:4869
 msgid "  -L                      Send requests using content-length."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1436
+#: test/ipptool.c:4871
+msgid "  -P filename.plist       Produce XML plist to a file and test report to standard output."
+msgstr ""
+
+#: scheduler/cupsfilter.c:1485
 msgid "  -P filename.ppd         Set PPD file."
 msgstr ""
 
-#: systemv/cupstestppd.c:3801
+#: test/ippfind.c:2764
+msgid "  -P number[-number]      Match port to number or range."
+msgstr ""
+
+#: systemv/cupstestppd.c:3865
 msgid "  -R root-directory       Set alternate root."
 msgstr ""
 
-#: test/ipptool.c:4494
+#: test/ipptool.c:4872
 msgid "  -S                      Test with SSL encryption."
 msgstr ""
 
-#: test/ipptool.c:4496
+#: test/ippfind.c:2756
+msgid "  -T seconds              Set the browse timeout in seconds."
+msgstr ""
+
+#: test/ipptool.c:4874
 msgid "  -T seconds              Set the receive/send timeout in seconds."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1437 systemv/cupsaddsmb.c:288 systemv/cupsctl.c:206
+#: scheduler/cupsfilter.c:1486 systemv/cupsaddsmb.c:288 systemv/cupsctl.c:206
 msgid "  -U username             Specify username."
 msgstr ""
 
-#: test/ipptool.c:4498
+#: test/ippfind.c:2758 test/ipptool.c:4876
 msgid "  -V version              Set default IPP version."
 msgstr ""
 
-#: systemv/cupstestppd.c:3802
+#: systemv/cupstestppd.c:3866
 msgid "  -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}"
 msgstr ""
 
-#: test/ipptool.c:4500
+#: test/ipptool.c:4878
 msgid "  -X                      Produce XML plist instead of plain text."
 msgstr ""
 
+#: test/ippdiscover.c:818
+msgid "  -a                      Browse for all services."
+msgstr ""
+
 #: systemv/cupsaddsmb.c:289
 msgid "  -a                      Export all printers."
 msgstr ""
 
-#: ppdc/ppdc.cxx:442
+#: test/ipptool.c:4880
+msgid "  -c                      Produce CSV output."
+msgstr ""
+
+#: ppdc/ppdc.cxx:437
 msgid "  -c catalog.po           Load the specified message catalog."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1438 scheduler/main.c:2055
+#: scheduler/cupsfilter.c:1487
+msgid "  -c cups-files.conf      Set cups-files.conf file to use."
+msgstr ""
+
+#: scheduler/main.c:2178
 msgid "  -c cupsd.conf           Set cupsd.conf file to use."
 msgstr ""
 
-#: test/ipptool.c:4502
+#: test/ippdiscover.c:819
+msgid "  -d domain               Browse/resolve in specified domain."
+msgstr ""
+
+#: test/ipptool.c:4881
 msgid "  -d name=value           Set named variable to value."
 msgstr ""
 
-#: ppdc/ppdc.cxx:444
+#: ppdc/ppdc.cxx:439
 msgid "  -d output-dir           Specify the output directory."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1440
+#: scheduler/cupsfilter.c:1488
 msgid "  -d printer              Use the named printer."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1442
+#: test/ippfind.c:2765
+msgid "  -d regex                Match domain to regular expression."
+msgstr ""
+
+#: scheduler/cupsfilter.c:1489
 msgid "  -e                      Use every filter from the PPD file."
 msgstr ""
 
-#: scheduler/main.c:2056
+#: scheduler/main.c:2179
 msgid "  -f                      Run in the foreground."
 msgstr ""
 
-#: test/ipptool.c:4504
+#: test/ipptool.c:4883
 msgid "  -f filename             Set default request filename."
 msgstr ""
 
-#: scheduler/main.c:2059
+#: scheduler/main.c:2182
 msgid "  -h                      Show this usage message."
 msgstr ""
 
+#: test/ippfind.c:2766
+msgid "  -h regex                Match hostname to regular expression."
+msgstr ""
+
 #: systemv/cupsaddsmb.c:290 systemv/cupsctl.c:207
 msgid "  -h server[:port]        Specify server address."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1444
+#: scheduler/cupsfilter.c:1490
 msgid "  -i mime/type            Set input MIME type (otherwise auto-typed)."
 msgstr ""
 
-#: test/ipptool.c:4506
+#: test/ipptool.c:4885
 msgid "  -i seconds              Repeat the last file with the given time interval."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1446
+#: scheduler/cupsfilter.c:1491
 msgid "  -j job-id[,N]           Filter file N from the specified job (default is file 1)."
 msgstr ""
 
-#: scheduler/main.c:2060
-msgid "  -l                      Run cupsd from launchd(8)."
+#: test/ippfind.c:2767
+msgid "  -l                      List attributes."
+msgstr ""
+
+#: test/ipptool.c:4887
+msgid "  -l                      Produce plain text output."
 msgstr ""
 
-#: ppdc/ppdc.cxx:446
+#: scheduler/main.c:2183
+msgid "  -l                      Run cupsd on demand."
+msgstr ""
+
+#: ppdc/ppdc.cxx:441
 msgid "  -l lang[,lang,...]      Specify the output language(s) (locale)."
 msgstr ""
 
-#: ppdc/ppdc.cxx:448
+#: ppdc/ppdc.cxx:443
 msgid "  -m                      Use the ModelName value as the filename."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1448
+#: scheduler/cupsfilter.c:1492
 msgid "  -m mime/type            Set output MIME type (otherwise application/pdf)."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1450
+#: scheduler/cupsfilter.c:1493
 msgid "  -n copies               Set number of copies."
 msgstr ""
 
-#: test/ipptool.c:4508
+#: test/ipptool.c:4888
 msgid "  -n count                Repeat the last file the given number of times."
 msgstr ""
 
+#: test/ippfind.c:2768
+msgid "  -n regex                Match service name to regular expression."
+msgstr ""
+
 #: ppdc/ppdi.cxx:133
 msgid "  -o filename.drv         Set driver information file (otherwise ppdi.drv)."
 msgstr ""
 
-#: ppdc/ppdmerge.cxx:370
+#: ppdc/ppdmerge.cxx:364
 msgid "  -o filename.ppd[.gz]    Set output file (otherwise stdout)."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1451
+#: scheduler/cupsfilter.c:1494
 msgid "  -o name=value           Set option(s)."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1452
+#: test/ippfind.c:2769
+msgid "  -p                      Print URI if true."
+msgstr ""
+
+#: scheduler/cupsfilter.c:1495
 msgid "  -p filename.ppd         Set PPD file."
 msgstr ""
 
-#: systemv/cupstestppd.c:3806 test/ipptool.c:4510
+#: test/ippdiscover.c:820
+msgid "  -p program              Run specified program for each service."
+msgstr ""
+
+#: test/ippfind.c:2770
+msgid "  -q                      Quietly report match via exit code."
+msgstr ""
+
+#: systemv/cupstestppd.c:3870 test/ipptool.c:4890
 msgid "  -q                      Run silently."
 msgstr ""
 
-#: systemv/cupstestppd.c:3807
+#: test/ippfind.c:2771
+msgid "  -r                      True if service is remote."
+msgstr ""
+
+#: systemv/cupstestppd.c:3871
 msgid "  -r                      Use 'relaxed' open mode."
 msgstr ""
 
-#: test/ipptool.c:4511
+#: test/ippfind.c:2772
+msgid "  -s                      Print service name if true."
+msgstr ""
+
+#: test/ipptool.c:4891
 msgid "  -t                      Produce a test report."
 msgstr ""
 
-#: ppdc/ppdc.cxx:450
+#: ppdc/ppdc.cxx:445
 msgid "  -t                      Test PPDs instead of generating them."
 msgstr ""
 
-#: scheduler/main.c:2061
+#: scheduler/main.c:2184
 msgid "  -t                      Test the configuration file."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1453
+#: test/ippfind.c:2773
+msgid "  -t key                  True if the TXT record contains the key."
+msgstr ""
+
+#: scheduler/cupsfilter.c:1496
 msgid "  -t title                Set title."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1454
+#: test/ippdiscover.c:821
+msgid "  -t type                 Browse/resolve with specified type."
+msgstr ""
+
+#: scheduler/cupsfilter.c:1497
 msgid "  -u                      Remove the PPD file when finished."
 msgstr ""
 
-#: systemv/cupsaddsmb.c:291 systemv/cupstestppd.c:3808 test/ipptool.c:4512
-#: ppdc/ppdc.cxx:452 ppdc/ppdpo.cxx:259
+#: test/ippfind.c:2774
+msgid "  -u regex                Match URI to regular expression."
+msgstr ""
+
+#: systemv/cupsaddsmb.c:291 systemv/cupstestppd.c:3872 test/ipptool.c:4892
+#: ppdc/ppdc.cxx:447 ppdc/ppdpo.cxx:254
 msgid "  -v                      Be verbose."
 msgstr ""
 
-#: systemv/cupstestppd.c:3809
+#: systemv/cupstestppd.c:3873
 msgid "  -vv                     Be very verbose."
 msgstr ""
 
-#: ppdc/ppdc.cxx:453
+#: test/ippfind.c:2775
+msgid ""
+"  -x utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+
+#: ppdc/ppdc.cxx:448
 msgid "  -z                      Compress PPD files using GNU zip."
 msgstr ""
 
-#: systemv/cupstestppd.c:332 systemv/cupstestppd.c:351
-#: systemv/cupstestppd.c:363 systemv/cupstestppd.c:496
-#: systemv/cupstestppd.c:511 systemv/cupstestppd.c:532
-#: systemv/cupstestppd.c:547 systemv/cupstestppd.c:577
-#: systemv/cupstestppd.c:597 systemv/cupstestppd.c:620
-#: systemv/cupstestppd.c:638 systemv/cupstestppd.c:664
-#: systemv/cupstestppd.c:682 systemv/cupstestppd.c:702
-#: systemv/cupstestppd.c:722 systemv/cupstestppd.c:740
-#: systemv/cupstestppd.c:757 systemv/cupstestppd.c:776
-#: systemv/cupstestppd.c:797 systemv/cupstestppd.c:816
-#: systemv/cupstestppd.c:836 systemv/cupstestppd.c:856
-#: systemv/cupstestppd.c:876 systemv/cupstestppd.c:896
-#: systemv/cupstestppd.c:914 systemv/cupstestppd.c:931
-#: systemv/cupstestppd.c:953 systemv/cupstestppd.c:971
-#: systemv/cupstestppd.c:988 systemv/cupstestppd.c:1006
-#: systemv/cupstestppd.c:1022 systemv/cupstestppd.c:1042
-#: systemv/cupstestppd.c:1073 systemv/cupstestppd.c:1095
-#: systemv/cupstestppd.c:1146 systemv/cupstestppd.c:1165
-#: systemv/cupstestppd.c:1209 systemv/cupstestppd.c:1223
-#: systemv/cupstestppd.c:1255 systemv/cupstestppd.c:1282
-#: systemv/cupstestppd.c:1800 systemv/cupstestppd.c:1819
-#: systemv/cupstestppd.c:1837 systemv/cupstestppd.c:1889
-#: systemv/cupstestppd.c:1905 systemv/cupstestppd.c:1942
-#: systemv/cupstestppd.c:1960 systemv/cupstestppd.c:1996
-#: systemv/cupstestppd.c:2010 systemv/cupstestppd.c:2037
-#: systemv/cupstestppd.c:2051 systemv/cupstestppd.c:2097
-#: systemv/cupstestppd.c:2119 systemv/cupstestppd.c:2142
-#: systemv/cupstestppd.c:2159 systemv/cupstestppd.c:2201
-#: systemv/cupstestppd.c:2244 systemv/cupstestppd.c:2291
-#: systemv/cupstestppd.c:2315 systemv/cupstestppd.c:2369
-#: systemv/cupstestppd.c:2385 systemv/cupstestppd.c:2415
-#: systemv/cupstestppd.c:2429 systemv/cupstestppd.c:2455
-#: systemv/cupstestppd.c:2471 systemv/cupstestppd.c:2511
-#: systemv/cupstestppd.c:2525 systemv/cupstestppd.c:2551
-#: systemv/cupstestppd.c:2567 systemv/cupstestppd.c:2597
-#: systemv/cupstestppd.c:2611 systemv/cupstestppd.c:2638
-#: systemv/cupstestppd.c:2655 systemv/cupstestppd.c:2669
-#: systemv/cupstestppd.c:2693 systemv/cupstestppd.c:2710
-#: systemv/cupstestppd.c:2724 systemv/cupstestppd.c:2748
-#: systemv/cupstestppd.c:2765 systemv/cupstestppd.c:2779
-#: systemv/cupstestppd.c:2803 systemv/cupstestppd.c:2820
-#: systemv/cupstestppd.c:2834 systemv/cupstestppd.c:2858
-#: systemv/cupstestppd.c:2872 systemv/cupstestppd.c:2887
-#: systemv/cupstestppd.c:2904 systemv/cupstestppd.c:2960
-#: systemv/cupstestppd.c:2995 systemv/cupstestppd.c:3009
-#: systemv/cupstestppd.c:3037 systemv/cupstestppd.c:3102
-#: systemv/cupstestppd.c:3117 systemv/cupstestppd.c:3156
-#: systemv/cupstestppd.c:3176 systemv/cupstestppd.c:3190
-#: systemv/cupstestppd.c:3387 systemv/cupstestppd.c:3423
-#: systemv/cupstestppd.c:3437 systemv/cupstestppd.c:3483
-#: systemv/cupstestppd.c:3515 systemv/cupstestppd.c:3532
-#: systemv/cupstestppd.c:3555 systemv/cupstestppd.c:3571
-#: systemv/cupstestppd.c:3609 systemv/cupstestppd.c:3750
-#: systemv/cupstestppd.c:3772 systemv/cupstestppd.c:3880
+#: test/ippfind.c:2818
+msgid "  IPPFIND_SERVICE_DOMAIN  Domain name"
+msgstr ""
+
+#: test/ippfind.c:2819
+msgid ""
+"  IPPFIND_SERVICE_HOSTNAME\n"
+"                          Fully-qualified domain name"
+msgstr ""
+
+#: test/ippfind.c:2821
+msgid "  IPPFIND_SERVICE_NAME    Service instance name"
+msgstr ""
+
+#: test/ippfind.c:2822
+msgid "  IPPFIND_SERVICE_PORT    Port number"
+msgstr ""
+
+#: test/ippfind.c:2823
+msgid "  IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr ""
+
+#: test/ippfind.c:2824
+msgid "  IPPFIND_SERVICE_SCHEME  URI scheme"
+msgstr ""
+
+#: test/ippfind.c:2825
+msgid "  IPPFIND_SERVICE_URI     URI"
+msgstr ""
+
+#: test/ippfind.c:2826
+msgid "  IPPFIND_TXT_*           Value of TXT record key"
+msgstr ""
+
+#: test/ippfind.c:2801
+msgid ""
+"  expression --and expression\n"
+"                          Logical AND."
+msgstr ""
+
+#: test/ippfind.c:2803
+msgid ""
+"  expression --or expression\n"
+"                          Logical OR."
+msgstr ""
+
+#: test/ippfind.c:2800
+msgid "  expression expression   Logical AND."
+msgstr ""
+
+#: test/ippfind.c:2808
+msgid "  {service_domain}        Domain name"
+msgstr ""
+
+#: test/ippfind.c:2809
+msgid "  {service_hostname}      Fully-qualified domain name"
+msgstr ""
+
+#: test/ippfind.c:2810
+msgid "  {service_name}          Service instance name"
+msgstr ""
+
+#: test/ippfind.c:2811
+msgid "  {service_port}          Port number"
+msgstr ""
+
+#: test/ippfind.c:2812
+msgid "  {service_regtype}       DNS-SD registration type"
+msgstr ""
+
+#: test/ippfind.c:2813
+msgid "  {service_scheme}        URI scheme"
+msgstr ""
+
+#: test/ippfind.c:2814
+msgid "  {service_uri}           URI"
+msgstr ""
+
+#: test/ippfind.c:2815
+msgid "  {txt_*}                 Value of TXT record key"
+msgstr ""
+
+#: test/ippfind.c:2807
+msgid "  {}                      URI"
+msgstr ""
+
+#: systemv/cupstestppd.c:312 systemv/cupstestppd.c:331
+#: systemv/cupstestppd.c:343 systemv/cupstestppd.c:476
+#: systemv/cupstestppd.c:491 systemv/cupstestppd.c:512
+#: systemv/cupstestppd.c:527 systemv/cupstestppd.c:557
+#: systemv/cupstestppd.c:577 systemv/cupstestppd.c:600
+#: systemv/cupstestppd.c:618 systemv/cupstestppd.c:644
+#: systemv/cupstestppd.c:662 systemv/cupstestppd.c:682
+#: systemv/cupstestppd.c:702 systemv/cupstestppd.c:720
+#: systemv/cupstestppd.c:737 systemv/cupstestppd.c:756
+#: systemv/cupstestppd.c:777 systemv/cupstestppd.c:796
+#: systemv/cupstestppd.c:816 systemv/cupstestppd.c:836
+#: systemv/cupstestppd.c:856 systemv/cupstestppd.c:876
+#: systemv/cupstestppd.c:894 systemv/cupstestppd.c:911
+#: systemv/cupstestppd.c:933 systemv/cupstestppd.c:951
+#: systemv/cupstestppd.c:968 systemv/cupstestppd.c:986
+#: systemv/cupstestppd.c:1002 systemv/cupstestppd.c:1022
+#: systemv/cupstestppd.c:1053 systemv/cupstestppd.c:1075
+#: systemv/cupstestppd.c:1126 systemv/cupstestppd.c:1145
+#: systemv/cupstestppd.c:1189 systemv/cupstestppd.c:1203
+#: systemv/cupstestppd.c:1235 systemv/cupstestppd.c:1262
+#: systemv/cupstestppd.c:1780 systemv/cupstestppd.c:1799
+#: systemv/cupstestppd.c:1817 systemv/cupstestppd.c:1869
+#: systemv/cupstestppd.c:1885 systemv/cupstestppd.c:1922
+#: systemv/cupstestppd.c:1940 systemv/cupstestppd.c:1976
+#: systemv/cupstestppd.c:1990 systemv/cupstestppd.c:2017
+#: systemv/cupstestppd.c:2031 systemv/cupstestppd.c:2077
+#: systemv/cupstestppd.c:2099 systemv/cupstestppd.c:2122
+#: systemv/cupstestppd.c:2139 systemv/cupstestppd.c:2181
+#: systemv/cupstestppd.c:2224 systemv/cupstestppd.c:2271
+#: systemv/cupstestppd.c:2295 systemv/cupstestppd.c:2349
+#: systemv/cupstestppd.c:2365 systemv/cupstestppd.c:2387
+#: systemv/cupstestppd.c:2427 systemv/cupstestppd.c:2441
+#: systemv/cupstestppd.c:2467 systemv/cupstestppd.c:2483
+#: systemv/cupstestppd.c:2505 systemv/cupstestppd.c:2555
+#: systemv/cupstestppd.c:2569 systemv/cupstestppd.c:2595
+#: systemv/cupstestppd.c:2611 systemv/cupstestppd.c:2641
+#: systemv/cupstestppd.c:2655 systemv/cupstestppd.c:2682
+#: systemv/cupstestppd.c:2699 systemv/cupstestppd.c:2713
+#: systemv/cupstestppd.c:2737 systemv/cupstestppd.c:2754
+#: systemv/cupstestppd.c:2768 systemv/cupstestppd.c:2792
+#: systemv/cupstestppd.c:2809 systemv/cupstestppd.c:2823
+#: systemv/cupstestppd.c:2847 systemv/cupstestppd.c:2864
+#: systemv/cupstestppd.c:2878 systemv/cupstestppd.c:2902
+#: systemv/cupstestppd.c:2916 systemv/cupstestppd.c:2931
+#: systemv/cupstestppd.c:2948 systemv/cupstestppd.c:3004
+#: systemv/cupstestppd.c:3039 systemv/cupstestppd.c:3053
+#: systemv/cupstestppd.c:3081 systemv/cupstestppd.c:3146
+#: systemv/cupstestppd.c:3161 systemv/cupstestppd.c:3200
+#: systemv/cupstestppd.c:3220 systemv/cupstestppd.c:3234
+#: systemv/cupstestppd.c:3451 systemv/cupstestppd.c:3487
+#: systemv/cupstestppd.c:3501 systemv/cupstestppd.c:3547
+#: systemv/cupstestppd.c:3579 systemv/cupstestppd.c:3596
+#: systemv/cupstestppd.c:3619 systemv/cupstestppd.c:3635
+#: systemv/cupstestppd.c:3673 systemv/cupstestppd.c:3814
+#: systemv/cupstestppd.c:3836 systemv/cupstestppd.c:3944
 msgid " FAIL"
 msgstr ""
 
-#: systemv/cupstestppd.c:1306
+#: systemv/cupstestppd.c:1286
 msgid " PASS"
 msgstr ""
 
-#: berkeley/lpq.c:565
+#: cups/ipp.c:5227
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#: cups/ipp.c:5238
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#: cups/ipp.c:4858
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#: cups/ipp.c:4850
+#, c-format
+msgid "\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#: cups/ipp.c:4876
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr ""
+
+#: cups/ipp.c:5290
+#, c-format
+msgid "\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#: cups/ipp.c:5299
+#, c-format
+msgid "\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#: cups/ipp.c:4976
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4984
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4968
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4928
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4960
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4936
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4944
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4920
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4952
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#: cups/ipp.c:4890
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+
+#: cups/ipp.c:5205
+#, c-format
+msgid "\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#: cups/ipp.c:5196
+#, c-format
+msgid "\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#: cups/ipp.c:5399
+#, c-format
+msgid "\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section 4.1.9)."
+msgstr ""
+
+#: cups/ipp.c:5409
+#, c-format
+msgid "\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section 4.1.9)."
+msgstr ""
+
+#: cups/ipp.c:5167
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#: cups/ipp.c:5176
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#: cups/ipp.c:5345
+#, c-format
+msgid "\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section 4.1.8)."
+msgstr ""
+
+#: cups/ipp.c:5355
+#, c-format
+msgid "\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section 4.1.8)."
+msgstr ""
+
+#: cups/ipp.c:4904
 #, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+msgid "\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
 msgstr ""
 
-#: berkeley/lpq.c:570
+#: cups/ipp.c:5047
+#, c-format
+msgid "\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 section 4.1.13)."
+msgstr ""
+
+#: cups/ipp.c:5028
+#, c-format
+msgid "\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#: cups/ipp.c:4997
+#, c-format
+msgid "\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#: cups/ipp.c:5012
+#, c-format
+msgid "\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#: cups/ipp.c:5109
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#: cups/ipp.c:5118
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#: cups/ipp.c:5261
+#, c-format
+msgid "\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#: cups/ipp.c:5270
+#, c-format
+msgid "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#: berkeley/lpq.c:533
 #, c-format
 msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
 msgstr ""
 
-#: systemv/lpstat.c:835
+#: cups/dest-localization.c:114
+#, c-format
+msgid "%d x %d mm"
+msgstr ""
+
+#: cups/dest-localization.c:106
+#, c-format
+msgid "%g x %g"
+msgstr ""
+
+#: cups/dest-localization.c:169 cups/dest-localization.c:176
+#, c-format
+msgid "%s (%s)"
+msgstr ""
+
+#: cups/dest-localization.c:183
+#, c-format
+msgid "%s (%s, %s)"
+msgstr ""
+
+#: cups/dest-localization.c:160
+#, c-format
+msgid "%s (Borderless)"
+msgstr ""
+
+#: cups/dest-localization.c:167 cups/dest-localization.c:174
+#, c-format
+msgid "%s (Borderless, %s)"
+msgstr ""
+
+#: cups/dest-localization.c:181
+#, c-format
+msgid "%s (Borderless, %s, %s)"
+msgstr ""
+
+#: systemv/lpstat.c:777
 #, c-format
 msgid "%s accepting requests since %s"
 msgstr ""
 
-#: scheduler/ipp.c:10166
+#: scheduler/ipp.c:9986
 #, c-format
 msgid "%s cannot be changed."
 msgstr ""
 
-#: berkeley/lpc.c:189
+#: berkeley/lpc.c:181
 #, c-format
 msgid "%s is not implemented by the CUPS version of lpc."
 msgstr ""
 
-#: berkeley/lpq.c:656
+#: berkeley/lpq.c:618
 #, c-format
 msgid "%s is not ready"
 msgstr ""
 
-#: berkeley/lpq.c:649
+#: berkeley/lpq.c:611
 #, c-format
 msgid "%s is ready"
 msgstr ""
 
-#: berkeley/lpq.c:652
+#: berkeley/lpq.c:614
 #, c-format
 msgid "%s is ready and printing"
 msgstr ""
 
-#: filter/rastertoepson.c:985 filter/rastertohp.c:711
-#: filter/rastertolabel.c:1134
+#: filter/rastertoepson.c:982 filter/rastertohp.c:700
+#: filter/rastertolabel.c:1120
 #, c-format
 msgid "%s job-id user title copies options [file]"
 msgstr ""
 
-#: systemv/lpstat.c:839
+#: systemv/lpstat.c:781
 #, c-format
 msgid "%s not accepting requests since %s -"
 msgstr ""
 
-#: scheduler/ipp.c:691
+#: scheduler/ipp.c:617
 #, c-format
 msgid "%s not supported."
 msgstr ""
 
-#: systemv/lpstat.c:850
+#: systemv/lpstat.c:792
 #, c-format
 msgid "%s/%s accepting requests since %s"
 msgstr ""
 
-#: systemv/lpstat.c:855
+#: systemv/lpstat.c:797
 #, c-format
 msgid "%s/%s not accepting requests since %s -"
 msgstr ""
 
-#: berkeley/lpq.c:557
+#: berkeley/lpq.c:526
 #, c-format
 msgid "%s: %-33.33s [job %d localhost]"
 msgstr ""
 
 #. TRANSLATORS: Message is "subject: error"
-#: cups/langprintf.c:86 scheduler/cupsfilter.c:716 systemv/lpadmin.c:805
-#: systemv/lpadmin.c:856 systemv/lpadmin.c:906 systemv/lpadmin.c:962
-#: systemv/lpadmin.c:1060 systemv/lpadmin.c:1112 systemv/lpadmin.c:1168
-#: systemv/lpadmin.c:1478
+#: cups/langprintf.c:77 scheduler/cupsfilter.c:726 systemv/lpadmin.c:803
+#: systemv/lpadmin.c:854 systemv/lpadmin.c:904 systemv/lpadmin.c:960
+#: systemv/lpadmin.c:1058 systemv/lpadmin.c:1110 systemv/lpadmin.c:1166
+#: systemv/lpadmin.c:1581
 #, c-format
 msgid "%s: %s"
 msgstr ""
 
-#: systemv/cancel.c:294 systemv/cancel.c:357
+#: systemv/cancel.c:305 systemv/cancel.c:368
 #, c-format
 msgid "%s: %s failed: %s"
 msgstr ""
 
+#: systemv/lpadmin.c:1216
+#, c-format
+msgid "%s: Bad printer URI \"%s\"."
+msgstr ""
+
+#: test/ippfind.c:777 test/ipptool.c:381
+#, c-format
+msgid "%s: Bad version %s for \"-V\"."
+msgstr ""
+
 #: systemv/cupsaccept.c:68
 #, c-format
 msgid "%s: Don't know what to do."
 msgstr ""
 
-#: berkeley/lpq.c:237 berkeley/lpr.c:362 systemv/lp.c:608
+#: berkeley/lpq.c:225 berkeley/lpr.c:358 systemv/lp.c:602
 #, c-format
 msgid "%s: Error - %s environment variable names non-existent destination \"%s\"."
 msgstr ""
 
-#: berkeley/lpq.c:144 berkeley/lpq.c:215 berkeley/lpr.c:234 berkeley/lpr.c:337
-#: systemv/lp.c:163 systemv/lp.c:583 systemv/lp.c:703 systemv/lp.c:752
-#: systemv/lpstat.c:208 systemv/lpstat.c:286 systemv/lpstat.c:388
-#: systemv/lpstat.c:417 systemv/lpstat.c:441 systemv/lpstat.c:500
-#: systemv/lpstat.c:566 systemv/lpstat.c:627 systemv/lpstat.c:753
-#: systemv/lpstat.c:938 systemv/lpstat.c:1199 systemv/lpstat.c:1442
-#: systemv/lpstat.c:1701
+#: berkeley/lpq.c:133 berkeley/lpq.c:203 berkeley/lpr.c:230 berkeley/lpr.c:333
+#: systemv/lp.c:157 systemv/lp.c:577 systemv/lp.c:697 systemv/lp.c:746
+#: systemv/lpstat.c:195 systemv/lpstat.c:241 systemv/lpstat.c:332
+#: systemv/lpstat.c:361 systemv/lpstat.c:385 systemv/lpstat.c:444
+#: systemv/lpstat.c:510 systemv/lpstat.c:571 systemv/lpstat.c:696
+#: systemv/lpstat.c:880 systemv/lpstat.c:1141 systemv/lpstat.c:1339
+#: systemv/lpstat.c:1579
 #, c-format
 msgid "%s: Error - add '/version=1.1' to server name."
 msgstr ""
 
-#: systemv/lp.c:240
+#: systemv/lp.c:234
 #, c-format
 msgid "%s: Error - bad job ID."
 msgstr ""
 
-#: systemv/lp.c:228
+#: systemv/lp.c:222
 #, c-format
 msgid "%s: Error - cannot print files and alter jobs simultaneously."
 msgstr ""
 
-#: systemv/lp.c:521
+#: systemv/lp.c:515
 #, c-format
 msgid "%s: Error - cannot print from stdin if files or a job ID are provided."
 msgstr ""
 
-#: systemv/lp.c:470
+#: systemv/lp.c:464
 #, c-format
 msgid "%s: Error - expected character set after \"-S\" option."
 msgstr ""
 
-#: systemv/lp.c:489
+#: systemv/lp.c:483
 #, c-format
 msgid "%s: Error - expected content type after \"-T\" option."
 msgstr ""
 
-#: berkeley/lpr.c:249
+#: berkeley/lpr.c:245
 #, c-format
 msgid "%s: Error - expected copies after \"-#\" option."
 msgstr ""
 
-#: systemv/lp.c:273
+#: systemv/lp.c:267
 #, c-format
 msgid "%s: Error - expected copies after \"-n\" option."
 msgstr ""
 
-#: berkeley/lpr.c:210
+#: berkeley/lpr.c:206
 #, c-format
 msgid "%s: Error - expected destination after \"-P\" option."
 msgstr ""
 
-#: systemv/lpstat.c:241
-#, c-format
-msgid "%s: Error - expected destination after \"-b\" option."
-msgstr ""
-
-#: systemv/lp.c:138
+#: systemv/lp.c:132
 #, c-format
 msgid "%s: Error - expected destination after \"-d\" option."
 msgstr ""
 
-#: systemv/lp.c:177
+#: systemv/lp.c:171
 #, c-format
 msgid "%s: Error - expected form after \"-f\" option."
 msgstr ""
 
-#: systemv/lp.c:400
+#: systemv/lp.c:394
 #, c-format
 msgid "%s: Error - expected hold name after \"-H\" option."
 msgstr ""
 
-#: berkeley/lpr.c:104
+#: berkeley/lpr.c:100
 #, c-format
 msgid "%s: Error - expected hostname after \"-H\" option."
 msgstr ""
 
-#: berkeley/lpq.c:180 berkeley/lprm.c:123 systemv/cancel.c:124
-#: systemv/cupsaccept.c:123 systemv/lp.c:198 systemv/lpstat.c:311
+#: berkeley/lpq.c:169 berkeley/lprm.c:123 systemv/cancel.c:124
+#: systemv/cupsaccept.c:123 systemv/lp.c:192 systemv/lpstat.c:266
 #, c-format
 msgid "%s: Error - expected hostname after \"-h\" option."
 msgstr ""
 
-#: systemv/lp.c:380
+#: systemv/lp.c:374
 #, c-format
 msgid "%s: Error - expected mode list after \"-y\" option."
 msgstr ""
 
-#: berkeley/lpr.c:272
+#: berkeley/lpr.c:268
 #, c-format
 msgid "%s: Error - expected name after \"-%c\" option."
 msgstr ""
 
-#: berkeley/lpr.c:154 systemv/lp.c:297
+#: berkeley/lpr.c:150 systemv/lp.c:291
 #, c-format
 msgid "%s: Error - expected option=value after \"-o\" option."
 msgstr ""
 
-#: systemv/lp.c:450
+#: systemv/lp.c:444
 #, c-format
 msgid "%s: Error - expected page list after \"-P\" option."
 msgstr ""
 
-#: systemv/lp.c:317
+#: systemv/lp.c:311
 #, c-format
 msgid "%s: Error - expected priority after \"-%c\" option."
 msgstr ""
@@ -1496,14 +1982,14 @@ msgstr ""
 msgid "%s: Error - expected reason text after \"-r\" option."
 msgstr ""
 
-#: systemv/lp.c:363
+#: systemv/lp.c:357
 #, c-format
 msgid "%s: Error - expected title after \"-t\" option."
 msgstr ""
 
-#: berkeley/lpq.c:108 berkeley/lpr.c:85 berkeley/lprm.c:104
-#: systemv/cancel.c:94 systemv/cupsaccept.c:101 systemv/lp.c:116
-#: systemv/lpadmin.c:438 systemv/lpstat.c:137
+#: berkeley/lpq.c:97 berkeley/lpr.c:81 berkeley/lprm.c:104 systemv/cancel.c:95
+#: systemv/cupsaccept.c:101 systemv/lp.c:110 systemv/lpadmin.c:426
+#: systemv/lpstat.c:124
 #, c-format
 msgid "%s: Error - expected username after \"-U\" option."
 msgstr ""
@@ -1513,88 +1999,103 @@ msgstr ""
 msgid "%s: Error - expected username after \"-u\" option."
 msgstr ""
 
-#: berkeley/lpr.c:126
+#: berkeley/lpr.c:122
 #, c-format
 msgid "%s: Error - expected value after \"-%c\" option."
 msgstr ""
 
-#: systemv/lpstat.c:157 systemv/lpstat.c:171
+#: systemv/lpstat.c:144 systemv/lpstat.c:158
 #, c-format
 msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option."
 msgstr ""
 
-#: berkeley/lpq.c:242 berkeley/lpr.c:367 systemv/lp.c:613
+#: berkeley/lpq.c:230 berkeley/lpr.c:363 systemv/lp.c:607
 #, c-format
 msgid "%s: Error - no default destination available."
 msgstr ""
 
-#: systemv/lp.c:339
+#: systemv/lp.c:333
 #, c-format
 msgid "%s: Error - priority must be between 1 and 100."
 msgstr ""
 
-#: berkeley/lpr.c:370 systemv/lp.c:616
+#: berkeley/lpr.c:366 systemv/lp.c:610
 #, c-format
 msgid "%s: Error - scheduler not responding."
 msgstr ""
 
-#: berkeley/lpr.c:315 systemv/lp.c:553
+#: berkeley/lpr.c:311 systemv/lp.c:547
 #, c-format
 msgid "%s: Error - too many files - \"%s\"."
 msgstr ""
 
-#: berkeley/lpr.c:297 systemv/lp.c:536
+#: berkeley/lpr.c:293 systemv/lp.c:530
 #, c-format
 msgid "%s: Error - unable to access \"%s\" - %s"
 msgstr ""
 
-#: berkeley/lpr.c:413 systemv/lp.c:647
+#: berkeley/lpr.c:409 systemv/lp.c:641
 #, c-format
 msgid "%s: Error - unable to queue from stdin - %s."
 msgstr ""
 
-#: berkeley/lprm.c:87 berkeley/lprm.c:172 systemv/cancel.c:214
+#: berkeley/lprm.c:87 berkeley/lprm.c:172 systemv/cancel.c:222
 #, c-format
 msgid "%s: Error - unknown destination \"%s\"."
 msgstr ""
 
-#: berkeley/lpq.c:148
+#: berkeley/lpq.c:137
 #, c-format
 msgid "%s: Error - unknown destination \"%s/%s\"."
 msgstr ""
 
-#: berkeley/lpr.c:283 berkeley/lprm.c:139 systemv/cancel.c:156
-#: systemv/cupsaccept.c:164 systemv/lp.c:512 systemv/lpstat.c:512
+#: berkeley/lpr.c:279 berkeley/lprm.c:139 systemv/cancel.c:163
+#: systemv/cupsaccept.c:164 systemv/lp.c:506 systemv/lpstat.c:456
 #, c-format
 msgid "%s: Error - unknown option \"%c\"."
 msgstr ""
 
-#: systemv/cupsaccept.c:157 systemv/lp.c:503
+#: systemv/cupsaccept.c:157 systemv/lp.c:497
 #, c-format
 msgid "%s: Error - unknown option \"%s\"."
 msgstr ""
 
-#: systemv/lp.c:217
+#: systemv/lp.c:211
 #, c-format
 msgid "%s: Expected job ID after \"-i\" option."
 msgstr ""
 
-#: systemv/lpstat.c:570 systemv/lpstat.c:610
+#: systemv/lpstat.c:514 systemv/lpstat.c:554
 #, c-format
 msgid "%s: Invalid destination name in list \"%s\"."
 msgstr ""
 
-#: scheduler/cupsfilter.c:569
+#: scheduler/cupsfilter.c:579
 #, c-format
 msgid "%s: Invalid filter string \"%s\"."
 msgstr ""
 
-#: systemv/lp.c:427
+#: test/ipptool.c:312
+#, c-format
+msgid "%s: Missing filename for \"-P\"."
+msgstr ""
+
+#: test/ippfind.c:749 test/ipptool.c:349
+#, c-format
+msgid "%s: Missing timeout for \"-T\"."
+msgstr ""
+
+#: test/ippfind.c:762 test/ipptool.c:363
+#, c-format
+msgid "%s: Missing version for \"-V\"."
+msgstr ""
+
+#: systemv/lp.c:421
 #, c-format
 msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"."
 msgstr ""
 
-#: scheduler/cupsfilter.c:460
+#: scheduler/cupsfilter.c:451
 #, c-format
 msgid "%s: No filter to convert from %s/%s to %s/%s."
 msgstr ""
@@ -1604,243 +2105,273 @@ msgstr ""
 msgid "%s: Operation failed: %s"
 msgstr ""
 
-#: berkeley/lpq.c:94 berkeley/lpr.c:71 berkeley/lprm.c:67 systemv/cancel.c:81
-#: systemv/cupsaccept.c:88 systemv/cupsaddsmb.c:86 systemv/lp.c:102
-#: systemv/lpadmin.c:239 systemv/lpinfo.c:88 systemv/lpmove.c:73
-#: systemv/lpstat.c:102 test/ipptool.c:307 test/ipptool.c:324
+#: berkeley/lpq.c:83 berkeley/lpr.c:67 berkeley/lprm.c:67 systemv/cancel.c:82
+#: systemv/cupsaccept.c:88 systemv/cupsaddsmb.c:86 systemv/lp.c:96
+#: systemv/lpadmin.c:230 systemv/lpinfo.c:88 systemv/lpmove.c:73
+#: systemv/lpstat.c:88 test/ipptool.c:294 test/ipptool.c:338
 #, c-format
 msgid "%s: Sorry, no encryption support."
 msgstr ""
 
-#: berkeley/lpq.c:296 scheduler/cupsfilter.c:1224 systemv/cancel.c:237
+#: systemv/lpadmin.c:1223
+#, c-format
+msgid "%s: Unable to connect to \"%s:%d\": %s"
+msgstr ""
+
+#: berkeley/lpq.c:284 scheduler/cupsfilter.c:1275 systemv/cancel.c:245
 #: systemv/cupsaddsmb.c:144 systemv/cupsaddsmb.c:171
 #, c-format
 msgid "%s: Unable to connect to server."
 msgstr ""
 
-#: systemv/cancel.c:317
+#: systemv/cancel.c:328
 #, c-format
 msgid "%s: Unable to contact server."
 msgstr ""
 
-#: scheduler/cupsfilter.c:425
+#: systemv/lpadmin.c:1236
+#, c-format
+msgid "%s: Unable to create PPD file: %s"
+msgstr ""
+
+#: scheduler/cupsfilter.c:416
 #, c-format
 msgid "%s: Unable to determine MIME type of \"%s\"."
 msgstr ""
 
-#: ppdc/ppdmerge.cxx:96
+#: test/ipptool.c:321
+#, c-format
+msgid "%s: Unable to open \"%s\": %s"
+msgstr ""
+
+#: ppdc/ppdmerge.cxx:90
 #, c-format
 msgid "%s: Unable to open %s: %s"
 msgstr ""
 
-#: scheduler/cupsfilter.c:664 ppdc/ppdmerge.cxx:112
+#: scheduler/cupsfilter.c:674 ppdc/ppdmerge.cxx:106
 #, c-format
 msgid "%s: Unable to open PPD file: %s on line %d."
 msgstr ""
 
-#: scheduler/cupsfilter.c:392
+#: scheduler/cupsfilter.c:383
 #, c-format
 msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"."
 msgstr ""
 
-#: berkeley/lpq.c:151 systemv/lpstat.c:631
+#: systemv/lpadmin.c:1207
+#, c-format
+msgid "%s: Unable to resolve \"%s\"."
+msgstr ""
+
+#: berkeley/lpq.c:140 systemv/lpstat.c:575
 #, c-format
 msgid "%s: Unknown destination \"%s\"."
 msgstr ""
 
-#: scheduler/cupsfilter.c:437
+#: scheduler/cupsfilter.c:428
 #, c-format
 msgid "%s: Unknown destination MIME type %s/%s."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1429
+#: scheduler/cupsfilter.c:1479
 #, c-format
 msgid "%s: Unknown option \"%c\"."
 msgstr ""
 
-#: scheduler/cupsfilter.c:417
+#: test/ippfind.c:648
+#, c-format
+msgid "%s: Unknown option \"%s\"."
+msgstr ""
+
+#: test/ippfind.c:928
+#, c-format
+msgid "%s: Unknown option \"-%c\"."
+msgstr ""
+
+#: scheduler/cupsfilter.c:408
 #, c-format
 msgid "%s: Unknown source MIME type %s/%s."
 msgstr ""
 
-#: berkeley/lpr.c:140
+#: berkeley/lpr.c:136
 #, c-format
 msgid "%s: Warning - \"%c\" format modifier not supported - output may not be correct."
 msgstr ""
 
-#: systemv/lp.c:477
+#: systemv/lp.c:471
 #, c-format
 msgid "%s: Warning - character set option ignored."
 msgstr ""
 
-#: systemv/lp.c:496
+#: systemv/lp.c:490
 #, c-format
 msgid "%s: Warning - content type option ignored."
 msgstr ""
 
-#: systemv/lp.c:184
+#: systemv/lp.c:178
 #, c-format
 msgid "%s: Warning - form option ignored."
 msgstr ""
 
-#: systemv/lp.c:387
+#: systemv/lp.c:381
 #, c-format
 msgid "%s: Warning - mode option ignored."
 msgstr ""
 
-#: ppdc/sample.c:310
+#: ppdc/sample.c:305
 msgid "-1"
 msgstr ""
 
-#: ppdc/sample.c:301
+#: ppdc/sample.c:296
 msgid "-10"
 msgstr ""
 
-#: ppdc/sample.c:393
+#: ppdc/sample.c:388
 msgid "-100"
 msgstr ""
 
-#: ppdc/sample.c:392
+#: ppdc/sample.c:387
 msgid "-105"
 msgstr ""
 
-#: ppdc/sample.c:300
+#: ppdc/sample.c:295
 msgid "-11"
 msgstr ""
 
-#: ppdc/sample.c:391
+#: ppdc/sample.c:386
 msgid "-110"
 msgstr ""
 
-#: ppdc/sample.c:390
+#: ppdc/sample.c:385
 msgid "-115"
 msgstr ""
 
-#: ppdc/sample.c:299
+#: ppdc/sample.c:294
 msgid "-12"
 msgstr ""
 
-#: ppdc/sample.c:389
+#: ppdc/sample.c:384
 msgid "-120"
 msgstr ""
 
-#: ppdc/sample.c:298
+#: ppdc/sample.c:293
 msgid "-13"
 msgstr ""
 
-#: ppdc/sample.c:297
+#: ppdc/sample.c:292
 msgid "-14"
 msgstr ""
 
-#: ppdc/sample.c:296
+#: ppdc/sample.c:291
 msgid "-15"
 msgstr ""
 
-#: ppdc/sample.c:309
+#: ppdc/sample.c:304
 msgid "-2"
 msgstr ""
 
-#: ppdc/sample.c:409
+#: ppdc/sample.c:404
 msgid "-20"
 msgstr ""
 
-#: ppdc/sample.c:408
+#: ppdc/sample.c:403
 msgid "-25"
 msgstr ""
 
-#: ppdc/sample.c:308
+#: ppdc/sample.c:303
 msgid "-3"
 msgstr ""
 
-#: ppdc/sample.c:407
+#: ppdc/sample.c:402
 msgid "-30"
 msgstr ""
 
-#: ppdc/sample.c:406
+#: ppdc/sample.c:401
 msgid "-35"
 msgstr ""
 
-#: ppdc/sample.c:307
+#: ppdc/sample.c:302
 msgid "-4"
 msgstr ""
 
-#: ppdc/sample.c:405
+#: ppdc/sample.c:400
 msgid "-40"
 msgstr ""
 
-#: ppdc/sample.c:404
+#: ppdc/sample.c:399
 msgid "-45"
 msgstr ""
 
-#: ppdc/sample.c:306
+#: ppdc/sample.c:301
 msgid "-5"
 msgstr ""
 
-#: ppdc/sample.c:403
+#: ppdc/sample.c:398
 msgid "-50"
 msgstr ""
 
-#: ppdc/sample.c:402
+#: ppdc/sample.c:397
 msgid "-55"
 msgstr ""
 
-#: ppdc/sample.c:305
+#: ppdc/sample.c:300
 msgid "-6"
 msgstr ""
 
-#: ppdc/sample.c:401
+#: ppdc/sample.c:396
 msgid "-60"
 msgstr ""
 
-#: ppdc/sample.c:400
+#: ppdc/sample.c:395
 msgid "-65"
 msgstr ""
 
-#: ppdc/sample.c:304
+#: ppdc/sample.c:299
 msgid "-7"
 msgstr ""
 
-#: ppdc/sample.c:399
+#: ppdc/sample.c:394
 msgid "-70"
 msgstr ""
 
-#: ppdc/sample.c:398
+#: ppdc/sample.c:393
 msgid "-75"
 msgstr ""
 
-#: ppdc/sample.c:303
+#: ppdc/sample.c:298
 msgid "-8"
 msgstr ""
 
-#: ppdc/sample.c:397
+#: ppdc/sample.c:392
 msgid "-80"
 msgstr ""
 
-#: ppdc/sample.c:396
+#: ppdc/sample.c:391
 msgid "-85"
 msgstr ""
 
-#: ppdc/sample.c:302
+#: ppdc/sample.c:297
 msgid "-9"
 msgstr ""
 
-#: ppdc/sample.c:395
+#: ppdc/sample.c:390
 msgid "-90"
 msgstr ""
 
-#: ppdc/sample.c:394
+#: ppdc/sample.c:389
 msgid "-95"
 msgstr ""
 
-#: ppdc/sample.c:311
+#: ppdc/sample.c:306
 msgid "0"
 msgstr ""
 
-#: ppdc/sample.c:312
+#: ppdc/sample.c:307
 msgid "1"
 msgstr ""
 
-#: ppdc/sample.c:384
+#: ppdc/sample.c:379
 msgid "1 inch/sec."
 msgstr ""
 
@@ -1852,7 +2383,7 @@ msgstr ""
 msgid "1.25x2.25\""
 msgstr ""
 
-#: ppdc/sample.c:432
+#: ppdc/sample.c:427
 msgid "1.5 inch/sec."
 msgstr ""
 
@@ -1872,11 +2403,11 @@ msgstr ""
 msgid "1.50x2.00\""
 msgstr ""
 
-#: ppdc/sample.c:321
+#: ppdc/sample.c:316
 msgid "10"
 msgstr ""
 
-#: ppdc/sample.c:443
+#: ppdc/sample.c:438
 msgid "10 inches/sec."
 msgstr ""
 
@@ -1892,39 +2423,39 @@ msgstr ""
 msgid "10 x 14"
 msgstr ""
 
-#: ppdc/sample.c:423
+#: ppdc/sample.c:418
 msgid "100"
 msgstr ""
 
-#: ppdc/sample.c:334
+#: ppdc/sample.c:329
 msgid "100 mm/sec."
 msgstr ""
 
-#: ppdc/sample.c:424
+#: ppdc/sample.c:419
 msgid "105"
 msgstr ""
 
-#: ppdc/sample.c:322
+#: ppdc/sample.c:317
 msgid "11"
 msgstr ""
 
-#: ppdc/sample.c:444
+#: ppdc/sample.c:439
 msgid "11 inches/sec."
 msgstr ""
 
-#: ppdc/sample.c:425
+#: ppdc/sample.c:420
 msgid "110"
 msgstr ""
 
-#: ppdc/sample.c:426
+#: ppdc/sample.c:421
 msgid "115"
 msgstr ""
 
-#: ppdc/sample.c:323
+#: ppdc/sample.c:318
 msgid "12"
 msgstr ""
 
-#: ppdc/sample.c:445
+#: ppdc/sample.c:440
 msgid "12 inches/sec."
 msgstr ""
 
@@ -1932,11 +2463,11 @@ msgstr ""
 msgid "12 x 11"
 msgstr ""
 
-#: ppdc/sample.c:427
+#: ppdc/sample.c:422
 msgid "120"
 msgstr ""
 
-#: ppdc/sample.c:335
+#: ppdc/sample.c:330
 msgid "120 mm/sec."
 msgstr ""
 
@@ -1948,7 +2479,7 @@ msgstr ""
 msgid "120x72dpi"
 msgstr ""
 
-#: ppdc/sample.c:324
+#: ppdc/sample.c:319
 msgid "13"
 msgstr ""
 
@@ -1956,15 +2487,15 @@ msgstr ""
 msgid "136dpi"
 msgstr ""
 
-#: ppdc/sample.c:325
+#: ppdc/sample.c:320
 msgid "14"
 msgstr ""
 
-#: ppdc/sample.c:326
+#: ppdc/sample.c:321
 msgid "15"
 msgstr ""
 
-#: ppdc/sample.c:328
+#: ppdc/sample.c:323
 msgid "15 mm/sec."
 msgstr ""
 
@@ -1972,23 +2503,23 @@ msgstr ""
 msgid "15 x 11"
 msgstr ""
 
-#: ppdc/sample.c:336
+#: ppdc/sample.c:331
 msgid "150 mm/sec."
 msgstr ""
 
-#: ppdc/sample.c:283
+#: ppdc/sample.c:278
 msgid "150dpi"
 msgstr ""
 
-#: ppdc/sample.c:368
+#: ppdc/sample.c:363
 msgid "16"
 msgstr ""
 
-#: ppdc/sample.c:369
+#: ppdc/sample.c:364
 msgid "17"
 msgstr ""
 
-#: ppdc/sample.c:370
+#: ppdc/sample.c:365
 msgid "18"
 msgstr ""
 
@@ -1996,19 +2527,19 @@ msgstr ""
 msgid "180dpi"
 msgstr ""
 
-#: ppdc/sample.c:371
+#: ppdc/sample.c:366
 msgid "19"
 msgstr ""
 
-#: ppdc/sample.c:313
+#: ppdc/sample.c:308
 msgid "2"
 msgstr ""
 
-#: ppdc/sample.c:385
+#: ppdc/sample.c:380
 msgid "2 inches/sec."
 msgstr ""
 
-#: ppdc/sample.c:270
+#: ppdc/sample.c:262
 msgid "2-Sided Printing"
 msgstr ""
 
@@ -2064,7 +2595,7 @@ msgstr ""
 msgid "2.38x5.50\""
 msgstr ""
 
-#: ppdc/sample.c:433
+#: ppdc/sample.c:428
 msgid "2.5 inches/sec."
 msgstr ""
 
@@ -2084,15 +2615,15 @@ msgstr ""
 msgid "2.9 x 1\""
 msgstr ""
 
-#: ppdc/sample.c:372
+#: ppdc/sample.c:367
 msgid "20"
 msgstr ""
 
-#: ppdc/sample.c:329
+#: ppdc/sample.c:324
 msgid "20 mm/sec."
 msgstr ""
 
-#: ppdc/sample.c:337
+#: ppdc/sample.c:332
 msgid "200 mm/sec."
 msgstr ""
 
@@ -2100,19 +2631,19 @@ msgstr ""
 msgid "203dpi"
 msgstr ""
 
-#: ppdc/sample.c:373
+#: ppdc/sample.c:368
 msgid "21"
 msgstr ""
 
-#: ppdc/sample.c:374
+#: ppdc/sample.c:369
 msgid "22"
 msgstr ""
 
-#: ppdc/sample.c:375
+#: ppdc/sample.c:370
 msgid "23"
 msgstr ""
 
-#: ppdc/sample.c:376
+#: ppdc/sample.c:371
 msgid "24"
 msgstr ""
 
@@ -2124,35 +2655,35 @@ msgstr ""
 msgid "240x72dpi"
 msgstr ""
 
-#: ppdc/sample.c:377
+#: ppdc/sample.c:372
 msgid "25"
 msgstr ""
 
-#: ppdc/sample.c:338
+#: ppdc/sample.c:333
 msgid "250 mm/sec."
 msgstr ""
 
-#: ppdc/sample.c:378
+#: ppdc/sample.c:373
 msgid "26"
 msgstr ""
 
-#: ppdc/sample.c:379
+#: ppdc/sample.c:374
 msgid "27"
 msgstr ""
 
-#: ppdc/sample.c:380
+#: ppdc/sample.c:375
 msgid "28"
 msgstr ""
 
-#: ppdc/sample.c:381
+#: ppdc/sample.c:376
 msgid "29"
 msgstr ""
 
-#: ppdc/sample.c:314
+#: ppdc/sample.c:309
 msgid "3"
 msgstr ""
 
-#: ppdc/sample.c:386
+#: ppdc/sample.c:381
 msgid "3 inches/sec."
 msgstr ""
 
@@ -2212,15 +2743,15 @@ msgstr ""
 msgid "3.50x1.00\""
 msgstr ""
 
-#: ppdc/sample.c:382
+#: ppdc/sample.c:377
 msgid "30"
 msgstr ""
 
-#: ppdc/sample.c:330
+#: ppdc/sample.c:325
 msgid "30 mm/sec."
 msgstr ""
 
-#: ppdc/sample.c:339
+#: ppdc/sample.c:334
 msgid "300 mm/sec."
 msgstr ""
 
@@ -2228,7 +2759,7 @@ msgstr ""
 msgid "300dpi"
 msgstr ""
 
-#: ppdc/sample.c:410
+#: ppdc/sample.c:405
 msgid "35"
 msgstr ""
 
@@ -2240,11 +2771,11 @@ msgstr ""
 msgid "360x180dpi"
 msgstr ""
 
-#: ppdc/sample.c:315
+#: ppdc/sample.c:310
 msgid "4"
 msgstr ""
 
-#: ppdc/sample.c:387
+#: ppdc/sample.c:382
 msgid "4 inches/sec."
 msgstr ""
 
@@ -2284,23 +2815,23 @@ msgstr ""
 msgid "4.00x6.50\""
 msgstr ""
 
-#: ppdc/sample.c:411
+#: ppdc/sample.c:406
 msgid "40"
 msgstr ""
 
-#: ppdc/sample.c:331
+#: ppdc/sample.c:326
 msgid "40 mm/sec."
 msgstr ""
 
-#: ppdc/sample.c:412
+#: ppdc/sample.c:407
 msgid "45"
 msgstr ""
 
-#: ppdc/sample.c:316
+#: ppdc/sample.c:311
 msgid "5"
 msgstr ""
 
-#: ppdc/sample.c:437
+#: ppdc/sample.c:432
 msgid "5 inches/sec."
 msgstr ""
 
@@ -2308,19 +2839,19 @@ msgstr ""
 msgid "5 x 7"
 msgstr ""
 
-#: ppdc/sample.c:413
+#: ppdc/sample.c:408
 msgid "50"
 msgstr ""
 
-#: ppdc/sample.c:414
+#: ppdc/sample.c:409
 msgid "55"
 msgstr ""
 
-#: ppdc/sample.c:317
+#: ppdc/sample.c:312
 msgid "6"
 msgstr ""
 
-#: ppdc/sample.c:438
+#: ppdc/sample.c:433
 msgid "6 inches/sec."
 msgstr ""
 
@@ -2352,15 +2883,15 @@ msgstr ""
 msgid "6.00x6.50\""
 msgstr ""
 
-#: ppdc/sample.c:415
+#: ppdc/sample.c:410
 msgid "60"
 msgstr ""
 
-#: ppdc/sample.c:332
+#: ppdc/sample.c:327
 msgid "60 mm/sec."
 msgstr ""
 
-#: ppdc/sample.c:261
+#: ppdc/sample.c:253
 msgid "600dpi"
 msgstr ""
 
@@ -2372,15 +2903,15 @@ msgstr ""
 msgid "60x72dpi"
 msgstr ""
 
-#: ppdc/sample.c:416
+#: ppdc/sample.c:411
 msgid "65"
 msgstr ""
 
-#: ppdc/sample.c:318
+#: ppdc/sample.c:313
 msgid "7"
 msgstr ""
 
-#: ppdc/sample.c:440
+#: ppdc/sample.c:435
 msgid "7 inches/sec."
 msgstr ""
 
@@ -2388,23 +2919,19 @@ msgstr ""
 msgid "7 x 9"
 msgstr ""
 
-#: ppdc/sample.c:417
+#: ppdc/sample.c:412
 msgid "70"
 msgstr ""
 
-#: ppdc/sample.c:252
-msgid "720dpi"
-msgstr ""
-
-#: ppdc/sample.c:418
+#: ppdc/sample.c:413
 msgid "75"
 msgstr ""
 
-#: ppdc/sample.c:319
+#: ppdc/sample.c:314
 msgid "8"
 msgstr ""
 
-#: ppdc/sample.c:441
+#: ppdc/sample.c:436
 msgid "8 inches/sec."
 msgstr ""
 
@@ -2440,23 +2967,23 @@ msgstr ""
 msgid "8.00x6.50\""
 msgstr ""
 
-#: ppdc/sample.c:419
+#: ppdc/sample.c:414
 msgid "80"
 msgstr ""
 
-#: ppdc/sample.c:333
+#: ppdc/sample.c:328
 msgid "80 mm/sec."
 msgstr ""
 
-#: ppdc/sample.c:420
+#: ppdc/sample.c:415
 msgid "85"
 msgstr ""
 
-#: ppdc/sample.c:320
+#: ppdc/sample.c:315
 msgid "9"
 msgstr ""
 
-#: ppdc/sample.c:442
+#: ppdc/sample.c:437
 msgid "9 inches/sec."
 msgstr ""
 
@@ -2472,32 +2999,32 @@ msgstr ""
 msgid "9-Pin Series"
 msgstr ""
 
-#: ppdc/sample.c:421
+#: ppdc/sample.c:416
 msgid "90"
 msgstr ""
 
-#: ppdc/sample.c:422
+#: ppdc/sample.c:417
 msgid "95"
 msgstr ""
 
-#: berkeley/lpc.c:213
+#: berkeley/lpc.c:205
 msgid "?Invalid help command unknown."
 msgstr ""
 
-#: cgi-bin/admin.c:2368
+#: cgi-bin/admin.c:2354
 msgid "A Samba password is required to export printer drivers"
 msgstr ""
 
-#: cgi-bin/admin.c:2364
+#: cgi-bin/admin.c:2350
 msgid "A Samba username is required to export printer drivers"
 msgstr ""
 
-#: scheduler/ipp.c:2381
+#: scheduler/ipp.c:2252
 #, c-format
 msgid "A class named \"%s\" already exists."
 msgstr ""
 
-#: scheduler/ipp.c:1004
+#: scheduler/ipp.c:915
 #, c-format
 msgid "A printer named \"%s\" already exists."
 msgstr ""
@@ -2638,24 +3165,24 @@ msgstr ""
 msgid "ARCH E Long Edge"
 msgstr ""
 
-#: cgi-bin/classes.c:169 cgi-bin/printers.c:172
+#: cgi-bin/classes.c:161 cgi-bin/printers.c:164
 msgid "Accept Jobs"
 msgstr ""
 
-#: cups/http-support.c:1345
+#: cups/http-support.c:1347
 msgid "Accepted"
 msgstr ""
 
-#: cgi-bin/admin.c:570
+#: cgi-bin/admin.c:546
 msgid "Add Class"
 msgstr ""
 
-#: cgi-bin/admin.c:882
+#: cgi-bin/admin.c:859
 msgid "Add Printer"
 msgstr ""
 
-#: cgi-bin/admin.c:444 cgi-bin/admin.c:477 cgi-bin/admin.c:525
-#: cgi-bin/admin.c:535
+#: cgi-bin/admin.c:420 cgi-bin/admin.c:453 cgi-bin/admin.c:501
+#: cgi-bin/admin.c:511
 msgid "Add RSS Subscription"
 msgstr ""
 
@@ -2663,28 +3190,28 @@ msgstr ""
 msgid "Address"
 msgstr ""
 
-#: cgi-bin/admin.c:210 cgi-bin/admin.c:284 cgi-bin/admin.c:2745
+#: cgi-bin/admin.c:186 cgi-bin/admin.c:260 cgi-bin/admin.c:2731
 msgid "Administration"
 msgstr ""
 
-#: ppdc/sample.c:429
+#: ppdc/sample.c:424
 msgid "Always"
 msgstr ""
 
-#: backend/socket.c:130
+#: backend/socket.c:121
 msgid "AppSocket/HP JetDirect"
 msgstr ""
 
-#: ppdc/sample.c:450
+#: ppdc/sample.c:445
 msgid "Applicator"
 msgstr ""
 
-#: scheduler/ipp.c:1079
+#: scheduler/ipp.c:998
 #, c-format
 msgid "Attempt to set %s printer-state to bad value %d."
 msgstr ""
 
-#: scheduler/ipp.c:325
+#: scheduler/ipp.c:239
 #, c-format
 msgid "Attribute groups are out of order (%x < %x)."
 msgstr ""
@@ -2737,306 +3264,335 @@ msgstr ""
 msgid "B9"
 msgstr ""
 
-#: scheduler/ipp.c:11091
+#: scheduler/ipp.c:10931
 #, c-format
 msgid "Bad 'document-format' value \"%s\"."
 msgstr ""
 
-#: cups/dest.c:1679
+#: cups/dest.c:1737
 msgid "Bad NULL dests pointer"
 msgstr ""
 
-#: cups/ppd.c:345
+#: cups/ppd.c:303
 msgid "Bad OpenGroup"
 msgstr ""
 
-#: cups/ppd.c:347
+#: cups/ppd.c:305
 msgid "Bad OpenUI/JCLOpenUI"
 msgstr ""
 
-#: cups/ppd.c:349
+#: cups/ppd.c:307
 msgid "Bad OrderDependency"
 msgstr ""
 
-#: cups/ppd-cache.c:149 cups/ppd-cache.c:196 cups/ppd-cache.c:234
-#: cups/ppd-cache.c:240 cups/ppd-cache.c:256 cups/ppd-cache.c:272
-#: cups/ppd-cache.c:281 cups/ppd-cache.c:289 cups/ppd-cache.c:306
-#: cups/ppd-cache.c:314 cups/ppd-cache.c:329 cups/ppd-cache.c:337
-#: cups/ppd-cache.c:358 cups/ppd-cache.c:370 cups/ppd-cache.c:385
-#: cups/ppd-cache.c:397 cups/ppd-cache.c:419 cups/ppd-cache.c:427
-#: cups/ppd-cache.c:445 cups/ppd-cache.c:453 cups/ppd-cache.c:468
-#: cups/ppd-cache.c:476 cups/ppd-cache.c:494 cups/ppd-cache.c:502
-#: cups/ppd-cache.c:529 cups/ppd-cache.c:575 cups/ppd-cache.c:583
-#: cups/ppd-cache.c:591
+#: cups/ppd-cache.c:434 cups/ppd-cache.c:481 cups/ppd-cache.c:566
+#: cups/ppd-cache.c:572 cups/ppd-cache.c:588 cups/ppd-cache.c:604
+#: cups/ppd-cache.c:613 cups/ppd-cache.c:621 cups/ppd-cache.c:638
+#: cups/ppd-cache.c:646 cups/ppd-cache.c:661 cups/ppd-cache.c:669
+#: cups/ppd-cache.c:690 cups/ppd-cache.c:702 cups/ppd-cache.c:717
+#: cups/ppd-cache.c:729 cups/ppd-cache.c:751 cups/ppd-cache.c:759
+#: cups/ppd-cache.c:777 cups/ppd-cache.c:785 cups/ppd-cache.c:800
+#: cups/ppd-cache.c:808 cups/ppd-cache.c:826 cups/ppd-cache.c:834
+#: cups/ppd-cache.c:861 cups/ppd-cache.c:931 cups/ppd-cache.c:939
+#: cups/ppd-cache.c:947
 msgid "Bad PPD cache file."
 msgstr ""
 
-#: cups/http-support.c:1360
+#: cups/http-support.c:1362
 msgid "Bad Request"
 msgstr ""
 
-#: cups/snmp.c:1002
+#: cups/snmp.c:954
 msgid "Bad SNMP version number"
 msgstr ""
 
-#: cups/ppd.c:350
+#: cups/ppd.c:308
 msgid "Bad UIConstraints"
 msgstr ""
 
-#: scheduler/ipp.c:1416
+#: cups/http-support.c:1456
+msgid "Bad arguments to function"
+msgstr ""
+
+#: scheduler/ipp.c:1368
 #, c-format
 msgid "Bad copies value %d."
 msgstr ""
 
-#: cups/ppd.c:358
+#: cups/ppd.c:316
 msgid "Bad custom parameter"
 msgstr ""
 
-#: cups/http-support.c:1512 scheduler/ipp.c:2467
+#: cups/http-support.c:1598 scheduler/ipp.c:2347
 #, c-format
 msgid "Bad device-uri \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:2506
+#: scheduler/ipp.c:2386
 #, c-format
 msgid "Bad device-uri scheme \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:8339 scheduler/ipp.c:8355 scheduler/ipp.c:9575
+#: scheduler/ipp.c:8143 scheduler/ipp.c:8161 scheduler/ipp.c:9387
 #, c-format
 msgid "Bad document-format \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:9591
+#: scheduler/ipp.c:9405
 #, c-format
 msgid "Bad document-format-default \"%s\"."
 msgstr ""
 
-#: cups/util.c:929
+#: cups/util.c:823
 msgid "Bad filename buffer"
 msgstr ""
 
-#: scheduler/ipp.c:1631
-msgid "Bad job-name value: Bad UTF-8 sequence."
+#: cups/http-support.c:1465
+msgid "Bad hostname/address in URI"
 msgstr ""
 
-#: scheduler/ipp.c:1634
-msgid "Bad job-name value: Name too long."
+#: scheduler/ipp.c:1543
+#, c-format
+msgid "Bad job-name value: %s"
 msgstr ""
 
-#: scheduler/ipp.c:1585
+#: scheduler/ipp.c:1536
 msgid "Bad job-name value: Wrong type or count."
 msgstr ""
 
-#: scheduler/ipp.c:10181
+#: scheduler/ipp.c:10001
 msgid "Bad job-priority value."
 msgstr ""
 
-#: scheduler/ipp.c:1446
+#: scheduler/ipp.c:1398
 #, c-format
 msgid "Bad job-sheets value \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:1430
+#: scheduler/ipp.c:1382
 msgid "Bad job-sheets value type."
 msgstr ""
 
-#: scheduler/ipp.c:10211
+#: scheduler/ipp.c:10031
 msgid "Bad job-state value."
 msgstr ""
 
-#: scheduler/ipp.c:3089 scheduler/ipp.c:3541 scheduler/ipp.c:6193
-#: scheduler/ipp.c:6340 scheduler/ipp.c:7773 scheduler/ipp.c:8042
-#: scheduler/ipp.c:8890 scheduler/ipp.c:9116 scheduler/ipp.c:9471
-#: scheduler/ipp.c:10074
+#: scheduler/ipp.c:2970 scheduler/ipp.c:3432 scheduler/ipp.c:5937
+#: scheduler/ipp.c:6084 scheduler/ipp.c:7572 scheduler/ipp.c:7841
+#: scheduler/ipp.c:8705 scheduler/ipp.c:8929 scheduler/ipp.c:9281
+#: scheduler/ipp.c:9894
 #, c-format
 msgid "Bad job-uri \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:2147 scheduler/ipp.c:5737
+#: scheduler/ipp.c:2018 scheduler/ipp.c:5475
 #, c-format
 msgid "Bad notify-pull-method \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:2111 scheduler/ipp.c:5701
+#: scheduler/ipp.c:1982 scheduler/ipp.c:5439
 #, c-format
 msgid "Bad notify-recipient-uri \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:1462
+#: scheduler/ipp.c:1414
 #, c-format
 msgid "Bad number-up value %d."
 msgstr ""
 
-#: cups/adminutil.c:292
+#: cups/adminutil.c:281
 #, c-format
 msgid "Bad option + choice on line %d."
 msgstr ""
 
-#: scheduler/ipp.c:1479
+#: scheduler/ipp.c:1431
 #, c-format
 msgid "Bad page-ranges values %d-%d."
 msgstr ""
 
-#: scheduler/ipp.c:2549
-#, c-format
-msgid "Bad port-monitor \"%s\"."
+#: cups/http-support.c:1462
+msgid "Bad port number in URI"
 msgstr ""
 
-#: cups/dest.c:676 cups/dest.c:1333
-msgid "Bad printer URI."
+#: scheduler/ipp.c:2429
+#, c-format
+msgid "Bad port-monitor \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:2610
+#: scheduler/ipp.c:2490
 #, c-format
 msgid "Bad printer-state value %d."
 msgstr ""
 
-#: scheduler/ipp.c:293
+#: cups/dest.c:610 cups/dest.c:1297 cups/dest.c:1344
+msgid "Bad printer-uri."
+msgstr ""
+
+#: scheduler/ipp.c:207
 #, c-format
 msgid "Bad request ID %d."
 msgstr ""
 
-#: scheduler/ipp.c:278
+#: scheduler/ipp.c:192
 #, c-format
 msgid "Bad request version number %d.%d."
 msgstr ""
 
-#: cgi-bin/admin.c:1484
+#: cups/http-support.c:1459
+msgid "Bad resource in URI"
+msgstr ""
+
+#: cups/http-support.c:1471
+msgid "Bad scheme in URI"
+msgstr ""
+
+#: cgi-bin/admin.c:1470
 msgid "Bad subscription ID"
 msgstr ""
 
-#: cups/ppd.c:360
+#: cups/http-support.c:1468
+msgid "Bad username in URI"
+msgstr ""
+
+#: cups/ppd.c:318
 msgid "Bad value string"
 msgstr ""
 
-#: cgi-bin/admin.c:3290 cgi-bin/admin.c:3536
+#: cups/http-support.c:1474
+msgid "Bad/empty URI"
+msgstr ""
+
+#: cgi-bin/admin.c:3276 cgi-bin/admin.c:3522
 msgid "Banners"
 msgstr ""
 
-#: ppdc/sample.c:287
+#: ppdc/sample.c:282
 msgid "Bond Paper"
 msgstr ""
 
-#: backend/usb-darwin.c:1846
+#: backend/usb-darwin.c:2024
 #, c-format
 msgid "Boolean expected for waiteof option \"%s\"."
 msgstr ""
 
-#: filter/pstops.c:2057
+#: filter/pstops.c:2034
 msgid "Buffer overflow detected, aborting."
 msgstr ""
 
-#: ppdc/sample.c:254
+#: ppdc/sample.c:277
 msgid "CMYK"
 msgstr ""
 
-#: ppdc/sample.c:363
+#: ppdc/sample.c:358
 msgid "CPCL Label Printer"
 msgstr ""
 
-#: cgi-bin/admin.c:1485 cgi-bin/admin.c:1524 cgi-bin/admin.c:1534
+#: cgi-bin/classes.c:165 cgi-bin/printers.c:168
+msgid "Cancel Jobs"
+msgstr ""
+
+#: cgi-bin/admin.c:1471 cgi-bin/admin.c:1510 cgi-bin/admin.c:1520
 msgid "Cancel RSS Subscription"
 msgstr ""
 
-#: backend/ipp.c:2027
+#: backend/ipp.c:2206
 msgid "Canceling print job."
 msgstr ""
 
-#: scheduler/ipp.c:2590
+#: scheduler/ipp.c:2470
 msgid "Cannot share a remote Kerberized printer."
 msgstr ""
 
-#: ppdc/sample.c:279
+#: ppdc/sample.c:271
 msgid "Cassette"
 msgstr ""
 
-#: cgi-bin/admin.c:1655 cgi-bin/admin.c:1797 cgi-bin/admin.c:1810
-#: cgi-bin/admin.c:1821
+#: cgi-bin/admin.c:1641 cgi-bin/admin.c:1783 cgi-bin/admin.c:1796
+#: cgi-bin/admin.c:1807
 msgid "Change Settings"
 msgstr ""
 
-#: scheduler/ipp.c:2159 scheduler/ipp.c:5749
+#: scheduler/ipp.c:2030 scheduler/ipp.c:5487
 #, c-format
 msgid "Character set \"%s\" not supported."
 msgstr ""
 
-#: cgi-bin/classes.c:195 cgi-bin/classes.c:322
+#: cgi-bin/classes.c:187 cgi-bin/classes.c:314
 msgid "Classes"
 msgstr ""
 
-#: cgi-bin/printers.c:182
+#: cgi-bin/printers.c:174
 msgid "Clean Print Heads"
 msgstr ""
 
-#: scheduler/ipp.c:3993
+#: scheduler/ipp.c:3884
 msgid "Close-Job doesn't support the job-uri attribute."
 msgstr ""
 
-#: ppdc/sample.c:282
+#: ppdc/sample.c:276
 msgid "Color"
 msgstr ""
 
-#: ppdc/sample.c:253
+#: ppdc/sample.c:274
 msgid "Color Mode"
 msgstr ""
 
-#: berkeley/lpc.c:204
+#: berkeley/lpc.c:196
 msgid ""
 "Commands may be abbreviated.  Commands are:\n"
 "\n"
 "exit    help    quit    status  ?"
 msgstr ""
 
-#: cups/snmp.c:1006
+#: cups/snmp.c:958
 msgid "Community name uses indefinite length"
 msgstr ""
 
-#: backend/ipp.c:802 backend/lpd.c:888 backend/socket.c:409
+#: backend/ipp.c:858 backend/lpd.c:879 backend/socket.c:400
 msgid "Connected to printer."
 msgstr ""
 
-#: backend/ipp.c:707 backend/lpd.c:711 backend/socket.c:328
+#: backend/ipp.c:763 backend/lpd.c:702 backend/socket.c:319
 msgid "Connecting to printer."
 msgstr ""
 
-#: cups/http-support.c:1333
+#: cups/http-support.c:1335
 msgid "Continue"
 msgstr ""
 
-#: ppdc/sample.c:365
+#: ppdc/sample.c:360
 msgid "Continuous"
 msgstr ""
 
-#: backend/lpd.c:1037 backend/lpd.c:1169
+#: backend/lpd.c:1028 backend/lpd.c:1160
 msgid "Control file sent successfully."
 msgstr ""
 
-#: backend/ipp.c:1261 backend/lpd.c:481
+#: backend/ipp.c:1358 backend/lpd.c:472
 msgid "Copying print data."
 msgstr ""
 
-#: cups/http-support.c:1342
+#: cups/http-support.c:1344
 msgid "Created"
 msgstr ""
 
-#: cups/ppd.c:1113 cups/ppd.c:1153 cups/ppd.c:1398 cups/ppd.c:1501
+#: cups/ppd.c:1069 cups/ppd.c:1109 cups/ppd.c:1354 cups/ppd.c:1457
 msgid "Custom"
 msgstr ""
 
-#: ppdc/sample.c:359
+#: ppdc/sample.c:354
 msgid "CustominCutInterval"
 msgstr ""
 
-#: ppdc/sample.c:357
+#: ppdc/sample.c:352
 msgid "CustominTearInterval"
 msgstr ""
 
-#: ppdc/sample.c:343
+#: ppdc/sample.c:338
 msgid "Cut"
 msgstr ""
 
-#: ppdc/sample.c:451
+#: ppdc/sample.c:446
 msgid "Cutter"
 msgstr ""
 
@@ -3048,23 +3604,23 @@ msgstr ""
 msgid "Darkness"
 msgstr ""
 
-#: backend/lpd.c:1122
+#: backend/lpd.c:1113
 msgid "Data file sent successfully."
 msgstr ""
 
-#: cgi-bin/admin.c:2094 cgi-bin/admin.c:2105 cgi-bin/admin.c:2150
+#: cgi-bin/admin.c:2080 cgi-bin/admin.c:2091 cgi-bin/admin.c:2136
 msgid "Delete Class"
 msgstr ""
 
-#: cgi-bin/admin.c:2179 cgi-bin/admin.c:2190 cgi-bin/admin.c:2235
+#: cgi-bin/admin.c:2165 cgi-bin/admin.c:2176 cgi-bin/admin.c:2221
 msgid "Delete Printer"
 msgstr ""
 
-#: ppdc/sample.c:281
+#: ppdc/sample.c:273
 msgid "DeskJet Series"
 msgstr ""
 
-#: scheduler/ipp.c:1361
+#: scheduler/ipp.c:1297
 #, c-format
 msgid "Destination \"%s\" is not accepting jobs."
 msgstr ""
@@ -3080,45 +3636,45 @@ msgid ""
 "        location = %s"
 msgstr ""
 
-#: ppdc/sample.c:436
+#: ppdc/sample.c:431
 msgid "Direct Thermal Media"
 msgstr ""
 
-#: cups/file.c:296
+#: cups/file.c:258
 #, c-format
 msgid "Directory \"%s\" contains a relative path."
 msgstr ""
 
-#: cups/file.c:268
+#: cups/file.c:230
 #, c-format
 msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
 msgstr ""
 
-#: cups/file.c:285
+#: cups/file.c:247
 #, c-format
 msgid "Directory \"%s\" is a file."
 msgstr ""
 
-#: cups/file.c:256
+#: cups/file.c:218
 #, c-format
 msgid "Directory \"%s\" not available: %s"
 msgstr ""
 
-#: cups/file.c:241
+#: cups/file.c:203
 #, c-format
 msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
 msgstr ""
 
-#: ppdc/sample.c:345
+#: ppdc/sample.c:340
 msgid "Disabled"
 msgstr ""
 
-#: scheduler/ipp.c:6242
+#: scheduler/ipp.c:5986
 #, c-format
 msgid "Document #%d does not exist in job #%d."
 msgstr ""
 
-#: ppdc/sample.c:275
+#: ppdc/sample.c:267
 msgid "Duplexer"
 msgstr ""
 
@@ -3126,26 +3682,30 @@ msgstr ""
 msgid "Dymo"
 msgstr ""
 
-#: ppdc/sample.c:431
+#: ppdc/sample.c:426
 msgid "EPL1 Label Printer"
 msgstr ""
 
-#: ppdc/sample.c:434
+#: ppdc/sample.c:429
 msgid "EPL2 Label Printer"
 msgstr ""
 
-#: cgi-bin/admin.c:1849 cgi-bin/admin.c:1861 cgi-bin/admin.c:1915
-#: cgi-bin/admin.c:1922 cgi-bin/admin.c:1957 cgi-bin/admin.c:1970
-#: cgi-bin/admin.c:1994 cgi-bin/admin.c:2067
+#: cgi-bin/admin.c:1835 cgi-bin/admin.c:1847 cgi-bin/admin.c:1901
+#: cgi-bin/admin.c:1908 cgi-bin/admin.c:1943 cgi-bin/admin.c:1956
+#: cgi-bin/admin.c:1980 cgi-bin/admin.c:2053
 msgid "Edit Configuration File"
 msgstr ""
 
-#: cups/adminutil.c:337
+#: cups/adminutil.c:326
 msgid "Empty PPD file."
 msgstr ""
 
+#: cups/http.c:4648
+msgid "Encryption is not supported."
+msgstr ""
+
 #. TRANSLATORS: Banner/cover sheet after the print job.
-#: cgi-bin/admin.c:3561
+#: cgi-bin/admin.c:3547
 msgid "Ending Banner"
 msgstr ""
 
@@ -3153,19 +3713,7 @@ msgstr ""
 msgid "English"
 msgstr ""
 
-#: systemv/lppasswd.c:193
-msgid "Enter old password:"
-msgstr ""
-
-#: systemv/lppasswd.c:224
-msgid "Enter password again:"
-msgstr ""
-
-#: systemv/lppasswd.c:212
-msgid "Enter password:"
-msgstr ""
-
-#: scheduler/client.c:2435
+#: scheduler/client.c:2226
 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 ""
 
@@ -3257,7 +3805,7 @@ msgstr ""
 msgid "Envelope DL"
 msgstr ""
 
-#: ppdc/sample.c:269
+#: ppdc/sample.c:261
 msgid "Envelope Feed"
 msgstr ""
 
@@ -3381,16 +3929,24 @@ msgstr ""
 msgid "Envelope You4 Long Edge"
 msgstr ""
 
+#: test/ippfind.c:2817
+msgid "Environment Variables:"
+msgstr ""
+
 #: ppdc/sample.c:240
 msgid "Epson"
 msgstr ""
 
-#: cgi-bin/admin.c:3604
+#: cgi-bin/admin.c:3590
 msgid "Error Policy"
 msgstr ""
 
-#: filter/rastertopwg.c:403 filter/rastertopwg.c:418 filter/rastertopwg.c:429
-#: filter/rastertopwg.c:440
+#: filter/rastertopwg.c:423
+msgid "Error reading raster data."
+msgstr ""
+
+#: filter/rastertopwg.c:395 filter/rastertopwg.c:413 filter/rastertopwg.c:431
+#: filter/rastertopwg.c:442
 msgid "Error sending raster data."
 msgstr ""
 
@@ -3398,43 +3954,43 @@ msgstr ""
 msgid "Error: need hostname after \"-h\" option."
 msgstr ""
 
-#: ppdc/sample.c:355
+#: ppdc/sample.c:350
 msgid "Every 10 Labels"
 msgstr ""
 
-#: ppdc/sample.c:347
+#: ppdc/sample.c:342
 msgid "Every 2 Labels"
 msgstr ""
 
-#: ppdc/sample.c:348
+#: ppdc/sample.c:343
 msgid "Every 3 Labels"
 msgstr ""
 
-#: ppdc/sample.c:349
+#: ppdc/sample.c:344
 msgid "Every 4 Labels"
 msgstr ""
 
-#: ppdc/sample.c:350
+#: ppdc/sample.c:345
 msgid "Every 5 Labels"
 msgstr ""
 
-#: ppdc/sample.c:351
+#: ppdc/sample.c:346
 msgid "Every 6 Labels"
 msgstr ""
 
-#: ppdc/sample.c:352
+#: ppdc/sample.c:347
 msgid "Every 7 Labels"
 msgstr ""
 
-#: ppdc/sample.c:353
+#: ppdc/sample.c:348
 msgid "Every 8 Labels"
 msgstr ""
 
-#: ppdc/sample.c:354
+#: ppdc/sample.c:349
 msgid "Every 9 Labels"
 msgstr ""
 
-#: ppdc/sample.c:346
+#: ppdc/sample.c:341
 msgid "Every Label"
 msgstr ""
 
@@ -3442,14 +3998,18 @@ msgstr ""
 msgid "Executive"
 msgstr ""
 
-#: cups/http-support.c:1388
+#: cups/http-support.c:1390
 msgid "Expectation Failed"
 msgstr ""
 
-#: cgi-bin/admin.c:2356 cgi-bin/admin.c:2375
+#: cgi-bin/admin.c:2342 cgi-bin/admin.c:2361
 msgid "Export Printers to Samba"
 msgstr ""
 
+#: test/ippfind.c:2763
+msgid "Expressions:"
+msgstr ""
+
 #: systemv/cupstestdsc.c:172 systemv/cupstestdsc.c:189
 #: systemv/cupstestdsc.c:214 systemv/cupstestdsc.c:231
 #: systemv/cupstestdsc.c:255 systemv/cupstestdsc.c:273
@@ -3472,27 +4032,27 @@ msgstr ""
 msgid "Fanfold US"
 msgstr ""
 
-#: cups/file.c:300
+#: cups/file.c:262
 #, c-format
 msgid "File \"%s\" contains a relative path."
 msgstr ""
 
-#: cups/file.c:275
+#: cups/file.c:237
 #, c-format
 msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
 msgstr ""
 
-#: cups/file.c:289
+#: cups/file.c:251
 #, c-format
 msgid "File \"%s\" is a directory."
 msgstr ""
 
-#: cups/file.c:261
+#: cups/file.c:223
 #, c-format
 msgid "File \"%s\" not available: %s"
 msgstr ""
 
-#: cups/file.c:247
+#: cups/file.c:209
 #, c-format
 msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
 msgstr ""
@@ -3501,13 +4061,13 @@ msgstr ""
 msgid "File Folder "
 msgstr ""
 
-#: scheduler/ipp.c:2485
+#: scheduler/ipp.c:2365
 #, c-format
 msgid "File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cups-files.conf\"."
 msgstr ""
 
-#: filter/rastertoepson.c:1117 filter/rastertohp.c:845
-#: filter/rastertolabel.c:1273
+#: filter/rastertoepson.c:1114 filter/rastertohp.c:834
+#: filter/rastertolabel.c:1259
 #, c-format
 msgid "Finished page %d."
 msgstr ""
@@ -3516,38 +4076,38 @@ msgstr ""
 msgid "Folio"
 msgstr ""
 
-#: cups/http-support.c:1367
+#: cups/http-support.c:1369
 msgid "Forbidden"
 msgstr ""
 
-#: cups/ppd.c:742 cups/ppd.c:1302
+#: cups/ppd.c:700 cups/ppd.c:1258
 msgid "General"
 msgstr ""
 
-#: ppdc/sample.c:259
+#: ppdc/sample.c:251
 msgid "Generic"
 msgstr ""
 
-#: cups/snmp.c:1016
+#: cups/snmp.c:968
 msgid "Get-Response-PDU uses indefinite length"
 msgstr ""
 
-#: ppdc/sample.c:290
+#: ppdc/sample.c:285
 msgid "Glossy Paper"
 msgstr ""
 
-#: scheduler/ipp.c:3067 scheduler/ipp.c:3467 scheduler/ipp.c:4005
-#: scheduler/ipp.c:6171 scheduler/ipp.c:6318 scheduler/ipp.c:7750
-#: scheduler/ipp.c:8868 scheduler/ipp.c:9094 scheduler/ipp.c:9449
-#: scheduler/ipp.c:10052
+#: scheduler/ipp.c:2948 scheduler/ipp.c:3358 scheduler/ipp.c:3896
+#: scheduler/ipp.c:5915 scheduler/ipp.c:6062 scheduler/ipp.c:7549
+#: scheduler/ipp.c:8683 scheduler/ipp.c:8907 scheduler/ipp.c:9259
+#: scheduler/ipp.c:9872
 msgid "Got a printer-uri attribute but no job-id."
 msgstr ""
 
-#: ppdc/sample.c:255
+#: ppdc/sample.c:275
 msgid "Grayscale"
 msgstr ""
 
-#: ppdc/sample.c:280
+#: ppdc/sample.c:272
 msgid "HP"
 msgstr ""
 
@@ -3559,87 +4119,95 @@ msgstr ""
 msgid "Help file not in index."
 msgstr ""
 
-#: cups/ipp.c:2689 cups/ipp.c:2716 cups/ipp.c:2739
+#: cups/ipp.c:3183 cups/ipp.c:3210 cups/ipp.c:3233
 msgid "IPP 1setOf attribute with incompatible value tags."
 msgstr ""
 
-#: cups/ipp.c:2652
+#: cups/ipp.c:3146
 msgid "IPP attribute has no name."
 msgstr ""
 
-#: cups/ipp.c:5521
+#: cups/ipp.c:7016
 msgid "IPP attribute is not a member of the message."
 msgstr ""
 
-#: cups/ipp.c:3092
+#: cups/ipp.c:3594
 msgid "IPP begCollection value not 0 bytes."
 msgstr ""
 
-#: cups/ipp.c:2882
+#: cups/ipp.c:3376
 msgid "IPP boolean value not 1 byte."
 msgstr ""
 
-#: cups/ipp.c:2943
+#: cups/ipp.c:3437
 msgid "IPP date value not 11 bytes."
 msgstr ""
 
-#: cups/ipp.c:3113
+#: cups/ipp.c:3615
 msgid "IPP endCollection value not 0 bytes."
 msgstr ""
 
-#: cups/ipp.c:2857
+#: cups/ipp.c:3351
 msgid "IPP enum value not 4 bytes."
 msgstr ""
 
-#: cups/ipp.c:2581
+#: cups/ipp.c:3075
 msgid "IPP extension tag larger than 0x7FFFFFFF."
 msgstr ""
 
-#: cups/ipp.c:2854
+#: cups/ipp.c:3348
 msgid "IPP integer value not 4 bytes."
 msgstr ""
 
-#: cups/ipp.c:3054
+#: cups/ipp.c:3547
 msgid "IPP language length overflows value."
 msgstr ""
 
-#: cups/ipp.c:2766
+#: cups/ipp.c:3556
+msgid "IPP language length too large."
+msgstr ""
+
+#: cups/ipp.c:3260
 msgid "IPP member name is not empty."
 msgstr ""
 
-#: cups/ipp.c:3139
+#: cups/ipp.c:3641
 msgid "IPP memberName value is empty."
 msgstr ""
 
-#: cups/ipp.c:3131
+#: cups/ipp.c:3633
 msgid "IPP memberName with no attribute."
 msgstr ""
 
-#: cups/ipp.c:2635
+#: cups/ipp.c:3129
 msgid "IPP name larger than 32767 bytes."
 msgstr ""
 
-#: cups/ipp.c:3020
+#: cups/ipp.c:3514
 msgid "IPP nameWithLanguage value less than minimum 4 bytes."
 msgstr ""
 
-#: cups/ipp.c:2988
+#: cups/ipp.c:3671
+msgid "IPP octetString length too large."
+msgstr ""
+
+#: cups/ipp.c:3482
 msgid "IPP rangeOfInteger value not 8 bytes."
 msgstr ""
 
-#: cups/ipp.c:2961
+#: cups/ipp.c:3455
 msgid "IPP resolution value not 9 bytes."
 msgstr ""
 
-#: cups/ipp.c:3072
+#: cups/ipp.c:3574
 msgid "IPP string length overflows value."
 msgstr ""
 
-#: cups/ipp.c:3016
+#: cups/ipp.c:3510
 msgid "IPP textWithLanguage value less than minimum 4 bytes."
 msgstr ""
 
-#: cups/ipp.c:2840
+#: cups/ipp.c:3334
 msgid "IPP value larger than 32767 bytes."
 msgstr ""
 
@@ -3647,47 +4215,47 @@ msgstr ""
 msgid "ISOLatin1"
 msgstr ""
 
-#: cups/ppd.c:353
+#: cups/ppd.c:311
 msgid "Illegal control character"
 msgstr ""
 
-#: cups/ppd.c:354
+#: cups/ppd.c:312
 msgid "Illegal main keyword string"
 msgstr ""
 
-#: cups/ppd.c:355
+#: cups/ppd.c:313
 msgid "Illegal option keyword string"
 msgstr ""
 
-#: cups/ppd.c:356
+#: cups/ppd.c:314
 msgid "Illegal translation string"
 msgstr ""
 
-#: cups/ppd.c:357
+#: cups/ppd.c:315
 msgid "Illegal whitespace character"
 msgstr ""
 
-#: ppdc/sample.c:274
+#: ppdc/sample.c:266
 msgid "Installable Options"
 msgstr ""
 
-#: ppdc/sample.c:277
+#: ppdc/sample.c:269
 msgid "Installed"
 msgstr ""
 
-#: ppdc/sample.c:293
+#: ppdc/sample.c:288
 msgid "IntelliBar Label Printer"
 msgstr ""
 
-#: ppdc/sample.c:292
+#: ppdc/sample.c:287
 msgid "Intellitech"
 msgstr ""
 
-#: cups/http-support.c:1394
+#: cups/http-support.c:1396
 msgid "Internal Server Error"
 msgstr ""
 
-#: cups/ppd.c:344
+#: cups/ppd.c:302
 msgid "Internal error"
 msgstr ""
 
@@ -3699,20 +4267,24 @@ msgstr ""
 msgid "Internet Postage 3-Part"
 msgstr ""
 
-#: backend/ipp.c:310
+#: backend/ipp.c:323
 msgid "Internet Printing Protocol"
 msgstr ""
 
-#: cups/dest-options.c:837
+#: cups/pwg-media.c:293 cups/pwg-media.c:312
+msgid "Invalid media name arguments."
+msgstr ""
+
+#: cups/dest-options.c:1032
 msgid "Invalid media size."
 msgstr ""
 
-#: filter/commandtops.c:125
+#: filter/commandtops.c:114
 #, c-format
 msgid "Invalid printer command \"%s\"."
 msgstr ""
 
-#: cups/ppd.c:1420
+#: cups/ppd.c:1376
 msgid "JCL"
 msgstr ""
 
@@ -3772,93 +4344,93 @@ msgstr ""
 msgid "JIS B9"
 msgstr ""
 
-#: scheduler/ipp.c:9166
+#: scheduler/ipp.c:8979
 #, c-format
 msgid "Job #%d cannot be restarted - no files."
 msgstr ""
 
-#: scheduler/ipp.c:3107 scheduler/ipp.c:3337 scheduler/ipp.c:3392
-#: scheduler/ipp.c:3569 scheduler/ipp.c:4015 scheduler/ipp.c:5835
-#: scheduler/ipp.c:6211 scheduler/ipp.c:6358 scheduler/ipp.c:6658
-#: scheduler/ipp.c:7597 scheduler/ipp.c:7619 scheduler/ipp.c:7791
-#: scheduler/ipp.c:8016 scheduler/ipp.c:8059 scheduler/ipp.c:8908
-#: scheduler/ipp.c:9134 scheduler/ipp.c:9489 scheduler/ipp.c:10092
+#: scheduler/ipp.c:2988 scheduler/ipp.c:3222 scheduler/ipp.c:3281
+#: scheduler/ipp.c:3460 scheduler/ipp.c:3906 scheduler/ipp.c:5573
+#: scheduler/ipp.c:5955 scheduler/ipp.c:6102 scheduler/ipp.c:6440
+#: scheduler/ipp.c:7396 scheduler/ipp.c:7418 scheduler/ipp.c:7590
+#: scheduler/ipp.c:7815 scheduler/ipp.c:7858 scheduler/ipp.c:8723
+#: scheduler/ipp.c:8947 scheduler/ipp.c:9299 scheduler/ipp.c:9912
 #, c-format
 msgid "Job #%d does not exist."
 msgstr ""
 
-#: scheduler/ipp.c:3601
+#: scheduler/ipp.c:3492
 #, c-format
 msgid "Job #%d is already aborted - can't cancel."
 msgstr ""
 
-#: scheduler/ipp.c:3595
+#: scheduler/ipp.c:3486
 #, c-format
 msgid "Job #%d is already canceled - can't cancel."
 msgstr ""
 
-#: scheduler/ipp.c:3607
+#: scheduler/ipp.c:3498
 #, c-format
 msgid "Job #%d is already completed - can't cancel."
 msgstr ""
 
-#: scheduler/ipp.c:7817 scheduler/ipp.c:8101 scheduler/ipp.c:10107
+#: scheduler/ipp.c:7616 scheduler/ipp.c:7900 scheduler/ipp.c:9927
 #, c-format
 msgid "Job #%d is finished and cannot be altered."
 msgstr ""
 
-#: scheduler/ipp.c:9148
+#: scheduler/ipp.c:8961
 #, c-format
 msgid "Job #%d is not complete."
 msgstr ""
 
-#: scheduler/ipp.c:3122
+#: scheduler/ipp.c:3003
 #, c-format
 msgid "Job #%d is not held for authentication."
 msgstr ""
 
-#: scheduler/ipp.c:8922
+#: scheduler/ipp.c:8737
 #, c-format
 msgid "Job #%d is not held."
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1055
+#: cgi-bin/ipp-var.c:1038
 msgid "Job Completed"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1053
+#: cgi-bin/ipp-var.c:1036
 msgid "Job Created"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1059
+#: cgi-bin/ipp-var.c:1042
 msgid "Job Options Changed"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1057
+#: cgi-bin/ipp-var.c:1040
 msgid "Job Stopped"
 msgstr ""
 
-#: scheduler/ipp.c:10189
+#: scheduler/ipp.c:10009
 msgid "Job is completed and cannot be changed."
 msgstr ""
 
-#: cgi-bin/jobs.c:198
+#: cgi-bin/jobs.c:192
 msgid "Job operation failed"
 msgstr ""
 
-#: scheduler/ipp.c:10225 scheduler/ipp.c:10244 scheduler/ipp.c:10255
+#: scheduler/ipp.c:10045 scheduler/ipp.c:10062 scheduler/ipp.c:10073
 msgid "Job state cannot be changed."
 msgstr ""
 
-#: scheduler/ipp.c:9014
+#: scheduler/ipp.c:8827
 msgid "Job subscriptions cannot be renewed."
 msgstr ""
 
-#: cgi-bin/jobs.c:103 cgi-bin/jobs.c:114 cgi-bin/jobs.c:195
+#: cgi-bin/jobs.c:97 cgi-bin/jobs.c:108 cgi-bin/jobs.c:189
 msgid "Jobs"
 msgstr ""
 
-#: backend/lpd.c:186
+#: backend/lpd.c:177
 msgid "LPD/LPR Host or Printer"
 msgstr ""
 
@@ -3866,11 +4438,11 @@ msgstr ""
 msgid "Label Printer"
 msgstr ""
 
-#: ppdc/sample.c:446
+#: ppdc/sample.c:441
 msgid "Label Top"
 msgstr ""
 
-#: scheduler/ipp.c:2168 scheduler/ipp.c:5758
+#: scheduler/ipp.c:2039 scheduler/ipp.c:5496
 #, c-format
 msgid "Language \"%s\" not supported."
 msgstr ""
@@ -3879,7 +4451,7 @@ msgstr ""
 msgid "Large Address"
 msgstr ""
 
-#: ppdc/sample.c:291
+#: ppdc/sample.c:286
 msgid "LaserJet Series PCL 4/5"
 msgstr ""
 
@@ -3895,39 +4467,43 @@ msgstr ""
 msgid "Light"
 msgstr ""
 
-#: cups/ppd.c:352
+#: cups/ppd.c:310
 msgid "Line longer than the maximum allowed (255 characters)"
 msgstr ""
 
-#: cgi-bin/admin.c:2393
+#: cgi-bin/admin.c:2379
 msgid "List Available Printers"
 msgstr ""
 
-#: ppdc/sample.c:272
+#: cups/localize.c:291
+msgid "Load paper."
+msgstr ""
+
+#: ppdc/sample.c:264
 msgid "Long-Edge (Portrait)"
 msgstr ""
 
-#: cups/http-support.c:1620
-msgid "Looking for printer."
+#: cups/http-support.c:1725
+msgid "Looking for printer..."
 msgstr ""
 
-#: ppdc/sample.c:268
+#: ppdc/sample.c:260
 msgid "Manual Feed"
 msgstr ""
 
-#: cups/ppd.c:789 cups/ppd.c:1357
+#: cups/ppd.c:747 cups/ppd.c:1313
 msgid "Media Size"
 msgstr ""
 
-#: cups/ppd.c:793 cups/ppd.c:1361 ppdc/sample.c:262
+#: cups/ppd.c:751 cups/ppd.c:1317 ppdc/sample.c:254
 msgid "Media Source"
 msgstr ""
 
-#: ppdc/sample.c:364
+#: ppdc/sample.c:359
 msgid "Media Tracking"
 msgstr ""
 
-#: cups/ppd.c:791 cups/ppd.c:1359 ppdc/sample.c:285
+#: cups/ppd.c:749 cups/ppd.c:1315 ppdc/sample.c:280
 msgid "Media Type"
 msgstr ""
 
@@ -3935,79 +4511,87 @@ msgstr ""
 msgid "Medium"
 msgstr ""
 
-#: cups/ppd.c:341
+#: cups/ppd.c:299
 msgid "Memory allocation error"
 msgstr ""
 
-#: cups/ppd.c:361
+#: cups/ppd.c:319
 msgid "Missing CloseGroup"
 msgstr ""
 
-#: cups/ppd.c:342
+#: cups/ppd.c:300
 msgid "Missing PPD-Adobe-4.x header"
 msgstr ""
 
-#: cups/ppd.c:351
+#: cups/ppd.c:309
 msgid "Missing asterisk in column 1"
 msgstr ""
 
-#: scheduler/ipp.c:6234
+#: scheduler/ipp.c:5978
 msgid "Missing document-number attribute."
 msgstr ""
 
-#: cups/adminutil.c:273
+#: cups/adminutil.c:262
 #, c-format
 msgid "Missing double quote on line %d."
 msgstr ""
 
-#: cgi-bin/admin.c:736 cgi-bin/admin.c:2106 cgi-bin/admin.c:2191
-#: cgi-bin/admin.c:2785 cgi-bin/admin.c:3039 cgi-bin/admin.c:3150
-#: cgi-bin/admin.c:3860
+#: cgi-bin/admin.c:712 cgi-bin/admin.c:2092 cgi-bin/admin.c:2177
+#: cgi-bin/admin.c:2771 cgi-bin/admin.c:3025 cgi-bin/admin.c:3136
+#: cgi-bin/admin.c:3846
 msgid "Missing form variable"
 msgstr ""
 
-#: scheduler/ipp.c:9543
+#: scheduler/ipp.c:9353
 msgid "Missing last-document attribute in request."
 msgstr ""
 
-#: cups/pwg-media.c:535
+#: cups/pwg-media.c:555
 msgid "Missing media or media-col."
 msgstr ""
 
-#: cups/pwg-media.c:454
+#: cups/pwg-media.c:474
 msgid "Missing media-size in media-col."
 msgstr ""
 
-#: scheduler/ipp.c:6788
+#: scheduler/ipp.c:6581
 msgid "Missing notify-subscription-ids attribute."
 msgstr ""
 
-#: cups/ppd.c:359
+#: cups/ppd.c:317
 msgid "Missing option keyword"
 msgstr ""
 
-#: scheduler/ipp.c:3248 scheduler/ipp.c:3273
+#: scheduler/ipp.c:3129 scheduler/ipp.c:3154
 msgid "Missing requesting-user-name attribute."
 msgstr ""
 
-#: scheduler/ipp.c:461
+#: scheduler/ipp.c:388
 msgid "Missing required attributes."
 msgstr ""
 
-#: cups/adminutil.c:254
+#: cups/http-support.c:1486
+msgid "Missing resource in URI"
+msgstr ""
+
+#: cups/http-support.c:1480
+msgid "Missing scheme in URI"
+msgstr ""
+
+#: cups/adminutil.c:243
 #, c-format
 msgid "Missing value on line %d."
 msgstr ""
 
-#: cups/ppd.c:343
+#: cups/ppd.c:301
 msgid "Missing value string"
 msgstr ""
 
-#: cups/pwg-media.c:442
+#: cups/pwg-media.c:462
 msgid "Missing x-dimension in media-size."
 msgstr ""
 
-#: cups/pwg-media.c:448
+#: cups/pwg-media.c:468
 msgid "Missing y-dimension in media-size."
 msgstr ""
 
@@ -4020,96 +4604,96 @@ msgid ""
 "        device-id = %s"
 msgstr ""
 
-#: cgi-bin/admin.c:570
+#: test/ippfind.c:2794
+msgid "Modifiers:"
+msgstr ""
+
+#: cgi-bin/admin.c:546
 msgid "Modify Class"
 msgstr ""
 
-#: cgi-bin/admin.c:882
+#: cgi-bin/admin.c:859
 msgid "Modify Printer"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:425 cgi-bin/ipp-var.c:516
+#: cgi-bin/ipp-var.c:413 cgi-bin/ipp-var.c:504
 msgid "Move All Jobs"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:364 cgi-bin/ipp-var.c:423 cgi-bin/ipp-var.c:514
+#: cgi-bin/ipp-var.c:352 cgi-bin/ipp-var.c:411 cgi-bin/ipp-var.c:502
 msgid "Move Job"
 msgstr ""
 
-#: cups/http-support.c:1351
+#: cups/http-support.c:1353
 msgid "Moved Permanently"
 msgstr ""
 
-#: cups/ppd.c:340
+#: cups/ppd.c:298
 msgid "NULL PPD file pointer"
 msgstr ""
 
-#: cups/snmp.c:1053
+#: cups/snmp.c:1005
 msgid "Name OID uses indefinite length"
 msgstr ""
 
-#: scheduler/ipp.c:1142
+#: scheduler/ipp.c:1061
 msgid "Nested classes are not allowed."
 msgstr ""
 
-#: ppdc/sample.c:430
+#: ppdc/sample.c:425
 msgid "Never"
 msgstr ""
 
-#: ppdc/sample.c:256
-msgid "New Stylus Color Series"
-msgstr ""
-
-#: ppdc/sample.c:258
-msgid "New Stylus Photo Series"
-msgstr ""
-
-#: cups/ppd.c:1949
+#: cups/ppd.c:1904
 msgid "No"
 msgstr ""
 
-#: cups/http-support.c:1348
+#: cups/http-support.c:1350
 msgid "No Content"
 msgstr ""
 
-#: cups/util.c:1304
+#: cups/util.c:1123
 msgid "No PPD name"
 msgstr ""
 
-#: cups/snmp.c:1047
+#: cups/snmp.c:999
 msgid "No VarBind SEQUENCE"
 msgstr ""
 
-#: cups/adminutil.c:788
+#: cups/adminutil.c:777
 msgid "No Windows printer drivers are installed."
 msgstr ""
 
-#: cups/request.c:568 cups/request.c:914
+#: cups/request.c:570 cups/request.c:933
 msgid "No active connection"
 msgstr ""
 
-#: scheduler/ipp.c:3518
+#: cups/request.c:350
+msgid "No active connection."
+msgstr ""
+
+#: scheduler/ipp.c:3409
 #, c-format
 msgid "No active jobs on %s."
 msgstr ""
 
-#: scheduler/ipp.c:302
+#: scheduler/ipp.c:216
 msgid "No attributes in request."
 msgstr ""
 
-#: scheduler/ipp.c:3149
+#: scheduler/ipp.c:3030
 msgid "No authentication information provided."
 msgstr ""
 
-#: cups/snmp.c:1004
+#: cups/snmp.c:956
 msgid "No community name"
 msgstr ""
 
-#: scheduler/ipp.c:6034
+#: scheduler/ipp.c:5778
 msgid "No default printer."
 msgstr ""
 
-#: cgi-bin/ipp-var.c:436 scheduler/ipp.c:7363
+#: cgi-bin/ipp-var.c:424 scheduler/ipp.c:7162
 msgid "No destinations added."
 msgstr ""
 
@@ -4117,72 +4701,84 @@ msgstr ""
 msgid "No device URI found in argv[0] or in DEVICE_URI environment variable."
 msgstr ""
 
-#: cups/snmp.c:1034
+#: cups/snmp.c:986
 msgid "No error-index"
 msgstr ""
 
-#: cups/snmp.c:1026
+#: cups/snmp.c:978
 msgid "No error-status"
 msgstr ""
 
-#: scheduler/ipp.c:8305 scheduler/ipp.c:9557
+#: scheduler/ipp.c:8105 scheduler/ipp.c:9367
 msgid "No file in print request."
 msgstr ""
 
-#: cups/util.c:923
+#: cups/util.c:817
 msgid "No modification time"
 msgstr ""
 
-#: cups/snmp.c:1051
+#: cups/snmp.c:1003
 msgid "No name OID"
 msgstr ""
 
-#: filter/rastertoepson.c:1147 filter/rastertohp.c:876
-#: filter/rastertolabel.c:1302
+#: filter/rastertoepson.c:1144 filter/rastertohp.c:865
+#: filter/rastertolabel.c:1288
 msgid "No pages were found."
 msgstr ""
 
-#: cups/util.c:917
+#: cups/util.c:811
 msgid "No printer name"
 msgstr ""
 
-#: cups/util.c:1837
+#: cups/util.c:1647
 msgid "No printer-uri found"
 msgstr ""
 
-#: cups/util.c:1822
+#: cups/util.c:1631
 msgid "No printer-uri found for class"
 msgstr ""
 
-#: scheduler/ipp.c:6437
+#: scheduler/ipp.c:6186
 msgid "No printer-uri in request."
 msgstr ""
 
-#: cups/snmp.c:1018
+#: cups/http.c:2260
+msgid "No request URI."
+msgstr ""
+
+#: cups/http.c:2277
+msgid "No request protocol version."
+msgstr ""
+
+#: cups/request.c:358
+msgid "No request sent."
+msgstr ""
+
+#: cups/snmp.c:970
 msgid "No request-id"
 msgstr ""
 
-#: scheduler/ipp.c:5643
+#: scheduler/ipp.c:5381
 msgid "No subscription attributes in request."
 msgstr ""
 
-#: scheduler/ipp.c:7690
+#: scheduler/ipp.c:7489
 msgid "No subscriptions found."
 msgstr ""
 
-#: cups/snmp.c:1042
+#: cups/snmp.c:994
 msgid "No variable-bindings SEQUENCE"
 msgstr ""
 
-#: cups/snmp.c:997
+#: cups/snmp.c:949
 msgid "No version number"
 msgstr ""
 
-#: ppdc/sample.c:367
+#: ppdc/sample.c:362
 msgid "Non-continuous (Mark sensing)"
 msgstr ""
 
-#: ppdc/sample.c:366
+#: ppdc/sample.c:361
 msgid "Non-continuous (Web sensing)"
 msgstr ""
 
@@ -4190,27 +4786,27 @@ msgstr ""
 msgid "Normal"
 msgstr ""
 
-#: cups/http-support.c:1370
+#: cups/http-support.c:1372
 msgid "Not Found"
 msgstr ""
 
-#: cups/http-support.c:1382
+#: cups/http-support.c:1384
 msgid "Not Implemented"
 msgstr ""
 
-#: ppdc/sample.c:276
+#: ppdc/sample.c:268
 msgid "Not Installed"
 msgstr ""
 
-#: cups/http-support.c:1357
+#: cups/http-support.c:1359
 msgid "Not Modified"
 msgstr ""
 
-#: cups/http-support.c:1385
+#: cups/http-support.c:1387
 msgid "Not Supported"
 msgstr ""
 
-#: scheduler/ipp.c:1554 scheduler/ipp.c:10787
+#: scheduler/ipp.c:1506 scheduler/ipp.c:10626
 msgid "Not allowed to print."
 msgstr ""
 
@@ -4222,15 +4818,15 @@ msgstr ""
 msgid "Note: this program only validates the DSC comments, not the PostScript itself."
 msgstr ""
 
-#: cups/http-support.c:1339 cups/ppd.c:338
+#: cups/http-support.c:1341 cups/http-support.c:1477 cups/ppd.c:296
 msgid "OK"
 msgstr ""
 
-#: ppdc/sample.c:271
+#: ppdc/sample.c:263
 msgid "Off (1-Sided)"
 msgstr ""
 
-#: ppdc/sample.c:361
+#: ppdc/sample.c:356
 msgid "Oki"
 msgstr ""
 
@@ -4238,76 +4834,69 @@ msgstr ""
 msgid "Online Help"
 msgstr ""
 
-#: cups/adminutil.c:955
+#: cups/adminutil.c:944
 #, c-format
 msgid "Open of %s failed: %s"
 msgstr ""
 
-#: cups/ppd.c:346
+#: cups/ppd.c:304
 msgid "OpenGroup without a CloseGroup first"
 msgstr ""
 
-#: cups/ppd.c:348
+#: cups/ppd.c:306
 msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"
 msgstr ""
 
-#: cgi-bin/admin.c:3631
+#: cgi-bin/admin.c:3617
 msgid "Operation Policy"
 msgstr ""
 
-#: filter/pstops.c:2205
+#: filter/pstops.c:2182
 #, c-format
 msgid "Option \"%s\" cannot be included via %%%%IncludeFeature."
 msgstr ""
 
-#: cgi-bin/admin.c:3281 cgi-bin/admin.c:3365
+#: cgi-bin/admin.c:3267 cgi-bin/admin.c:3351
 msgid "Options Installed"
 msgstr ""
 
-#: scheduler/cupsfilter.c:1433 scheduler/main.c:2054 systemv/cupsaddsmb.c:284
-#: systemv/cupsctl.c:203 systemv/cupstestdsc.c:429 systemv/cupstestppd.c:3797
-#: test/ipptool.c:4484 ppdc/ppdc.cxx:437 ppdc/ppdhtml.cxx:174
-#: ppdc/ppdi.cxx:130 ppdc/ppdmerge.cxx:369 ppdc/ppdpo.cxx:254
+#: scheduler/cupsfilter.c:1482 scheduler/main.c:2177 systemv/cupsaddsmb.c:284
+#: systemv/cupsctl.c:203 systemv/cupstestdsc.c:429 systemv/cupstestppd.c:3861
+#: test/ippfind.c:2753 test/ipptool.c:4857 ppdc/ppdc.cxx:432
+#: ppdc/ppdhtml.cxx:179 ppdc/ppdi.cxx:130 ppdc/ppdmerge.cxx:363
+#: ppdc/ppdpo.cxx:249
 msgid "Options:"
 msgstr ""
 
-#: cups/ppd-cache.c:157
+#: cups/ppd-cache.c:442
 msgid "Out of date PPD cache file."
 msgstr ""
 
-#: cups/ppd-cache.c:1384
+#: cups/ppd-cache.c:1810
 msgid "Out of memory."
 msgstr ""
 
-#: cups/ppd.c:795 cups/ppd.c:1363
+#: cups/ppd.c:753 cups/ppd.c:1319
 msgid "Output Mode"
 msgstr ""
 
-#: systemv/lpstat.c:1295 systemv/lpstat.c:1299
-#, c-format
-msgid "Output for printer %s is sent to %s"
-msgstr ""
-
-#: systemv/lpstat.c:1289
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
+#: cups/localize.c:316
+msgid "Output bin is almost full."
 msgstr ""
 
-#: systemv/lpstat.c:1313 systemv/lpstat.c:1317
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
+#: cups/localize.c:318
+msgid "Output bin is full."
 msgstr ""
 
-#: systemv/lpstat.c:1307
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+#: cups/localize.c:314
+msgid "Output bin is missing."
 msgstr ""
 
 #: systemv/cupstestdsc.c:399
 msgid "PASS"
 msgstr ""
 
-#: ppdc/sample.c:260
+#: ppdc/sample.c:252
 msgid "PCL Laser Printer"
 msgstr ""
 
@@ -4335,23 +4924,39 @@ msgstr ""
 msgid "PRC32K Oversize Long Edge"
 msgstr ""
 
-#: cups/snmp.c:1014
+#: cups/snmp.c:966
 msgid "Packet does not contain a Get-Response-PDU"
 msgstr ""
 
-#: cups/snmp.c:993
+#: cups/snmp.c:945
 msgid "Packet does not start with SEQUENCE"
 msgstr ""
 
-#: ppdc/sample.c:360
+#: cups/localize.c:293
+msgid "Paper jam."
+msgstr ""
+
+#: cups/localize.c:310
+msgid "Paper tray is almost empty."
+msgstr ""
+
+#: cups/localize.c:312
+msgid "Paper tray is empty."
+msgstr ""
+
+#: cups/localize.c:308
+msgid "Paper tray is missing."
+msgstr ""
+
+#: ppdc/sample.c:355
 msgid "ParamCustominCutInterval"
 msgstr ""
 
-#: ppdc/sample.c:358
+#: ppdc/sample.c:353
 msgid "ParamCustominTearInterval"
 msgstr ""
 
-#: cups/auth.c:199 cups/auth.c:367
+#: cups/auth.c:195 cups/auth.c:362
 #, c-format
 msgid "Password for %s on %s? "
 msgstr ""
@@ -4361,15 +4966,15 @@ msgstr ""
 msgid "Password for %s required to access %s via SAMBA: "
 msgstr ""
 
-#: cgi-bin/classes.c:167
+#: cgi-bin/classes.c:159
 msgid "Pause Class"
 msgstr ""
 
-#: cgi-bin/printers.c:170
+#: cgi-bin/printers.c:162
 msgid "Pause Printer"
 msgstr ""
 
-#: ppdc/sample.c:448
+#: ppdc/sample.c:443
 msgid "Peel-Off"
 msgstr ""
 
@@ -4381,19 +4986,19 @@ msgstr ""
 msgid "Photo Labels"
 msgstr ""
 
-#: ppdc/sample.c:286
+#: ppdc/sample.c:281
 msgid "Plain Paper"
 msgstr ""
 
-#: cgi-bin/admin.c:3299 cgi-bin/admin.c:3580
+#: cgi-bin/admin.c:3285 cgi-bin/admin.c:3566
 msgid "Policies"
 msgstr ""
 
-#: cgi-bin/admin.c:3306 cgi-bin/admin.c:3649 cgi-bin/admin.c:3662
+#: cgi-bin/admin.c:3292 cgi-bin/admin.c:3635 cgi-bin/admin.c:3648
 msgid "Port Monitor"
 msgstr ""
 
-#: ppdc/sample.c:278
+#: ppdc/sample.c:270
 msgid "PostScript Printer"
 msgstr ""
 
@@ -4413,7 +5018,11 @@ msgstr ""
 msgid "Postcard Long Edge"
 msgstr ""
 
-#: ppdc/sample.c:295
+#: backend/ipp.c:965 backend/ipp.c:973
+msgid "Preparing to print."
+msgstr ""
+
+#: ppdc/sample.c:290
 msgid "Print Density"
 msgstr ""
 
@@ -4421,153 +5030,139 @@ msgstr ""
 msgid "Print Job:"
 msgstr ""
 
-#: ppdc/sample.c:340
+#: ppdc/sample.c:335
 msgid "Print Mode"
 msgstr ""
 
-#: ppdc/sample.c:383
+#: ppdc/sample.c:378
 msgid "Print Rate"
 msgstr ""
 
-#: cgi-bin/printers.c:179
+#: cgi-bin/printers.c:171
 msgid "Print Self-Test Page"
 msgstr ""
 
-#: ppdc/sample.c:327
+#: ppdc/sample.c:322
 msgid "Print Speed"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:792
+#: cgi-bin/ipp-var.c:780
 msgid "Print Test Page"
 msgstr ""
 
-#: ppdc/sample.c:356
+#: ppdc/sample.c:351
 msgid "Print and Cut"
 msgstr ""
 
-#: ppdc/sample.c:344
+#: ppdc/sample.c:339
 msgid "Print and Tear"
 msgstr ""
 
-#: backend/ipp.c:1575
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr ""
-
-#: backend/ipp.c:1565
-msgid "Print file accepted - job ID unknown."
-msgstr ""
-
-#: backend/socket.c:438 backend/usb-unix.c:191
+#: backend/socket.c:429 backend/usb-unix.c:184
 msgid "Print file sent."
 msgstr ""
 
-#: backend/ipp.c:1526
-msgid "Print file was not accepted."
-msgstr ""
-
-#: backend/ipp.c:2001
+#: backend/ipp.c:2180
 msgid "Print job canceled at printer."
 msgstr ""
 
-#: backend/ipp.c:1996
+#: backend/ipp.c:2172
 msgid "Print job too large."
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1047
+#: backend/ipp.c:1654
+msgid "Print job was not accepted."
+msgstr ""
+
+#: cgi-bin/ipp-var.c:1030
 msgid "Printer Added"
 msgstr ""
 
-#: ppdc/sample.c:263
+#: ppdc/sample.c:255
 msgid "Printer Default"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1051
+#: cgi-bin/ipp-var.c:1034
 msgid "Printer Deleted"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1049
+#: cgi-bin/ipp-var.c:1032
 msgid "Printer Modified"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1045
+#: cgi-bin/ipp-var.c:1028
 msgid "Printer Paused"
 msgstr ""
 
-#: ppdc/sample.c:294
+#: ppdc/sample.c:289
 msgid "Printer Settings"
 msgstr ""
 
-#: backend/ipp.c:1999
+#: backend/ipp.c:2175
 msgid "Printer cannot print supplied content."
 msgstr ""
 
+#: backend/ipp.c:2178
+msgid "Printer cannot print with supplied options."
+msgstr ""
+
 #: cups/notify.c:126
 msgid "Printer:"
 msgstr ""
 
-#: cgi-bin/printers.c:204 cgi-bin/printers.c:332
+#: cgi-bin/printers.c:196 cgi-bin/printers.c:324
 msgid "Printers"
 msgstr ""
 
-#: filter/rastertoepson.c:1093 filter/rastertohp.c:817
-#: filter/rastertolabel.c:1249
+#: filter/rastertoepson.c:1090 filter/rastertohp.c:806
+#: filter/rastertolabel.c:1235
 #, c-format
-msgid "Printing page %d, %d%% complete."
-msgstr ""
-
-#: cgi-bin/classes.c:173 cgi-bin/printers.c:176
-msgid "Purge Jobs"
+msgid "Printing page %d, %u%% complete."
 msgstr ""
 
 #: ppdc/sample.c:155
 msgid "Quarto"
 msgstr ""
 
-#: scheduler/ipp.c:1549 scheduler/ipp.c:10782
+#: scheduler/ipp.c:1501 scheduler/ipp.c:10621
 msgid "Quota limit reached."
 msgstr ""
 
-#: berkeley/lpq.c:520
+#: berkeley/lpq.c:490
 msgid "Rank    Owner   Job     File(s)                         Total Size"
 msgstr ""
 
-#. TRANSLATORS: Pri is job priority.
-#: berkeley/lpq.c:516
-msgid "Rank   Owner      Pri  Job        Files                       Total Size"
-msgstr ""
-
-#: cgi-bin/classes.c:171 cgi-bin/printers.c:174
+#: cgi-bin/classes.c:163 cgi-bin/printers.c:166
 msgid "Reject Jobs"
 msgstr ""
 
-#: backend/lpd.c:1033 backend/lpd.c:1165
+#: backend/lpd.c:1024 backend/lpd.c:1156
 #, c-format
 msgid "Remote host did not accept control file (%d)."
 msgstr ""
 
-#: backend/lpd.c:1118
+#: backend/lpd.c:1109
 #, c-format
 msgid "Remote host did not accept data file (%d)."
 msgstr ""
 
-#: ppdc/sample.c:428
+#: ppdc/sample.c:423
 msgid "Reprint After Error"
 msgstr ""
 
-#: cups/http-support.c:1373
+#: cups/http-support.c:1375
 msgid "Request Entity Too Large"
 msgstr ""
 
-#: cups/ppd.c:797 cups/ppd.c:1365 ppdc/sample.c:231
+#: cups/ppd.c:755 cups/ppd.c:1321 ppdc/sample.c:231
 msgid "Resolution"
 msgstr ""
 
-#: cgi-bin/classes.c:165
+#: cgi-bin/classes.c:157
 msgid "Resume Class"
 msgstr ""
 
-#: cgi-bin/printers.c:167
+#: cgi-bin/printers.c:159
 msgid "Resume Printer"
 msgstr ""
 
@@ -4575,69 +5170,73 @@ msgstr ""
 msgid "Return Address"
 msgstr ""
 
-#: ppdc/sample.c:449
+#: ppdc/sample.c:444
 msgid "Rewind"
 msgstr ""
 
-#: cups/adminutil.c:2052
+#: cups/adminutil.c:2041
 #, c-format
 msgid "Running command: %s %s -N -A %s -c '%s'"
 msgstr ""
 
-#: cups/snmp.c:995
+#: cups/snmp.c:947
 msgid "SEQUENCE uses indefinite length"
 msgstr ""
 
-#: cups/http-support.c:1397
+#: cups/http-support.c:1399
 msgid "SSL/TLS Negotiation Error"
 msgstr ""
 
-#: cups/http-support.c:1354
+#: cups/http-support.c:1356
 msgid "See Other"
 msgstr ""
 
-#: backend/usb-darwin.c:543 backend/usb-libusb.c:459
+#: backend/usb-darwin.c:564 backend/usb-libusb.c:346
 msgid "Sending data to printer."
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1061
+#: cgi-bin/ipp-var.c:1044
 msgid "Server Restarted"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1067
+#: cgi-bin/ipp-var.c:1050
 msgid "Server Security Auditing"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1063
+#: cgi-bin/ipp-var.c:1046
 msgid "Server Started"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1065
+#: cgi-bin/ipp-var.c:1048
 msgid "Server Stopped"
 msgstr ""
 
-#: cups/http-support.c:1391
+#: cups/tls-darwin.c:1030 cups/tls-gnutls.c:1049
+msgid "Server credentials not set."
+msgstr ""
+
+#: cups/http-support.c:1393
 msgid "Service Unavailable"
 msgstr ""
 
-#: cgi-bin/admin.c:2786 cgi-bin/admin.c:2832 cgi-bin/admin.c:2989
-#: cgi-bin/admin.c:3008
+#: cgi-bin/admin.c:2772 cgi-bin/admin.c:2818 cgi-bin/admin.c:2975
+#: cgi-bin/admin.c:2994
 msgid "Set Allowed Users"
 msgstr ""
 
-#: cgi-bin/admin.c:3035
+#: cgi-bin/admin.c:3021
 msgid "Set As Server Default"
 msgstr ""
 
-#: cgi-bin/admin.c:3135
+#: cgi-bin/admin.c:3121
 msgid "Set Class Options"
 msgstr ""
 
-#: cgi-bin/admin.c:3135 cgi-bin/admin.c:3309 cgi-bin/admin.c:3691
+#: cgi-bin/admin.c:3121 cgi-bin/admin.c:3295 cgi-bin/admin.c:3677
 msgid "Set Printer Options"
 msgstr ""
 
-#: cgi-bin/admin.c:3861 cgi-bin/admin.c:3905 cgi-bin/admin.c:3923
+#: cgi-bin/admin.c:3847 cgi-bin/admin.c:3891 cgi-bin/admin.c:3909
 msgid "Set Publishing"
 msgstr ""
 
@@ -4645,30 +5244,30 @@ msgstr ""
 msgid "Shipping Address"
 msgstr ""
 
-#: ppdc/sample.c:273
+#: ppdc/sample.c:265
 msgid "Short-Edge (Landscape)"
 msgstr ""
 
-#: ppdc/sample.c:288
+#: ppdc/sample.c:283
 msgid "Special Paper"
 msgstr ""
 
-#: backend/lpd.c:1074
+#: backend/lpd.c:1065
 #, c-format
 msgid "Spooling job, %.0f%% complete."
 msgstr ""
 
-#: ppdc/sample.c:341
+#: ppdc/sample.c:336
 msgid "Standard"
 msgstr ""
 
 #. TRANSLATORS: Banner/cover sheet before the print job.
-#: cgi-bin/admin.c:3552
+#: cgi-bin/admin.c:3538
 msgid "Starting Banner"
 msgstr ""
 
-#: filter/rastertoepson.c:1069 filter/rastertohp.c:793
-#: filter/rastertolabel.c:1225
+#: filter/rastertoepson.c:1066 filter/rastertohp.c:782
+#: filter/rastertolabel.c:1211
 #, c-format
 msgid "Starting page %d."
 msgstr ""
@@ -4677,20 +5276,16 @@ msgstr ""
 msgid "Statement"
 msgstr ""
 
-#: ppdc/sample.c:251
-msgid "Stylus Color Series"
-msgstr ""
-
-#: ppdc/sample.c:257
-msgid "Stylus Photo Series"
-msgstr ""
-
-#: scheduler/ipp.c:3664 scheduler/ipp.c:6804 scheduler/ipp.c:7503
-#: scheduler/ipp.c:9002
+#: scheduler/ipp.c:3555 scheduler/ipp.c:6597 scheduler/ipp.c:7302
+#: scheduler/ipp.c:8815
 #, c-format
 msgid "Subscription #%d does not exist."
 msgstr ""
 
+#: test/ippfind.c:2806
+msgid "Substitutions:"
+msgstr ""
+
 #: ppdc/sample.c:157
 msgid "Super A"
 msgstr ""
@@ -4703,7 +5298,7 @@ msgstr ""
 msgid "Super B/A3"
 msgstr ""
 
-#: cups/http-support.c:1336
+#: cups/http-support.c:1338
 msgid "Switching Protocols"
 msgstr ""
 
@@ -4719,306 +5314,278 @@ msgstr ""
 msgid "Tabloid Oversize Long Edge"
 msgstr ""
 
-#: ppdc/sample.c:342
+#: ppdc/sample.c:337
 msgid "Tear"
 msgstr ""
 
-#: ppdc/sample.c:447
+#: ppdc/sample.c:442
 msgid "Tear-Off"
 msgstr ""
 
-#: ppdc/sample.c:388
+#: ppdc/sample.c:383
 msgid "Tear-Off Adjust Position"
 msgstr ""
 
-#: scheduler/ipp.c:6508 scheduler/ipp.c:6586 scheduler/ipp.c:6602
-#: scheduler/ipp.c:6620
+#: scheduler/ipp.c:1337
+#, c-format
+msgid "The \"%s\" attribute is required for print jobs."
+msgstr ""
+
+#: scheduler/ipp.c:6257 scheduler/ipp.c:6337 scheduler/ipp.c:6350
+#: scheduler/ipp.c:6362 scheduler/ipp.c:6377
 #, c-format
 msgid "The %s attribute cannot be provided with job-ids."
 msgstr ""
 
-#: scheduler/ipp.c:1381
+#: scheduler/ipp.c:1316
 #, c-format
-msgid "The '%s' Job Description attribute cannot be supplied in a job creation request."
+msgid "The '%s' Job Status attribute cannot be supplied in a job creation request."
 msgstr ""
 
-#: scheduler/ipp.c:5233
+#: scheduler/ipp.c:5190
 #, c-format
 msgid "The '%s' operation attribute cannot be supplied in a Create-Job request."
 msgstr ""
 
-#: scheduler/ipp.c:7034
+#: scheduler/ipp.c:6827
 #, c-format
 msgid "The PPD file \"%s\" could not be found."
 msgstr ""
 
-#: scheduler/ipp.c:7021
+#: scheduler/ipp.c:6814
 #, c-format
 msgid "The PPD file \"%s\" could not be opened: %s"
 msgstr ""
 
-#: filter/rastertoepson.c:1038 filter/rastertohp.c:764
-#: filter/rastertolabel.c:1189
+#: filter/rastertoepson.c:1035 filter/rastertohp.c:753
+#: filter/rastertolabel.c:1175
 msgid "The PPD file could not be opened."
 msgstr ""
 
-#: cgi-bin/admin.c:749
+#: cgi-bin/admin.c:725
 msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
 msgstr ""
 
-#: cups/localize.c:353
+#: cups/localize.c:338
 msgid "The developer unit needs to be replaced."
 msgstr ""
 
-#: cups/localize.c:351
+#: cups/localize.c:336
 msgid "The developer unit will need to be replaced soon."
 msgstr ""
 
-#: cups/localize.c:343
+#: cups/localize.c:328
 msgid "The fuser's temperature is high."
 msgstr ""
 
-#: cups/localize.c:345
+#: cups/localize.c:330
 msgid "The fuser's temperature is low."
 msgstr ""
 
-#: scheduler/ipp.c:2195
+#: scheduler/ipp.c:2066
 msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
 msgstr ""
 
-#: scheduler/ipp.c:2178 scheduler/ipp.c:5768
+#: scheduler/ipp.c:2049 scheduler/ipp.c:5506
 #, c-format
 msgid "The notify-user-data value is too large (%d > 63 octets)."
 msgstr ""
 
-#: cups/localize.c:349
+#: cups/localize.c:334
 msgid "The optical photoconductor needs to be replaced."
 msgstr ""
 
-#: cups/localize.c:347
+#: cups/localize.c:332
 msgid "The optical photoconductor will need to be replaced soon."
 msgstr ""
 
-#: cups/localize.c:331
-msgid "The output bin is almost full."
-msgstr ""
-
-#: cups/localize.c:333
-msgid "The output bin is full."
-msgstr ""
-
-#: cups/localize.c:329
-msgid "The output bin is missing."
-msgstr ""
-
-#: cups/localize.c:325
-msgid "The paper tray is almost empty."
-msgstr ""
-
-#: cups/localize.c:327
-msgid "The paper tray is empty."
-msgstr ""
-
-#: cups/localize.c:323
-msgid "The paper tray is missing."
-msgstr ""
-
-#: cups/localize.c:306
-msgid "The paper tray needs to be filled."
+#: backend/ipp.c:985
+msgid "The printer configuration is incorrect or the printer no longer exists."
 msgstr ""
 
-#: backend/ipp.c:925
-msgid "The printer URI is incorrect or no longer exists."
+#: backend/lpd.c:627 backend/lpd.c:1017 backend/lpd.c:1099 backend/lpd.c:1149
+msgid "The printer did not respond."
 msgstr ""
 
-#: backend/lpd.c:636 backend/lpd.c:1026 backend/lpd.c:1108 backend/lpd.c:1158
-msgid "The printer did not respond."
+#: backend/ipp.c:829 backend/ipp.c:948 backend/ipp.c:1062 backend/ipp.c:1459
+#: backend/ipp.c:1626 backend/lpd.c:836 backend/socket.c:379
+#: backend/usb-unix.c:124 backend/usb-unix.c:414 backend/usb-unix.c:497
+msgid "The printer is in use."
 msgstr ""
 
-#: backend/ipp.c:908 backend/ipp.c:915
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
+#: cups/localize.c:320
+msgid "The printer is low on ink."
 msgstr ""
 
-#: backend/ipp.c:773 backend/ipp.c:890 backend/ipp.c:1002 backend/ipp.c:1352
-#: backend/ipp.c:1503 backend/lpd.c:845 backend/socket.c:388
-#: backend/usb-unix.c:131 backend/usb-unix.c:424 backend/usb-unix.c:507
-msgid "The printer is in use."
+#: cups/localize.c:298
+msgid "The printer is low on toner."
 msgstr ""
 
-#: backend/runloop.c:254 backend/runloop.c:374 cups/localize.c:311
+#: backend/runloop.c:243 backend/runloop.c:363 cups/localize.c:296
 msgid "The printer is not connected."
 msgstr ""
 
-#: backend/ipp.c:751 backend/ipp.c:784 backend/ipp.c:886 backend/lpd.c:824
-#: backend/lpd.c:865 backend/socket.c:367 backend/socket.c:400
+#: backend/ipp.c:807 backend/ipp.c:840 backend/ipp.c:944 backend/lpd.c:815
+#: backend/lpd.c:856 backend/socket.c:358 backend/socket.c:391
 msgid "The printer is not responding."
 msgstr ""
 
-#: backend/runloop.c:396
+#: backend/runloop.c:385
 msgid "The printer is now connected."
 msgstr ""
 
-#: backend/usb-darwin.c:1286
+#: backend/usb-darwin.c:1342
 msgid "The printer is now online."
 msgstr ""
 
-#: backend/usb-darwin.c:1307
+#: backend/usb-darwin.c:1381
 msgid "The printer is offline."
 msgstr ""
 
-#: cups/localize.c:335
-msgid "The printer is running low on ink."
-msgstr ""
-
-#: cups/localize.c:313
-msgid "The printer is running low on toner."
-msgstr ""
-
-#: backend/ipp.c:766 backend/lpd.c:838 backend/socket.c:381
+#: backend/ipp.c:822 backend/lpd.c:829 backend/socket.c:372
 msgid "The printer is unreachable at this time."
 msgstr ""
 
-#: cups/localize.c:337
+#: cups/localize.c:322
 msgid "The printer may be out of ink."
 msgstr ""
 
-#: cups/localize.c:315
+#: cups/localize.c:300
 msgid "The printer may be out of toner."
 msgstr ""
 
-#: backend/ipp.c:760 backend/lpd.c:832 backend/socket.c:375
+#: backend/ipp.c:816 backend/lpd.c:823 backend/socket.c:366
 msgid "The printer may not exist or is unavailable at this time."
 msgstr ""
 
-#: cgi-bin/admin.c:931
+#: cgi-bin/admin.c:908
 msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
 msgstr ""
 
-#: scheduler/ipp.c:876 scheduler/ipp.c:1136 scheduler/ipp.c:3313
-#: scheduler/ipp.c:3484 scheduler/ipp.c:5216 scheduler/ipp.c:5602
-#: scheduler/ipp.c:5916 scheduler/ipp.c:6474 scheduler/ipp.c:7239
-#: scheduler/ipp.c:7295 scheduler/ipp.c:7609 scheduler/ipp.c:7875
-#: scheduler/ipp.c:7964 scheduler/ipp.c:7997 scheduler/ipp.c:8320
-#: scheduler/ipp.c:8713 scheduler/ipp.c:8794 scheduler/ipp.c:9961
-#: scheduler/ipp.c:10415 scheduler/ipp.c:10745 scheduler/ipp.c:10827
-#: scheduler/ipp.c:11201
+#: scheduler/ipp.c:787 scheduler/ipp.c:1055 scheduler/ipp.c:3194
+#: scheduler/ipp.c:3375 scheduler/ipp.c:5173 scheduler/ipp.c:5340
+#: scheduler/ipp.c:5654 scheduler/ipp.c:6223 scheduler/ipp.c:7032
+#: scheduler/ipp.c:7088 scheduler/ipp.c:7408 scheduler/ipp.c:7674
+#: scheduler/ipp.c:7763 scheduler/ipp.c:7796 scheduler/ipp.c:8120
+#: scheduler/ipp.c:8527 scheduler/ipp.c:8609 scheduler/ipp.c:9781
+#: scheduler/ipp.c:10233 scheduler/ipp.c:10584 scheduler/ipp.c:10666
+#: scheduler/ipp.c:11041
 msgid "The printer or class does not exist."
 msgstr ""
 
-#: scheduler/ipp.c:1319
+#: scheduler/ipp.c:1255
 msgid "The printer or class is not shared."
 msgstr ""
 
-#: cups/localize.c:317
+#: cups/localize.c:302
 msgid "The printer's cover is open."
 msgstr ""
 
-#: cups/localize.c:321
+#: cups/localize.c:306
 msgid "The printer's door is open."
 msgstr ""
 
-#: cups/localize.c:319
+#: cups/localize.c:304
 msgid "The printer's interlock is open."
 msgstr ""
 
-#: cups/localize.c:339
+#: cups/localize.c:324
 msgid "The printer's waste bin is almost full."
 msgstr ""
 
-#: cups/localize.c:341
+#: cups/localize.c:326
 msgid "The printer's waste bin is full."
 msgstr ""
 
-#: scheduler/ipp.c:982 scheduler/ipp.c:2359
+#: scheduler/ipp.c:893 scheduler/ipp.c:2230
 #, c-format
 msgid "The printer-uri \"%s\" contains invalid characters."
 msgstr ""
 
-#: scheduler/ipp.c:3290
+#: scheduler/ipp.c:3171
 msgid "The printer-uri attribute is required."
 msgstr ""
 
-#: scheduler/ipp.c:966
+#: scheduler/ipp.c:877
 msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
 msgstr ""
 
-#: scheduler/ipp.c:2343
+#: scheduler/ipp.c:2214
 msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
 msgstr ""
 
-#: cgi-bin/admin.c:474
+#: cgi-bin/admin.c:450
 msgid "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)."
 msgstr ""
 
-#: scheduler/client.c:2458
+#: scheduler/client.c:2249
 msgid "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it."
 msgstr ""
 
-#: scheduler/ipp.c:6569
+#: scheduler/ipp.c:6321
 #, c-format
 msgid "The which-jobs value \"%s\" is not supported."
 msgstr ""
 
-#: scheduler/ipp.c:5846
+#: scheduler/ipp.c:5584
 msgid "There are too many subscriptions."
 msgstr ""
 
-#: cups/localize.c:308
-msgid "There is a paper jam."
-msgstr ""
-
-#: backend/usb-darwin.c:379 backend/usb-darwin.c:438 backend/usb-darwin.c:505
-#: backend/usb-darwin.c:526 backend/usb-libusb.c:384 backend/usb-libusb.c:438
+#: backend/usb-darwin.c:398 backend/usb-darwin.c:457 backend/usb-darwin.c:526
+#: backend/usb-darwin.c:547 backend/usb-libusb.c:271 backend/usb-libusb.c:325
 msgid "There was an unrecoverable USB error."
 msgstr ""
 
-#: ppdc/sample.c:435
+#: ppdc/sample.c:430
 msgid "Thermal Transfer Media"
 msgstr ""
 
-#: scheduler/ipp.c:1543
+#: scheduler/ipp.c:1495
 msgid "Too many active jobs."
 msgstr ""
 
-#: scheduler/ipp.c:1437
+#: scheduler/ipp.c:1389
 #, c-format
 msgid "Too many job-sheets values (%d > 2)."
 msgstr ""
 
-#: scheduler/ipp.c:2644
+#: scheduler/ipp.c:2524
 #, c-format
 msgid "Too many printer-state-reasons values (%d > %d)."
 msgstr ""
 
-#: ppdc/sample.c:289
+#: ppdc/sample.c:284
 msgid "Transparency"
 msgstr ""
 
-#: ppdc/sample.c:284
+#: ppdc/sample.c:279
 msgid "Tray"
 msgstr ""
 
-#: ppdc/sample.c:264
+#: ppdc/sample.c:256
 msgid "Tray 1"
 msgstr ""
 
-#: ppdc/sample.c:265
+#: ppdc/sample.c:257
 msgid "Tray 2"
 msgstr ""
 
-#: ppdc/sample.c:266
+#: ppdc/sample.c:258
 msgid "Tray 3"
 msgstr ""
 
-#: ppdc/sample.c:267
+#: ppdc/sample.c:259
 msgid "Tray 4"
 msgstr ""
 
-#: cups/http-support.c:1376
+#: cups/http-support.c:1378
 msgid "URI Too Long"
 msgstr ""
 
+#: cups/http-support.c:1453
+msgid "URI too large"
+msgstr ""
+
 #: ppdc/sample.c:138
 msgid "US Ledger"
 msgstr ""
@@ -5051,7 +5618,7 @@ msgstr ""
 msgid "US Letter Small"
 msgstr ""
 
-#: cgi-bin/admin.c:1959 cgi-bin/admin.c:1972 cgi-bin/admin.c:1996
+#: cgi-bin/admin.c:1945 cgi-bin/admin.c:1958 cgi-bin/admin.c:1982
 msgid "Unable to access cupsd.conf file"
 msgstr ""
 
@@ -5059,221 +5626,231 @@ msgstr ""
 msgid "Unable to access help file."
 msgstr ""
 
-#: cgi-bin/admin.c:526
+#: cgi-bin/admin.c:502
 msgid "Unable to add RSS subscription"
 msgstr ""
 
-#: cgi-bin/admin.c:814
+#: cgi-bin/admin.c:790
 msgid "Unable to add class"
 msgstr ""
 
-#: backend/ipp.c:1677
+#: backend/ipp.c:1808
 msgid "Unable to add document to print job."
 msgstr ""
 
-#: scheduler/ipp.c:1646
+#: scheduler/ipp.c:1553
 #, c-format
 msgid "Unable to add job for destination \"%s\"."
 msgstr ""
 
-#: cgi-bin/admin.c:1059 cgi-bin/admin.c:1419
+#: cgi-bin/admin.c:1036 cgi-bin/admin.c:1405
 msgid "Unable to add printer"
 msgstr ""
 
-#: scheduler/ipp.c:1246
+#: scheduler/ipp.c:1173
 msgid "Unable to allocate memory for file types."
 msgstr ""
 
-#: filter/pstops.c:451
+#: filter/pstops.c:423
 msgid "Unable to allocate memory for page info"
 msgstr ""
 
-#: filter/pstops.c:445
+#: filter/pstops.c:417
 msgid "Unable to allocate memory for pages array"
 msgstr ""
 
-#: cgi-bin/admin.c:1525
+#: cgi-bin/admin.c:1511
 msgid "Unable to cancel RSS subscription"
 msgstr ""
 
-#: backend/ipp.c:2048
+#: backend/ipp.c:2085 backend/ipp.c:2533
 msgid "Unable to cancel print job."
 msgstr ""
 
-#: cgi-bin/admin.c:2990
+#: cgi-bin/admin.c:2976
 msgid "Unable to change printer"
 msgstr ""
 
-#: cgi-bin/admin.c:3906
+#: cgi-bin/admin.c:3892
 msgid "Unable to change printer-is-shared attribute"
 msgstr ""
 
-#: cgi-bin/admin.c:1657 cgi-bin/admin.c:1799
+#: cgi-bin/admin.c:1643 cgi-bin/admin.c:1785
 msgid "Unable to change server settings"
 msgstr ""
 
-#: filter/commandtops.c:420
+#: cups/ipp.c:5389
+#, c-format
+msgid "Unable to compile mimeMediaType regular expression: %s."
+msgstr ""
+
+#: cups/ipp.c:5335
+#, c-format
+msgid "Unable to compile naturalLanguage regular expression: %s."
+msgstr ""
+
+#: filter/commandtops.c:407
 msgid "Unable to configure printer options."
 msgstr ""
 
-#: cups/adminutil.c:911 cups/request.c:1041
+#: cups/adminutil.c:900 cups/request.c:1066
 msgid "Unable to connect to host."
 msgstr ""
 
-#: backend/ipp.c:729 backend/ipp.c:1166 backend/lpd.c:804 backend/socket.c:347
-#: backend/usb-unix.c:117
+#: backend/ipp.c:785 backend/ipp.c:1258 backend/lpd.c:795 backend/socket.c:338
+#: backend/usb-unix.c:110
 msgid "Unable to contact printer, queuing on next printer in class."
 msgstr ""
 
-#: cups/adminutil.c:726
+#: cups/adminutil.c:715
 #, c-format
 msgid "Unable to copy 64-bit CUPS printer driver files (%d)."
 msgstr ""
 
-#: cups/adminutil.c:691
+#: cups/adminutil.c:680
 #, c-format
 msgid "Unable to copy 64-bit Windows printer driver files (%d)."
 msgstr ""
 
-#: cups/adminutil.c:522
+#: cups/adminutil.c:511
 #, c-format
 msgid "Unable to copy CUPS printer driver files (%d)."
 msgstr ""
 
-#: scheduler/ipp.c:2764
+#: scheduler/ipp.c:2644
 #, c-format
 msgid "Unable to copy PPD file - %s"
 msgstr ""
 
-#: scheduler/ipp.c:2819
+#: scheduler/ipp.c:2699
 msgid "Unable to copy PPD file."
 msgstr ""
 
-#: cups/adminutil.c:487
+#: cups/adminutil.c:476
 #, c-format
 msgid "Unable to copy Windows 2000 printer driver files (%d)."
 msgstr ""
 
-#: cups/adminutil.c:610
+#: cups/adminutil.c:599
 #, c-format
 msgid "Unable to copy Windows 9x printer driver files (%d)."
 msgstr ""
 
-#: scheduler/ipp.c:2741
+#: scheduler/ipp.c:2621
 #, c-format
 msgid "Unable to copy interface script - %s"
 msgstr ""
 
-#: backend/ipp.c:2137
-msgid "Unable to create compressed print file"
+#: cups/util.c:496 cups/util.c:1479
+msgid "Unable to create printer-uri"
 msgstr ""
 
-#: cups/util.c:602 cups/util.c:1663
-msgid "Unable to create printer-uri"
+#: cups/tls-darwin.c:1291 cups/tls-gnutls.c:1181
+msgid "Unable to create server credentials."
 msgstr ""
 
-#: cgi-bin/admin.c:1850 cgi-bin/admin.c:1862 scheduler/cupsfilter.c:1239
+#: cgi-bin/admin.c:1836 cgi-bin/admin.c:1848 scheduler/cupsfilter.c:1290
 msgid "Unable to create temporary file"
 msgstr ""
 
-#: cgi-bin/admin.c:2153
+#: cgi-bin/admin.c:2139
 msgid "Unable to delete class"
 msgstr ""
 
-#: cgi-bin/admin.c:2238
+#: cgi-bin/admin.c:2224
 msgid "Unable to delete printer"
 msgstr ""
 
-#: cgi-bin/classes.c:260 cgi-bin/printers.c:269
+#: cgi-bin/classes.c:252 cgi-bin/printers.c:261
 msgid "Unable to do maintenance command"
 msgstr ""
 
-#: cgi-bin/admin.c:1974
+#: cgi-bin/admin.c:1960
 msgid "Unable to edit cupsd.conf files larger than 1MB"
 msgstr ""
 
-#: cups/http.c:4261
+#: cups/tls-darwin.c:1459
 msgid "Unable to establish a secure connection to host (certificate chain invalid)."
 msgstr ""
 
-#: cups/http.c:4251
+#: cups/tls-darwin.c:1449
 msgid "Unable to establish a secure connection to host (certificate not yet valid)."
 msgstr ""
 
-#: cups/http.c:4246
+#: cups/tls-darwin.c:1444
 msgid "Unable to establish a secure connection to host (expired certificate)."
 msgstr ""
 
-#: cups/http.c:4256
+#: cups/tls-darwin.c:1454
 msgid "Unable to establish a secure connection to host (host name mismatch)."
 msgstr ""
 
-#: cups/http.c:4266
+#: cups/tls-darwin.c:1464
 msgid "Unable to establish a secure connection to host (peer dropped connection before responding)."
 msgstr ""
 
-#: cups/http.c:4241
+#: cups/tls-darwin.c:1439
 msgid "Unable to establish a secure connection to host (self-signed certificate)."
 msgstr ""
 
-#: cups/http.c:4236
+#: cups/tls-darwin.c:1434
 msgid "Unable to establish a secure connection to host (untrusted certificate)."
 msgstr ""
 
-#: cups/http.c:3995 cups/http.c:4293 cups/http.c:4326 cups/http.c:4343
+#: cups/tls-darwin.c:1491 cups/tls-sspi.c:1279 cups/tls-sspi.c:1296
 msgid "Unable to establish a secure connection to host."
 msgstr ""
 
-#: cgi-bin/ipp-var.c:365
+#: cgi-bin/ipp-var.c:353
 msgid "Unable to find destination for job"
 msgstr ""
 
-#: cups/http-support.c:1810
+#: cups/http-support.c:1949
 msgid "Unable to find printer."
 msgstr ""
 
-#: backend/ipp.c:2159
-msgid "Unable to generate compressed print file"
+#: cups/tls-darwin.c:1305
+msgid "Unable to find server credentials."
 msgstr ""
 
-#: backend/ipp.c:3122
+#: backend/ipp.c:3221
 msgid "Unable to get backend exit status."
 msgstr ""
 
-#: cgi-bin/classes.c:450
+#: cgi-bin/classes.c:442
 msgid "Unable to get class list"
 msgstr ""
 
-#: cgi-bin/classes.c:549
+#: cgi-bin/classes.c:541
 msgid "Unable to get class status"
 msgstr ""
 
-#: cgi-bin/admin.c:1320
+#: cgi-bin/admin.c:1299
 msgid "Unable to get list of printer drivers"
 msgstr ""
 
-#: cgi-bin/admin.c:2840
+#: cgi-bin/admin.c:2826
 msgid "Unable to get printer attributes"
 msgstr ""
 
-#: cgi-bin/printers.c:467
+#: cgi-bin/printers.c:459
 msgid "Unable to get printer list"
 msgstr ""
 
-#: cgi-bin/printers.c:569
+#: cgi-bin/printers.c:561
 msgid "Unable to get printer status"
 msgstr ""
 
-#: backend/ipp.c:949
+#: backend/ipp.c:1009
 msgid "Unable to get printer status."
 msgstr ""
 
-#: cups/adminutil.c:565 cups/adminutil.c:769
+#: cups/adminutil.c:554 cups/adminutil.c:758
 #, c-format
 msgid "Unable to install Windows 2000 printer driver files (%d)."
 msgstr ""
 
-#: cups/adminutil.c:639
+#: cups/adminutil.c:628
 #, c-format
 msgid "Unable to install Windows 9x printer driver files (%d)."
 msgstr ""
@@ -5282,49 +5859,45 @@ msgstr ""
 msgid "Unable to load help index."
 msgstr ""
 
-#: backend/ipp.c:655 backend/lpd.c:435 backend/socket.c:286
+#: backend/ipp.c:672 backend/lpd.c:426 backend/socket.c:277
 #, c-format
 msgid "Unable to locate printer \"%s\"."
 msgstr ""
 
-#: backend/dnssd.c:781 backend/ipp.c:327 backend/lpd.c:205
-#: backend/socket.c:172
+#: backend/dnssd.c:787 backend/ipp.c:340 backend/lpd.c:196
+#: backend/socket.c:163
 msgid "Unable to locate printer."
 msgstr ""
 
-#: cgi-bin/admin.c:813
+#: cgi-bin/admin.c:789
 msgid "Unable to modify class"
 msgstr ""
 
-#: cgi-bin/admin.c:1058 cgi-bin/admin.c:1418
+#: cgi-bin/admin.c:1035 cgi-bin/admin.c:1404
 msgid "Unable to modify printer"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:432 cgi-bin/ipp-var.c:521
+#: cgi-bin/ipp-var.c:420 cgi-bin/ipp-var.c:509
 msgid "Unable to move job"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:434 cgi-bin/ipp-var.c:523
+#: cgi-bin/ipp-var.c:422 cgi-bin/ipp-var.c:511
 msgid "Unable to move jobs"
 msgstr ""
 
-#: cgi-bin/admin.c:3186 cups/ppd.c:339
+#: cgi-bin/admin.c:3172 cups/ppd.c:297
 msgid "Unable to open PPD file"
 msgstr ""
 
-#: backend/ipp.c:2143
-msgid "Unable to open compressed print file"
-msgstr ""
-
-#: cgi-bin/admin.c:2608
+#: cgi-bin/admin.c:2594
 msgid "Unable to open cupsd.conf file:"
 msgstr ""
 
-#: backend/usb-unix.c:141
+#: backend/usb-unix.c:134
 msgid "Unable to open device file"
 msgstr ""
 
-#: scheduler/ipp.c:6255
+#: scheduler/ipp.c:5999
 #, c-format
 msgid "Unable to open document #%d in job #%d."
 msgstr ""
@@ -5333,226 +5906,242 @@ msgstr ""
 msgid "Unable to open help file."
 msgstr ""
 
-#: backend/ipp.c:368 backend/ipp.c:1437 backend/ipp.c:1636 backend/ipp.c:2149
-#: backend/lpd.c:505 backend/socket.c:159 backend/usb.c:237
-#: filter/gziptoany.c:71 filter/pstops.c:300
+#: backend/ipp.c:382 backend/ipp.c:1554 backend/ipp.c:1763 backend/lpd.c:496
+#: backend/socket.c:150 backend/usb.c:237 filter/gziptoany.c:73
+#: filter/pstops.c:270
 msgid "Unable to open print file"
 msgstr ""
 
-#: filter/rastertoepson.c:998 filter/rastertohp.c:724
-#: filter/rastertolabel.c:1147
+#: filter/rastertoepson.c:995 filter/rastertohp.c:713
+#: filter/rastertolabel.c:1133
 msgid "Unable to open raster file"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:795
+#: cgi-bin/ipp-var.c:783
 msgid "Unable to print test page"
 msgstr ""
 
-#: backend/runloop.c:96 backend/runloop.c:325 backend/usb-darwin.c:613
-#: backend/usb-darwin.c:657 backend/usb-libusb.c:529 backend/usb-libusb.c:564
+#: backend/runloop.c:85 backend/runloop.c:314 backend/usb-darwin.c:634
+#: backend/usb-darwin.c:678 backend/usb-libusb.c:416 backend/usb-libusb.c:451
 msgid "Unable to read print data."
 msgstr ""
 
-#: cups/dest.c:3389
-msgid "Unable to resolve printer URI."
+#: scheduler/ipp.c:8279 scheduler/ipp.c:9520
+msgid "Unable to rename job document file."
 msgstr ""
 
-#: cups/adminutil.c:2088
+#: cups/dest.c:3446
+msgid "Unable to resolve printer-uri."
+msgstr ""
+
+#: cups/adminutil.c:2077
 #, c-format
 msgid "Unable to run \"%s\": %s"
 msgstr ""
 
-#: filter/pstops.c:563
+#: filter/pstops.c:535
 msgid "Unable to see in file"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:598 cgi-bin/ipp-var.c:618
+#: cgi-bin/ipp-var.c:586 cgi-bin/ipp-var.c:606
 msgid "Unable to send command to printer driver"
 msgstr ""
 
-#: backend/usb-darwin.c:735 backend/usb-libusb.c:640
+#: backend/usb-darwin.c:756 backend/usb-libusb.c:527
 msgid "Unable to send data to printer."
 msgstr ""
 
-#: cups/adminutil.c:821
+#: cups/adminutil.c:810
 #, c-format
 msgid "Unable to set Windows printer driver (%d)."
 msgstr ""
 
-#: cgi-bin/admin.c:3807
+#: cgi-bin/admin.c:3793
 msgid "Unable to set options"
 msgstr ""
 
-#: cgi-bin/admin.c:3077
+#: cgi-bin/admin.c:3063
 msgid "Unable to set server default"
 msgstr ""
 
-#: backend/ipp.c:2981 backend/ipp.c:3058 backend/ipp.c:3066
+#: backend/ipp.c:3080 backend/ipp.c:3157 backend/ipp.c:3165
 msgid "Unable to start backend process."
 msgstr ""
 
-#: cgi-bin/admin.c:1912
+#: cgi-bin/admin.c:1898
 msgid "Unable to upload cupsd.conf file"
 msgstr ""
 
-#: backend/usb-darwin.c:1985 backend/usb-darwin.c:2009
+#: backend/usb-darwin.c:2166 backend/usb-darwin.c:2190
 msgid "Unable to use legacy USB class driver."
 msgstr ""
 
-#: backend/runloop.c:125 backend/runloop.c:380
+#: backend/runloop.c:114 backend/runloop.c:369
 msgid "Unable to write print data"
 msgstr ""
 
-#: filter/gziptoany.c:90
+#: filter/gziptoany.c:92
 #, c-format
 msgid "Unable to write uncompressed print data: %s"
 msgstr ""
 
-#: cups/http-support.c:1364
+#: cups/http-support.c:1366
 msgid "Unauthorized"
 msgstr ""
 
-#: cgi-bin/admin.c:3503
+#: cgi-bin/admin.c:3489
 msgid "Units"
 msgstr ""
 
-#: cups/http-support.c:1404 cups/ppd.c:366
+#: cups/http-support.c:1406 cups/http-support.c:1490 cups/ppd.c:324
 msgid "Unknown"
 msgstr ""
 
-#: filter/pstops.c:2213
+#: filter/pstops.c:2190
 #, c-format
 msgid "Unknown choice \"%s\" for option \"%s\"."
 msgstr ""
 
-#: backend/ipp.c:510
+#: backend/ipp.c:524
 #, c-format
 msgid "Unknown encryption option value: \"%s\"."
 msgstr ""
 
-#: backend/lpd.c:351
+#: backend/lpd.c:342
 #, c-format
 msgid "Unknown file order: \"%s\"."
 msgstr ""
 
-#: backend/lpd.c:322
+#: backend/lpd.c:313
 #, c-format
 msgid "Unknown format character: \"%c\"."
 msgstr ""
 
-#: cups/dest-options.c:769
+#: cups/dest-options.c:964
 msgid "Unknown media size name."
 msgstr ""
 
-#: backend/ipp.c:567
+#: backend/ipp.c:588
 #, c-format
 msgid "Unknown option \"%s\" with value \"%s\"."
 msgstr ""
 
-#: filter/pstops.c:2196
+#: filter/pstops.c:2173
 #, c-format
 msgid "Unknown option \"%s\"."
 msgstr ""
 
-#: backend/lpd.c:337
+#: backend/lpd.c:328
 #, c-format
 msgid "Unknown print mode: \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:10617
+#: scheduler/ipp.c:10455
 #, c-format
 msgid "Unknown printer-error-policy \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:10600
+#: scheduler/ipp.c:10438
 #, c-format
 msgid "Unknown printer-op-policy \"%s\"."
 msgstr ""
 
-#: cups/http-addrlist.c:710
+#: cups/http.c:2309
+msgid "Unknown request method."
+msgstr ""
+
+#: cups/http.c:2329
+msgid "Unknown request version."
+msgstr ""
+
+#: cups/http-support.c:1483
+msgid "Unknown scheme in URI"
+msgstr ""
+
+#: cups/http-addrlist.c:737
 msgid "Unknown service name."
 msgstr ""
 
-#: backend/ipp.c:539
+#: backend/ipp.c:553
 #, c-format
 msgid "Unknown version option value: \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:11072
+#: scheduler/ipp.c:10912
 #, c-format
 msgid "Unsupported 'compression' value \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:11102
+#: scheduler/ipp.c:10942
 #, c-format
 msgid "Unsupported 'document-format' value \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:11177
+#: scheduler/ipp.c:11017
 msgid "Unsupported 'job-name' value."
 msgstr ""
 
-#: scheduler/ipp.c:402
+#: scheduler/ipp.c:329
 #, c-format
 msgid "Unsupported character set \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:8286 scheduler/ipp.c:9522
+#: scheduler/ipp.c:8086 scheduler/ipp.c:9332
 #, c-format
 msgid "Unsupported compression \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:8420 scheduler/ipp.c:9672
+#: scheduler/ipp.c:8222 scheduler/ipp.c:9485
 #, c-format
 msgid "Unsupported document-format \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:9655
+#: scheduler/ipp.c:9468
 #, c-format
 msgid "Unsupported document-format \"%s/%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:1403
+#: scheduler/ipp.c:1355
 #, c-format
 msgid "Unsupported format \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:1501
+#: scheduler/ipp.c:1453
 msgid "Unsupported margins."
 msgstr ""
 
-#: cups/pwg-media.c:529
+#: cups/pwg-media.c:549
 msgid "Unsupported media value."
 msgstr ""
 
-#: filter/pstops.c:2478
+#: filter/pstops.c:2455
 #, c-format
 msgid "Unsupported number-up value %d, using number-up=1."
 msgstr ""
 
-#: filter/pstops.c:2512
+#: filter/pstops.c:2489
 #, c-format
 msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb."
 msgstr ""
 
-#: filter/pstops.c:2563
+#: filter/pstops.c:2540
 #, c-format
 msgid "Unsupported page-border value %s, using page-border=none."
 msgstr ""
 
-#: filter/rastertopwg.c:147 filter/rastertopwg.c:155 filter/rastertopwg.c:164
+#: filter/rastertopwg.c:139 filter/rastertopwg.c:147 filter/rastertopwg.c:156
 msgid "Unsupported raster data."
 msgstr ""
 
-#: cups/snmp.c:1112
+#: cups/snmp.c:1064
 msgid "Unsupported value type"
 msgstr ""
 
-#: cups/http-support.c:1379
+#: cups/http-support.c:1381
 msgid "Upgrade Required"
 msgstr ""
 
-#: systemv/lpadmin.c:668
+#: systemv/lpadmin.c:666
 msgid ""
 "Usage:\n"
 "\n"
@@ -5564,10 +6153,10 @@ msgid ""
 "                       [-u allow:user,user] [-u deny:user,user]"
 msgstr ""
 
-#: backend/dnssd.c:241 backend/ipp.c:316 backend/lpd.c:192
-#: backend/socket.c:136 backend/usb.c:183 filter/commandtops.c:74
-#: filter/gziptoany.c:50 filter/pstops.c:264 monitor/bcp.c:62
-#: monitor/tbcp.c:61
+#: backend/dnssd.c:227 backend/ipp.c:329 backend/lpd.c:183
+#: backend/socket.c:127 backend/usb.c:183 filter/commandtops.c:63
+#: filter/gziptoany.c:46 filter/pstops.c:231 monitor/bcp.c:56
+#: monitor/tbcp.c:55
 #, c-format
 msgid "Usage: %s job-id user title copies options [file]"
 msgstr ""
@@ -5580,23 +6169,39 @@ msgstr ""
 msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]"
 msgstr ""
 
-#: scheduler/main.c:2053
+#: scheduler/main.c:2176
 msgid "Usage: cupsd [options]"
 msgstr ""
 
-#: scheduler/cupsfilter.c:1432
-msgid "Usage: cupsfilter [ options ] filename"
+#: scheduler/cupsfilter.c:1481
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
 msgstr ""
 
 #: systemv/cupstestdsc.c:425
 msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
 msgstr ""
 
-#: systemv/cupstestppd.c:3793
+#: systemv/cupstestppd.c:3857
 msgid "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
 msgstr ""
 
-#: test/ipptool.c:4482
+#: test/ippdiscover.c:814
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+"       ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+
+#: test/ippfind.c:2746
+msgid ""
+"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n"
+"       ippfind [options] name[.regtype[.domain.]] ... [expression]\n"
+"       ippfind --help\n"
+"       ippfind --version"
+msgstr ""
+
+#: test/ipptool.c:4855
 msgid "Usage: ipptool [options] URI filename [ ... filenameN ]"
 msgstr ""
 
@@ -5604,7 +6209,7 @@ msgstr ""
 msgid "Usage: lpmove job/src dest"
 msgstr ""
 
-#: systemv/lpoptions.c:553
+#: systemv/lpoptions.c:539
 msgid ""
 "Usage: lpoptions [-h server] [-E] -d printer\n"
 "       lpoptions [-h server] [-E] [-p printer] -l\n"
@@ -5612,26 +6217,15 @@ msgid ""
 "       lpoptions [-h server] [-E] -x printer"
 msgstr ""
 
-#: systemv/lppasswd.c:476
-msgid "Usage: lppasswd [-g groupname]"
-msgstr ""
-
-#: systemv/lppasswd.c:479
-msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-"       lppasswd [-g groupname] -a [username]\n"
-"       lppasswd [-g groupname] -x [username]"
-msgstr ""
-
-#: berkeley/lpq.c:675
+#: berkeley/lpq.c:637
 msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
 msgstr ""
 
-#: ppdc/ppdc.cxx:435
+#: ppdc/ppdc.cxx:430
 msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]"
 msgstr ""
 
-#: ppdc/ppdhtml.cxx:172
+#: ppdc/ppdhtml.cxx:177
 msgid "Usage: ppdhtml [options] filename.drv >filename.html"
 msgstr ""
 
@@ -5639,68 +6233,64 @@ msgstr ""
 msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]"
 msgstr ""
 
-#: ppdc/ppdmerge.cxx:367
+#: ppdc/ppdmerge.cxx:361
 msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]"
 msgstr ""
 
-#: ppdc/ppdpo.cxx:252
+#: ppdc/ppdpo.cxx:247
 msgid "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]"
 msgstr ""
 
-#: backend/snmp.c:218
+#: backend/snmp.c:192
 msgid "Usage: snmp [host-or-ip-address]"
 msgstr ""
 
-#: cups/snmp.c:1064
+#: cups/snmp.c:1016
 msgid "Value uses indefinite length"
 msgstr ""
 
-#: cups/snmp.c:1049
+#: cups/snmp.c:1001
 msgid "VarBind uses indefinite length"
 msgstr ""
 
-#: cups/snmp.c:999
+#: cups/snmp.c:951
 msgid "Version uses indefinite length"
 msgstr ""
 
-#: backend/ipp.c:1774
+#: backend/ipp.c:1925
 msgid "Waiting for job to complete."
 msgstr ""
 
-#: backend/usb-darwin.c:457 backend/usb-libusb.c:336
+#: backend/usb-darwin.c:481 backend/usb-libusb.c:223
 msgid "Waiting for printer to become available."
 msgstr ""
 
-#: backend/socket.c:458
+#: backend/socket.c:440
 msgid "Waiting for printer to finish."
 msgstr ""
 
-#: cups/adminutil.c:793
+#: cups/adminutil.c:782
 msgid "Warning, no Windows 2000 printer drivers are installed."
 msgstr ""
 
-#: cups/http-support.c:1400
+#: cups/http-support.c:1402
 msgid "Web Interface is Disabled"
 msgstr ""
 
-#: cups/ppd.c:1947
+#: cups/ppd.c:1902
 msgid "Yes"
 msgstr ""
 
-#: scheduler/client.c:2445
+#: scheduler/client.c:2236
 #, c-format
 msgid "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
 msgstr ""
 
-#: systemv/lppasswd.c:254
-msgid "Your password must be at least 6 characters long, cannot contain your username, and must contain at least one letter and number."
-msgstr ""
-
-#: ppdc/sample.c:439
+#: ppdc/sample.c:434
 msgid "ZPL Label Printer"
 msgstr ""
 
-#: ppdc/sample.c:362
+#: ppdc/sample.c:357
 msgid "Zebra"
 msgstr ""
 
@@ -5716,11 +6306,11 @@ msgstr ""
 msgid "completed"
 msgstr ""
 
-#: scheduler/ipp.c:6127
+#: scheduler/ipp.c:5871
 msgid "cups-deviced failed to execute."
 msgstr ""
 
-#: scheduler/ipp.c:6957 scheduler/ipp.c:7206
+#: scheduler/ipp.c:6750 scheduler/ipp.c:6999
 msgid "cups-driverd failed to execute."
 msgstr ""
 
@@ -5748,82 +6338,82 @@ msgstr ""
 msgid "cupsctl: Unknown option \"-%c\""
 msgstr ""
 
-#: scheduler/main.c:194
+#: scheduler/main.c:182
 msgid "cupsd: Expected config filename after \"-c\" option."
 msgstr ""
 
-#: scheduler/main.c:282
+#: scheduler/main.c:278
 msgid "cupsd: Expected cups-files.conf filename after \"-s\" option."
 msgstr ""
 
-#: scheduler/main.c:293
+#: scheduler/main.c:252
+msgid "cupsd: On-demand support not compiled in, running in normal mode."
+msgstr ""
+
+#: scheduler/main.c:289
 msgid "cupsd: Relative cups-files.conf filename not allowed."
 msgstr ""
 
-#: scheduler/main.c:225 scheduler/main.c:232
+#: scheduler/main.c:213 scheduler/main.c:220
 msgid "cupsd: Unable to get current directory."
 msgstr ""
 
-#: scheduler/main.c:343 scheduler/main.c:352
+#: scheduler/main.c:338 scheduler/main.c:347
 msgid "cupsd: Unable to get path to cups-files.conf file."
 msgstr ""
 
-#: scheduler/main.c:322
+#: scheduler/main.c:320
 #, c-format
 msgid "cupsd: Unknown argument \"%s\" - aborting."
 msgstr ""
 
-#: scheduler/main.c:315
+#: scheduler/main.c:313
 #, c-format
 msgid "cupsd: Unknown option \"%c\" - aborting."
 msgstr ""
 
-#: scheduler/main.c:259
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
-
-#: scheduler/cupsfilter.c:1212
+#: scheduler/cupsfilter.c:1263
 #, c-format
 msgid "cupsfilter: Invalid document number %d."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1206
+#: scheduler/cupsfilter.c:1257
 #, c-format
 msgid "cupsfilter: Invalid job ID %d."
 msgstr ""
 
-#: scheduler/cupsfilter.c:358
+#: scheduler/cupsfilter.c:348
 msgid "cupsfilter: Only one filename can be specified."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1254
+#: scheduler/cupsfilter.c:1305
 #, c-format
 msgid "cupsfilter: Unable to get job file - %s"
 msgstr ""
 
-#: systemv/cupstestppd.c:261
+#: systemv/cupstestppd.c:241
 msgid "cupstestppd: The -q option is incompatible with the -v option."
 msgstr ""
 
-#: systemv/cupstestppd.c:277
+#: systemv/cupstestppd.c:257
 msgid "cupstestppd: The -v option is incompatible with the -q option."
 msgstr ""
 
-#: systemv/lpstat.c:1335 systemv/lpstat.c:1338 systemv/lpstat.c:1341
+#: systemv/lpstat.c:1232 systemv/lpstat.c:1235 systemv/lpstat.c:1238
 #, c-format
 msgid "device for %s/%s: %s"
 msgstr ""
 
-#: systemv/lpstat.c:1322 systemv/lpstat.c:1325 systemv/lpstat.c:1328
+#: systemv/lpstat.c:1218 systemv/lpstat.c:1221 systemv/lpstat.c:1224
 #, c-format
 msgid "device for %s: %s"
 msgstr ""
 
-#: cups/snmp.c:1036
+#: cups/snmp.c:988
 msgid "error-index uses indefinite length"
 msgstr ""
 
-#: cups/snmp.c:1028
+#: cups/snmp.c:980
 msgid "error-status uses indefinite length"
 msgstr ""
 
@@ -5831,7 +6421,7 @@ msgstr ""
 msgid "held"
 msgstr ""
 
-#: berkeley/lpc.c:209
+#: berkeley/lpc.c:201
 msgid "help\t\tGet help on commands."
 msgstr ""
 
@@ -5839,211 +6429,302 @@ msgstr ""
 msgid "idle"
 msgstr ""
 
-#: test/ipptool.c:376 test/ipptool.c:518 test/ipptool.c:542
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
+#: test/ippfind.c:2465
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr ""
+
+#: test/ippfind.c:328
+msgid "ippfind: Cannot use --and after --or."
 msgstr ""
 
-#: test/ipptool.c:600
+#: test/ippfind.c:601
 #, c-format
-msgid "ipptool: Bad URI - %s."
+msgid "ippfind: Expected key name after %s."
+msgstr ""
+
+#: test/ippfind.c:551 test/ippfind.c:734
+#, c-format
+msgid "ippfind: Expected port range after %s."
+msgstr ""
+
+#: test/ippfind.c:361
+#, c-format
+msgid "ippfind: Expected program after %s."
+msgstr ""
+
+#: test/ippfind.c:378
+#, c-format
+msgid "ippfind: Expected semi-colon after %s."
+msgstr ""
+
+#: test/ippfind.c:1965
+msgid "ippfind: Missing close brace in substitution."
+msgstr ""
+
+#: test/ippfind.c:1053
+msgid "ippfind: Missing close parenthesis."
+msgstr ""
+
+#: test/ippfind.c:335
+msgid "ippfind: Missing expression before \"--and\"."
+msgstr ""
+
+#: test/ippfind.c:448
+msgid "ippfind: Missing expression before \"--or\"."
+msgstr ""
+
+#: test/ippfind.c:871
+#, c-format
+msgid "ippfind: Missing key name after %s."
+msgstr ""
+
+#: test/ippfind.c:1024
+msgid "ippfind: Missing open parenthesis."
+msgstr ""
+
+#: test/ippfind.c:901
+#, c-format
+msgid "ippfind: Missing program after %s."
+msgstr ""
+
+#: test/ippfind.c:347 test/ippfind.c:401 test/ippfind.c:430 test/ippfind.c:536
+#: test/ippfind.c:618 test/ippfind.c:633 test/ippfind.c:788 test/ippfind.c:803
+#: test/ippfind.c:826 test/ippfind.c:886
+#, c-format
+msgid "ippfind: Missing regular expression after %s."
+msgstr ""
+
+#: test/ippfind.c:919
+#, c-format
+msgid "ippfind: Missing semi-colon after %s."
+msgstr ""
+
+#: test/ippfind.c:1912 test/ippfind.c:1937
+msgid "ippfind: Out of memory."
+msgstr ""
+
+#: test/ippfind.c:997
+msgid "ippfind: Too many parenthesis."
+msgstr ""
+
+#: test/ippfind.c:1266 test/ippfind.c:1402 test/ippfind.c:2557
+#, c-format
+msgid "ippfind: Unable to browse or resolve: %s"
+msgstr ""
+
+#: test/ippfind.c:2035 test/ippfind.c:2062
+#, c-format
+msgid "ippfind: Unable to execute \"%s\": %s"
+msgstr ""
+
+#: test/ippfind.c:1143 test/ippfind.c:1151 test/ippfind.c:1162
+#, c-format
+msgid "ippfind: Unable to use Bonjour: %s"
+msgstr ""
+
+#: test/ippfind.c:1994
+#, c-format
+msgid "ippfind: Unknown variable \"{%s}\"."
+msgstr ""
+
+#: test/ipptool.c:329 test/ipptool.c:392 test/ipptool.c:547 test/ipptool.c:570
+msgid "ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."
 msgstr ""
 
-#: test/ipptool.c:365
+#: test/ipptool.c:626
 #, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
+msgid "ipptool: Bad URI - %s."
 msgstr ""
 
-#: test/ipptool.c:511
+#: test/ipptool.c:540
 msgid "ipptool: Invalid seconds for \"-i\"."
 msgstr ""
 
-#: test/ipptool.c:581
+#: test/ipptool.c:607
 msgid "ipptool: May only specify a single URI."
 msgstr ""
 
-#: test/ipptool.c:534
+#: test/ipptool.c:562
 msgid "ipptool: Missing count for \"-n\"."
 msgstr ""
 
-#: test/ipptool.c:411
+#: test/ipptool.c:426
 msgid "ipptool: Missing filename for \"-f\"."
 msgstr ""
 
-#: test/ipptool.c:392
+#: test/ipptool.c:407
 msgid "ipptool: Missing name=value for \"-d\"."
 msgstr ""
 
-#: test/ipptool.c:501
+#: test/ipptool.c:530
 msgid "ipptool: Missing seconds for \"-i\"."
 msgstr ""
 
-#: test/ipptool.c:335
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr ""
-
-#: test/ipptool.c:348
-msgid "ipptool: Missing version for \"-V\"."
-msgstr ""
-
-#: test/ipptool.c:627
+#: test/ipptool.c:652
 msgid "ipptool: URI required before test file."
 msgstr ""
 
-#: test/ipptool.c:561
+#: test/ipptool.c:588
 #, c-format
 msgid "ipptool: Unknown option \"-%c\"."
 msgstr ""
 
-#: scheduler/ipp.c:7953
+#: scheduler/ipp.c:7752
 msgid "job-printer-uri attribute missing."
 msgstr ""
 
-#: systemv/lpadmin.c:131 systemv/lpadmin.c:375
+#: systemv/lpadmin.c:123 systemv/lpadmin.c:364
 msgid "lpadmin: Class name can only contain printable characters."
 msgstr ""
 
-#: systemv/lpadmin.c:614
+#: systemv/lpadmin.c:601
 msgid "lpadmin: Expected PPD after \"-P\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:457
+#: systemv/lpadmin.c:445
 msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:364
+#: systemv/lpadmin.c:353
 msgid "lpadmin: Expected class after \"-r\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:120
+#: systemv/lpadmin.c:112
 msgid "lpadmin: Expected class name after \"-c\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:558
+#: systemv/lpadmin.c:545
 msgid "lpadmin: Expected description after \"-D\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:491
+#: systemv/lpadmin.c:479
 msgid "lpadmin: Expected device URI after \"-v\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:574
+#: systemv/lpadmin.c:561
 msgid "lpadmin: Expected file type(s) after \"-I\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:202
+#: systemv/lpadmin.c:193
 msgid "lpadmin: Expected hostname after \"-h\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:221
+#: systemv/lpadmin.c:212
 msgid "lpadmin: Expected interface after \"-i\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:594
+#: systemv/lpadmin.c:581
 msgid "lpadmin: Expected location after \"-L\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:274
+#: systemv/lpadmin.c:264
 msgid "lpadmin: Expected model after \"-m\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:417
+#: systemv/lpadmin.c:405
 msgid "lpadmin: Expected name after \"-R\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:294
+#: systemv/lpadmin.c:284
 msgid "lpadmin: Expected name=value after \"-o\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:313
+#: systemv/lpadmin.c:303
 msgid "lpadmin: Expected printer after \"-p\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:164
+#: systemv/lpadmin.c:155
 msgid "lpadmin: Expected printer name after \"-d\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:525
+#: systemv/lpadmin.c:512
 msgid "lpadmin: Expected printer or class after \"-x\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:975
+#: systemv/lpadmin.c:973
 msgid "lpadmin: No member names were seen."
 msgstr ""
 
-#: systemv/lpadmin.c:762
+#: systemv/lpadmin.c:760
 #, c-format
 msgid "lpadmin: Printer %s is already a member of class %s."
 msgstr ""
 
-#: systemv/lpadmin.c:989
+#: systemv/lpadmin.c:987
 #, c-format
 msgid "lpadmin: Printer %s is not a member of class %s."
 msgstr ""
 
-#: systemv/lpadmin.c:175 systemv/lpadmin.c:324 systemv/lpadmin.c:536
+#: systemv/lpadmin.c:166 systemv/lpadmin.c:314 systemv/lpadmin.c:523
 msgid "lpadmin: Printer name can only contain printable characters."
 msgstr ""
 
-#: systemv/lpadmin.c:105
+#: 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:96 systemv/lpadmin.c:149 systemv/lpadmin.c:253
-#: systemv/lpadmin.c:339 systemv/lpadmin.c:393 systemv/lpadmin.c:510
-#: systemv/lpadmin.c:647
+#: systemv/lpadmin.c:88 systemv/lpadmin.c:140 systemv/lpadmin.c:243
+#: systemv/lpadmin.c:328 systemv/lpadmin.c:381 systemv/lpadmin.c:497
+#: systemv/lpadmin.c:642
 #, c-format
 msgid "lpadmin: Unable to connect to server: %s"
 msgstr ""
 
-#: systemv/lpadmin.c:1329
+#: systemv/lpadmin.c:1427
 msgid "lpadmin: Unable to create temporary file"
 msgstr ""
 
-#: systemv/lpadmin.c:402
+#: systemv/lpadmin.c:390
 msgid ""
 "lpadmin: Unable to delete option:\n"
 "         You must specify a printer name first."
 msgstr ""
 
-#: systemv/lpadmin.c:1339
+#: systemv/lpadmin.c:1419
+#, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
+#: systemv/lpadmin.c:1439
 #, c-format
 msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
 msgstr ""
 
-#: systemv/lpadmin.c:348
+#: systemv/lpadmin.c:337
 msgid ""
 "lpadmin: Unable to remove a printer from the class:\n"
 "         You must specify a printer name first."
 msgstr ""
 
-#: systemv/lpadmin.c:656
+#: systemv/lpadmin.c:651
 msgid ""
 "lpadmin: Unable to set the printer options:\n"
 "         You must specify a printer name first."
 msgstr ""
 
-#: systemv/lpadmin.c:474
+#: systemv/lpadmin.c:462
 #, c-format
 msgid "lpadmin: Unknown allow/deny option \"%s\"."
 msgstr ""
 
-#: systemv/lpadmin.c:629
+#: systemv/lpadmin.c:616
 #, c-format
 msgid "lpadmin: Unknown argument \"%s\"."
 msgstr ""
 
-#: systemv/lpadmin.c:624
+#: systemv/lpadmin.c:611
 #, c-format
 msgid "lpadmin: Unknown option \"%c\"."
 msgstr ""
 
-#: systemv/lpadmin.c:580
+#: systemv/lpadmin.c:567
 msgid "lpadmin: Warning - content type list ignored."
 msgstr ""
 
-#: berkeley/lpc.c:76 berkeley/lpc.c:104 berkeley/lpc.c:140
+#: berkeley/lpc.c:68 berkeley/lpc.c:96 berkeley/lpc.c:132
 msgid "lpc> "
 msgstr ""
 
@@ -6105,111 +6786,57 @@ msgstr ""
 msgid "lpmove: Unknown option \"%c\"."
 msgstr ""
 
-#: systemv/lpoptions.c:150 systemv/lpoptions.c:168 systemv/lpoptions.c:244
+#: systemv/lpoptions.c:143 systemv/lpoptions.c:161 systemv/lpoptions.c:237
 msgid "lpoptions: No printers."
 msgstr ""
 
-#: systemv/lpoptions.c:219
+#: systemv/lpoptions.c:212
 #, c-format
 msgid "lpoptions: Unable to add printer or instance: %s"
 msgstr ""
 
-#: systemv/lpoptions.c:521
+#: systemv/lpoptions.c:507
 #, c-format
 msgid "lpoptions: Unable to get PPD file for %s: %s"
 msgstr ""
 
-#: systemv/lpoptions.c:529
+#: systemv/lpoptions.c:515
 #, c-format
 msgid "lpoptions: Unable to open PPD file for %s."
 msgstr ""
 
-#: systemv/lpoptions.c:99
+#: systemv/lpoptions.c:92
 msgid "lpoptions: Unknown printer or class."
 msgstr ""
 
-#: systemv/lppasswd.c:173
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr ""
-
-#: systemv/lppasswd.c:302
-msgid "lppasswd: Password file busy."
-msgstr ""
-
-#: systemv/lppasswd.c:431
-msgid "lppasswd: Password file not updated."
-msgstr ""
-
-#: systemv/lppasswd.c:398
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr ""
-
-#: systemv/lppasswd.c:253
-msgid "lppasswd: Sorry, password rejected."
-msgstr ""
-
-#: systemv/lppasswd.c:230
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr ""
-
-#: systemv/lppasswd.c:199 systemv/lppasswd.c:218
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:304 systemv/lppasswd.c:312 systemv/lppasswd.c:329
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:364 systemv/lppasswd.c:377 systemv/lppasswd.c:408
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:446
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:458
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:389
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr ""
-
-#: systemv/lpstat.c:1132
+#: systemv/lpstat.c:1074
 #, c-format
 msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"."
 msgstr ""
 
-#: systemv/lpstat.c:1068
+#: systemv/lpstat.c:1010
 #, c-format
 msgid "members of class %s:"
 msgstr ""
 
-#: berkeley/lpq.c:587
+#: berkeley/lpq.c:549
 msgid "no entries"
 msgstr ""
 
-#: systemv/lpstat.c:1136
+#: systemv/lpstat.c:1078
 msgid "no system default destination"
 msgstr ""
 
-#: scheduler/ipp.c:5817
+#: scheduler/ipp.c:5555
 msgid "notify-events not specified."
 msgstr ""
 
-#: scheduler/ipp.c:2132 scheduler/ipp.c:5722
+#: scheduler/ipp.c:2003 scheduler/ipp.c:5460
 #, c-format
 msgid "notify-recipient-uri URI \"%s\" is already used."
 msgstr ""
 
-#: scheduler/ipp.c:2122 scheduler/ipp.c:5712
+#: scheduler/ipp.c:1993 scheduler/ipp.c:5450
 #, c-format
 msgid "notify-recipient-uri URI \"%s\" uses unknown scheme."
 msgstr ""
@@ -6218,17 +6845,17 @@ msgstr ""
 msgid "pending"
 msgstr ""
 
-#: ppdc/ppdc.cxx:113 ppdc/ppdpo.cxx:93
+#: ppdc/ppdc.cxx:108 ppdc/ppdpo.cxx:87
 #, c-format
 msgid "ppdc: Adding include directory \"%s\"."
 msgstr ""
 
-#: ppdc/ppdpo.cxx:134
+#: ppdc/ppdpo.cxx:130
 #, c-format
 msgid "ppdc: Adding/updating UI text from %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:410
+#: ppdc/ppdc-source.cxx:367
 #, c-format
 msgid "ppdc: Bad boolean value (%s) on line %d of %s."
 msgstr ""
@@ -6238,375 +6865,375 @@ msgstr ""
 msgid "ppdc: Bad font attribute: %s"
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1796
+#: ppdc/ppdc-source.cxx:1753
 #, c-format
 msgid "ppdc: Bad resolution name \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1113
+#: ppdc/ppdc-source.cxx:1070
 #, c-format
 msgid "ppdc: Bad status keyword %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2033
+#: ppdc/ppdc-source.cxx:1990
 #, c-format
 msgid "ppdc: Bad variable substitution ($%c) on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2719
+#: ppdc/ppdc-source.cxx:2675
 #, c-format
 msgid "ppdc: Choice found on line %d of %s with no Option."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1698
+#: ppdc/ppdc-source.cxx:1655
 #, c-format
 msgid "ppdc: Duplicate #po for locale %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:932
+#: ppdc/ppdc-source.cxx:889
 #, c-format
 msgid "ppdc: Expected a filter definition on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:955
+#: ppdc/ppdc-source.cxx:912
 #, c-format
 msgid "ppdc: Expected a program name on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:394
+#: ppdc/ppdc-source.cxx:351
 #, c-format
 msgid "ppdc: Expected boolean value on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1093
+#: ppdc/ppdc-source.cxx:1050
 #, c-format
 msgid "ppdc: Expected charset after Font on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:447
+#: ppdc/ppdc-source.cxx:404
 #, c-format
 msgid "ppdc: Expected choice code on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:435
+#: ppdc/ppdc-source.cxx:392
 #, c-format
 msgid "ppdc: Expected choice name/text on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:503
+#: ppdc/ppdc-source.cxx:460
 #, c-format
 msgid "ppdc: Expected color order for ColorModel on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:492
+#: ppdc/ppdc-source.cxx:449
 #, c-format
 msgid "ppdc: Expected colorspace for ColorModel on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:514
+#: ppdc/ppdc-source.cxx:471
 #, c-format
 msgid "ppdc: Expected compression for ColorModel on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:695
+#: ppdc/ppdc-source.cxx:652
 #, c-format
 msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2905
+#: ppdc/ppdc-source.cxx:2861
 #, c-format
 msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:826
+#: ppdc/ppdc-source.cxx:783
 #, c-format
 msgid "ppdc: Expected duplex type after Duplex on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1077
+#: ppdc/ppdc-source.cxx:1034
 #, c-format
 msgid "ppdc: Expected encoding after Font on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1689
+#: ppdc/ppdc-source.cxx:1646
 #, c-format
 msgid "ppdc: Expected filename after #po %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1205
+#: ppdc/ppdc-source.cxx:1162
 #, c-format
 msgid "ppdc: Expected group name/text on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2619
+#: ppdc/ppdc-source.cxx:2575
 #, c-format
 msgid "ppdc: Expected include filename on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1502
+#: ppdc/ppdc-source.cxx:1459
 #, c-format
 msgid "ppdc: Expected integer on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1681
+#: ppdc/ppdc-source.cxx:1638
 #, c-format
 msgid "ppdc: Expected locale after #po on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:353
+#: ppdc/ppdc-source.cxx:310
 #, c-format
 msgid "ppdc: Expected name after %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3277
+#: ppdc/ppdc-source.cxx:3233
 #, c-format
 msgid "ppdc: Expected name after FileName on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1058
+#: ppdc/ppdc-source.cxx:1015
 #, c-format
 msgid "ppdc: Expected name after Font on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3108
+#: ppdc/ppdc-source.cxx:3064
 #, c-format
 msgid "ppdc: Expected name after Manufacturer on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3141
+#: ppdc/ppdc-source.cxx:3097
 #, c-format
 msgid "ppdc: Expected name after MediaSize on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3231
+#: ppdc/ppdc-source.cxx:3187
 #, c-format
 msgid "ppdc: Expected name after ModelName on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3294
+#: ppdc/ppdc-source.cxx:3250
 #, c-format
 msgid "ppdc: Expected name after PCFileName on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1156
+#: ppdc/ppdc-source.cxx:1113
 #, c-format
 msgid "ppdc: Expected name/text after %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1245
+#: ppdc/ppdc-source.cxx:1202
 #, c-format
 msgid "ppdc: Expected name/text after Installable on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1782
+#: ppdc/ppdc-source.cxx:1739
 #, c-format
 msgid "ppdc: Expected name/text after Resolution on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:479
+#: ppdc/ppdc-source.cxx:436
 #, c-format
 msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1574
+#: ppdc/ppdc-source.cxx:1531
 #, c-format
 msgid "ppdc: Expected option name/text on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1608
+#: ppdc/ppdc-source.cxx:1565
 #, c-format
 msgid "ppdc: Expected option section on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1586
+#: ppdc/ppdc-source.cxx:1543
 #, c-format
 msgid "ppdc: Expected option type on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1765
+#: ppdc/ppdc-source.cxx:1722
 #, c-format
 msgid "ppdc: Expected override field after Resolution on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-catalog.cxx:341 ppdc/ppdc-catalog.cxx:353
+#: ppdc/ppdc-catalog.cxx:389 ppdc/ppdc-catalog.cxx:401
 #, c-format
 msgid "ppdc: Expected quoted string on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1004
+#: ppdc/ppdc-source.cxx:961
 #, c-format
 msgid "ppdc: Expected real number on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:572
+#: ppdc/ppdc-source.cxx:529
 #, c-format
 msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1863
+#: ppdc/ppdc-source.cxx:1820
 #, c-format
 msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:361
+#: ppdc/ppdc-source.cxx:318
 #, c-format
 msgid "ppdc: Expected selector after %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1101
+#: ppdc/ppdc-source.cxx:1058
 #, c-format
 msgid "ppdc: Expected status after Font on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2794
+#: ppdc/ppdc-source.cxx:2750
 #, c-format
 msgid "ppdc: Expected string after Copyright on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3397
+#: ppdc/ppdc-source.cxx:3353
 #, c-format
 msgid "ppdc: Expected string after Version on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:728
+#: ppdc/ppdc-source.cxx:685
 #, c-format
 msgid "ppdc: Expected two option names on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:372
+#: ppdc/ppdc-source.cxx:329
 #, c-format
 msgid "ppdc: Expected value after %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1085
+#: ppdc/ppdc-source.cxx:1042
 #, c-format
 msgid "ppdc: Expected version after Font on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:227
+#: ppdc/ppdc-source.cxx:184
 #, c-format
 msgid "ppdc: Invalid #include/#po filename \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:972
+#: ppdc/ppdc-source.cxx:929
 #, c-format
 msgid "ppdc: Invalid cost for filter on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:964
+#: ppdc/ppdc-source.cxx:921
 #, c-format
 msgid "ppdc: Invalid empty MIME type for filter on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:980
+#: ppdc/ppdc-source.cxx:937
 #, c-format
 msgid "ppdc: Invalid empty program name for filter on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1628
+#: ppdc/ppdc-source.cxx:1585
 #, c-format
 msgid "ppdc: Invalid option section \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1600
+#: ppdc/ppdc-source.cxx:1557
 #, c-format
 msgid "ppdc: Invalid option type \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc.cxx:251 ppdc/ppdpo.cxx:123
+#: ppdc/ppdc.cxx:246 ppdc/ppdpo.cxx:117
 #, c-format
 msgid "ppdc: Loading driver information file \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc.cxx:187
+#: ppdc/ppdc.cxx:182
 #, c-format
 msgid "ppdc: Loading messages for locale \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc.cxx:126
+#: ppdc/ppdc.cxx:121
 #, c-format
 msgid "ppdc: Loading messages from \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2412 ppdc/ppdc-source.cxx:2644
+#: ppdc/ppdc-source.cxx:2368 ppdc/ppdc-source.cxx:2600
 #, c-format
 msgid "ppdc: Missing #endif at end of \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2513 ppdc/ppdc-source.cxx:2548
-#: ppdc/ppdc-source.cxx:2578
+#: ppdc/ppdc-source.cxx:2469 ppdc/ppdc-source.cxx:2504
+#: ppdc/ppdc-source.cxx:2534
 #, c-format
 msgid "ppdc: Missing #if on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-catalog.cxx:418
+#: ppdc/ppdc-catalog.cxx:466
 #, c-format
 msgid "ppdc: Need a msgid line before any translation strings on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-driver.cxx:730
+#: ppdc/ppdc-driver.cxx:712
 #, c-format
 msgid "ppdc: No message catalog provided for locale %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1651 ppdc/ppdc-source.cxx:2882
-#: ppdc/ppdc-source.cxx:2968 ppdc/ppdc-source.cxx:3061
-#: ppdc/ppdc-source.cxx:3194 ppdc/ppdc-source.cxx:3327
+#: ppdc/ppdc-source.cxx:1608 ppdc/ppdc-source.cxx:2838
+#: ppdc/ppdc-source.cxx:2924 ppdc/ppdc-source.cxx:3017
+#: ppdc/ppdc-source.cxx:3150 ppdc/ppdc-source.cxx:3283
 #, c-format
 msgid "ppdc: Option %s defined in two different groups on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1644
+#: ppdc/ppdc-source.cxx:1601
 #, c-format
 msgid "ppdc: Option %s redefined with a different type on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:705
+#: ppdc/ppdc-source.cxx:662
 #, c-format
 msgid "ppdc: Option constraint must *name on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2495
+#: ppdc/ppdc-source.cxx:2451
 #, c-format
 msgid "ppdc: Too many nested #if's on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc.cxx:374
+#: ppdc/ppdc.cxx:369
 #, c-format
 msgid "ppdc: Unable to create PPD file \"%s\" - %s."
 msgstr ""
 
-#: ppdc/ppdc.cxx:266
+#: ppdc/ppdc.cxx:261
 #, c-format
 msgid "ppdc: Unable to create output directory %s: %s"
 msgstr ""
 
-#: ppdc/ppdc.cxx:287
+#: ppdc/ppdc.cxx:282
 #, c-format
 msgid "ppdc: Unable to create output pipes: %s"
 msgstr ""
 
-#: ppdc/ppdc.cxx:303 ppdc/ppdc.cxx:309
+#: ppdc/ppdc.cxx:298 ppdc/ppdc.cxx:304
 #, c-format
 msgid "ppdc: Unable to execute cupstestppd: %s"
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1730
+#: ppdc/ppdc-source.cxx:1687
 #, c-format
 msgid "ppdc: Unable to find #po file %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2651
+#: ppdc/ppdc-source.cxx:2607
 #, c-format
 msgid "ppdc: Unable to find include file \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc.cxx:198
+#: ppdc/ppdc.cxx:193
 #, c-format
 msgid "ppdc: Unable to find localization for \"%s\" - %s"
 msgstr ""
 
-#: ppdc/ppdc.cxx:135
+#: ppdc/ppdc.cxx:130
 #, c-format
 msgid "ppdc: Unable to load localization file \"%s\" - %s"
 msgstr ""
@@ -6616,107 +7243,107 @@ msgstr ""
 msgid "ppdc: Unable to open %s: %s"
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2054
+#: ppdc/ppdc-source.cxx:2011
 #, c-format
 msgid "ppdc: Undefined variable (%s) on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-catalog.cxx:435
+#: ppdc/ppdc-catalog.cxx:483
 #, c-format
 msgid "ppdc: Unexpected text on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2924
+#: ppdc/ppdc-source.cxx:2880
 #, c-format
 msgid "ppdc: Unknown driver type %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:906
+#: ppdc/ppdc-source.cxx:863
 #, c-format
 msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3154
+#: ppdc/ppdc-source.cxx:3110
 #, c-format
 msgid "ppdc: Unknown media size \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-catalog.cxx:463
+#: ppdc/ppdc-catalog.cxx:511
 #, c-format
 msgid "ppdc: Unknown message catalog format for \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3408
+#: ppdc/ppdc-source.cxx:3364
 #, c-format
 msgid "ppdc: Unknown token \"%s\" seen on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1014
+#: ppdc/ppdc-source.cxx:971
 #, c-format
 msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2164
+#: ppdc/ppdc-source.cxx:2121
 #, c-format
 msgid "ppdc: Unterminated string starting with %c on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc.cxx:365
+#: ppdc/ppdc.cxx:360
 #, c-format
 msgid "ppdc: Warning - overlapping filename \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc.cxx:380
+#: ppdc/ppdc.cxx:375
 #, c-format
 msgid "ppdc: Writing %s."
 msgstr ""
 
-#: ppdc/ppdc.cxx:148
+#: ppdc/ppdc.cxx:143
 #, c-format
 msgid "ppdc: Writing PPD files to directory \"%s\"."
 msgstr ""
 
-#: ppdc/ppdmerge.cxx:136
+#: ppdc/ppdmerge.cxx:130
 #, c-format
 msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s."
 msgstr ""
 
-#: ppdc/ppdmerge.cxx:176
+#: ppdc/ppdmerge.cxx:170
 #, c-format
 msgid "ppdmerge: Ignoring PPD file %s."
 msgstr ""
 
-#: ppdc/ppdmerge.cxx:160
+#: ppdc/ppdmerge.cxx:154
 #, c-format
 msgid "ppdmerge: Unable to backup %s to %s - %s"
 msgstr ""
 
-#: systemv/lpstat.c:1900
+#: systemv/lpstat.c:1777
 #, c-format
 msgid "printer %s disabled since %s -"
 msgstr ""
 
-#: systemv/lpstat.c:1889
+#: systemv/lpstat.c:1766
 #, c-format
 msgid "printer %s is idle.  enabled since %s"
 msgstr ""
 
-#: systemv/lpstat.c:1894
+#: systemv/lpstat.c:1771
 #, c-format
 msgid "printer %s now printing %s-%d.  enabled since %s"
 msgstr ""
 
-#: systemv/lpstat.c:2025
+#: systemv/lpstat.c:1900
 #, c-format
 msgid "printer %s/%s disabled since %s -"
 msgstr ""
 
-#: systemv/lpstat.c:2011
+#: systemv/lpstat.c:1886
 #, c-format
 msgid "printer %s/%s is idle.  enabled since %s"
 msgstr ""
 
-#: systemv/lpstat.c:2018
+#: systemv/lpstat.c:1893
 #, c-format
 msgid "printer %s/%s now printing %s-%d.  enabled since %s"
 msgstr ""
@@ -6725,29 +7352,29 @@ msgstr ""
 msgid "processing"
 msgstr ""
 
-#: systemv/lp.c:668
+#: systemv/lp.c:662
 #, c-format
 msgid "request id is %s-%d (%d file(s))"
 msgstr ""
 
-#: cups/snmp.c:1020
+#: cups/snmp.c:972
 msgid "request-id uses indefinite length"
 msgstr ""
 
-#: systemv/lpstat.c:2159
+#: systemv/lpstat.c:2032
 msgid "scheduler is not running"
 msgstr ""
 
-#: systemv/lpstat.c:2155
+#: systemv/lpstat.c:2028
 msgid "scheduler is running"
 msgstr ""
 
-#: cups/adminutil.c:2159
+#: cups/adminutil.c:2148
 #, c-format
 msgid "stat of %s failed: %s"
 msgstr ""
 
-#: berkeley/lpc.c:211
+#: berkeley/lpc.c:203
 msgid "status\t\tShow status of daemon and queue."
 msgstr ""
 
@@ -6755,12 +7382,12 @@ msgstr ""
 msgid "stopped"
 msgstr ""
 
-#: systemv/lpstat.c:1110
+#: systemv/lpstat.c:1052
 #, c-format
 msgid "system default destination: %s"
 msgstr ""
 
-#: systemv/lpstat.c:1107
+#: systemv/lpstat.c:1049
 #, c-format
 msgid "system default destination: %s/%s"
 msgstr ""
@@ -6773,7 +7400,7 @@ msgstr ""
 msgid "untitled"
 msgstr ""
 
-#: cups/snmp.c:1045
+#: cups/snmp.c:997
 msgid "variable-bindings uses indefinite length"
 msgstr ""
 
index c0ad8a5..efe899f 100644 (file)
 "       cupsaddsmb [options] -a" = "       cupsaddsmb [options] -a";
 "       cupstestdsc [options] -" = "       cupstestdsc [options] -";
 "       program | cupstestppd [options] -" = "       program | cupstestppd [options] -";
-"      %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\" 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  %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 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 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 \"%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 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  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  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**  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 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 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";
 "    Warning: file contains binary data." = "    Warning: file contains binary data.";
 "    Warning: no %%EndComments comment in file." = "    Warning: no %%EndComments comment in file.";
 "    Warning: obsolete DSC version %.1f in file." = "    Warning: obsolete DSC version %.1f in file.";
+"  ! expression            Unary NOT of expression." = "  ! expression            Unary NOT of expression.";
+"  ( expressions )         Group expressions." = "  ( expressions )         Group expressions.";
 "  --[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-]user-cancel-any  Allow/prevent users to cancel any job." = "  --[no-]user-cancel-any  Allow/prevent users to cancel any job.";
 "  --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).";
+"  --domain regex          Match domain to regular expression." = "  --domain regex          Match domain to regular expression.";
+"  --exec utility [argument ...] ;\n                          Execute program if true." = "  --exec utility [argument …] ;\n                          Execute program if true.";
+"  --false                 Always false." = "  --false                 Always false.";
+"  --help                  Show help." = "  --help                  Show help.";
+"  --help                  Show this help." = "  --help                  Show this help.";
+"  --host regex            Match hostname to regular expression." = "  --host regex            Match hostname to regular expression.";
 "  --lf                    End lines with LF (UNIX/Linux/OS X)." = "  --lf                    End lines with LF (UNIX/Linux/OS X).";
+"  --list-filters          List filters that will be used." = "  --list-filters          List filters that will be used.";
+"  --local                 True if service is local." = "  --local                 True if service is local.";
+"  --ls                    List attributes." = "  --ls                    List attributes.";
+"  --name regex            Match service name to regular expression." = "  --name regex            Match service name to regular expression.";
+"  --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.";
+"  --quiet                 Quietly report match via exit code." = "  --quiet                 Quietly report match via exit code.";
+"  --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.";
+"  --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.";
 "  -4                      Connect using IPv4." = "  -4                      Connect using IPv4.";
 "  -6                      Connect using IPv6." = "  -6                      Connect using IPv6.";
 "  -C                      Send requests using chunking (default)." = "  -C                      Send requests using chunking (default).";
 "  -I include-dir          Add include directory to search path." = "  -I include-dir          Add include directory to search path.";
 "  -I {filename,filters,none,profiles}" = "  -I {filename,filters,none,profiles}";
 "  -L                      Send requests using content-length." = "  -L                      Send requests using content-length.";
+"  -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         Set PPD file." = "  -P filename.ppd         Set PPD file.";
+"  -P number[-number]      Match port to number or range." = "  -P number[-number]      Match port to number or range.";
 "  -R root-directory       Set alternate root." = "  -R root-directory       Set alternate root.";
 "  -S                      Test with SSL encryption." = "  -S                      Test with SSL encryption.";
+"  -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.";
 "  -U username             Specify username." = "  -U username             Specify username.";
 "  -V version              Set default IPP version." = "  -V version              Set default IPP version.";
 "  -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}" = "  -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}";
 "  -X                      Produce XML plist instead of plain text." = "  -X                      Produce XML plist instead of plain text.";
+"  -a                      Browse for all services." = "  -a                      Browse for all services.";
 "  -a                      Export all printers." = "  -a                      Export all printers.";
+"  -c                      Produce CSV output." = "  -c                      Produce CSV output.";
 "  -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.";
 "  -c cupsd.conf           Set cupsd.conf file to use." = "  -c cupsd.conf           Set cupsd.conf file to use.";
+"  -d domain               Browse/resolve in specified domain." = "  -d domain               Browse/resolve in specified domain.";
 "  -d name=value           Set named variable to value." = "  -d name=value           Set named variable to value.";
 "  -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.";
+"  -d regex                Match domain to regular expression." = "  -d regex                Match domain to regular expression.";
 "  -e                      Use every filter from the PPD file." = "  -e                      Use every filter from the PPD file.";
 "  -f                      Run in the foreground." = "  -f                      Run in the foreground.";
 "  -f filename             Set default request filename." = "  -f filename             Set default request filename.";
 "  -h                      Show this usage message." = "  -h                      Show this usage message.";
+"  -h regex                Match hostname to regular expression." = "  -h regex                Match hostname to regular expression.";
 "  -h server[:port]        Specify server address." = "  -h server[:port]        Specify server address.";
 "  -i mime/type            Set input MIME type (otherwise auto-typed)." = "  -i mime/type            Set input MIME type (otherwise auto-typed).";
 "  -i seconds              Repeat the last file with the given time interval." = "  -i seconds              Repeat the last file with the given time interval.";
 "  -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                      Run cupsd from launchd(8)." = "  -l                      Run cupsd from launchd(8).";
-"  -l lang[,lang,...]      Specify the output language(s) (locale)." = "  -l lang[,lang,...]      Specify the output language(s) (locale).";
+"  -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 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.";
 "  -n count                Repeat the last file the given number of times." = "  -n count                Repeat the last file the given number of times.";
+"  -n regex                Match service name to regular expression." = "  -n regex                Match service name to regular expression.";
 "  -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                      Print URI if true." = "  -p                      Print URI if true.";
 "  -p filename.ppd         Set PPD file." = "  -p filename.ppd         Set PPD file.";
+"  -p program              Run specified program for each service." = "  -p program              Run specified program for each service.";
+"  -q                      Quietly report match via exit code." = "  -q                      Quietly report match via exit code.";
 "  -q                      Run silently." = "  -q                      Run silently.";
+"  -r                      True if service is remote." = "  -r                      True if service is remote.";
 "  -r                      Use 'relaxed' open mode." = "  -r                      Use 'relaxed' open mode.";
+"  -s                      Print service name if true." = "  -s                      Print service name if true.";
 "  -t                      Produce a test report." = "  -t                      Produce a test report.";
 "  -t                      Test PPDs instead of generating them." = "  -t                      Test PPDs instead of generating them.";
 "  -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                Set title." = "  -t title                Set title.";
+"  -t type                 Browse/resolve with specified type." = "  -t type                 Browse/resolve with specified type.";
 "  -u                      Remove the PPD file when finished." = "  -u                      Remove the PPD file when finished.";
+"  -u regex                Match URI to regular expression." = "  -u regex                Match URI to regular expression.";
 "  -v                      Be verbose." = "  -v                      Be verbose.";
 "  -vv                     Be very verbose." = "  -vv                     Be very verbose.";
+"  -x utility [argument ...] ;\n                          Execute program if true." = "  -x utility [argument …] ;\n                          Execute program if true.";
 "  -z                      Compress PPD files using GNU zip." = "  -z                      Compress PPD files using GNU zip.";
+"  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";
+"  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.";
+"  {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";
 " FAIL" = " FAIL";
 " PASS" = " PASS";
-"%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" = "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes";
+"\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)." = "“%s”: Bad URI value “%s” - %s (RFC 2911 section 4.1.5).";
+"\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)." = "“%s”: Bad URI value “%s” - bad length %d (RFC 2911 section 4.1.5).";
+"\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)." = "“%s”: Bad attribute name - bad length %d (RFC 2911 section 4.1.3).";
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)." = "“%s”: Bad attribute name - invalid character (RFC 2911 section 4.1.3).";
+"\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)." = "“%s”: Bad boolen value %d (RFC 2911 section 4.1.11).";
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)." = "“%s”: Bad charset value “%s” - bad characters (RFC 2911 section 4.1.7).";
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)." = "“%s”: Bad charset value “%s” - bad length %d (RFC 2911 section 4.1.7).";
+"\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)." = "“%s”: Bad dateTime UTC hours %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)." = "“%s”: Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)." = "“%s”: Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)." = "“%s”: Bad dateTime day %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)." = "“%s”: Bad dateTime deciseconds %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)." = "“%s”: Bad dateTime hours %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)." = "“%s”: Bad dateTime minutes %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)." = "“%s”: Bad dateTime month %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)." = "“%s”: Bad dateTime seconds %u (RFC 2911 section 4.1.14).";
+"\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)." = "“%s”: Bad enum value %d - out of range (RFC 2911 section 4.1.4).";
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)." = "“%s”: Bad keyword value “%s” - bad length %d (RFC 2911 section 4.1.3).";
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section 4.1.3)." = "“%s”: Bad keyword value “%s” - invalid character (RFC 2911 section 4.1.3).";
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section 4.1.9)." = "“%s”: Bad mimeMediaType value “%s” - bad characters (RFC 2911 section 4.1.9).";
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section 4.1.9)." = "“%s”: Bad mimeMediaType value “%s” - bad length %d (RFC 2911 section 4.1.9).";
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)." = "“%s”: Bad name value “%s” - bad UTF-8 sequence (RFC 2911 section 4.1.2).";
+"\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)." = "“%s”: Bad name value “%s” - bad length %d (RFC 2911 section 4.1.2).";
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section 4.1.8)." = "“%s”: Bad naturalLanguage value “%s” - bad characters (RFC 2911 section 4.1.8).";
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section 4.1.8)." = "“%s”: Bad naturalLanguage value “%s” - bad length %d (RFC 2911 section 4.1.8).";
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)." = "“%s”: Bad octetString value - bad length %d (RFC 2911 section 4.1.10).";
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 section 4.1.13)." = "“%s”: Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 section 4.1.13).";
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section 4.1.15)." = "“%s”: Bad resolution value %dx%d%s - bad units value (RFC 2911 section 4.1.15).";
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 2911 section 4.1.15)." = "“%s”: Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 2911 section 4.1.15).";
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC 2911 section 4.1.15)." = "“%s”: Bad resolution value %dx%d%s - feed resolution must be positive (RFC 2911 section 4.1.15).";
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)." = "“%s”: Bad text value “%s” - bad UTF-8 sequence (RFC 2911 section 4.1.1).";
+"\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)." = "“%s”: Bad text value “%s” - bad length %d (RFC 2911 section 4.1.1).";
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)." = "“%s”: Bad uriScheme value “%s” - bad characters (RFC 2911 section 4.1.6).";
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)." = "“%s”: Bad uriScheme value “%s” - bad length %d (RFC 2911 section 4.1.6).";
 "%-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.";
 // 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 environment variable names non-existent destination \"%s\"." = "%s: Error - %s environment variable names non-existent destination \"%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 - 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 \"-b\" option." = "%s: Error - expected destination after \"-b\" 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 - 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 - 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: Need job ID (\"-i jobid\") before \"-H restart\"." = "%s: Need job ID (\"-i jobid\") before \"-H restart\".";
+"%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 determine MIME type of \"%s\"." = "%s: Unable to determine MIME type of \"%s\".";
+"%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 read MIME database from \"%s\" or \"%s\"." = "%s: Unable to read MIME database from \"%s\" or \"%s\".";
-"%s: Unknown destination \"%s\"." = "%s: Unknown destination \"%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 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 \"%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 - \"%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.";
 "7 inches/sec." = "7 inches/sec.";
 "7 x 9" = "7 x 9";
 "70" = "70";
-"720dpi" = "720dpi";
 "75" = "75";
 "8" = "8";
 "8 inches/sec." = "8 inches/sec.";
 "?Invalid help command unknown." = "?Invalid help command unknown.";
 "A Samba password is required to export printer drivers" = "A Samba password is required to export printer drivers";
 "A Samba username is required to export printer drivers" = "A Samba username is required to export printer drivers";
-"A class named \"%s\" already exists." = "A class named \"%s\" already exists.";
-"A printer named \"%s\" already exists." = "A printer named \"%s\" already exists.";
+"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";
 "B7" = "B7";
 "B8" = "B8";
 "B9" = "B9";
-"Bad 'document-format' value \"%s\"." = "Bad 'document-format' value \"%s\".";
+"Bad 'document-format' value \"%s\"." = "Bad 'document-format' value “%s”.";
 "Bad NULL dests pointer" = "Bad NULL dests pointer";
 "Bad OpenGroup" = "Bad OpenGroup";
 "Bad OpenUI/JCLOpenUI" = "Bad OpenUI/JCLOpenUI";
 "Bad Request" = "Bad Request";
 "Bad SNMP version number" = "Bad SNMP version number";
 "Bad UIConstraints" = "Bad UIConstraints";
+"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 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 job-name value: Bad UTF-8 sequence." = "Bad job-name value: Bad UTF-8 sequence.";
-"Bad job-name value: Name too long." = "Bad job-name value: Name too long.";
+"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 \"%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 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 number-up value %d." = "Bad number-up value %d.";
 "Bad option + choice on line %d." = "Bad option + choice on line %d.";
 "Bad page-ranges values %d-%d." = "Bad page-ranges values %d-%d.";
-"Bad port-monitor \"%s\"." = "Bad port-monitor \"%s\".";
-"Bad printer URI." = "Bad printer URI.";
+"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 subscription ID" = "Bad subscription ID";
+"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";
-"Boolean expected for waiteof option \"%s\"." = "Boolean expected for waiteof option \"%s\".";
+"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";
 "Cancel RSS Subscription" = "Cancel RSS Subscription";
 "Canceling print job." = "Canceling print job.";
 "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.";
+"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.";
 "Delete Class" = "Delete Class";
 "Delete Printer" = "Delete Printer";
 "DeskJet Series" = "DeskJet Series";
-"Destination \"%s\" is not accepting jobs." = "Destination \"%s\" is not accepting jobs.";
+"Destination \"%s\" is not accepting jobs." = "Destination “%s” is not accepting jobs.";
 "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).";
+"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.";
 "Duplexer" = "Duplexer";
 "EPL2 Label Printer" = "EPL2 Label Printer";
 "Edit Configuration File" = "Edit Configuration File";
 "Empty PPD file." = "Empty PPD file.";
+"Encryption is not supported." = "Encryption is not supported.";
 // TRANSLATORS: Banner/cover sheet after the print job.
 "Ending Banner" = "Ending Banner";
 "English" = "English";
-"Enter old password:" = "Enter old password:";
-"Enter password again:" = "Enter password again:";
-"Enter password:" = "Enter password:";
 "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 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.";
+"Error: need hostname after \"-h\" option." = "Error: need hostname after “-h” option.";
 "Every 10 Labels" = "Every 10 Labels";
 "Every 2 Labels" = "Every 2 Labels";
 "Every 3 Labels" = "Every 3 Labels";
 "Executive" = "Executive";
 "Expectation Failed" = "Expectation Failed";
 "Export Printers to Samba" = "Export Printers to Samba";
+"Expressions:" = "Expressions:";
 "FAIL" = "FAIL";
 "FanFold German" = "FanFold German";
 "FanFold Legal German" = "FanFold Legal German";
 "Fanfold US" = "Fanfold US";
-"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 \"%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\".";
+"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.";
 "Folio" = "Folio";
 "Forbidden" = "Forbidden";
 "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.";
 "Internet Postage 2-Part" = "Internet Postage 2-Part";
 "Internet Postage 3-Part" = "Internet Postage 3-Part";
 "Internet Printing Protocol" = "Internet Printing Protocol";
+"Invalid media name arguments." = "Invalid media name arguments.";
 "Invalid media size." = "Invalid media size.";
-"Invalid printer command \"%s\"." = "Invalid printer command \"%s\".";
+"Invalid printer command \"%s\"." = "Invalid printer command “%s”.";
 "JCL" = "JCL";
 "JIS B0" = "JIS B0";
 "JIS B1" = "JIS B1";
 "LPD/LPR Host or Printer" = "LPD/LPR Host or Printer";
 "Label Printer" = "Label Printer";
 "Label Top" = "Label Top";
-"Language \"%s\" not supported." = "Language \"%s\" not supported.";
+"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";
 "Light" = "Light";
 "Line longer than the maximum allowed (255 characters)" = "Line longer than the maximum allowed (255 characters)";
 "List Available Printers" = "List Available Printers";
+"Load paper." = "Load paper.";
 "Long-Edge (Portrait)" = "Long-Edge (Portrait)";
-"Looking for printer." = "Looking for printer.";
+"Looking for printer..." = "Looking for printer…";
 "Manual Feed" = "Manual Feed";
 "Media Size" = "Media Size";
 "Media Source" = "Media Source";
 "Missing option keyword" = "Missing option keyword";
 "Missing requesting-user-name attribute." = "Missing requesting-user-name attribute.";
 "Missing required attributes." = "Missing required attributes.";
+"Missing resource in URI" = "Missing resource in URI";
+"Missing scheme in URI" = "Missing scheme in URI";
 "Missing value on line %d." = "Missing value on line %d.";
 "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";
 "Name OID uses indefinite length" = "Name OID uses indefinite length";
 "Nested classes are not allowed." = "Nested classes are not allowed.";
 "Never" = "Never";
-"New Stylus Color Series" = "New Stylus Color Series";
-"New Stylus Photo Series" = "New Stylus Photo Series";
 "No" = "No";
 "No Content" = "No Content";
 "No PPD name" = "No PPD name";
 "No VarBind SEQUENCE" = "No VarBind SEQUENCE";
 "No Windows printer drivers are installed." = "No Windows printer drivers are installed.";
 "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 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 subscription attributes in request." = "No subscription attributes in request.";
 "No subscriptions found." = "No subscriptions found.";
 "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.";
+"Option \"%s\" cannot be included via %%%%IncludeFeature." = "Option “%s” cannot be included via %%%%IncludeFeature.";
 "Options Installed" = "Options Installed";
 "Options:" = "Options:";
 "Out of date PPD cache file." = "Out of date PPD cache file.";
 "Out of memory." = "Out of memory.";
 "Output Mode" = "Output Mode";
-"Output for printer %s is sent to %s" = "Output for printer %s is sent to %s";
-"Output for printer %s is sent to remote printer %s on %s" = "Output for printer %s is sent to remote printer %s on %s";
-"Output for printer %s/%s is sent to %s" = "Output for printer %s/%s is sent to %s";
-"Output for printer %s/%s is sent to remote printer %s on %s" = "Output for printer %s/%s is sent to remote printer %s on %s";
+"Output bin is almost full." = "Output bin is almost full.";
+"Output bin is full." = "Output bin is full.";
+"Output bin is missing." = "Output bin is missing.";
 "PASS" = "PASS";
 "PCL Laser Printer" = "PCL Laser Printer";
 "PRC16K" = "PRC16K";
 "PRC32K Oversize Long Edge" = "PRC32K Oversize Long Edge";
 "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";
+"Paper jam." = "Paper jam.";
+"Paper tray is almost empty." = "Paper tray is almost empty.";
+"Paper tray is empty." = "Paper tray is empty.";
+"Paper tray is missing." = "Paper tray is missing.";
 "ParamCustominCutInterval" = "ParamCustominCutInterval";
 "ParamCustominTearInterval" = "ParamCustominTearInterval";
 "Password for %s on %s? " = "Password for %s on %s? ";
 "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 Test Page" = "Print Test Page";
 "Print and Cut" = "Print and Cut";
 "Print and Tear" = "Print and Tear";
-"Print file accepted - job ID %d." = "Print file accepted - job ID %d.";
-"Print file accepted - job ID unknown." = "Print file accepted - job ID unknown.";
 "Print file sent." = "Print file sent.";
-"Print file was not accepted." = "Print file was not accepted.";
 "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 Added" = "Printer Added";
 "Printer Default" = "Printer Default";
 "Printer Deleted" = "Printer Deleted";
 "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:" = "Printer:";
 "Printers" = "Printers";
-"Printing page %d, %d%% complete." = "Printing page %d, %d%% complete.";
-"Purge Jobs" = "Purge Jobs";
+"Printing page %d, %u%% complete." = "Printing page %d, %u%% complete.";
 "Quarto" = "Quarto";
 "Quota limit reached." = "Quota limit reached.";
 "Rank    Owner   Job     File(s)                         Total Size" = "Rank    Owner   Job     File(s)                         Total Size";
-// TRANSLATORS: Pri is job priority.
-"Rank   Owner      Pri  Job        Files                       Total Size" = "Rank   Owner      Pri  Job        Files                       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).";
 "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";
 "Starting Banner" = "Starting Banner";
 "Starting page %d." = "Starting page %d.";
 "Statement" = "Statement";
-"Stylus Color Series" = "Stylus Color Series";
-"Stylus Photo Series" = "Stylus Photo Series";
 "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";
 "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 Description attribute cannot be supplied in a job creation request." = "The '%s' Job Description attribute cannot be supplied in a job creation request.";
+"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 \"%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 developer unit needs to be replaced." = "The developer unit needs to be replaced.";
 "The notify-user-data value is too large (%d > 63 octets)." = "The notify-user-data value is too large (%d > 63 octets).";
 "The optical photoconductor needs to be replaced." = "The optical photoconductor needs to be replaced.";
 "The optical photoconductor will need to be replaced soon." = "The optical photoconductor will need to be replaced soon.";
-"The output bin is almost full." = "The output bin is almost full.";
-"The output bin is full." = "The output bin is full.";
-"The output bin is missing." = "The output bin is missing.";
-"The paper tray is almost empty." = "The paper tray is almost empty.";
-"The paper tray is empty." = "The paper tray is empty.";
-"The paper tray is missing." = "The paper tray is missing.";
-"The paper tray needs to be filled." = "The paper tray needs to be filled.";
-"The printer URI is incorrect or no longer exists." = "The printer URI is incorrect or no longer exists.";
+"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 does not support IPP/%d.%d, trying IPP/%s." = "The printer does not support IPP/%d.%d, trying IPP/%s.";
 "The printer is in use." = "The printer is in use.";
+"The printer is low on ink." = "The printer is low on ink.";
+"The printer is low on toner." = "The printer is low on toner.";
 "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 running low on ink." = "The printer is running low on ink.";
-"The printer is running low on toner." = "The printer is running low on toner.";
 "The printer is unreachable at this time." = "The printer is unreachable at this time.";
 "The printer may be out of ink." = "The printer may be out of ink.";
 "The printer may be out of toner." = "The printer may be out of toner.";
 "The printer's interlock is open." = "The printer's interlock is open.";
 "The printer's waste bin is almost full." = "The printer's waste bin is almost full.";
 "The printer's waste bin is full." = "The printer's waste bin is full.";
-"The printer-uri \"%s\" contains invalid characters." = "The printer-uri \"%s\" contains invalid characters.";
+"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 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 subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)." = "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#).";
-"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.";
+"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 is a paper jam." = "There is a paper jam.";
 "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.";
 "Tray 3" = "Tray 3";
 "Tray 4" = "Tray 4";
 "URI Too Long" = "URI Too Long";
+"URI too large" = "URI too large";
 "US Ledger" = "US Ledger";
 "US Legal" = "US Legal";
 "US Legal Oversize" = "US Legal Oversize";
 "Unable to add RSS subscription" = "Unable to add RSS subscription";
 "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 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 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 Windows 2000 printer driver files (%d)." = "Unable to copy Windows 2000 printer driver files (%d).";
 "Unable to copy Windows 9x printer driver files (%d)." = "Unable to copy Windows 9x printer driver files (%d).";
 "Unable to copy interface script - %s" = "Unable to copy interface script - %s";
-"Unable to create compressed print file" = "Unable to create compressed print file";
 "Unable to create printer-uri" = "Unable to create printer-uri";
+"Unable to create server credentials." = "Unable to create server credentials.";
 "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 establish a secure connection to host." = "Unable to establish a secure connection to host.";
 "Unable to find destination for job" = "Unable to find destination for job";
 "Unable to find printer." = "Unable to find printer.";
-"Unable to generate compressed print file" = "Unable to generate compressed print file";
+"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 install Windows 2000 printer driver files (%d)." = "Unable to install Windows 2000 printer driver files (%d).";
 "Unable to install Windows 9x printer driver files (%d)." = "Unable to install Windows 9x printer driver files (%d).";
 "Unable to load help index." = "Unable to load help index.";
-"Unable to locate printer \"%s\"." = "Unable to locate printer \"%s\".";
+"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 compressed print file" = "Unable to open compressed print 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 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 resolve printer URI." = "Unable to resolve printer URI.";
-"Unable to run \"%s\": %s" = "Unable to run \"%s\": %s";
+"Unable to rename job document file." = "Unable to rename job document file.";
+"Unable to resolve printer-uri." = "Unable to resolve printer-uri.";
+"Unable to run \"%s\": %s" = "Unable to run “%s”: %s";
 "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.";
 "Unauthorized" = "Unauthorized";
 "Units" = "Units";
 "Unknown" = "Unknown";
-"Unknown choice \"%s\" for option \"%s\"." = "Unknown choice \"%s\" for option \"%s\".";
-"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 choice \"%s\" for option \"%s\"." = "Unknown choice “%s” for option “%s”.";
+"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 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 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\".";
+"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-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 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.";
 "Upgrade Required" = "Upgrade Required";
 "Usage:\n\n    lpadmin [-h server] -d destination\n    lpadmin [-h server] -x destination\n    lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n                       [-r remove-class] [-v device] [-D description]\n                       [-P ppd-file] [-o name=value]\n                       [-u allow:user,user] [-u deny:user,user]" = "Usage:\n\n    lpadmin [-h server] -d destination\n    lpadmin [-h server] -x destination\n    lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n                       [-r remove-class] [-v device] [-D description]\n                       [-P ppd-file] [-o name=value]\n                       [-u allow:user,user] [-u deny:user,user]";
 "Usage: %s job-id user title copies options [file]" = "Usage: %s job-id user title copies options [file]";
-"Usage: cupsaddsmb [options] printer1 ... printerN" = "Usage: cupsaddsmb [options] printer1 ... printerN";
-"Usage: cupsctl [options] [param=value ... paramN=valueN]" = "Usage: cupsctl [options] [param=value ... paramN=valueN]";
+"Usage: cupsaddsmb [options] printer1 ... printerN" = "Usage: cupsaddsmb [options] printer1  printerN";
+"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: cupstestdsc [options] filename.ps [... filename.ps]" = "Usage: cupstestdsc [options] filename.ps [... filename.ps]";
-"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" = "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]";
-"Usage: ipptool [options] URI filename [ ... filenameN ]" = "Usage: ipptool [options] URI filename [ ... filenameN ]";
+"Usage: cupsfilter [ options ] [ -- ] filename" = "Usage: cupsfilter [ options ] [ -- ] filename";
+"Usage: cupstestdsc [options] filename.ps [... filename.ps]" = "Usage: cupstestdsc [options] filename.ps [… filename.ps]";
+"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" = "Usage: cupstestppd [options] filename1.ppd[.gz] [… filenameN.ppd[.gz]]";
+"Usage: ippdiscover [options] -a\n       ippdiscover [options] \"service name\"\n\nOptions:" = "Usage: ippdiscover [options] -a\n       ippdiscover [options] “service name”\n\nOptions:";
+"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: lpmove job/src dest" = "Usage: lpmove job/src dest";
-"Usage: lpoptions [-h server] [-E] -d printer\n       lpoptions [-h server] [-E] [-p printer] -l\n       lpoptions [-h server] [-E] -p printer -o option[=value] ...\n       lpoptions [-h server] [-E] -x printer" = "Usage: lpoptions [-h server] [-E] -d printer\n       lpoptions [-h server] [-E] [-p printer] -l\n       lpoptions [-h server] [-E] -p printer -o option[=value] ...\n       lpoptions [-h server] [-E] -x printer";
-"Usage: lppasswd [-g groupname]" = "Usage: lppasswd [-g groupname]";
-"Usage: lppasswd [-g groupname] [username]\n       lppasswd [-g groupname] -a [username]\n       lppasswd [-g groupname] -x [username]" = "Usage: lppasswd [-g groupname] [username]\n       lppasswd [-g groupname] -a [username]\n       lppasswd [-g groupname] -x [username]";
+"Usage: lpoptions [-h server] [-E] -d printer\n       lpoptions [-h server] [-E] [-p printer] -l\n       lpoptions [-h server] [-E] -p printer -o option[=value] ...\n       lpoptions [-h server] [-E] -x printer" = "Usage: lpoptions [-h server] [-E] -d printer\n       lpoptions [-h server] [-E] [-p printer] -l\n       lpoptions [-h server] [-E] -p printer -o option[=value] …\n       lpoptions [-h server] [-E] -x printer";
 "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" = "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]";
-"Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" = "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]";
+"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: 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]";
 "Value uses indefinite length" = "Value uses indefinite length";
 "VarBind uses indefinite length" = "VarBind uses indefinite length";
 "Web Interface is Disabled" = "Web Interface is Disabled";
 "Yes" = "Yes";
 "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>." = "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>.";
-"Your password must be at least 6 characters long, cannot contain your username, and must contain at least one letter and number." = "Your password must be at least 6 characters long, cannot contain your username, and must contain at least one letter and number.";
 "ZPL Label Printer" = "ZPL Label Printer";
 "Zebra" = "Zebra";
 "aborted" = "aborted";
 "completed" = "completed";
 "cups-deviced failed to execute." = "cups-deviced failed to execute.";
 "cups-driverd failed to execute." = "cups-driverd failed to execute.";
-"cupsaddsmb: No PPD file for printer \"%s\" - %s" = "cupsaddsmb: No PPD file for printer \"%s\" - %s";
+"cupsaddsmb: No PPD file for printer \"%s\" - %s" = "cupsaddsmb: No PPD file for printer “%s” - %s";
 "cupsctl: Cannot set Listen or Port directly." = "cupsctl: Cannot set Listen or Port 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.";
+"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.";
-"cupsd: launchd(8) support not compiled in, running in normal mode." = "cupsd: launchd(8) support not compiled in, running in normal mode.";
+"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.";
 "held" = "held";
 "help\t\tGet help on commands." = "help\t\tGet help on commands.";
 "idle" = "idle";
-"ipptool: \"-i\" and \"-n\" are incompatible with -X\"." = "ipptool: \"-i\" and \"-n\" are incompatible with -X\".";
+"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 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 \"-P\" and \"-X\"." = "ipptool: “-i” and “-n” are incompatible with “-P” and “-X”.";
 "ipptool: Bad URI - %s." = "ipptool: Bad URI - %s.";
-"ipptool: Bad version %s for \"-V\"." = "ipptool: Bad version %s for \"-V\".";
-"ipptool: Invalid seconds for \"-i\"." = "ipptool: Invalid seconds for \"-i\".";
+"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 \"-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: Missing timeout for \"-T\"." = "ipptool: Missing timeout for \"-T\".";
-"ipptool: Missing version for \"-V\"." = "ipptool: Missing version for \"-V\".";
+"ipptool: Missing count for \"-n\"." = "ipptool: Missing count for “-n”.";
+"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.";
-"ipptool: Unknown option \"-%c\"." = "ipptool: Unknown option \"-%c\".";
+"ipptool: Unknown option \"-%c\"." = "ipptool: Unknown option “-%c”.";
 "job-printer-uri attribute missing." = "job-printer-uri attribute missing.";
 "lpadmin: Class name can only contain printable characters." = "lpadmin: Class name can only contain printable characters.";
-"lpadmin: Expected PPD after \"-P\" option." = "lpadmin: Expected PPD after \"-P\" 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 interface after \"-i\" option." = "lpadmin: Expected interface after \"-i\" 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: Expected PPD after \"-P\" option." = "lpadmin: Expected PPD after “-P” 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 interface after \"-i\" option." = "lpadmin: Expected interface after “-i” 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: 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 file \"%s\" - %s" = "lpadmin: Unable to open PPD file \"%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 open PPD file \"%s\" - %s" = "lpadmin: Unable to open PPD file “%s” - %s";
 "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: 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: 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\".";
-"lpinfo: Unknown argument \"%s\"." = "lpinfo: Unknown argument \"%s\".";
-"lpinfo: Unknown option \"%c\"." = "lpinfo: Unknown option \"%c\".";
-"lpinfo: Unknown option \"%s\"." = "lpinfo: Unknown option \"%s\".";
+"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”.";
+"lpinfo: Unknown argument \"%s\"." = "lpinfo: Unknown argument “%s”.";
+"lpinfo: Unknown option \"%c\"." = "lpinfo: Unknown option “%c”.";
+"lpinfo: Unknown option \"%s\"." = "lpinfo: Unknown option “%s”.";
 "lpmove: Unable to connect to server: %s" = "lpmove: Unable to connect to server: %s";
-"lpmove: Unknown argument \"%s\"." = "lpmove: Unknown argument \"%s\".";
-"lpmove: Unknown option \"%c\"." = "lpmove: Unknown option \"%c\".";
+"lpmove: Unknown argument \"%s\"." = "lpmove: Unknown argument “%s”.";
+"lpmove: Unknown option \"%c\"." = "lpmove: Unknown option “%c”.";
 "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.";
-"lppasswd: Only root can add or delete passwords." = "lppasswd: Only root can add or delete passwords.";
-"lppasswd: Password file busy." = "lppasswd: Password file busy.";
-"lppasswd: Password file not updated." = "lppasswd: Password file not updated.";
-"lppasswd: Sorry, password doesn't match." = "lppasswd: Sorry, password doesn't match.";
-"lppasswd: Sorry, password rejected." = "lppasswd: Sorry, password rejected.";
-"lppasswd: Sorry, passwords don't match." = "lppasswd: Sorry, passwords don't match.";
-"lppasswd: Unable to copy password string: %s" = "lppasswd: Unable to copy password string: %s";
-"lppasswd: Unable to open password file: %s" = "lppasswd: Unable to open password file: %s";
-"lppasswd: Unable to write to password file: %s" = "lppasswd: Unable to write to password file: %s";
-"lppasswd: failed to backup old password file: %s" = "lppasswd: failed to backup old password file: %s";
-"lppasswd: failed to rename password file: %s" = "lppasswd: failed to rename password file: %s";
-"lppasswd: user \"%s\" and group \"%s\" do not exist." = "lppasswd: user \"%s\" and group \"%s\" do not exist.";
-"lpstat: error - %s environment variable names non-existent destination \"%s\"." = "lpstat: error - %s environment variable names non-existent destination \"%s\".";
+"lpstat: error - %s environment variable names non-existent destination \"%s\"." = "lpstat: error - %s environment variable names non-existent destination “%s”.";
 "members of class %s:" = "members of class %s:";
 "no entries" = "no entries";
 "no system default destination" = "no system default destination";
 "notify-events not specified." = "notify-events not specified.";
-"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.";
+"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.";
 "pending" = "pending";
-"ppdc: Adding include directory \"%s\"." = "ppdc: Adding include directory \"%s\".";
+"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 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: 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 #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: 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 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 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 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: 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: 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.";
+"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";
 "printer %s disabled since %s -" = "printer %s disabled since %s -";
index 5d99bd2..369e7fd 100644 (file)
@@ -3,7 +3,7 @@
 #
 #   Message catalog template for the Common UNIX Printing System (CUPS).
 #
-#   Copyright 2007-2009 by Apple Inc.
+#   Copyright 2007-2015 by Apple Inc.
 #   Copyright 2005-2007 by Easy Software Products.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -32,7 +32,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 1.4.6\n"
 "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2013-07-08 07:38-0400\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
 "PO-Revision-Date: 2012-09-29 11:21+0200\n"
 "Last-Translator: Àngel Mompó <mecatxis@gmail.com>\n"
 "Language-Team: Catalan <ca@dodds.net>\n"
@@ -932,6 +932,12 @@ msgstr "     Avís: no hi ha cap %%EndComments al fitxer."
 msgid "    Warning: obsolete DSC version %.1f in file."
 msgstr "     Avís: versió del DSC %.1f obsoleta al fitxer."
 
+msgid "  ! expression            Unary NOT of expression."
+msgstr ""
+
+msgid "  ( expressions )         Group expressions."
+msgstr ""
+
 msgid "  --[no-]debug-logging    Turn debug logging on/off."
 msgstr "  --[no-]debug-logging    Activa o desactiva el registre de depuració."
 
@@ -956,9 +962,85 @@ 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 "  --domain regex          Match domain to regular expression."
+msgstr ""
+
+msgid ""
+"  --exec utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+
+msgid "  --false                 Always false."
+msgstr ""
+
+msgid "  --help                  Show help."
+msgstr ""
+
+msgid "  --help                  Show this help."
+msgstr ""
+
+msgid "  --host regex            Match hostname to regular expression."
+msgstr ""
+
 msgid "  --lf                    End lines with LF (UNIX/Linux/OS X)."
 msgstr "  --lf                    Final de línia amb LF (UNIX/Linux/OS X)."
 
+msgid "  --list-filters          List filters that will be used."
+msgstr ""
+
+msgid "  --local                 True if service is local."
+msgstr ""
+
+msgid "  --ls                    List attributes."
+msgstr ""
+
+msgid "  --name regex            Match service name to regular expression."
+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 "  --quiet                 Quietly report match via exit code."
+msgstr ""
+
+msgid "  --remote                True if service is remote."
+msgstr ""
+
+msgid ""
+"  --stop-after-include-error\n"
+"                          Stop tests after a failed INCLUDE."
+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 "  -4                      Connect using IPv4."
 msgstr "  -4                      Connecta fent servir IPv4."
 
@@ -1004,15 +1086,26 @@ msgid "  -L                      Send requests using content-length."
 msgstr ""
 "  -L                      Envia les peticions fent servir content-length."
 
+msgid ""
+"  -P filename.plist       Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+
 msgid "  -P filename.ppd         Set PPD file."
 msgstr "  -P nomfitxer.ppd         Estableix el fitxer PPD."
 
+msgid "  -P number[-number]      Match port to number or range."
+msgstr ""
+
 msgid "  -R root-directory       Set alternate root."
 msgstr "  -R directori-arrel       Estableix una arrel alternativa."
 
 msgid "  -S                      Test with SSL encryption."
 msgstr "  -S                      Fa una prova amb xifrat SSL."
 
+msgid "  -T seconds              Set the browse timeout in seconds."
+msgstr ""
+
 msgid "  -T seconds              Set the receive/send timeout in seconds."
 msgstr ""
 "  -T segons              Estableix el temps d'espera màxim per enviar i "
@@ -1035,16 +1128,28 @@ msgid "  -X                      Produce XML plist instead of plain text."
 msgstr ""
 "  -X                      Retorna els plist en XML en comptes de text pla."
 
+msgid "  -a                      Browse for all services."
+msgstr ""
+
 msgid "  -a                      Export all printers."
 msgstr "  -a                      Exporta totes les impressores."
 
+msgid "  -c                      Produce CSV output."
+msgstr ""
+
 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 "  -c cupsd.conf           Set cupsd.conf file to use."
 msgstr ""
 "  -c cupsd.conf           Estableix el fitxer cupsd.conf que cal fer servir."
 
+msgid "  -d domain               Browse/resolve in specified domain."
+msgstr ""
+
 msgid "  -d name=value           Set named variable to value."
 msgstr "  -d nom=valor           Estableix la variable indicada al valor."
 
@@ -1054,6 +1159,9 @@ 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 "  -d regex                Match domain to regular expression."
+msgstr ""
+
 msgid "  -e                      Use every filter from the PPD file."
 msgstr "  -e                      Fa servir tots els filtres del fitxer PPD."
 
@@ -1068,6 +1176,9 @@ msgstr ""
 msgid "  -h                      Show this usage message."
 msgstr "  -h                      Mostra aquest missatge de sintaxi."
 
+msgid "  -h regex                Match hostname to regular expression."
+msgstr ""
+
 msgid "  -h server[:port]        Specify server address."
 msgstr "  -h servidor[:port]        Especifica l'adreça del servidor."
 
@@ -1088,8 +1199,14 @@ msgstr ""
 "  -j id-feina[,N]           Filtra el fitxer N a la feina especificada (el "
 "fitxer per defecte és 1)."
 
-msgid "  -l                      Run cupsd from launchd(8)."
-msgstr "  -l                      Executa cupsd des de launchd(8)."
+msgid "  -l                      List attributes."
+msgstr ""
+
+msgid "  -l                      Produce plain text output."
+msgstr ""
+
+msgid "  -l                      Run cupsd on demand."
+msgstr ""
 
 msgid "  -l lang[,lang,...]      Specify the output language(s) (locale)."
 msgstr ""
@@ -1115,6 +1232,9 @@ msgstr ""
 "  -n comptador                Repeteix l'últim fitxer el nombre indicat de "
 "vegades."
 
+msgid "  -n regex                Match service name to regular expression."
+msgstr ""
+
 msgid ""
 "  -o filename.drv         Set driver information file (otherwise ppdi.drv)."
 msgstr ""
@@ -1129,15 +1249,30 @@ msgstr ""
 msgid "  -o name=value           Set option(s)."
 msgstr "  -o nom=valor           Estableix les opcions."
 
+msgid "  -p                      Print URI if true."
+msgstr ""
+
 msgid "  -p filename.ppd         Set PPD file."
 msgstr "  -p nomfitxer.ppd         Estableix el fitxer PPD."
 
+msgid "  -p program              Run specified program for each service."
+msgstr ""
+
+msgid "  -q                      Quietly report match via exit code."
+msgstr ""
+
 msgid "  -q                      Run silently."
 msgstr "  -q                      S'executa en mode silenciós."
 
+msgid "  -r                      True if service is remote."
+msgstr ""
+
 msgid "  -r                      Use 'relaxed' open mode."
 msgstr "  -r                      Fa servir el mode obert «relaxat»."
 
+msgid "  -s                      Print service name if true."
+msgstr ""
+
 msgid "  -t                      Produce a test report."
 msgstr "  -t                      Genera un informe de prova."
 
@@ -1147,23 +1282,103 @@ msgstr "  -t                      Prova els  PPDs en comptes de generar-los."
 msgid "  -t                      Test the configuration file."
 msgstr "  -t                      Prova el fitxer de configuració."
 
+msgid "  -t key                  True if the TXT record contains the key."
+msgstr ""
+
 msgid "  -t title                Set title."
 msgstr "  -t títol                Estableix el títol."
 
+msgid "  -t type                 Browse/resolve with specified type."
+msgstr ""
+
 msgid "  -u                      Remove the PPD file when finished."
 msgstr "  -u                      Elimina el fitxer PPD quan ha acabat."
 
+msgid "  -u regex                Match URI to regular expression."
+msgstr ""
+
 msgid "  -v                      Be verbose."
 msgstr "  -v                      Mode detallat."
 
 msgid "  -vv                     Be very verbose."
 msgstr "  -vv                     Mode molt detallat."
 
+msgid ""
+"  -x utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+
 msgid "  -z                      Compress PPD files using GNU zip."
 msgstr ""
 "  -z                      Comprimeix els fitxers PPD fent servir el zip de "
 "GNU."
 
+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 ""
+"  expression --and expression\n"
+"                          Logical AND."
+msgstr ""
+
+msgid ""
+"  expression --or expression\n"
+"                          Logical OR."
+msgstr ""
+
+msgid "  expression expression   Logical AND."
+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 " FAIL"
 msgstr " ERROR"
 
@@ -1171,14 +1386,201 @@ msgid " PASS"
 msgstr " VÀLID"
 
 #, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
-msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+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"
 
@@ -1236,6 +1638,14 @@ 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."
 
@@ -1287,10 +1697,6 @@ 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 \"-b\" option."
-msgstr "%s: error - s'esperava un destí després de l'opció «-b»."
-
-#, c-format
 msgid "%s: Error - expected destination after \"-d\" option."
 msgstr "%s: error - s'esperava un destí després de l'opció «-d»."
 
@@ -1411,6 +1817,18 @@ 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»."
 
@@ -1427,6 +1845,10 @@ 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."
 
@@ -1435,10 +1857,18 @@ 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"
 
@@ -1451,6 +1881,10 @@ 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 destination \"%s\"."
 msgstr "%s: el destí «%s» és desconegut."
 
@@ -1463,6 +1897,14 @@ 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."
 
@@ -2018,9 +2460,6 @@ msgstr "7 x 9"
 msgid "70"
 msgstr "70"
 
-msgid "720dpi"
-msgstr "720ppp"
-
 msgid "75"
 msgstr "75"
 
@@ -2310,6 +2749,9 @@ msgstr "El número de versió del SNMP és incorrecte"
 msgid "Bad UIConstraints"
 msgstr "La UIConstraints és incorrecta"
 
+msgid "Bad arguments to function"
+msgstr ""
+
 #, c-format
 msgid "Bad copies value %d."
 msgstr "El valor de copies %d és incorrecte"
@@ -2336,10 +2778,11 @@ 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 job-name value: Bad UTF-8 sequence."
+msgid "Bad hostname/address in URI"
 msgstr ""
 
-msgid "Bad job-name value: Name too long."
+#, c-format
+msgid "Bad job-name value: %s"
 msgstr ""
 
 msgid "Bad job-name value: Wrong type or count."
@@ -2382,17 +2825,20 @@ msgstr "L'opció + elecció de la línia %d és incorrecta."
 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."
 
-msgid "Bad printer URI."
-msgstr "L'URI de la impressora és incorrecte."
-
 #, 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."
@@ -2401,12 +2847,24 @@ msgstr "L'identificador %d de la sol·licitud és incorrecte."
 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 subscription ID"
 msgstr "L'identificador de la subscripció és incorrecte."
 
+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"
 
@@ -2426,6 +2884,9 @@ msgstr "CMYK"
 msgid "CPCL Label Printer"
 msgstr "Impressora d'etiquetes CPCL"
 
+msgid "Cancel Jobs"
+msgstr ""
+
 msgid "Cancel RSS Subscription"
 msgstr "Cancel·la la subscripció RSS"
 
@@ -2594,6 +3055,9 @@ msgstr "Edita el fitxer de configuració"
 msgid "Empty PPD file."
 msgstr "El fitxer PPD és buit."
 
+msgid "Encryption is not supported."
+msgstr ""
+
 #. TRANSLATORS: Banner/cover sheet after the print job.
 msgid "Ending Banner"
 msgstr "S'està acabant el bàner"
@@ -2601,15 +3065,6 @@ msgstr "S'està acabant el bàner"
 msgid "English"
 msgstr "Anglès"
 
-msgid "Enter old password:"
-msgstr "Introduïu la contrasenya antiga:"
-
-msgid "Enter password again:"
-msgstr "Introduïu la contrasenya un altre cop:"
-
-msgid "Enter password:"
-msgstr "Introduïu la contrasenya:"
-
 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 "
@@ -2779,12 +3234,18 @@ 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."
 
@@ -2830,6 +3291,9 @@ msgstr "Ha fallat la condició del valor que s'esperava"
 msgid "Export Printers to Samba"
 msgstr "Exportar les impressores al Samba"
 
+msgid "Expressions:"
+msgstr ""
+
 msgid "FAIL"
 msgstr "ERROR"
 
@@ -2942,6 +3406,9 @@ 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."
 
@@ -2958,6 +3425,9 @@ 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."
 
@@ -3019,6 +3489,9 @@ msgstr "Franqueig per Internet en 3 parts"
 msgid "Internet Printing Protocol"
 msgstr "Protocol d'impressió per Internet"
 
+msgid "Invalid media name arguments."
+msgstr ""
+
 msgid "Invalid media size."
 msgstr "Mida del suport no vàlida."
 
@@ -3168,11 +3641,14 @@ msgstr "La línia la longitud màxima permesa (255 caràcters)"
 msgid "List Available Printers"
 msgstr "Llista les impressores disponibles"
 
+msgid "Load paper."
+msgstr ""
+
 msgid "Long-Edge (Portrait)"
 msgstr "Costat-llarg (vertical)"
 
-msgid "Looking for printer."
-msgstr "S'està buscant la impressora."
+msgid "Looking for printer..."
+msgstr ""
 
 msgid "Manual Feed"
 msgstr "Alimentació manual"
@@ -3235,6 +3711,12 @@ msgstr "Falta l'atribut requesting-user-name."
 msgid "Missing required attributes."
 msgstr "Falten alguns atributs necessaris."
 
+msgid "Missing resource in URI"
+msgstr ""
+
+msgid "Missing scheme in URI"
+msgstr ""
+
 #, c-format
 msgid "Missing value on line %d."
 msgstr "Falta un valor a la línia %d."
@@ -3260,6 +3742,9 @@ msgstr ""
 "        fabricant i model = %s\n"
 "        id del dispositiu = %s"
 
+msgid "Modifiers:"
+msgstr ""
+
 msgid "Modify Class"
 msgstr "Modifica la classe"
 
@@ -3287,12 +3772,6 @@ msgstr "No es permeten les classes imbricades."
 msgid "Never"
 msgstr "Mai"
 
-msgid "New Stylus Color Series"
-msgstr "Sèrie New Stylus Color"
-
-msgid "New Stylus Photo Series"
-msgstr "Sèrie New Stylus Photo"
-
 msgid "No"
 msgstr "No"
 
@@ -3311,6 +3790,9 @@ msgstr "No hi ha cap controlador d'impressores de Windows instal·lat."
 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."
@@ -3365,6 +3847,15 @@ 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"
 
@@ -3458,24 +3949,16 @@ msgid "Out of memory."
 msgstr "Sense memòria."
 
 msgid "Output Mode"
-msgstr "Mode de sortida"
-
-#, c-format
-msgid "Output for printer %s is sent to %s"
-msgstr "La sortida de la impressora %s s'envia a %s"
+msgstr "Mode de sortida"
 
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
-msgstr "La sortida de la impressora %s s'envia a la impressora remota %s a %s"
+msgid "Output bin is almost full."
+msgstr ""
 
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
-msgstr "La sortida per la impressora %s/%s s'envia a la impressora %s"
+msgid "Output bin is full."
+msgstr ""
 
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+msgid "Output bin is missing."
 msgstr ""
-"La sortida per la impressora %s/%s s'envia a la impressora remota %s a %s"
 
 msgid "PASS"
 msgstr "VÀLID"
@@ -3507,6 +3990,18 @@ 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 "Paper jam."
+msgstr ""
+
+msgid "Paper tray is almost empty."
+msgstr ""
+
+msgid "Paper tray is empty."
+msgstr ""
+
+msgid "Paper tray is missing."
+msgstr ""
+
 msgid "ParamCustominCutInterval"
 msgstr "ParamCustominCutInterval"
 
@@ -3560,6 +4055,9 @@ 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ó"
 
@@ -3587,25 +4085,18 @@ msgstr "Imprimeix i talla"
 msgid "Print and Tear"
 msgstr "Imprimeix i estripa"
 
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr "S'ha acceptat el fitxer d'impressió - ID de la feina %d."
-
-msgid "Print file accepted - job ID unknown."
-msgstr "S'ha acceptat el fitxer d'impressió - l'ID de la feina és desconegut."
-
 msgid "Print file sent."
 msgstr "S'ha enviat el fitxer d'impressió."
 
-msgid "Print file was not accepted."
-msgstr "No s'ha acceptat 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 ""
+
 msgid "Printer Added"
 msgstr "S'ha afegit una impressora"
 
@@ -3627,6 +4118,9 @@ 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:"
 msgstr "Impressora:"
 
@@ -3634,11 +4128,8 @@ msgid "Printers"
 msgstr "Impressores"
 
 #, c-format
-msgid "Printing page %d, %d%% complete."
-msgstr "S'està imprimint la pàgina %d. S'ha completat el %d%%."
-
-msgid "Purge Jobs"
-msgstr "Purga les feines"
+msgid "Printing page %d, %u%% complete."
+msgstr ""
 
 msgid "Quarto"
 msgstr "Quart"
@@ -3650,13 +4141,6 @@ msgid "Rank    Owner   Job     File(s)                         Total Size"
 msgstr ""
 "Rang    Propietari   Feina     Fitxer(s)                         Mida total"
 
-#. TRANSLATORS: Pri is job priority.
-msgid ""
-"Rank   Owner      Pri  Job        Files                       Total Size"
-msgstr ""
-"Rang   Propietari      Pri  Feina        Fitxers                       Mida "
-"total"
-
 msgid "Reject Jobs"
 msgstr "Rebutja feines"
 
@@ -3717,6 +4201,9 @@ 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"
 
@@ -3762,16 +4249,13 @@ msgstr "S'està començant la pàgina %d."
 msgid "Statement"
 msgstr "Declaració"
 
-msgid "Stylus Color Series"
-msgstr "Sèrie Stylus Color"
-
-msgid "Stylus Photo Series"
-msgstr "Sèrie Stylus Photo"
-
 #, c-format
 msgid "Subscription #%d does not exist."
 msgstr "La subscripció #%d no existeix."
 
+msgid "Substitutions:"
+msgstr ""
+
 msgid "Super A"
 msgstr "Super A"
 
@@ -3803,13 +4287,16 @@ 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 Description attribute cannot be supplied in a job creation "
-"request."
+"The '%s' Job Status attribute cannot be supplied in a job creation request."
 msgstr ""
 
 #, c-format
@@ -3865,46 +4352,26 @@ msgstr "S'ha de canviar el fotoconductor òptic."
 msgid "The optical photoconductor will need to be replaced soon."
 msgstr "El fotoconductor òptic s'haurà de canviar aviat."
 
-msgid "The output bin is almost full."
-msgstr "La safata de sortida és gairebé plena."
-
-msgid "The output bin is full."
-msgstr "La safata de sortida és plena."
-
-msgid "The output bin is missing."
-msgstr "Falta la safata de sortida."
-
-msgid "The paper tray is almost empty."
-msgstr "La safata de paper és gairebé buida."
-
-msgid "The paper tray is empty."
-msgstr "La safata de paper és buida."
-
-msgid "The paper tray is missing."
-msgstr "Falta la safata de paper."
-
-msgid "The paper tray needs to be filled."
-msgstr "S'ha d'omplir la safata de paper."
-
-msgid "The printer URI is incorrect or no longer exists."
-msgstr "L'URI de la impressora no és correcte o ja no existeix."
+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."
 
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
-msgstr ""
-"La impressora no és compatible amb el IPP/%d.%d, s'està intentant el IPP/%s."
-
 msgid "The printer is in use."
 msgstr "La impressora està ocupada."
 
+msgid "The printer is low on ink."
+msgstr ""
+
+msgid "The printer is low on toner."
+msgstr "S'està acabant el tòner de la impressora."
+
 msgid "The printer is not connected."
 msgstr "La impressora no està connectada."
 
 msgid "The printer is not responding."
-msgstr "La impressora no respòn."
+msgstr "La impressora no respon."
 
 msgid "The printer is now connected."
 msgstr "Ara la impressora està connectada."
@@ -3915,12 +4382,6 @@ 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 running low on ink."
-msgstr "S'està acabant la tinta de la impressora."
-
-msgid "The printer is running low on toner."
-msgstr "S'està acabant el tòner de la impressora."
-
 msgid "The printer is unreachable at this time."
 msgstr "Ara mateix no es pot accedir a la impressora."
 
@@ -4002,9 +4463,6 @@ msgstr "El valor «%s» de which-jobs no està implementat."
 msgid "There are too many subscriptions."
 msgstr "Hi ha massa subscripcions."
 
-msgid "There is a paper jam."
-msgstr "S'ha encallat el paper."
-
 msgid "There was an unrecoverable USB error."
 msgstr "Hi ha un error de l'USB irrecuperable."
 
@@ -4043,6 +4501,9 @@ msgstr "Safata 4"
 msgid "URI Too Long"
 msgstr "L'URI és massa llarg"
 
+msgid "URI too large"
+msgstr ""
+
 msgid "US Ledger"
 msgstr "Llibre major americà"
 
@@ -4113,6 +4574,14 @@ 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."
 
@@ -4162,12 +4631,12 @@ msgstr ""
 msgid "Unable to copy interface script - %s"
 msgstr "No es pot copiar l'script de la interfície - %s"
 
-msgid "Unable to create compressed print file"
-msgstr "No es pot crear el fitxer d'impressió comprimit"
-
 msgid "Unable to create printer-uri"
 msgstr "No es pot crear el printer-uri"
 
+msgid "Unable to create server credentials."
+msgstr ""
+
 msgid "Unable to create temporary file"
 msgstr "No es pot crear el fitxer temporal"
 
@@ -4233,8 +4702,8 @@ 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 generate compressed print file"
-msgstr "No es pot generar el fitxer d'impressió comprimit"
+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"
@@ -4297,9 +4766,6 @@ 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 compressed print file"
-msgstr "No es pot obrir el fitxer d'impressió comprimit"
-
 msgid "Unable to open cupsd.conf file:"
 msgstr "No es pot obrir el fitxer cups.conf"
 
@@ -4325,8 +4791,11 @@ 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ó."
 
-msgid "Unable to resolve printer URI."
-msgstr "No es pot resoldre l'URI de la impressora."
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
+msgstr ""
 
 #, c-format
 msgid "Unable to run \"%s\": %s"
@@ -4415,6 +4884,15 @@ msgstr "El paràmetre printer-error-policy «%s» és desconegut."
 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."
 
@@ -4515,8 +4993,8 @@ msgstr "Sintaxi: cupsctl [opcions] [param=valor ... paramN=valorN]"
 msgid "Usage: cupsd [options]"
 msgstr "Sintaxi: cupsd [opcions]"
 
-msgid "Usage: cupsfilter [ options ] filename"
-msgstr "Sintaxi: cupsfilter [ opcions ] nomfitxer"
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
+msgstr ""
 
 msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
 msgstr "Sintaxi: cupstestdsc [opcions] nomfitxer.ps [...nomfitxer.ps]"
@@ -4526,6 +5004,20 @@ msgid ""
 msgstr ""
 "Sintaxi: cupstestppd [opcions] nomfitxer1.ppd[.gz] [... nomfitxerN.ppd[.gz]]"
 
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+"       ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+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]"
 
@@ -4543,18 +5035,6 @@ msgstr ""
 "         lpoptions [-h servidor] [-E] -p impressora -o opció[=valor] ...\n"
 "         lpoptions [-h servidor] [-E] -x impressora"
 
-msgid "Usage: lppasswd [-g groupname]"
-msgstr "Sintaxi: lppasswd [-g nomgrup]"
-
-msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-"       lppasswd [-g groupname] -a [username]\n"
-"       lppasswd [-g groupname] -x [username]"
-msgstr ""
-"Sintaxi: lppasswd [-g nomgrup] [nomusuari]\n"
-"         lppasswd [-g nomgrup] -a [nomusuari]\n"
-"         lppasswd [-g nomgrup] -x [nomusuari]"
-
 msgid ""
 "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
 msgstr ""
@@ -4616,13 +5096,6 @@ msgstr ""
 "Heu d'accedir a aquesta pagina a través de la URL <A HREF=\"https://%s:%d%s"
 "\">https://%s:%d%s</A>."
 
-msgid ""
-"Your password must be at least 6 characters long, cannot contain your "
-"username, and must contain at least one letter and number."
-msgstr ""
-"La contrasenya ha de tenir com a mínim 6 caràcters, no pot contenir el nom "
-"d'usuari, i ha de tenir com a mínim una lletra i un número."
-
 msgid "ZPL Label Printer"
 msgstr "Impressora d'etiquetes ZPL"
 
@@ -4670,6 +5143,9 @@ 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 ""
 
@@ -4687,11 +5163,6 @@ msgstr "cupsd: l'argument «%s» és desconegut - s'interromp."
 msgid "cupsd: Unknown option \"%c\" - aborting."
 msgstr "cupsd: l'opció «%c» és desconeguda - s'interromp."
 
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
-"cupsd: no s'ha compilat amb compatibilitat per launchd(8). S'executa en mode "
-"normal."
-
 #, c-format
 msgid "cupsfilter: Invalid document number %d."
 msgstr "cupsfilter: el document número %d no és vàlid."
@@ -4736,16 +5207,88 @@ msgstr "help\t\tproporciona ajuda sobre les comandes."
 msgid "idle"
 msgstr "inactiva"
 
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
-msgstr "ipptool: «-i» i «-n» no són compatibles amb «-X»."
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr ""
+
+msgid "ippfind: Cannot use --and after --or."
+msgstr ""
 
 #, c-format
-msgid "ipptool: Bad URI - %s."
-msgstr "ipptool: l'URI no es correcte - %s."
+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 ""
+
+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 \"-P\" and \"-X\"."
+msgstr ""
 
 #, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
-msgstr "ipptool: la versió %s de «-V» no és correcta."
+msgid "ipptool: Bad URI - %s."
+msgstr "ipptool: l'URI no es correcte - %s."
 
 msgid "ipptool: Invalid seconds for \"-i\"."
 msgstr "ipptool: els segons de «-i» no són correctes."
@@ -4765,12 +5308,6 @@ msgstr "ipptool: falta nom=valor a «-d»."
 msgid "ipptool: Missing seconds for \"-i\"."
 msgstr "ipptool: falten els segons a «-i»."
 
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr "ipptool: falta el temps màxim d'espera a «-T»."
-
-msgid "ipptool: Missing version for \"-V\"."
-msgstr "ipptool: falta la versió a «-V»."
-
 msgid "ipptool: URI required before test file."
 msgstr "ipptool: falta l'URI abans del fitxer de prova."
 
@@ -4869,6 +5406,10 @@ msgstr ""
 "         Heu d'especificar primer un nom d'impressora."
 
 #, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
+#, c-format
 msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
 msgstr "lpadmin: no s'ha pogut obrir el fitxer PPD «%s» - %s"
 
@@ -4973,51 +5514,6 @@ 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."
 
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr ""
-"lppasswd: només l'usuari primari (root) pot afegir o esborrar contrasenyes."
-
-msgid "lppasswd: Password file busy."
-msgstr "lppaswd: el fitxer de contrasenyes està ocupat."
-
-msgid "lppasswd: Password file not updated."
-msgstr "lppaswd: el fitxer de contrasenyes no està actualitzat."
-
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr "lppaswwd: la contrasenya no coincideix."
-
-msgid "lppasswd: Sorry, password rejected."
-msgstr "lppaswwd: s'ha refusat la contrasenya."
-
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr "lppaswwd: les contrasenyes no coincideixen."
-
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr "lppasswd: no s'ha pogut copiar la cadena de contrasenya: %s"
-
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr "lppasswd: no s'ha pogut obrir el fitxer de contrasenyes: %s"
-
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr "lppasswd: no s'ha pogut escriure al fitxer de contrasenyes: %s"
-
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr ""
-"lppasswd: no s'ha pogut fer la còpia de seguretat del fitxer de contrasenyes "
-"antic: %s"
-
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr "lppasswd: no s'ha pogut canviar el nom del fitxer de contrasenyes: %s"
-
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr "lppaswd: l'usuari «%s» i el grup «%s» no existeixen."
-
 #, c-format
 msgid ""
 "lpstat: error - %s environment variable names non-existent destination \"%s"
@@ -5582,6 +6078,9 @@ msgstr "La variable-bindings fa servir una longitud indefinida"
 #~ "  -j tipus/mime            Estableix el tipus MIME de sortida "
 #~ "(application/pdf si no s'especifica)."
 
+#~ msgid "  -l                      Run cupsd from launchd(8)."
+#~ msgstr "  -l                      Executa cupsd des de launchd(8)."
+
 #~ msgid ""
 #~ "  -o filename             Set file to be generated (otherwise stdout)."
 #~ msgstr ""
@@ -5604,12 +6103,33 @@ msgstr "La variable-bindings fa servir una longitud indefinida"
 #~ msgstr ""
 #~ "  -v                      Mostra tots els atributs enviats i rebuts."
 
+#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+
+#~ msgid "%s: Error - expected destination after \"-b\" option."
+#~ msgstr "%s: error - s'esperava un destí després de l'opció «-b»."
+
 #~ msgid "3.5\" Disk - 2 1/8 x 2 3/4\""
 #~ msgstr "Disc de 3.5 - 2 1/8 x 2 3/4\""
 
+#~ msgid "720dpi"
+#~ msgstr "720ppp"
+
 #~ msgid "Address - 1 1/8 x 3 1/2\""
 #~ msgstr "Adreça - 1 1/8 x 3 1/2\""
 
+#~ msgid "Bad printer URI."
+#~ msgstr "L'URI de la impressora és incorrecte."
+
+#~ msgid "Enter old password:"
+#~ msgstr "Introduïu la contrasenya antiga:"
+
+#~ msgid "Enter password again:"
+#~ msgstr "Introduïu la contrasenya un altre cop:"
+
+#~ msgid "Enter password:"
+#~ msgstr "Introduïu la contrasenya:"
+
 #~ msgid "File Folder - 9/16 x 3 7/16\""
 #~ msgstr "Carpeta d'arxivador: 9/16 x 3 7/16\""
 
@@ -5632,6 +6152,39 @@ msgstr "La variable-bindings fa servir una longitud indefinida"
 #~ msgid "Large Address - 1 4/10 x 3 1/2\""
 #~ msgstr "Adreça gran - 1 4/10 x 3 1/2\""
 
+#~ msgid "Looking for printer."
+#~ msgstr "S'està buscant la impressora."
+
+#~ msgid "New Stylus Color Series"
+#~ msgstr "Sèrie New Stylus Color"
+
+#~ msgid "New Stylus Photo Series"
+#~ msgstr "Sèrie New Stylus Photo"
+
+#~ msgid "Output for printer %s is sent to %s"
+#~ msgstr "La sortida de la impressora %s s'envia a %s"
+
+#~ msgid "Output for printer %s is sent to remote printer %s on %s"
+#~ msgstr ""
+#~ "La sortida de la impressora %s s'envia a la impressora remota %s a %s"
+
+#~ msgid "Output for printer %s/%s is sent to %s"
+#~ msgstr "La sortida per la impressora %s/%s s'envia a la impressora %s"
+
+#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+#~ msgstr ""
+#~ "La sortida per la impressora %s/%s s'envia a la impressora remota %s a %s"
+
+#~ msgid "Print file accepted - job ID %d."
+#~ msgstr "S'ha acceptat el fitxer d'impressió - ID de la feina %d."
+
+#~ msgid "Print file accepted - job ID unknown."
+#~ msgstr ""
+#~ "S'ha acceptat el fitxer d'impressió - l'ID de la feina és desconegut."
+
+#~ msgid "Print file was not accepted."
+#~ msgstr "No s'ha acceptat el fitxer d'impressió."
+
 #~ msgid "Printer busy, will retry in 10 seconds."
 #~ msgstr ""
 #~ "La impressora està ocupada. Es tornarà a intentar d'aquí a 10 segons."
@@ -5651,6 +6204,18 @@ msgstr "La variable-bindings fa servir una longitud indefinida"
 #~ "La impressora està desconnectada. Es tornarà a intentar d'aquí a 30 "
 #~ "segons."
 
+#~ msgid "Printing page %d, %d%% complete."
+#~ msgstr "S'està imprimint la pàgina %d. S'ha completat el %d%%."
+
+#~ msgid "Purge Jobs"
+#~ msgstr "Purga les feines"
+
+#~ msgid ""
+#~ "Rank   Owner      Pri  Job        Files                       Total Size"
+#~ msgstr ""
+#~ "Rang   Propietari      Pri  Feina        Fitxers                       "
+#~ "Mida total"
+
 #~ msgid "Ready to print."
 #~ msgstr "Preparada per imprimir."
 
@@ -5660,37 +6225,170 @@ msgstr "La variable-bindings fa servir una longitud indefinida"
 #~ msgid "Shipping Address - 2 5/16 x 4\""
 #~ msgstr "Adreça de lliurament - 2 5/16 x 4\""
 
-#~ msgid "The printer is low on toner."
-#~ msgstr "S'està acabant el tòner de la impressora."
+#~ msgid "Stylus Color Series"
+#~ msgstr "Sèrie Stylus Color"
+
+#~ msgid "Stylus Photo Series"
+#~ msgstr "Sèrie Stylus Photo"
+
+#~ msgid "The output bin is almost full."
+#~ msgstr "La safata de sortida és gairebé plena."
+
+#~ msgid "The output bin is full."
+#~ msgstr "La safata de sortida és plena."
+
+#~ msgid "The output bin is missing."
+#~ msgstr "Falta la safata de sortida."
+
+#~ msgid "The paper tray is almost empty."
+#~ msgstr "La safata de paper és gairebé buida."
+
+#~ msgid "The paper tray is empty."
+#~ msgstr "La safata de paper és buida."
+
+#~ msgid "The paper tray is missing."
+#~ msgstr "Falta la safata de paper."
+
+#~ msgid "The paper tray needs to be filled."
+#~ msgstr "S'ha d'omplir la safata de paper."
+
+#~ msgid "The printer URI is incorrect or no longer exists."
+#~ msgstr "L'URI de la impressora no és correcte o ja no existeix."
+
+#~ msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
+#~ msgstr ""
+#~ "La impressora no és compatible amb el IPP/%d.%d, s'està intentant el IPP/"
+#~ "%s."
 
 #~ msgid "The printer is out of toner."
 #~ msgstr "S'ha acabat el tòner de la impressora"
 
+#~ msgid "The printer is running low on ink."
+#~ msgstr "S'està acabant la tinta de la impressora."
+
+#~ msgid "The printer is running low on toner."
+#~ msgstr "S'està acabant el tòner de la impressora."
+
+#~ msgid "There is a paper jam."
+#~ msgstr "S'ha encallat el paper."
+
+#~ msgid "Unable to create compressed print file"
+#~ msgstr "No es pot crear el fitxer d'impressió comprimit"
+
 #~ msgid "Unable to create temporary file:"
 #~ msgstr "No es pot crear el fitxer temporal:"
 
+#~ msgid "Unable to generate compressed print file"
+#~ msgstr "No es pot generar el fitxer d'impressió comprimit"
+
 #~ msgid "Unable to get printer status:"
 #~ msgstr "No es pot obtenir l'estat de la impressora:"
 
 #~ msgid "Unable to open PPD file:"
 #~ msgstr "No es pot obrir el fitxer PPD:"
 
+#~ msgid "Unable to open compressed print file"
+#~ msgstr "No es pot obrir el fitxer d'impressió comprimit"
+
 #~ msgid "Unable to read print data"
 #~ msgstr "No es poden llegir les dades d'impressió"
 
+#~ msgid "Unable to resolve printer URI."
+#~ msgstr "No es pot resoldre l'URI de la impressora."
+
 #~ msgid "Usage: %s job-id user title copies options file"
 #~ msgstr "Sintaxi: %s id-tasca usuari títol còpies opcions fitxer"
 
 #~ msgid "Usage: convert [ options ]"
 #~ msgstr "Sintaxi: convert [ opcions ]"
 
+#~ msgid "Usage: cupsfilter [ options ] filename"
+#~ msgstr "Sintaxi: cupsfilter [ opcions ] nomfitxer"
+
+#~ msgid "Usage: lppasswd [-g groupname]"
+#~ msgstr "Sintaxi: lppasswd [-g nomgrup]"
+
+#~ msgid ""
+#~ "Usage: lppasswd [-g groupname] [username]\n"
+#~ "       lppasswd [-g groupname] -a [username]\n"
+#~ "       lppasswd [-g groupname] -x [username]"
+#~ msgstr ""
+#~ "Sintaxi: lppasswd [-g nomgrup] [nomusuari]\n"
+#~ "         lppasswd [-g nomgrup] -a [nomusuari]\n"
+#~ "         lppasswd [-g nomgrup] -x [nomusuari]"
+
+#~ msgid ""
+#~ "Your password must be at least 6 characters long, cannot contain your "
+#~ "username, and must contain at least one letter and number."
+#~ msgstr ""
+#~ "La contrasenya ha de tenir com a mínim 6 caràcters, no pot contenir el "
+#~ "nom d'usuari, i ha de tenir com a mínim una lletra i un número."
+
 #~ msgid "convert: Use the -f option to specify a file to convert."
 #~ msgstr ""
 #~ "convert: feu servir l'opció -f per especificar el fitxer que voleu "
 #~ "convertir."
 
+#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
+#~ msgstr ""
+#~ "cupsd: no s'ha compilat amb compatibilitat per launchd(8). S'executa en "
+#~ "mode normal."
+
+#~ msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
+#~ msgstr "ipptool: «-i» i «-n» no són compatibles amb «-X»."
+
 #~ msgid "ipptool: \"-i\" is incompatible with \"-X\"."
 #~ msgstr "ipptool: «-i» no és compatible amb «-X»."
 
 #~ msgid "ipptool: \"-n\" is incompatible with \"-X\"."
 #~ msgstr "ipptool: «-n» no és compatible amb «-X»."
+
+#~ msgid "ipptool: Bad version %s for \"-V\"."
+#~ msgstr "ipptool: la versió %s de «-V» no és correcta."
+
+#~ msgid "ipptool: Missing timeout for \"-T\"."
+#~ msgstr "ipptool: falta el temps màxim d'espera a «-T»."
+
+#~ msgid "ipptool: Missing version for \"-V\"."
+#~ msgstr "ipptool: falta la versió a «-V»."
+
+#~ msgid "lppasswd: Only root can add or delete passwords."
+#~ msgstr ""
+#~ "lppasswd: només l'usuari primari (root) pot afegir o esborrar "
+#~ "contrasenyes."
+
+#~ msgid "lppasswd: Password file busy."
+#~ msgstr "lppaswd: el fitxer de contrasenyes està ocupat."
+
+#~ msgid "lppasswd: Password file not updated."
+#~ msgstr "lppaswd: el fitxer de contrasenyes no està actualitzat."
+
+#~ msgid "lppasswd: Sorry, password doesn't match."
+#~ msgstr "lppaswwd: la contrasenya no coincideix."
+
+#~ msgid "lppasswd: Sorry, password rejected."
+#~ msgstr "lppaswwd: s'ha refusat la contrasenya."
+
+#~ msgid "lppasswd: Sorry, passwords don't match."
+#~ msgstr "lppaswwd: les contrasenyes no coincideixen."
+
+#~ msgid "lppasswd: Unable to copy password string: %s"
+#~ msgstr "lppasswd: no s'ha pogut copiar la cadena de contrasenya: %s"
+
+#~ msgid "lppasswd: Unable to open password file: %s"
+#~ msgstr "lppasswd: no s'ha pogut obrir el fitxer de contrasenyes: %s"
+
+#~ msgid "lppasswd: Unable to write to password file: %s"
+#~ msgstr "lppasswd: no s'ha pogut escriure al fitxer de contrasenyes: %s"
+
+#~ msgid "lppasswd: failed to backup old password file: %s"
+#~ msgstr ""
+#~ "lppasswd: no s'ha pogut fer la còpia de seguretat del fitxer de "
+#~ "contrasenyes antic: %s"
+
+#~ msgid "lppasswd: failed to rename password file: %s"
+#~ msgstr ""
+#~ "lppasswd: no s'ha pogut canviar el nom del fitxer de contrasenyes: %s"
+
+#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
+#~ msgstr "lppaswd: l'usuari «%s» i el grup «%s» no existeixen."
index d689543..8e03517 100644 (file)
@@ -12,7 +12,6 @@
 #   which should have been included with this file.  If this file is
 #   file is missing or damaged, see the license at "http://www.cups.org/".
 #
-
 #
 # Notes for Translators:
 #
@@ -30,7 +29,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 1.6\n"
 "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2012-05-23 16:24-0700\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
 "PO-Revision-Date: 2012-09-14 10:26+0100\n"
 "Last-Translator: Jan Bartos <jan.bartos@madeta.cz>\n"
 "Language-Team: Czech\n"
@@ -39,746 +38,593 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: systemv/lpstat.c:1876 systemv/lpstat.c:2001
 msgid "\t\t(all)"
 msgstr ""
 
-#: systemv/lpstat.c:1879 systemv/lpstat.c:1882 systemv/lpstat.c:2004
-#: systemv/lpstat.c:2007
 msgid "\t\t(none)"
 msgstr ""
 
-#: berkeley/lpc.c:434
 #, c-format
 msgid "\t%d entries"
 msgstr ""
 
-#: systemv/lpstat.c:756 systemv/lpstat.c:772
 #, c-format
 msgid "\t%s"
 msgstr ""
 
-#: systemv/lpstat.c:1857 systemv/lpstat.c:1982
 msgid "\tAfter fault: continue"
 msgstr ""
 
-#: systemv/lpstat.c:1481 systemv/lpstat.c:1826 systemv/lpstat.c:1952
 #, c-format
 msgid "\tAlerts: %s"
 msgstr ""
 
-#: systemv/lpstat.c:1880 systemv/lpstat.c:2005
 msgid "\tBanner required"
 msgstr ""
 
-#: systemv/lpstat.c:1881 systemv/lpstat.c:2006
 msgid "\tCharset sets:"
 msgstr ""
 
-#: systemv/lpstat.c:1845 systemv/lpstat.c:1970
 msgid "\tConnection: direct"
 msgstr ""
 
-#: systemv/lpstat.c:1836 systemv/lpstat.c:1962
 msgid "\tConnection: remote"
 msgstr ""
 
-#: systemv/lpstat.c:1800 systemv/lpstat.c:1926
 msgid "\tContent types: any"
 msgstr ""
 
-#: systemv/lpstat.c:1884 systemv/lpstat.c:2009
 msgid "\tDefault page size:"
 msgstr ""
 
-#: systemv/lpstat.c:1883 systemv/lpstat.c:2008
 msgid "\tDefault pitch:"
 msgstr ""
 
-#: systemv/lpstat.c:1885 systemv/lpstat.c:2010
 msgid "\tDefault port settings:"
 msgstr ""
 
-#: systemv/lpstat.c:1806 systemv/lpstat.c:1932
 #, c-format
 msgid "\tDescription: %s"
 msgstr ""
 
-#: systemv/lpstat.c:1799 systemv/lpstat.c:1925
 msgid "\tForm mounted:"
 msgstr ""
 
-#: systemv/lpstat.c:1878 systemv/lpstat.c:2003
 msgid "\tForms allowed:"
 msgstr ""
 
-#: systemv/lpstat.c:1840 systemv/lpstat.c:1966
 #, c-format
 msgid "\tInterface: %s.ppd"
 msgstr ""
 
-#: systemv/lpstat.c:1849 systemv/lpstat.c:1974
 #, c-format
 msgid "\tInterface: %s/interfaces/%s"
 msgstr ""
 
-#: systemv/lpstat.c:1853 systemv/lpstat.c:1978
 #, c-format
 msgid "\tInterface: %s/ppd/%s.ppd"
 msgstr ""
 
-#: systemv/lpstat.c:1831 systemv/lpstat.c:1957
 #, c-format
 msgid "\tLocation: %s"
 msgstr ""
 
-#: systemv/lpstat.c:1856 systemv/lpstat.c:1981
 msgid "\tOn fault: no alert"
 msgstr ""
 
-#: systemv/lpstat.c:1801 systemv/lpstat.c:1927
 msgid "\tPrinter types: unknown"
 msgstr ""
 
-#: systemv/lpstat.c:1462
 #, c-format
 msgid "\tStatus: %s"
 msgstr ""
 
-#: systemv/lpstat.c:1861 systemv/lpstat.c:1875 systemv/lpstat.c:1986
-#: systemv/lpstat.c:2000
 msgid "\tUsers allowed:"
 msgstr ""
 
-#: systemv/lpstat.c:1868 systemv/lpstat.c:1993
 msgid "\tUsers denied:"
 msgstr ""
 
-#: berkeley/lpc.c:436
 msgid "\tdaemon present"
 msgstr ""
 
-#: berkeley/lpc.c:432
 msgid "\tno entries"
 msgstr ""
 
-#: berkeley/lpc.c:404 berkeley/lpc.c:416
 #, c-format
 msgid "\tprinter is on device '%s' speed -1"
 msgstr ""
 
-#: berkeley/lpc.c:429
 msgid "\tprinting is disabled"
 msgstr ""
 
-#: berkeley/lpc.c:427
 msgid "\tprinting is enabled"
 msgstr ""
 
-#: systemv/lpstat.c:1484
 #, c-format
 msgid "\tqueued for %s"
 msgstr ""
 
-#: berkeley/lpc.c:424
 msgid "\tqueuing is disabled"
 msgstr ""
 
-#: berkeley/lpc.c:422
 msgid "\tqueuing is enabled"
 msgstr ""
 
-#: systemv/lpstat.c:1792 systemv/lpstat.c:1918
 msgid "\treason unknown"
 msgstr ""
 
-#: systemv/cupstestppd.c:454
 msgid ""
 "\n"
 "    DETAILED CONFORMANCE TEST RESULTS"
 msgstr ""
 
-#: systemv/cupstestppd.c:3800
 msgid "                          Ignore specific warnings."
 msgstr ""
 
-#: systemv/cupstestppd.c:3804
 msgid "                          Issue warnings instead of errors."
 msgstr ""
 
-#: systemv/cupstestppd.c:410 systemv/cupstestppd.c:415
 msgid "                REF: Page 15, section 3.1."
 msgstr ""
 
-#: systemv/cupstestppd.c:405
 msgid "                REF: Page 15, section 3.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:425
 msgid "                REF: Page 19, section 3.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:378
 msgid "                REF: Page 20, section 3.4."
 msgstr ""
 
-#: systemv/cupstestppd.c:430
 msgid "                REF: Page 27, section 3.5."
 msgstr ""
 
-#: systemv/cupstestppd.c:373
 msgid "                REF: Page 42, section 5.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:420
 msgid "                REF: Pages 16-17, section 3.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:390
 msgid "                REF: Pages 42-45, section 5.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:384
 msgid "                REF: Pages 45-46, section 5.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:395
 msgid "                REF: Pages 48-49, section 5.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:400
 msgid "                REF: Pages 52-54, section 5.2."
 msgstr ""
 
-#: berkeley/lpq.c:554
 #, c-format
 msgid "        %-39.39s %.0f bytes"
 msgstr ""
 
-#: systemv/cupstestppd.c:589
 #, c-format
 msgid "        PASS    Default%s"
 msgstr ""
 
-#: systemv/cupstestppd.c:524
 msgid "        PASS    DefaultImageableArea"
 msgstr ""
 
-#: systemv/cupstestppd.c:558
 msgid "        PASS    DefaultPaperDimension"
 msgstr ""
 
-#: systemv/cupstestppd.c:631
 msgid "        PASS    FileVersion"
 msgstr ""
 
-#: systemv/cupstestppd.c:675
 msgid "        PASS    FormatVersion"
 msgstr ""
 
-#: systemv/cupstestppd.c:695
 msgid "        PASS    LanguageEncoding"
 msgstr ""
 
-#: systemv/cupstestppd.c:715
 msgid "        PASS    LanguageVersion"
 msgstr ""
 
-#: systemv/cupstestppd.c:769
 msgid "        PASS    Manufacturer"
 msgstr ""
 
-#: systemv/cupstestppd.c:809
 msgid "        PASS    ModelName"
 msgstr ""
 
-#: systemv/cupstestppd.c:829
 msgid "        PASS    NickName"
 msgstr ""
 
-#: systemv/cupstestppd.c:889
 msgid "        PASS    PCFileName"
 msgstr ""
 
-#: systemv/cupstestppd.c:964
 msgid "        PASS    PSVersion"
 msgstr ""
 
-#: systemv/cupstestppd.c:869
 msgid "        PASS    PageRegion"
 msgstr ""
 
-#: systemv/cupstestppd.c:849
 msgid "        PASS    PageSize"
 msgstr ""
 
-#: systemv/cupstestppd.c:924
 msgid "        PASS    Product"
 msgstr ""
 
-#: systemv/cupstestppd.c:999
 msgid "        PASS    ShortNickName"
 msgstr ""
 
-#: systemv/cupstestppd.c:1374
 #, c-format
 msgid "        WARN    %s has no corresponding options."
 msgstr ""
 
-#: systemv/cupstestppd.c:1486
 #, c-format
 msgid ""
 "        WARN    %s shares a common prefix with %s\n"
 "                REF: Page 15, section 3.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:1345
 #, c-format
 msgid ""
-"        WARN    Duplex option keyword %s may not work as expected and should be named Duplex.\n"
+"        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:1744
 msgid "        WARN    File contains a mix of CR, LF, and CR LF line endings."
 msgstr ""
 
-#: systemv/cupstestppd.c:1390
 msgid ""
 "        WARN    LanguageEncoding required by PPD 4.3 spec.\n"
 "                REF: Pages 56-57, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1726
 #, c-format
 msgid "        WARN    Line %d only contains whitespace."
 msgstr ""
 
-#: systemv/cupstestppd.c:1398
 msgid ""
 "        WARN    Manufacturer required by PPD 4.3 spec.\n"
 "                REF: Pages 58-59, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1749
-msgid "        WARN    Non-Windows PPD files should use lines ending with only LF, not CR LF."
+msgid ""
+"        WARN    Non-Windows PPD files should use lines ending with only LF, "
+"not CR LF."
 msgstr ""
 
-#: systemv/cupstestppd.c:1382
 #, c-format
 msgid ""
 "        WARN    Obsolete PPD version %.1f.\n"
 "                REF: Page 42, section 5.2."
 msgstr ""
 
-#: systemv/cupstestppd.c:1413
 msgid ""
 "        WARN    PCFileName longer than 8.3 in violation of PPD spec.\n"
 "                REF: Pages 61-62, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1421
 msgid ""
 "        WARN    PCFileName should contain a unique filename.\n"
 "                REF: Pages 61-62, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1456
 msgid ""
 "        WARN    Protocols contains PJL but JCL attributes are not set.\n"
 "                REF: Pages 78-79, section 5.7."
 msgstr ""
 
-#: systemv/cupstestppd.c:1447
 msgid ""
 "        WARN    Protocols contains both PJL and BCP; expected TBCP.\n"
 "                REF: Pages 78-79, section 5.7."
 msgstr ""
 
-#: systemv/cupstestppd.c:1430
 msgid ""
 "        WARN    ShortNickName required by PPD 4.3 spec.\n"
 "                REF: Pages 64-65, section 5.3."
 msgstr ""
 
-#: systemv/cupsaddsmb.c:282
 msgid "       cupsaddsmb [options] -a"
 msgstr ""
 
-#: systemv/cupstestdsc.c:427
 msgid "       cupstestdsc [options] -"
 msgstr ""
 
-#: systemv/cupstestppd.c:3795
 msgid "       program | cupstestppd [options] -"
 msgstr ""
 
-#: systemv/cupstestppd.c:3727
 #, c-format
 msgid ""
 "      %s  \"%s %s\" conflicts with \"%s %s\"\n"
 "                (constraint=\"%s %s %s %s\")."
 msgstr ""
 
-#: systemv/cupstestppd.c:2248
 #, c-format
 msgid "      %s  %s %s does not exist."
 msgstr ""
 
-#: systemv/cupstestppd.c:3884
 #, c-format
 msgid "      %s  %s file \"%s\" has the wrong capitalization."
 msgstr ""
 
-#: systemv/cupstestppd.c:2318
 #, c-format
 msgid ""
 "      %s  Bad %s choice %s.\n"
 "                REF: Page 122, section 5.17"
 msgstr ""
 
-#: systemv/cupstestppd.c:3487 systemv/cupstestppd.c:3536
-#: systemv/cupstestppd.c:3575
 #, c-format
 msgid "      %s  Bad UTF-8 \"%s\" translation string for option %s, choice %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:3441
 #, c-format
 msgid "      %s  Bad UTF-8 \"%s\" translation string for option %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:2389
 #, c-format
 msgid "      %s  Bad cupsFilter value \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:2475
 #, c-format
 msgid "      %s  Bad cupsFilter2 value \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:2964
 #, c-format
 msgid "      %s  Bad cupsICCProfile %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:2571
 #, c-format
 msgid "      %s  Bad cupsPreFilter value \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:1822
 #, c-format
 msgid "      %s  Bad cupsUIConstraints %s: \"%s\""
 msgstr ""
 
-#: systemv/cupstestppd.c:3391
 #, c-format
 msgid "      %s  Bad language \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:2433 systemv/cupstestppd.c:2529
-#: systemv/cupstestppd.c:2615 systemv/cupstestppd.c:2673
-#: systemv/cupstestppd.c:2728 systemv/cupstestppd.c:2783
-#: systemv/cupstestppd.c:2838 systemv/cupstestppd.c:2891
-#: systemv/cupstestppd.c:3013
 #, c-format
 msgid "      %s  Bad permissions on %s file \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:2373 systemv/cupstestppd.c:2459
-#: systemv/cupstestppd.c:2555 systemv/cupstestppd.c:2642
-#: systemv/cupstestppd.c:2697 systemv/cupstestppd.c:2752
-#: systemv/cupstestppd.c:2807 systemv/cupstestppd.c:2862
 #, c-format
 msgid "      %s  Bad spelling of %s - should be %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:2907
 #, c-format
 msgid "      %s  Cannot provide both APScanAppPath and APScanAppBundleID."
 msgstr ""
 
-#: systemv/cupstestppd.c:2205
 #, c-format
 msgid "      %s  Default choices conflicting."
 msgstr ""
 
-#: systemv/cupstestppd.c:1803
 #, c-format
 msgid "      %s  Empty cupsUIConstraints %s"
 msgstr ""
 
-#: systemv/cupstestppd.c:3519 systemv/cupstestppd.c:3559
 #, c-format
 msgid "      %s  Missing \"%s\" translation string for option %s, choice %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:3427
 #, c-format
 msgid "      %s  Missing \"%s\" translation string for option %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:2418 systemv/cupstestppd.c:2514
-#: systemv/cupstestppd.c:2600 systemv/cupstestppd.c:2658
-#: systemv/cupstestppd.c:2713 systemv/cupstestppd.c:2768
-#: systemv/cupstestppd.c:2823 systemv/cupstestppd.c:2875
-#: systemv/cupstestppd.c:2998
 #, c-format
 msgid "      %s  Missing %s file \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:3121
 #, c-format
 msgid ""
 "      %s  Missing REQUIRED PageRegion option.\n"
 "                REF: Page 100, section 5.14."
 msgstr ""
 
-#: systemv/cupstestppd.c:3106
 #, c-format
 msgid ""
 "      %s  Missing REQUIRED PageSize option.\n"
 "                REF: Page 99, section 5.14."
 msgstr ""
 
-#: systemv/cupstestppd.c:2013 systemv/cupstestppd.c:2054
 #, c-format
 msgid "      %s  Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:1908
 #, c-format
 msgid "      %s  Missing choice *%s %s in cupsUIConstraints %s: \"%s\""
 msgstr ""
 
-#: systemv/cupstestppd.c:1840
 #, c-format
 msgid "      %s  Missing cupsUIResolver %s"
 msgstr ""
 
-#: systemv/cupstestppd.c:1999 systemv/cupstestppd.c:2040
 #, c-format
 msgid "      %s  Missing option %s in UIConstraints \"*%s %s *%s %s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:1892
 #, c-format
 msgid "      %s  Missing option %s in cupsUIConstraints %s: \"%s\""
 msgstr ""
 
-#: systemv/cupstestppd.c:3613
 #, c-format
 msgid "      %s  No base translation \"%s\" is included in file."
 msgstr ""
 
-#: systemv/cupstestppd.c:2294
 #, c-format
 msgid ""
 "      %s  REQUIRED %s does not define choice None.\n"
 "                REF: Page 122, section 5.17"
 msgstr ""
 
-#: systemv/cupstestppd.c:3180 systemv/cupstestppd.c:3194
 #, c-format
 msgid "      %s  Size \"%s\" defined for %s but not for %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:3160
 #, c-format
 msgid "      %s  Size \"%s\" has unexpected dimensions (%gx%g)."
 msgstr ""
 
-#: systemv/cupstestppd.c:3332
 #, c-format
 msgid "      %s  Size \"%s\" should be \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:3292
 #, c-format
 msgid "      %s  Size \"%s\" should be the Adobe standard name \"%s\"."
 msgstr ""
 
-#: systemv/cupstestppd.c:3041
 #, c-format
 msgid "      %s  cupsICCProfile %s hash value collides with %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:1963
 #, c-format
 msgid "      %s  cupsUIResolver %s causes a loop."
 msgstr ""
 
-#: systemv/cupstestppd.c:1945
 #, c-format
-msgid "      %s  cupsUIResolver %s does not list at least two different options."
+msgid ""
+"      %s  cupsUIResolver %s does not list at least two different options."
 msgstr ""
 
-#: systemv/cupstestppd.c:1168
 #, c-format
 msgid ""
 "      **FAIL**  %s must be 1284DeviceID\n"
 "                REF: Page 72, section 5.5"
 msgstr ""
 
-#: systemv/cupstestppd.c:580
 #, c-format
 msgid ""
 "      **FAIL**  Bad Default%s %s\n"
 "                REF: Page 40, section 4.5."
 msgstr ""
 
-#: systemv/cupstestppd.c:514
 #, c-format
 msgid ""
 "      **FAIL**  Bad DefaultImageableArea %s\n"
 "                REF: Page 102, section 5.15."
 msgstr ""
 
-#: systemv/cupstestppd.c:550
 #, c-format
 msgid ""
 "      **FAIL**  Bad DefaultPaperDimension %s\n"
 "                REF: Page 103, section 5.15."
 msgstr ""
 
-#: systemv/cupstestppd.c:623
 #, c-format
 msgid ""
 "      **FAIL**  Bad FileVersion \"%s\"\n"
 "                REF: Page 56, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:667
 #, c-format
 msgid ""
 "      **FAIL**  Bad FormatVersion \"%s\"\n"
 "                REF: Page 56, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1025
 msgid ""
 "      **FAIL**  Bad JobPatchFile attribute in file\n"
 "                REF: Page 24, section 3.4."
 msgstr ""
 
-#: systemv/cupstestppd.c:1213
 #, c-format
 msgid "      **FAIL**  Bad LanguageEncoding %s - must be ISOLatin1."
 msgstr ""
 
-#: systemv/cupstestppd.c:1227
 #, c-format
 msgid "      **FAIL**  Bad LanguageVersion %s - must be English."
 msgstr ""
 
-#: systemv/cupstestppd.c:743 systemv/cupstestppd.c:760
 #, c-format
 msgid ""
 "      **FAIL**  Bad Manufacturer (should be \"%s\")\n"
 "                REF: Page 211, table D.1."
 msgstr ""
 
-#: systemv/cupstestppd.c:800
 #, c-format
 msgid ""
 "      **FAIL**  Bad ModelName - \"%c\" not allowed in string.\n"
 "                REF: Pages 59-60, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:956
 msgid ""
 "      **FAIL**  Bad PSVersion - not \"(string) int\".\n"
 "                REF: Pages 62-64, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:917
 msgid ""
 "      **FAIL**  Bad Product - not \"(string)\".\n"
 "                REF: Page 62, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:991
 msgid ""
 "      **FAIL**  Bad ShortNickName - longer than 31 chars.\n"
 "                REF: Pages 64-65, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1149
 #, c-format
 msgid ""
 "      **FAIL**  Bad option %s choice %s\n"
 "                REF: Page 84, section 5.9"
 msgstr ""
 
-#: systemv/cupstestppd.c:3754 systemv/cupstestppd.c:3776
 #, c-format
 msgid "      **FAIL**  Default option code cannot be interpreted: %s"
 msgstr ""
 
-#: systemv/cupstestppd.c:1286
 #, c-format
-msgid "      **FAIL**  Default translation string for option %s choice %s contains 8-bit characters."
+msgid ""
+"      **FAIL**  Default translation string for option %s choice %s contains "
+"8-bit characters."
 msgstr ""
 
-#: systemv/cupstestppd.c:1259
 #, c-format
-msgid "      **FAIL**  Default translation string for option %s contains 8-bit characters."
+msgid ""
+"      **FAIL**  Default translation string for option %s contains 8-bit "
+"characters."
 msgstr ""
 
-#: systemv/cupstestppd.c:2101
 #, c-format
 msgid "      **FAIL**  Group names %s and %s differ only by case."
 msgstr ""
 
-#: systemv/cupstestppd.c:2146
 #, c-format
 msgid "      **FAIL**  Multiple occurrences of option %s choice name %s."
 msgstr ""
 
-#: systemv/cupstestppd.c:2163
 #, c-format
 msgid "      **FAIL**  Option %s choice names %s and %s differ only by case."
 msgstr ""
 
-#: systemv/cupstestppd.c:2123
 #, c-format
 msgid "      **FAIL**  Option names %s and %s differ only by case."
 msgstr ""
 
-#: systemv/cupstestppd.c:600
 #, c-format
 msgid ""
 "      **FAIL**  REQUIRED Default%s\n"
 "                REF: Page 40, section 4.5."
 msgstr ""
 
-#: systemv/cupstestppd.c:499
 msgid ""
 "      **FAIL**  REQUIRED DefaultImageableArea\n"
 "                REF: Page 102, section 5.15."
 msgstr ""
 
-#: systemv/cupstestppd.c:535
 msgid ""
 "      **FAIL**  REQUIRED DefaultPaperDimension\n"
 "                REF: Page 103, section 5.15."
 msgstr ""
 
-#: systemv/cupstestppd.c:641
 msgid ""
 "      **FAIL**  REQUIRED FileVersion\n"
 "                REF: Page 56, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:685
 msgid ""
 "      **FAIL**  REQUIRED FormatVersion\n"
 "                REF: Page 56, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1076
 #, c-format
 msgid ""
 "      **FAIL**  REQUIRED ImageableArea for PageSize %s\n"
@@ -786,68 +632,57 @@ msgid ""
 "                REF: Page 102, section 5.15."
 msgstr ""
 
-#: systemv/cupstestppd.c:705
 msgid ""
 "      **FAIL**  REQUIRED LanguageEncoding\n"
 "                REF: Pages 56-57, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:725
 msgid ""
 "      **FAIL**  REQUIRED LanguageVersion\n"
 "                REF: Pages 57-58, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:779
 msgid ""
 "      **FAIL**  REQUIRED Manufacturer\n"
 "                REF: Pages 58-59, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:819
 msgid ""
 "      **FAIL**  REQUIRED ModelName\n"
 "                REF: Pages 59-60, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:839
 msgid ""
 "      **FAIL**  REQUIRED NickName\n"
 "                REF: Page 60, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:899
 msgid ""
 "      **FAIL**  REQUIRED PCFileName\n"
 "                REF: Pages 61-62, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:974
 msgid ""
 "      **FAIL**  REQUIRED PSVersion\n"
 "                REF: Pages 62-64, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:879
 msgid ""
 "      **FAIL**  REQUIRED PageRegion\n"
 "                REF: Page 100, section 5.14."
 msgstr ""
 
-#: systemv/cupstestppd.c:1045
 msgid ""
 "      **FAIL**  REQUIRED PageSize\n"
 "                REF: Page 41, section 5.\n"
 "                REF: Page 99, section 5.14."
 msgstr ""
 
-#: systemv/cupstestppd.c:859
 msgid ""
 "      **FAIL**  REQUIRED PageSize\n"
 "                REF: Pages 99-100, section 5.14."
 msgstr ""
 
-#: systemv/cupstestppd.c:1098
 #, c-format
 msgid ""
 "      **FAIL**  REQUIRED PaperDimension for PageSize %s\n"
@@ -855,2194 +690,2111 @@ msgid ""
 "                REF: Page 103, section 5.15."
 msgstr ""
 
-#: systemv/cupstestppd.c:934
 msgid ""
 "      **FAIL**  REQUIRED Product\n"
 "                REF: Page 62, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:1009
 msgid ""
 "      **FAIL**  REQUIRED ShortNickName\n"
 "                REF: Page 64-65, section 5.3."
 msgstr ""
 
-#: systemv/cupstestppd.c:334 systemv/cupstestppd.c:353
-#: systemv/cupstestppd.c:365
 #, c-format
 msgid "      **FAIL**  Unable to open PPD file - %s on line %d."
 msgstr ""
 
-#: systemv/cupstestppd.c:1498
 #, c-format
 msgid "    %d ERRORS FOUND"
 msgstr ""
 
-#: systemv/cupstestdsc.c:431
 msgid "    -h       Show program usage"
 msgstr ""
 
-#: systemv/cupstestdsc.c:234 systemv/cupstestdsc.c:276
 #, c-format
 msgid ""
 "    Bad %%%%BoundingBox: on line %d.\n"
 "        REF: Page 39, %%%%BoundingBox:"
 msgstr ""
 
-#: systemv/cupstestdsc.c:305
 #, c-format
 msgid ""
 "    Bad %%%%Page: on line %d.\n"
 "        REF: Page 53, %%%%Page:"
 msgstr ""
 
-#: systemv/cupstestdsc.c:218 systemv/cupstestdsc.c:258
 #, c-format
 msgid ""
 "    Bad %%%%Pages: on line %d.\n"
 "        REF: Page 43, %%%%Pages:"
 msgstr ""
 
-#: systemv/cupstestdsc.c:176
 #, c-format
 msgid ""
 "    Line %d is longer than 255 characters (%d).\n"
 "        REF: Page 25, Line Length"
 msgstr ""
 
-#: systemv/cupstestdsc.c:192
 msgid ""
 "    Missing %!PS-Adobe-3.0 on first line.\n"
 "        REF: Page 17, 3.1 Conforming Documents"
 msgstr ""
 
-#: systemv/cupstestdsc.c:362
 #, c-format
 msgid "    Missing %%EndComments comment.        REF: Page 41, %%EndComments"
 msgstr ""
 
-#: systemv/cupstestdsc.c:342
 #, c-format
 msgid ""
 "    Missing or bad %%BoundingBox: comment.\n"
 "        REF: Page 39, %%BoundingBox:"
 msgstr ""
 
-#: systemv/cupstestdsc.c:372
 #, c-format
 msgid ""
 "    Missing or bad %%Page: comments.\n"
 "        REF: Page 53, %%Page:"
 msgstr ""
 
-#: systemv/cupstestdsc.c:352
 #, c-format
 msgid ""
 "    Missing or bad %%Pages: comment.\n"
 "        REF: Page 43, %%Pages:"
 msgstr ""
 
-#: systemv/cupstestppd.c:1500
 msgid "    NO ERRORS FOUND"
 msgstr ""
 
-#: systemv/cupstestdsc.c:395
 #, c-format
 msgid "    Saw %d lines that exceeded 255 characters."
 msgstr ""
 
-#: systemv/cupstestdsc.c:390
 #, c-format
 msgid "    Too many %%BeginDocument comments."
 msgstr ""
 
-#: systemv/cupstestdsc.c:382
 #, c-format
 msgid "    Too many %%EndDocument comments."
 msgstr ""
 
-#: systemv/cupstestdsc.c:402
 msgid "    Warning: file contains binary data."
 msgstr ""
 
-#: systemv/cupstestdsc.c:410
 #, c-format
 msgid "    Warning: no %%EndComments comment in file."
 msgstr ""
 
-#: systemv/cupstestdsc.c:406
 #, c-format
 msgid "    Warning: obsolete DSC version %.1f in file."
 msgstr ""
 
-#: systemv/cupsctl.c:210
+msgid "  ! expression            Unary NOT of expression."
+msgstr ""
+
+msgid "  ( expressions )         Group expressions."
+msgstr ""
+
 msgid "  --[no-]debug-logging    Turn debug logging on/off."
 msgstr ""
 
-#: systemv/cupsctl.c:212
 msgid "  --[no-]remote-admin     Turn remote administration on/off."
 msgstr ""
 
-#: systemv/cupsctl.c:214
 msgid "  --[no-]remote-any       Allow/prevent access from the Internet."
 msgstr ""
 
-#: systemv/cupsctl.c:216
 msgid "  --[no-]share-printers   Turn printer sharing on/off."
 msgstr ""
 
-#: systemv/cupsctl.c:218
 msgid "  --[no-]user-cancel-any  Allow/prevent users to cancel any job."
 msgstr ""
 
-#: ppdc/ppdc.cxx:455
 msgid "  --cr                    End lines with CR (Mac OS 9)."
 msgstr ""
 
-#: ppdc/ppdc.cxx:457
 msgid "  --crlf                  End lines with CR + LF (Windows)."
 msgstr ""
 
-#: ppdc/ppdc.cxx:459
+msgid "  --domain regex          Match domain to regular expression."
+msgstr ""
+
+msgid ""
+"  --exec utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+
+msgid "  --false                 Always false."
+msgstr ""
+
+msgid "  --help                  Show help."
+msgstr ""
+
+msgid "  --help                  Show this help."
+msgstr ""
+
+msgid "  --host regex            Match hostname to regular expression."
+msgstr ""
+
 msgid "  --lf                    End lines with LF (UNIX/Linux/OS X)."
 msgstr ""
 
-#: test/ipptool.c:4404
+msgid "  --list-filters          List filters that will be used."
+msgstr ""
+
+msgid "  --local                 True if service is local."
+msgstr ""
+
+msgid "  --ls                    List attributes."
+msgstr ""
+
+msgid "  --name regex            Match service name to regular expression."
+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 "  --quiet                 Quietly report match via exit code."
+msgstr ""
+
+msgid "  --remote                True if service is remote."
+msgstr ""
+
+msgid ""
+"  --stop-after-include-error\n"
+"                          Stop tests after a failed INCLUDE."
+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 "  -4                      Connect using IPv4."
 msgstr ""
 
-#: test/ipptool.c:4405
 msgid "  -6                      Connect using IPv6."
 msgstr ""
 
-#: test/ipptool.c:4406
 msgid "  -C                      Send requests using chunking (default)."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1431
 msgid "  -D                      Remove the input file when finished."
 msgstr ""
 
-#: ppdc/ppdc.cxx:438 ppdc/ppdhtml.cxx:175 ppdc/ppdpo.cxx:255
 msgid "  -D name=value           Set named variable to value."
 msgstr ""
 
-#: systemv/cupsaddsmb.c:285 systemv/cupsctl.c:205
 msgid "  -E                      Encrypt the connection."
 msgstr ""
 
-#: test/ipptool.c:4408
 msgid "  -E                      Test with HTTP Upgrade to TLS."
 msgstr ""
 
-#: scheduler/main.c:2021
-msgid "  -F                      Run in the foreground but detach from console."
+msgid ""
+"  -F                      Run in the foreground but detach from console."
 msgstr ""
 
-#: systemv/cupsaddsmb.c:286
 msgid "  -H samba-server         Use the named SAMBA server."
 msgstr ""
 
-#: test/ipptool.c:4410
 msgid "  -I                      Ignore errors."
 msgstr ""
 
-#: ppdc/ppdc.cxx:440 ppdc/ppdhtml.cxx:177 ppdc/ppdi.cxx:131 ppdc/ppdpo.cxx:257
 msgid "  -I include-dir          Add include directory to search path."
 msgstr ""
 
-#: systemv/cupstestppd.c:3799
 msgid "  -I {filename,filters,none,profiles}"
 msgstr ""
 
-#: test/ipptool.c:4411
 msgid "  -L                      Send requests using content-length."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1433
+msgid ""
+"  -P filename.plist       Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+
 msgid "  -P filename.ppd         Set PPD file."
 msgstr ""
 
-#: systemv/cupstestppd.c:3801
+msgid "  -P number[-number]      Match port to number or range."
+msgstr ""
+
 msgid "  -R root-directory       Set alternate root."
 msgstr ""
 
-#: test/ipptool.c:4413
 msgid "  -S                      Test with SSL encryption."
 msgstr ""
 
-#: test/ipptool.c:4415
+msgid "  -T seconds              Set the browse timeout in seconds."
+msgstr ""
+
 msgid "  -T seconds              Set the receive/send timeout in seconds."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1434 systemv/cupsaddsmb.c:288 systemv/cupsctl.c:206
 msgid "  -U username             Specify username."
 msgstr ""
 
-#: test/ipptool.c:4417
 msgid "  -V version              Set default IPP version."
 msgstr ""
 
-#: systemv/cupstestppd.c:3802
-msgid "  -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}"
+msgid ""
+"  -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,"
+"translations}"
 msgstr ""
 
-#: test/ipptool.c:4419
 msgid "  -X                      Produce XML plist instead of plain text."
 msgstr ""
 
-#: systemv/cupsaddsmb.c:289
+msgid "  -a                      Browse for all services."
+msgstr ""
+
 msgid "  -a                      Export all printers."
 msgstr ""
 
-#: ppdc/ppdc.cxx:442
+msgid "  -c                      Produce CSV output."
+msgstr ""
+
 msgid "  -c catalog.po           Load the specified message catalog."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1435 scheduler/main.c:2019
+msgid "  -c cups-files.conf      Set cups-files.conf file to use."
+msgstr ""
+
 msgid "  -c cupsd.conf           Set cupsd.conf file to use."
 msgstr ""
 
-#: test/ipptool.c:4421
+msgid "  -d domain               Browse/resolve in specified domain."
+msgstr ""
+
 msgid "  -d name=value           Set named variable to value."
 msgstr ""
 
-#: ppdc/ppdc.cxx:444
 msgid "  -d output-dir           Specify the output directory."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1437
 msgid "  -d printer              Use the named printer."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1439
+msgid "  -d regex                Match domain to regular expression."
+msgstr ""
+
 msgid "  -e                      Use every filter from the PPD file."
 msgstr ""
 
-#: scheduler/main.c:2020
 msgid "  -f                      Run in the foreground."
 msgstr ""
 
-#: test/ipptool.c:4423
 msgid "  -f filename             Set default request filename."
 msgstr ""
 
-#: scheduler/main.c:2023
 msgid "  -h                      Show this usage message."
 msgstr ""
 
-#: systemv/cupsaddsmb.c:290 systemv/cupsctl.c:207
+msgid "  -h regex                Match hostname to regular expression."
+msgstr ""
+
 msgid "  -h server[:port]        Specify server address."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1441
 msgid "  -i mime/type            Set input MIME type (otherwise auto-typed)."
 msgstr ""
 
-#: test/ipptool.c:4425
-msgid "  -i seconds              Repeat the last file with the given time interval."
+msgid ""
+"  -i seconds              Repeat the last file with the given time interval."
+msgstr ""
+
+msgid ""
+"  -j job-id[,N]           Filter file N from the specified job (default is "
+"file 1)."
+msgstr ""
+
+msgid "  -l                      List attributes."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1443
-msgid "  -j job-id[,N]           Filter file N from the specified job (default is file 1)."
+msgid "  -l                      Produce plain text output."
 msgstr ""
 
-#: scheduler/main.c:2024
-msgid "  -l                      Run cupsd from launchd(8)."
+msgid "  -l                      Run cupsd on demand."
 msgstr ""
 
-#: ppdc/ppdc.cxx:446
 msgid "  -l lang[,lang,...]      Specify the output language(s) (locale)."
 msgstr ""
 
-#: ppdc/ppdc.cxx:448
 msgid "  -m                      Use the ModelName value as the filename."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1445
-msgid "  -m mime/type            Set output MIME type (otherwise application/pdf)."
+msgid ""
+"  -m mime/type            Set output MIME type (otherwise application/pdf)."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1447
 msgid "  -n copies               Set number of copies."
 msgstr ""
 
-#: test/ipptool.c:4427
-msgid "  -n count                Repeat the last file the given number of times."
+msgid ""
+"  -n count                Repeat the last file the given number of times."
+msgstr ""
+
+msgid "  -n regex                Match service name to regular expression."
 msgstr ""
 
-#: ppdc/ppdi.cxx:133
-msgid "  -o filename.drv         Set driver information file (otherwise ppdi.drv)."
+msgid ""
+"  -o filename.drv         Set driver information file (otherwise ppdi.drv)."
 msgstr ""
 
-#: ppdc/ppdmerge.cxx:370
 msgid "  -o filename.ppd[.gz]    Set output file (otherwise stdout)."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1448
 msgid "  -o name=value           Set option(s)."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1449
+msgid "  -p                      Print URI if true."
+msgstr ""
+
 msgid "  -p filename.ppd         Set PPD file."
 msgstr ""
 
-#: systemv/cupstestppd.c:3806 test/ipptool.c:4429
+msgid "  -p program              Run specified program for each service."
+msgstr ""
+
+msgid "  -q                      Quietly report match via exit code."
+msgstr ""
+
 msgid "  -q                      Run silently."
 msgstr ""
 
-#: systemv/cupstestppd.c:3807
+msgid "  -r                      True if service is remote."
+msgstr ""
+
 msgid "  -r                      Use 'relaxed' open mode."
 msgstr ""
 
-#: test/ipptool.c:4430
+msgid "  -s                      Print service name if true."
+msgstr ""
+
 msgid "  -t                      Produce a test report."
 msgstr ""
 
-#: ppdc/ppdc.cxx:450
 msgid "  -t                      Test PPDs instead of generating them."
 msgstr ""
 
-#: scheduler/main.c:2025
 msgid "  -t                      Test the configuration file."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1450
+msgid "  -t key                  True if the TXT record contains the key."
+msgstr ""
+
 msgid "  -t title                Set title."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1451
+msgid "  -t type                 Browse/resolve with specified type."
+msgstr ""
+
 msgid "  -u                      Remove the PPD file when finished."
 msgstr ""
 
-#: systemv/cupsaddsmb.c:291 systemv/cupstestppd.c:3808 test/ipptool.c:4431
-#: ppdc/ppdc.cxx:452 ppdc/ppdpo.cxx:259
+msgid "  -u regex                Match URI to regular expression."
+msgstr ""
+
 msgid "  -v                      Be verbose."
 msgstr ""
 
-#: systemv/cupstestppd.c:3809
 msgid "  -vv                     Be very verbose."
 msgstr ""
 
-#: ppdc/ppdc.cxx:453
+msgid ""
+"  -x utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+
 msgid "  -z                      Compress PPD files using GNU zip."
 msgstr ""
 
-#: systemv/cupstestppd.c:332 systemv/cupstestppd.c:351
-#: systemv/cupstestppd.c:363 systemv/cupstestppd.c:496
-#: systemv/cupstestppd.c:511 systemv/cupstestppd.c:532
-#: systemv/cupstestppd.c:547 systemv/cupstestppd.c:577
-#: systemv/cupstestppd.c:597 systemv/cupstestppd.c:620
-#: systemv/cupstestppd.c:638 systemv/cupstestppd.c:664
-#: systemv/cupstestppd.c:682 systemv/cupstestppd.c:702
-#: systemv/cupstestppd.c:722 systemv/cupstestppd.c:740
-#: systemv/cupstestppd.c:757 systemv/cupstestppd.c:776
-#: systemv/cupstestppd.c:797 systemv/cupstestppd.c:816
-#: systemv/cupstestppd.c:836 systemv/cupstestppd.c:856
-#: systemv/cupstestppd.c:876 systemv/cupstestppd.c:896
-#: systemv/cupstestppd.c:914 systemv/cupstestppd.c:931
-#: systemv/cupstestppd.c:953 systemv/cupstestppd.c:971
-#: systemv/cupstestppd.c:988 systemv/cupstestppd.c:1006
-#: systemv/cupstestppd.c:1022 systemv/cupstestppd.c:1042
-#: systemv/cupstestppd.c:1073 systemv/cupstestppd.c:1095
-#: systemv/cupstestppd.c:1146 systemv/cupstestppd.c:1165
-#: systemv/cupstestppd.c:1209 systemv/cupstestppd.c:1223
-#: systemv/cupstestppd.c:1255 systemv/cupstestppd.c:1282
-#: systemv/cupstestppd.c:1800 systemv/cupstestppd.c:1819
-#: systemv/cupstestppd.c:1837 systemv/cupstestppd.c:1889
-#: systemv/cupstestppd.c:1905 systemv/cupstestppd.c:1942
-#: systemv/cupstestppd.c:1960 systemv/cupstestppd.c:1996
-#: systemv/cupstestppd.c:2010 systemv/cupstestppd.c:2037
-#: systemv/cupstestppd.c:2051 systemv/cupstestppd.c:2097
-#: systemv/cupstestppd.c:2119 systemv/cupstestppd.c:2142
-#: systemv/cupstestppd.c:2159 systemv/cupstestppd.c:2201
-#: systemv/cupstestppd.c:2244 systemv/cupstestppd.c:2291
-#: systemv/cupstestppd.c:2315 systemv/cupstestppd.c:2369
-#: systemv/cupstestppd.c:2385 systemv/cupstestppd.c:2415
-#: systemv/cupstestppd.c:2429 systemv/cupstestppd.c:2455
-#: systemv/cupstestppd.c:2471 systemv/cupstestppd.c:2511
-#: systemv/cupstestppd.c:2525 systemv/cupstestppd.c:2551
-#: systemv/cupstestppd.c:2567 systemv/cupstestppd.c:2597
-#: systemv/cupstestppd.c:2611 systemv/cupstestppd.c:2638
-#: systemv/cupstestppd.c:2655 systemv/cupstestppd.c:2669
-#: systemv/cupstestppd.c:2693 systemv/cupstestppd.c:2710
-#: systemv/cupstestppd.c:2724 systemv/cupstestppd.c:2748
-#: systemv/cupstestppd.c:2765 systemv/cupstestppd.c:2779
-#: systemv/cupstestppd.c:2803 systemv/cupstestppd.c:2820
-#: systemv/cupstestppd.c:2834 systemv/cupstestppd.c:2858
-#: systemv/cupstestppd.c:2872 systemv/cupstestppd.c:2887
-#: systemv/cupstestppd.c:2904 systemv/cupstestppd.c:2960
-#: systemv/cupstestppd.c:2995 systemv/cupstestppd.c:3009
-#: systemv/cupstestppd.c:3037 systemv/cupstestppd.c:3102
-#: systemv/cupstestppd.c:3117 systemv/cupstestppd.c:3156
-#: systemv/cupstestppd.c:3176 systemv/cupstestppd.c:3190
-#: systemv/cupstestppd.c:3387 systemv/cupstestppd.c:3423
-#: systemv/cupstestppd.c:3437 systemv/cupstestppd.c:3483
-#: systemv/cupstestppd.c:3515 systemv/cupstestppd.c:3532
-#: systemv/cupstestppd.c:3555 systemv/cupstestppd.c:3571
-#: systemv/cupstestppd.c:3609 systemv/cupstestppd.c:3750
-#: systemv/cupstestppd.c:3772 systemv/cupstestppd.c:3880
+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 ""
+"  expression --and expression\n"
+"                          Logical AND."
+msgstr ""
+
+msgid ""
+"  expression --or expression\n"
+"                          Logical OR."
+msgstr ""
+
+msgid "  expression expression   Logical AND."
+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 " FAIL"
 msgstr ""
 
-#: systemv/cupstestppd.c:1306
 msgid " PASS"
 msgstr ""
 
-#: berkeley/lpq.c:560
 #, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
 msgstr ""
 
-#: berkeley/lpq.c:565
 #, c-format
 msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
 msgstr ""
 
-#: systemv/lpstat.c:750
+#, 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 ""
 
-#: scheduler/ipp.c:10045
 #, c-format
 msgid "%s cannot be changed."
 msgstr "%s nelze změnit."
 
-#: berkeley/lpc.c:189
 #, c-format
 msgid "%s is not implemented by the CUPS version of lpc."
 msgstr ""
 
-#: berkeley/lpq.c:651
 #, c-format
 msgid "%s is not ready"
 msgstr ""
 
-#: berkeley/lpq.c:644
 #, c-format
 msgid "%s is ready"
 msgstr ""
 
-#: berkeley/lpq.c:647
 #, c-format
 msgid "%s is ready and printing"
 msgstr ""
 
-#: filter/rastertoepson.c:985 filter/rastertohp.c:711
-#: filter/rastertolabel.c:1134
 #, c-format
 msgid "%s job-id user title copies options [file]"
 msgstr ""
 
-#: systemv/lpstat.c:754
 #, c-format
 msgid "%s not accepting requests since %s -"
 msgstr ""
 
-#: scheduler/ipp.c:691
 #, c-format
 msgid "%s not supported."
 msgstr ""
 
-#: systemv/lpstat.c:765
 #, c-format
 msgid "%s/%s accepting requests since %s"
 msgstr ""
 
-#: systemv/lpstat.c:770
 #, c-format
 msgid "%s/%s not accepting requests since %s -"
 msgstr ""
 
-#: berkeley/lpq.c:552
 #, c-format
 msgid "%s: %-33.33s [job %d localhost]"
 msgstr ""
 
 #. TRANSLATORS: Message is "subject: error"
-#: cups/langprintf.c:86 scheduler/cupsfilter.c:714 systemv/lpadmin.c:805
-#: systemv/lpadmin.c:856 systemv/lpadmin.c:906 systemv/lpadmin.c:962
-#: systemv/lpadmin.c:1060 systemv/lpadmin.c:1112 systemv/lpadmin.c:1168
-#: systemv/lpadmin.c:1478
 #, c-format
 msgid "%s: %s"
 msgstr ""
 
-#: systemv/cancel.c:294 systemv/cancel.c:357
 #, c-format
 msgid "%s: %s failed: %s"
 msgstr ""
 
-#: systemv/cupsaccept.c:68
+#, 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 ""
 
-#: berkeley/lpq.c:236 berkeley/lpr.c:344 systemv/lp.c:584
 #, c-format
-msgid "%s: Error - %s environment variable names non-existent destination \"%s\"."
+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 ""
 
-#: systemv/lp.c:231
 #, c-format
 msgid "%s: Error - bad job ID."
 msgstr ""
 
-#: systemv/lp.c:219
 #, c-format
 msgid "%s: Error - cannot print files and alter jobs simultaneously."
 msgstr ""
 
-#: systemv/lp.c:505
 #, c-format
 msgid "%s: Error - cannot print from stdin if files or a job ID are provided."
 msgstr ""
 
-#: systemv/lp.c:461
 #, c-format
 msgid "%s: Error - expected character set after \"-S\" option."
 msgstr ""
 
-#: systemv/lp.c:480
 #, c-format
 msgid "%s: Error - expected content type after \"-T\" option."
 msgstr ""
 
-#: berkeley/lpr.c:240
 #, c-format
 msgid "%s: Error - expected copies after \"-#\" option."
 msgstr ""
 
-#: systemv/lp.c:264
 #, c-format
 msgid "%s: Error - expected copies after \"-n\" option."
 msgstr ""
 
-#: berkeley/lpr.c:209
 #, c-format
 msgid "%s: Error - expected destination after \"-P\" option."
 msgstr ""
 
-#: systemv/lpstat.c:231
-#, c-format
-msgid "%s: Error - expected destination after \"-b\" option."
-msgstr ""
-
-#: systemv/lp.c:138
 #, c-format
 msgid "%s: Error - expected destination after \"-d\" option."
 msgstr ""
 
-#: systemv/lp.c:168
 #, c-format
 msgid "%s: Error - expected form after \"-f\" option."
 msgstr ""
 
-#: systemv/lp.c:391
 #, c-format
 msgid "%s: Error - expected hold name after \"-H\" option."
 msgstr ""
 
-#: berkeley/lpr.c:103
 #, c-format
 msgid "%s: Error - expected hostname after \"-H\" option."
 msgstr ""
 
-#: berkeley/lpq.c:180 berkeley/lprm.c:123 systemv/cancel.c:124
-#: systemv/cupsaccept.c:123 systemv/lp.c:189 systemv/lpstat.c:291
 #, c-format
 msgid "%s: Error - expected hostname after \"-h\" option."
 msgstr ""
 
-#: systemv/lp.c:371
 #, c-format
 msgid "%s: Error - expected mode list after \"-y\" option."
 msgstr ""
 
-#: berkeley/lpr.c:263
 #, c-format
 msgid "%s: Error - expected name after \"-%c\" option."
 msgstr ""
 
-#: berkeley/lpr.c:153 systemv/lp.c:288
 #, c-format
 msgid "%s: Error - expected option=value after \"-o\" option."
 msgstr ""
 
-#: systemv/lp.c:441
 #, c-format
 msgid "%s: Error - expected page list after \"-P\" option."
 msgstr ""
 
-#: systemv/lp.c:308
 #, c-format
 msgid "%s: Error - expected priority after \"-%c\" option."
 msgstr ""
 
-#: systemv/cupsaccept.c:141
 #, c-format
 msgid "%s: Error - expected reason text after \"-r\" option."
 msgstr ""
 
-#: systemv/lp.c:354
 #, c-format
 msgid "%s: Error - expected title after \"-t\" option."
 msgstr ""
 
-#: berkeley/lpq.c:111 berkeley/lpr.c:84 berkeley/lprm.c:104
-#: systemv/cancel.c:94 systemv/cupsaccept.c:101 systemv/lp.c:116
-#: systemv/lpadmin.c:438 systemv/lpstat.c:137
 #, c-format
 msgid "%s: Error - expected username after \"-U\" option."
 msgstr ""
 
-#: systemv/cancel.c:145
 #, c-format
 msgid "%s: Error - expected username after \"-u\" option."
 msgstr ""
 
-#: berkeley/lpr.c:125
 #, c-format
 msgid "%s: Error - expected value after \"-%c\" option."
 msgstr ""
 
-#: systemv/lpstat.c:157 systemv/lpstat.c:171
 #, c-format
-msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option."
+msgid ""
+"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" "
+"option."
 msgstr ""
 
-#: berkeley/lpq.c:241 berkeley/lpr.c:349 systemv/lp.c:589
 #, c-format
 msgid "%s: Error - no default destination available."
 msgstr ""
 
-#: systemv/lp.c:330
 #, c-format
 msgid "%s: Error - priority must be between 1 and 100."
 msgstr ""
 
-#: berkeley/lpr.c:352 systemv/lp.c:592
 #, c-format
 msgid "%s: Error - scheduler not responding."
 msgstr ""
 
-#: berkeley/lpr.c:305 systemv/lp.c:537
 #, c-format
 msgid "%s: Error - too many files - \"%s\"."
 msgstr ""
 
-#: berkeley/lpr.c:287 systemv/lp.c:520
 #, c-format
 msgid "%s: Error - unable to access \"%s\" - %s"
 msgstr ""
 
-#: berkeley/lpr.c:395 systemv/lp.c:623
 #, c-format
 msgid "%s: Error - unable to queue from stdin - %s."
 msgstr ""
 
-#: berkeley/lprm.c:87 berkeley/lprm.c:172 systemv/cancel.c:214
 #, c-format
 msgid "%s: Error - unknown destination \"%s\"."
 msgstr ""
 
-#: berkeley/lpq.c:150
 #, c-format
 msgid "%s: Error - unknown destination \"%s/%s\"."
 msgstr ""
 
-#: berkeley/lpr.c:274 berkeley/lprm.c:139 systemv/cancel.c:156
-#: systemv/cupsaccept.c:164 systemv/lp.c:496 systemv/lpstat.c:452
 #, c-format
 msgid "%s: Error - unknown option \"%c\"."
 msgstr ""
 
-#: systemv/cupsaccept.c:157
 #, c-format
 msgid "%s: Error - unknown option \"%s\"."
 msgstr ""
 
-#: systemv/lp.c:208
 #, c-format
 msgid "%s: Expected job ID after \"-i\" option."
 msgstr ""
 
-#: systemv/lpstat.c:504 systemv/lpstat.c:543
 #, c-format
 msgid "%s: Invalid destination name in list \"%s\"."
 msgstr ""
 
-#: scheduler/cupsfilter.c:567
 #, c-format
 msgid "%s: Invalid filter string \"%s\"."
 msgstr ""
 
-#: systemv/lp.c:418
+#, 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 ""
 
-#: scheduler/cupsfilter.c:458
 #, c-format
 msgid "%s: No filter to convert from %s/%s to %s/%s."
 msgstr ""
 
-#: systemv/cupsaccept.c:198
 #, c-format
 msgid "%s: Operation failed: %s"
 msgstr ""
 
-#: berkeley/lpq.c:97 berkeley/lpr.c:70 berkeley/lprm.c:67 systemv/cancel.c:81
-#: systemv/cupsaccept.c:88 systemv/cupsaddsmb.c:86 systemv/lp.c:102
-#: systemv/lpadmin.c:239 systemv/lpinfo.c:88 systemv/lpmove.c:73
-#: systemv/lpstat.c:102 test/ipptool.c:304 test/ipptool.c:321
 #, c-format
 msgid "%s: Sorry, no encryption support."
 msgstr ""
 
-#: berkeley/lpq.c:295 scheduler/cupsfilter.c:1221 systemv/cancel.c:237
-#: systemv/cupsaddsmb.c:144 systemv/cupsaddsmb.c:171
+#, c-format
+msgid "%s: Unable to connect to \"%s:%d\": %s"
+msgstr ""
+
 #, c-format
 msgid "%s: Unable to connect to server."
 msgstr ""
 
-#: systemv/cancel.c:317
 #, c-format
 msgid "%s: Unable to contact server."
 msgstr ""
 
-#: scheduler/cupsfilter.c:424
+#, c-format
+msgid "%s: Unable to create PPD file: %s"
+msgstr ""
+
 #, c-format
 msgid "%s: Unable to determine MIME type of \"%s\"."
 msgstr ""
 
-#: ppdc/ppdmerge.cxx:96
+#, c-format
+msgid "%s: Unable to open \"%s\": %s"
+msgstr ""
+
 #, c-format
 msgid "%s: Unable to open %s: %s"
 msgstr ""
 
-#: scheduler/cupsfilter.c:662 ppdc/ppdmerge.cxx:112
 #, c-format
 msgid "%s: Unable to open PPD file: %s on line %d."
 msgstr ""
 
-#: scheduler/cupsfilter.c:392
 #, c-format
 msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"."
 msgstr ""
 
-#: berkeley/lpq.c:153 systemv/lpstat.c:558
+#, c-format
+msgid "%s: Unable to resolve \"%s\"."
+msgstr ""
+
 #, c-format
 msgid "%s: Unknown destination \"%s\"."
 msgstr ""
 
-#: scheduler/cupsfilter.c:435
 #, c-format
 msgid "%s: Unknown destination MIME type %s/%s."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1426
 #, c-format
 msgid "%s: Unknown option \"%c\"."
 msgstr ""
 
-#: scheduler/cupsfilter.c:416
+#, 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 ""
 
-#: berkeley/lpr.c:139
 #, c-format
-msgid "%s: Warning - \"%c\" format modifier not supported - output may not be correct."
+msgid ""
+"%s: Warning - \"%c\" format modifier not supported - output may not be "
+"correct."
 msgstr ""
 
-#: systemv/lp.c:468
 #, c-format
 msgid "%s: Warning - character set option ignored."
 msgstr ""
 
-#: systemv/lp.c:487
 #, c-format
 msgid "%s: Warning - content type option ignored."
 msgstr ""
 
-#: systemv/lp.c:175
 #, c-format
 msgid "%s: Warning - form option ignored."
 msgstr ""
 
-#: systemv/lp.c:378
 #, c-format
 msgid "%s: Warning - mode option ignored."
 msgstr ""
 
-#: ppdc/sample.c:310
 msgid "-1"
 msgstr "-1"
 
-#: ppdc/sample.c:301
 msgid "-10"
 msgstr "-10"
 
-#: ppdc/sample.c:393
 msgid "-100"
 msgstr "-100"
 
-#: ppdc/sample.c:392
 msgid "-105"
 msgstr "-105"
 
-#: ppdc/sample.c:300
 msgid "-11"
 msgstr "-11"
 
-#: ppdc/sample.c:391
 msgid "-110"
 msgstr "-110"
 
-#: ppdc/sample.c:390
 msgid "-115"
 msgstr "-115"
 
-#: ppdc/sample.c:299
 msgid "-12"
 msgstr "-12"
 
-#: ppdc/sample.c:389
 msgid "-120"
 msgstr "-120"
 
-#: ppdc/sample.c:298
 msgid "-13"
 msgstr "-13"
 
-#: ppdc/sample.c:297
 msgid "-14"
 msgstr "-14"
 
-#: ppdc/sample.c:296
 msgid "-15"
 msgstr "-15"
 
-#: ppdc/sample.c:309
 msgid "-2"
 msgstr "-2"
 
-#: ppdc/sample.c:409
 msgid "-20"
 msgstr "-20"
 
-#: ppdc/sample.c:408
 msgid "-25"
 msgstr "-25"
 
-#: ppdc/sample.c:308
 msgid "-3"
 msgstr "-3"
 
-#: ppdc/sample.c:407
 msgid "-30"
 msgstr "-30"
 
-#: ppdc/sample.c:406
 msgid "-35"
 msgstr "-35"
 
-#: ppdc/sample.c:307
 msgid "-4"
 msgstr "-4"
 
-#: ppdc/sample.c:405
 msgid "-40"
 msgstr "-40"
 
-#: ppdc/sample.c:404
 msgid "-45"
 msgstr "-45"
 
-#: ppdc/sample.c:306
 msgid "-5"
 msgstr "-5"
 
-#: ppdc/sample.c:403
 msgid "-50"
 msgstr "-50"
 
-#: ppdc/sample.c:402
 msgid "-55"
 msgstr "-55"
 
-#: ppdc/sample.c:305
 msgid "-6"
 msgstr "-6"
 
-#: ppdc/sample.c:401
 msgid "-60"
 msgstr "-60"
 
-#: ppdc/sample.c:400
 msgid "-65"
 msgstr "-65"
 
-#: ppdc/sample.c:304
 msgid "-7"
 msgstr "-7"
 
-#: ppdc/sample.c:399
 msgid "-70"
 msgstr "-70"
 
-#: ppdc/sample.c:398
 msgid "-75"
 msgstr "-75"
 
-#: ppdc/sample.c:303
 msgid "-8"
 msgstr "-8"
 
-#: ppdc/sample.c:397
 msgid "-80"
 msgstr "-80"
 
-#: ppdc/sample.c:396
 msgid "-85"
 msgstr "-85"
 
-#: ppdc/sample.c:302
 msgid "-9"
 msgstr "-9"
 
-#: ppdc/sample.c:395
 msgid "-90"
 msgstr "-90"
 
-#: ppdc/sample.c:394
 msgid "-95"
 msgstr "-95"
 
-#: ppdc/sample.c:311
 msgid "0"
 msgstr "0"
 
-#: ppdc/sample.c:312
 msgid "1"
 msgstr "1"
 
-#: ppdc/sample.c:384
 msgid "1 inch/sec."
 msgstr "1 palec/sek."
 
-#: ppdc/sample.c:172
 msgid "1.25x0.25\""
 msgstr "1.25x0.25\""
 
-#: ppdc/sample.c:173
 msgid "1.25x2.25\""
 msgstr "1.25x2.25\""
 
-#: ppdc/sample.c:432
 msgid "1.5 inch/sec."
 msgstr "1.5 palce/sek."
 
-#: ppdc/sample.c:174
 msgid "1.50x0.25\""
 msgstr "1.50x0.25\""
 
-#: ppdc/sample.c:175
 msgid "1.50x0.50\""
 msgstr "1.50x0.50\""
 
-#: ppdc/sample.c:176
 msgid "1.50x1.00\""
 msgstr "1.50x1.00\""
 
-#: ppdc/sample.c:177
 msgid "1.50x2.00\""
 msgstr "1.50x2.00\""
 
-#: ppdc/sample.c:321
 msgid "10"
 msgstr "10"
 
-#: ppdc/sample.c:443
 msgid "10 inches/sec."
 msgstr "10 palců/sek."
 
-#: 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:423
 msgid "100"
 msgstr "100"
 
-#: ppdc/sample.c:334
 msgid "100 mm/sec."
 msgstr "100 mm/sek."
 
-#: ppdc/sample.c:424
 msgid "105"
 msgstr "105"
 
-#: ppdc/sample.c:322
 msgid "11"
 msgstr "11"
 
-#: ppdc/sample.c:444
 msgid "11 inches/sec."
 msgstr "11 palců/sek."
 
-#: ppdc/sample.c:425
 msgid "110"
 msgstr "110"
 
-#: ppdc/sample.c:426
 msgid "115"
 msgstr "115"
 
-#: ppdc/sample.c:323
 msgid "12"
 msgstr "12"
 
-#: ppdc/sample.c:445
 msgid "12 inches/sec."
 msgstr "12 palců/sek."
 
-#: ppdc/sample.c:9
 msgid "12 x 11"
 msgstr ""
 
-#: ppdc/sample.c:427
 msgid "120"
 msgstr "120"
 
-#: ppdc/sample.c:335
 msgid "120 mm/sec."
 msgstr "120 mm/sek."
 
-#: ppdc/sample.c:243
 msgid "120x60dpi"
 msgstr "120x60 dpi"
 
-#: ppdc/sample.c:249
 msgid "120x72dpi"
 msgstr "120x72 dpi"
 
-#: ppdc/sample.c:324
 msgid "13"
 msgstr "13"
 
-#: ppdc/sample.c:232
 msgid "136dpi"
 msgstr "136 dpi"
 
-#: ppdc/sample.c:325
 msgid "14"
 msgstr "14"
 
-#: ppdc/sample.c:326
 msgid "15"
 msgstr "15"
 
-#: ppdc/sample.c:328
 msgid "15 mm/sec."
 msgstr "15 mm/sek."
 
-#: ppdc/sample.c:10
 msgid "15 x 11"
 msgstr ""
 
-#: ppdc/sample.c:336
 msgid "150 mm/sec."
 msgstr "150 mm/sek."
 
-#: ppdc/sample.c:283
 msgid "150dpi"
 msgstr "150 dpi"
 
-#: ppdc/sample.c:368
 msgid "16"
 msgstr "16"
 
-#: ppdc/sample.c:369
 msgid "17"
 msgstr "17"
 
-#: ppdc/sample.c:370
 msgid "18"
 msgstr "18"
 
-#: ppdc/sample.c:244
 msgid "180dpi"
 msgstr "180 dpi"
 
-#: ppdc/sample.c:371
 msgid "19"
 msgstr "19"
 
-#: ppdc/sample.c:313
 msgid "2"
 msgstr "2"
 
-#: ppdc/sample.c:385
 msgid "2 inches/sec."
 msgstr "2 palce/sek."
 
-#: ppdc/sample.c:270
 msgid "2-Sided Printing"
 msgstr "oboustranný tisk"
 
-#: ppdc/sample.c:178
 msgid "2.00x0.37\""
 msgstr "2.00x0.37\""
 
-#: ppdc/sample.c:179
 msgid "2.00x0.50\""
 msgstr "2.00x0.50\""
 
-#: ppdc/sample.c:180
 msgid "2.00x1.00\""
 msgstr "2.00x1.00\""
 
-#: ppdc/sample.c:181
 msgid "2.00x1.25\""
 msgstr "2.00x1.25\""
 
-#: ppdc/sample.c:182
 msgid "2.00x2.00\""
 msgstr "2.00x2.00\""
 
-#: ppdc/sample.c:183
 msgid "2.00x3.00\""
 msgstr "2.00x3.00\""
 
-#: ppdc/sample.c:184
 msgid "2.00x4.00\""
 msgstr "2.00x4.00\""
 
-#: ppdc/sample.c:185
 msgid "2.00x5.50\""
 msgstr "2.00x5.50\""
 
-#: ppdc/sample.c:186
 msgid "2.25x0.50\""
 msgstr "2.25x0.50\""
 
-#: ppdc/sample.c:187
 msgid "2.25x1.25\""
 msgstr "2.25x1.25\""
 
-#: ppdc/sample.c:188
 msgid "2.25x4.00\""
 msgstr "2.25x4.00\""
 
-#: ppdc/sample.c:189
 msgid "2.25x5.50\""
 msgstr "2.25x5.50\""
 
-#: ppdc/sample.c:190
 msgid "2.38x5.50\""
 msgstr "2.38x5.50\""
 
-#: ppdc/sample.c:433
 msgid "2.5 inches/sec."
 msgstr "2.5 palce/sek."
 
-#: ppdc/sample.c:191
 msgid "2.50x1.00\""
 msgstr "2.50x1.00\""
 
-#: ppdc/sample.c:192
 msgid "2.50x2.00\""
 msgstr "2.50x2.00\""
 
-#: ppdc/sample.c:193
 msgid "2.75x1.25\""
 msgstr "2.75x1.25\""
 
-#: ppdc/sample.c:194
 msgid "2.9 x 1\""
 msgstr "2.9 x 1\""
 
-#: ppdc/sample.c:372
 msgid "20"
 msgstr "20"
 
-#: ppdc/sample.c:329
 msgid "20 mm/sec."
 msgstr "20 mm/sek."
 
-#: ppdc/sample.c:337
 msgid "200 mm/sec."
 msgstr "200 mm/sek."
 
-#: ppdc/sample.c:233
 msgid "203dpi"
 msgstr "203 dpi"
 
-#: ppdc/sample.c:373
 msgid "21"
 msgstr "21"
 
-#: ppdc/sample.c:374
 msgid "22"
 msgstr "22"
 
-#: ppdc/sample.c:375
 msgid "23"
 msgstr "23"
 
-#: ppdc/sample.c:376
 msgid "24"
 msgstr "24"
 
-#: ppdc/sample.c:241
 msgid "24-Pin Series"
 msgstr "24 jehličková"
 
-#: ppdc/sample.c:250
 msgid "240x72dpi"
 msgstr "240x72 dpi"
 
-#: ppdc/sample.c:377
 msgid "25"
 msgstr "25"
 
-#: ppdc/sample.c:338
 msgid "250 mm/sec."
 msgstr "250 mm/sek."
 
-#: ppdc/sample.c:378
 msgid "26"
 msgstr "26"
 
-#: ppdc/sample.c:379
 msgid "27"
 msgstr "27"
 
-#: ppdc/sample.c:380
 msgid "28"
 msgstr "28"
 
-#: ppdc/sample.c:381
 msgid "29"
 msgstr "29"
 
-#: ppdc/sample.c:314
 msgid "3"
 msgstr "3"
 
-#: ppdc/sample.c:386
 msgid "3 inches/sec."
 msgstr "3 palce/sek."
 
-#: ppdc/sample.c:3
 msgid "3 x 5"
 msgstr ""
 
-#: ppdc/sample.c:195
 msgid "3.00x1.00\""
 msgstr "3.00x1.00\""
 
-#: ppdc/sample.c:196
 msgid "3.00x1.25\""
 msgstr "3.00x1.25\""
 
-#: ppdc/sample.c:197
 msgid "3.00x2.00\""
 msgstr "3.00x2.00\""
 
-#: ppdc/sample.c:198
 msgid "3.00x3.00\""
 msgstr "3.00x3.00\""
 
-#: ppdc/sample.c:199
 msgid "3.00x5.00\""
 msgstr "3.00x5.00\""
 
-#: ppdc/sample.c:200
 msgid "3.25x2.00\""
 msgstr "3.25x2.00\""
 
-#: ppdc/sample.c:201
 msgid "3.25x5.00\""
 msgstr "3.25x5.00\""
 
-#: ppdc/sample.c:202
 msgid "3.25x5.50\""
 msgstr "3.25x5.50\""
 
-#: ppdc/sample.c:203
 msgid "3.25x5.83\""
 msgstr "3.25x5.83\""
 
-#: ppdc/sample.c:204
 msgid "3.25x7.83\""
 msgstr "3.25x7.83\""
 
-#: ppdc/sample.c:4
 msgid "3.5 x 5"
 msgstr ""
 
-#: ppdc/sample.c:171
 msgid "3.5\" Disk"
 msgstr "3.5\" Disk"
 
-#: ppdc/sample.c:205
 msgid "3.50x1.00\""
 msgstr "3.50x1.00\""
 
-#: ppdc/sample.c:382
 msgid "30"
 msgstr "30"
 
-#: ppdc/sample.c:330
 msgid "30 mm/sec."
 msgstr "30 mm/sek."
 
-#: ppdc/sample.c:339
 msgid "300 mm/sec."
 msgstr "300 mm/sek."
 
-#: ppdc/sample.c:234
 msgid "300dpi"
 msgstr "300 dpi"
 
-#: ppdc/sample.c:410
 msgid "35"
 msgstr "35"
 
-#: ppdc/sample.c:246
 msgid "360dpi"
 msgstr "360 dpi"
 
-#: ppdc/sample.c:245
 msgid "360x180dpi"
 msgstr "360x180 dpi"
 
-#: ppdc/sample.c:315
 msgid "4"
 msgstr "4"
 
-#: ppdc/sample.c:387
 msgid "4 inches/sec."
 msgstr "4 palce/sek."
 
-#: ppdc/sample.c:206
 msgid "4.00x1.00\""
 msgstr "4.00x1.00\""
 
-#: ppdc/sample.c:214
 msgid "4.00x13.00\""
 msgstr "4.00x13.00\""
 
-#: ppdc/sample.c:207
 msgid "4.00x2.00\""
 msgstr "4.00x2.00\""
 
-#: ppdc/sample.c:208
 msgid "4.00x2.50\""
 msgstr "4.00x2.50\""
 
-#: ppdc/sample.c:209
 msgid "4.00x3.00\""
 msgstr "4.00x3.00\""
 
-#: ppdc/sample.c:210
 msgid "4.00x4.00\""
 msgstr "4.00x4.00\""
 
-#: ppdc/sample.c:211
 msgid "4.00x5.00\""
 msgstr "4.00x5.00\""
 
-#: ppdc/sample.c:212
 msgid "4.00x6.00\""
 msgstr "4.00x6.00\""
 
-#: ppdc/sample.c:213
 msgid "4.00x6.50\""
 msgstr "4.00x6.50\""
 
-#: ppdc/sample.c:411
 msgid "40"
 msgstr "40"
 
-#: ppdc/sample.c:331
 msgid "40 mm/sec."
 msgstr "40 mm/sek."
 
-#: ppdc/sample.c:412
 msgid "45"
 msgstr "45"
 
-#: ppdc/sample.c:316
 msgid "5"
 msgstr "5"
 
-#: ppdc/sample.c:437
 msgid "5 inches/sec."
 msgstr "5 palců/sek."
 
-#: ppdc/sample.c:5
 msgid "5 x 7"
 msgstr ""
 
-#: ppdc/sample.c:413
 msgid "50"
 msgstr "50"
 
-#: ppdc/sample.c:414
 msgid "55"
 msgstr "55"
 
-#: ppdc/sample.c:317
 msgid "6"
 msgstr "6"
 
-#: ppdc/sample.c:438
 msgid "6 inches/sec."
 msgstr "6 palců/sek."
 
-#: ppdc/sample.c:215
 msgid "6.00x1.00\""
 msgstr "6.00x1.00\""
 
-#: ppdc/sample.c:216
 msgid "6.00x2.00\""
 msgstr "6.00x2.00\""
 
-#: ppdc/sample.c:217
 msgid "6.00x3.00\""
 msgstr "6.00x3.00\""
 
-#: ppdc/sample.c:218
 msgid "6.00x4.00\""
 msgstr "6.00x4.00\""
 
-#: ppdc/sample.c:219
 msgid "6.00x5.00\""
 msgstr "6.00x5.00\""
 
-#: ppdc/sample.c:220
 msgid "6.00x6.00\""
 msgstr "6.00x6.00\""
 
-#: ppdc/sample.c:221
 msgid "6.00x6.50\""
 msgstr "6.00x6.50\""
 
-#: ppdc/sample.c:415
 msgid "60"
 msgstr "60"
 
-#: ppdc/sample.c:332
 msgid "60 mm/sec."
 msgstr "60 mm/sek."
 
-#: ppdc/sample.c:261
 msgid "600dpi"
 msgstr "600 dpi"
 
-#: ppdc/sample.c:242
 msgid "60dpi"
 msgstr "60 dpi"
 
-#: ppdc/sample.c:248
 msgid "60x72dpi"
 msgstr ""
 
-#: ppdc/sample.c:416
 msgid "65"
 msgstr "65"
 
-#: ppdc/sample.c:318
 msgid "7"
 msgstr "7"
 
-#: ppdc/sample.c:440
 msgid "7 inches/sec."
 msgstr "7 palců/sek."
 
-#: ppdc/sample.c:11
 msgid "7 x 9"
 msgstr ""
 
-#: ppdc/sample.c:417
 msgid "70"
 msgstr "70"
 
-#: ppdc/sample.c:252
-msgid "720dpi"
-msgstr "720 dpi"
-
-#: ppdc/sample.c:418
 msgid "75"
 msgstr "75"
 
-#: ppdc/sample.c:319
 msgid "8"
 msgstr "8"
 
-#: ppdc/sample.c:441
 msgid "8 inches/sec."
 msgstr "8 palců/sek."
 
-#: ppdc/sample.c:12
 msgid "8 x 10"
 msgstr ""
 
-#: ppdc/sample.c:222
 msgid "8.00x1.00\""
 msgstr "8.00x1.00\""
 
-#: ppdc/sample.c:223
 msgid "8.00x2.00\""
 msgstr "8.00x2.00\""
 
-#: ppdc/sample.c:224
 msgid "8.00x3.00\""
 msgstr "8.00x3.00\""
 
-#: ppdc/sample.c:225
 msgid "8.00x4.00\""
 msgstr "8.00x4.00\""
 
-#: ppdc/sample.c:226
 msgid "8.00x5.00\""
 msgstr "8.00x5.00\""
 
-#: ppdc/sample.c:227
 msgid "8.00x6.00\""
 msgstr "8.00x6.00\""
 
-#: ppdc/sample.c:228
 msgid "8.00x6.50\""
 msgstr "8.00x6.50\""
 
-#: ppdc/sample.c:419
 msgid "80"
 msgstr "80"
 
-#: ppdc/sample.c:333
 msgid "80 mm/sec."
 msgstr "80 mm/sek."
 
-#: ppdc/sample.c:420
 msgid "85"
 msgstr "85"
 
-#: ppdc/sample.c:320
 msgid "9"
 msgstr "9"
 
-#: ppdc/sample.c:442
 msgid "9 inches/sec."
 msgstr "9 palců/sek."
 
-#: 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 "9 jehličková"
 
-#: ppdc/sample.c:421
 msgid "90"
 msgstr "90"
 
-#: ppdc/sample.c:422
 msgid "95"
 msgstr "95"
 
-#: berkeley/lpc.c:213
 msgid "?Invalid help command unknown."
 msgstr ""
 
-#: cgi-bin/admin.c:2368
 msgid "A Samba password is required to export printer drivers"
 msgstr ""
 
-#: cgi-bin/admin.c:2364
 msgid "A Samba username is required to export printer drivers"
 msgstr ""
 
-#: scheduler/ipp.c:2283
 #, c-format
 msgid "A class named \"%s\" already exists."
 msgstr ""
 
-#: scheduler/ipp.c:1004
 #, c-format
 msgid "A printer named \"%s\" already exists."
 msgstr ""
 
-#: ppdc/sample.c:15
 msgid "A0"
 msgstr "A0"
 
-#: ppdc/sample.c:16
 msgid "A0 Long Edge"
 msgstr ""
 
-#: ppdc/sample.c:17
 msgid "A1"
 msgstr "A1"
 
-#: ppdc/sample.c:18
 msgid "A1 Long Edge"
 msgstr ""
 
-#: ppdc/sample.c:37
 msgid "A10"
 msgstr "A10"
 
-#: ppdc/sample.c:19
 msgid "A2"
 msgstr "A2"
 
-#: ppdc/sample.c:20
 msgid "A2 Long Edge"
 msgstr ""
 
-#: ppdc/sample.c:21
 msgid "A3"
 msgstr "A3"
 
-#: 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 "A4"
 
-#: 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 "A5"
 
-#: ppdc/sample.c:31
 msgid "A5 Long Edge"
 msgstr ""
 
-#: ppdc/sample.c:30
 msgid "A5 Oversize"
 msgstr ""
 
-#: ppdc/sample.c:32
 msgid "A6"
 msgstr "A6"
 
-#: ppdc/sample.c:33
 msgid "A6 Long Edge"
 msgstr ""
 
-#: ppdc/sample.c:34
 msgid "A7"
 msgstr "A7"
 
-#: ppdc/sample.c:35
 msgid "A8"
 msgstr "A8"
 
-#: ppdc/sample.c:36
 msgid "A9"
 msgstr "A9"
 
-#: ppdc/sample.c:38
 msgid "ANSI A"
 msgstr "ANSI A"
 
-#: ppdc/sample.c:39
 msgid "ANSI B"
 msgstr "ANSI B"
 
-#: ppdc/sample.c:40
 msgid "ANSI C"
 msgstr "ANSI C"
 
-#: ppdc/sample.c:41
 msgid "ANSI D"
 msgstr "ANSI D"
 
-#: ppdc/sample.c:42
 msgid "ANSI E"
 msgstr "ANSI E"
 
-#: ppdc/sample.c:47
 msgid "ARCH C"
 msgstr "ARCH C"
 
-#: ppdc/sample.c:48
 msgid "ARCH C Long Edge"
 msgstr ""
 
-#: ppdc/sample.c:49
 msgid "ARCH D"
 msgstr "ARCH D"
 
-#: ppdc/sample.c:50
 msgid "ARCH D Long Edge"
 msgstr ""
 
-#: ppdc/sample.c:51
 msgid "ARCH E"
 msgstr "ARCH E"
 
-#: ppdc/sample.c:52
 msgid "ARCH E Long Edge"
 msgstr ""
 
-#: cgi-bin/classes.c:169 cgi-bin/printers.c:172
 msgid "Accept Jobs"
 msgstr "Příjem úloh"
 
-#: cups/http-support.c:1284
 msgid "Accepted"
 msgstr "Přijatý"
 
-#: cgi-bin/admin.c:570
 msgid "Add Class"
 msgstr "Přidat třídu"
 
-#: cgi-bin/admin.c:882
 msgid "Add Printer"
 msgstr "Přidat tiskárnu"
 
-#: cgi-bin/admin.c:444 cgi-bin/admin.c:477 cgi-bin/admin.c:525
-#: cgi-bin/admin.c:535
 msgid "Add RSS Subscription"
 msgstr "Přidat RSS předplatné"
 
-#: ppdc/sample.c:163
 msgid "Address"
 msgstr "Adresa"
 
-#: cgi-bin/admin.c:210 cgi-bin/admin.c:284 cgi-bin/admin.c:2745
 msgid "Administration"
 msgstr "Administrace"
 
-#: ppdc/sample.c:429
 msgid "Always"
 msgstr "Vždy"
 
-#: backend/socket.c:129
 msgid "AppSocket/HP JetDirect"
 msgstr "AppSocket/HP JetDirect"
 
-#: ppdc/sample.c:450
 msgid "Applicator"
 msgstr "Aplikátor"
 
-#: scheduler/ipp.c:1079
 #, c-format
 msgid "Attempt to set %s printer-state to bad value %d."
 msgstr ""
 
-#: scheduler/ipp.c:325
 #, c-format
 msgid "Attribute groups are out of order (%x < %x)."
 msgstr ""
 
-#: ppdc/sample.c:126
 msgid "B0"
 msgstr "B0"
 
-#: ppdc/sample.c:127
 msgid "B1"
 msgstr "B1"
 
-#: ppdc/sample.c:137
 msgid "B10"
 msgstr "B10"
 
-#: ppdc/sample.c:128
 msgid "B2"
 msgstr "B2"
 
-#: ppdc/sample.c:129
 msgid "B3"
 msgstr "B3"
 
-#: ppdc/sample.c:130
 msgid "B4"
 msgstr "B4"
 
-#: ppdc/sample.c:131
 msgid "B5"
 msgstr "B5"
 
-#: ppdc/sample.c:132
 msgid "B5 Oversize"
 msgstr ""
 
-#: ppdc/sample.c:133
 msgid "B6"
 msgstr "B6"
 
-#: ppdc/sample.c:134
 msgid "B7"
 msgstr "B7"
 
-#: ppdc/sample.c:135
 msgid "B8"
 msgstr "B8"
 
-#: ppdc/sample.c:136
 msgid "B9"
 msgstr "B9"
 
-#: cups/dest.c:1680
+#, c-format
+msgid "Bad 'document-format' value \"%s\"."
+msgstr ""
+
 msgid "Bad NULL dests pointer"
 msgstr "Neplatný ukazatel NULL"
 
-#: cups/ppd.c:345
 msgid "Bad OpenGroup"
 msgstr "Chybný OpenGroup"
 
-#: cups/ppd.c:347
 msgid "Bad OpenUI/JCLOpenUI"
 msgstr "Chybný OpenUI/JCLOpenUI"
 
-#: cups/ppd.c:349
 msgid "Bad OrderDependency"
 msgstr "Chybný OrderDependency"
 
-#: cups/ppd-cache.c:148 cups/ppd-cache.c:195 cups/ppd-cache.c:233
-#: cups/ppd-cache.c:239 cups/ppd-cache.c:255 cups/ppd-cache.c:271
-#: cups/ppd-cache.c:280 cups/ppd-cache.c:288 cups/ppd-cache.c:305
-#: cups/ppd-cache.c:313 cups/ppd-cache.c:328 cups/ppd-cache.c:336
-#: cups/ppd-cache.c:354 cups/ppd-cache.c:366 cups/ppd-cache.c:381
-#: cups/ppd-cache.c:393 cups/ppd-cache.c:415 cups/ppd-cache.c:423
-#: cups/ppd-cache.c:441 cups/ppd-cache.c:449 cups/ppd-cache.c:464
-#: cups/ppd-cache.c:472 cups/ppd-cache.c:490 cups/ppd-cache.c:498
-#: cups/ppd-cache.c:525 cups/ppd-cache.c:571 cups/ppd-cache.c:579
-#: cups/ppd-cache.c:587
 msgid "Bad PPD cache file."
 msgstr ""
 
-#: cups/http-support.c:1299
 msgid "Bad Request"
 msgstr "Chybný požadavek"
 
-#: cups/snmp.c:1002
 msgid "Bad SNMP version number"
 msgstr "Chybná verze SNMP"
 
-#: cups/ppd.c:350
 msgid "Bad UIConstraints"
 msgstr "Chybný UIConstraints"
 
-#: scheduler/ipp.c:1380
+msgid "Bad arguments to function"
+msgstr ""
+
 #, c-format
 msgid "Bad copies value %d."
 msgstr "Chybný počet kopií %d."
 
-#: cups/ppd.c:358
 msgid "Bad custom parameter"
 msgstr "Chybný uživatelský parametr"
 
-#: cups/http-support.c:1451 scheduler/ipp.c:2350
 #, c-format
 msgid "Bad device-uri \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:2391
 #, c-format
 msgid "Bad device-uri scheme \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:8224 scheduler/ipp.c:8240 scheduler/ipp.c:9454
-#: scheduler/ipp.c:10968
 #, c-format
 msgid "Bad document-format \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:9470
 #, c-format
 msgid "Bad document-format-default \"%s\"."
 msgstr ""
 
-#: cups/util.c:929
 msgid "Bad filename buffer"
 msgstr ""
 
-#: scheduler/ipp.c:10060
+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 ""
 
-#: scheduler/ipp.c:1410
 #, c-format
 msgid "Bad job-sheets value \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:1394
 msgid "Bad job-sheets value type."
 msgstr ""
 
-#: scheduler/ipp.c:10090
 msgid "Bad job-state value."
 msgstr ""
 
-#: scheduler/ipp.c:2974 scheduler/ipp.c:3426 scheduler/ipp.c:6078
-#: scheduler/ipp.c:6225 scheduler/ipp.c:7658 scheduler/ipp.c:7927
-#: scheduler/ipp.c:8775 scheduler/ipp.c:9001 scheduler/ipp.c:9350
-#: scheduler/ipp.c:9953
 #, c-format
 msgid "Bad job-uri \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:2049 scheduler/ipp.c:5622
 #, c-format
 msgid "Bad notify-pull-method \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:2013 scheduler/ipp.c:5586
 #, c-format
 msgid "Bad notify-recipient-uri \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:1426
 #, c-format
 msgid "Bad number-up value %d."
 msgstr "Chybná hodnota %d."
 
-#: cups/adminutil.c:292
 #, c-format
 msgid "Bad option + choice on line %d."
 msgstr ""
 
-#: scheduler/ipp.c:1443
 #, c-format
 msgid "Bad page-ranges values %d-%d."
 msgstr "Chybný rozsah stránek %d-%d."
 
-#: scheduler/ipp.c:2434
-#, c-format
-msgid "Bad port-monitor \"%s\"."
+msgid "Bad port number in URI"
 msgstr ""
 
-#: cups/dest.c:676 cups/dest.c:1333
-msgid "Bad printer URI."
+#, c-format
+msgid "Bad port-monitor \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:2495
 #, c-format
 msgid "Bad printer-state value %d."
 msgstr ""
 
-#: scheduler/ipp.c:293
+msgid "Bad printer-uri."
+msgstr ""
+
 #, c-format
 msgid "Bad request ID %d."
 msgstr ""
 
-#: scheduler/ipp.c:278
 #, c-format
 msgid "Bad request version number %d.%d."
 msgstr ""
 
-#: cgi-bin/admin.c:1484
+msgid "Bad resource in URI"
+msgstr ""
+
+msgid "Bad scheme in URI"
+msgstr ""
+
 msgid "Bad subscription ID"
 msgstr ""
 
-#: cups/ppd.c:360
+msgid "Bad username in URI"
+msgstr ""
+
 msgid "Bad value string"
 msgstr ""
 
-#: cgi-bin/admin.c:3290 cgi-bin/admin.c:3536
+msgid "Bad/empty URI"
+msgstr ""
+
 msgid "Banners"
 msgstr "Banery"
 
-#: ppdc/sample.c:287
 msgid "Bond Paper"
 msgstr "Kancelářský papír"
 
-#: backend/usb-darwin.c:1846
 #, c-format
 msgid "Boolean expected for waiteof option \"%s\"."
 msgstr ""
 
-#: filter/pstops.c:2057
 msgid "Buffer overflow detected, aborting."
 msgstr ""
 
-#: ppdc/sample.c:254
 msgid "CMYK"
 msgstr "CMYK"
 
-#: ppdc/sample.c:363
 msgid "CPCL Label Printer"
 msgstr "Tiskárna štítků CPCL"
 
-#: cgi-bin/admin.c:1485 cgi-bin/admin.c:1524 cgi-bin/admin.c:1534
+msgid "Cancel Jobs"
+msgstr ""
+
 msgid "Cancel RSS Subscription"
 msgstr "Zrušit RSS předplatné"
 
-#: backend/ipp.c:1921
 msgid "Canceling print job."
 msgstr ""
 
-#: scheduler/ipp.c:2475
 msgid "Cannot share a remote Kerberized printer."
 msgstr ""
 
-#: ppdc/sample.c:279
 msgid "Cassette"
 msgstr ""
 
-#: cgi-bin/admin.c:1655 cgi-bin/admin.c:1797 cgi-bin/admin.c:1810
-#: cgi-bin/admin.c:1821
 msgid "Change Settings"
 msgstr "Změna nastavení"
 
-#: scheduler/ipp.c:2061 scheduler/ipp.c:5634
 #, c-format
 msgid "Character set \"%s\" not supported."
 msgstr ""
 
-#: cgi-bin/classes.c:195 cgi-bin/classes.c:322
 msgid "Classes"
 msgstr "Třídy"
 
-#: cgi-bin/printers.c:182
 msgid "Clean Print Heads"
 msgstr "Vyčištění tiskových hlav"
 
-#: scheduler/ipp.c:3878
 msgid "Close-Job doesn't support the job-uri attribute."
 msgstr ""
 
-#: ppdc/sample.c:282
 msgid "Color"
 msgstr "Barva"
 
-#: ppdc/sample.c:253
 msgid "Color Mode"
 msgstr "Barevný režim"
 
-#: berkeley/lpc.c:204
 msgid ""
 "Commands may be abbreviated.  Commands are:\n"
 "\n"
 "exit    help    quit    status  ?"
 msgstr ""
 
-#: cups/snmp.c:1006
 msgid "Community name uses indefinite length"
 msgstr "\"Community-Name\" má neomezenou délku"
 
-#: backend/ipp.c:786 backend/lpd.c:871 backend/socket.c:395
 msgid "Connected to printer."
 msgstr ""
 
-#: backend/ipp.c:691 backend/lpd.c:694 backend/socket.c:314
 msgid "Connecting to printer."
 msgstr ""
 
-#: cups/http-support.c:1272
 msgid "Continue"
 msgstr "Pokračovat"
 
-#: ppdc/sample.c:365
 msgid "Continuous"
 msgstr "Souvislý"
 
-#: backend/lpd.c:1020 backend/lpd.c:1152
 msgid "Control file sent successfully."
 msgstr ""
 
-#: backend/ipp.c:1233 backend/lpd.c:464
 msgid "Copying print data."
 msgstr ""
 
-#: cups/http-support.c:1281
 msgid "Created"
 msgstr "Vytvořeno"
 
-#: cups/ppd.c:1113 cups/ppd.c:1153 cups/ppd.c:1398 cups/ppd.c:1501
 msgid "Custom"
 msgstr "Uživatelský"
 
-#: ppdc/sample.c:359
 msgid "CustominCutInterval"
 msgstr "CustominCutInterval"
 
-#: ppdc/sample.c:357
 msgid "CustominTearInterval"
 msgstr "CustominTearInterval"
 
-#: ppdc/sample.c:343
 msgid "Cut"
 msgstr "Snížit"
 
-#: ppdc/sample.c:451
 msgid "Cutter"
 msgstr "Výstřižek"
 
-#: ppdc/sample.c:239
 msgid "Dark"
 msgstr "Tmavý"
 
-#: ppdc/sample.c:235
 msgid "Darkness"
 msgstr "Tma"
 
-#: backend/lpd.c:1105
 msgid "Data file sent successfully."
 msgstr ""
 
-#: cgi-bin/admin.c:2094 cgi-bin/admin.c:2105 cgi-bin/admin.c:2150
 msgid "Delete Class"
 msgstr "Výmaz třídy"
 
-#: cgi-bin/admin.c:2179 cgi-bin/admin.c:2190 cgi-bin/admin.c:2235
 msgid "Delete Printer"
 msgstr "Výmaz tiskárny"
 
-#: ppdc/sample.c:281
 msgid "DeskJet Series"
 msgstr "Řada DeskJet"
 
-#: scheduler/ipp.c:1346
 #, c-format
 msgid "Destination \"%s\" is not accepting jobs."
 msgstr "Zařízení \"%s\" nepřijímá úlohy."
 
-#: systemv/lpinfo.c:300
 #, c-format
 msgid ""
 "Device: uri = %s\n"
@@ -3053,934 +2805,725 @@ msgid ""
 "        location = %s"
 msgstr ""
 
-#: ppdc/sample.c:436
 msgid "Direct Thermal Media"
 msgstr "Termální médium"
 
-#: cups/file.c:296
 #, c-format
 msgid "Directory \"%s\" contains a relative path."
 msgstr ""
 
-#: cups/file.c:268
 #, c-format
 msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
 msgstr ""
 
-#: cups/file.c:285
 #, c-format
 msgid "Directory \"%s\" is a file."
 msgstr ""
 
-#: cups/file.c:256
 #, c-format
 msgid "Directory \"%s\" not available: %s"
 msgstr ""
 
-#: cups/file.c:241
 #, c-format
 msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
 msgstr ""
 
-#: ppdc/sample.c:345
 msgid "Disabled"
 msgstr "Zakázaný"
 
-#: scheduler/ipp.c:6127
 #, c-format
 msgid "Document #%d does not exist in job #%d."
 msgstr ""
 
-#: ppdc/sample.c:275
 msgid "Duplexer"
 msgstr "Duplexní jednotka"
 
-#: ppdc/sample.c:229
 msgid "Dymo"
 msgstr "Dymo"
 
-#: ppdc/sample.c:431
 msgid "EPL1 Label Printer"
 msgstr "Tiskárna štítků EPL1"
 
-#: ppdc/sample.c:434
 msgid "EPL2 Label Printer"
 msgstr "Tiskárna štítků EPL2"
 
-#: cgi-bin/admin.c:1849 cgi-bin/admin.c:1861 cgi-bin/admin.c:1915
-#: cgi-bin/admin.c:1922 cgi-bin/admin.c:1957 cgi-bin/admin.c:1970
-#: cgi-bin/admin.c:1994 cgi-bin/admin.c:2067
 msgid "Edit Configuration File"
 msgstr "Úprava konfiguračního souboru"
 
-#: cups/adminutil.c:337
 msgid "Empty PPD file."
 msgstr ""
 
+msgid "Encryption is not supported."
+msgstr ""
+
 #. TRANSLATORS: Banner/cover sheet after the print job.
-#: cgi-bin/admin.c:3561
 msgid "Ending Banner"
 msgstr "Ukončení baneru"
 
-#: ppdc/sample.c:2
 msgid "English"
 msgstr "Čeština"
 
-#: systemv/lppasswd.c:193
-msgid "Enter old password:"
-msgstr "Zadejte původní heslo:"
-
-#: systemv/lppasswd.c:224
-msgid "Enter password again:"
-msgstr "Opakujte heslo:"
-
-#: systemv/lppasswd.c:212
-msgid "Enter password:"
-msgstr "Zadejte heslo:"
-
-#: scheduler/client.c:2427
-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 ""
+"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."
 
-#: 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:269
 msgid "Envelope Feed"
 msgstr "Podavač obálek"
 
-#: 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 ""
 
-#: ppdc/sample.c:240
+msgid "Environment Variables:"
+msgstr ""
+
 msgid "Epson"
 msgstr "Epson"
 
-#: cgi-bin/admin.c:3604
 msgid "Error Policy"
 msgstr "Chování při chybě"
 
-#: filter/rastertopwg.c:403 filter/rastertopwg.c:418 filter/rastertopwg.c:429
-#: filter/rastertopwg.c:440
+msgid "Error reading raster data."
+msgstr ""
+
 msgid "Error sending raster data."
 msgstr ""
 
-#: systemv/lpinfo.c:103 systemv/lpmove.c:88
 msgid "Error: need hostname after \"-h\" option."
 msgstr ""
 
-#: ppdc/sample.c:355
 msgid "Every 10 Labels"
 msgstr "Každých 10 štítků"
 
-#: ppdc/sample.c:347
 msgid "Every 2 Labels"
 msgstr "Každé 2 štítky"
 
-#: ppdc/sample.c:348
 msgid "Every 3 Labels"
 msgstr "Každé 3 štítky"
 
-#: ppdc/sample.c:349
 msgid "Every 4 Labels"
 msgstr "Každé 4 štítky"
 
-#: ppdc/sample.c:350
 msgid "Every 5 Labels"
 msgstr "Každých 5 štítků"
 
-#: ppdc/sample.c:351
 msgid "Every 6 Labels"
 msgstr "Každých 6 štítků"
 
-#: ppdc/sample.c:352
 msgid "Every 7 Labels"
 msgstr "Každých 7 štítků"
 
-#: ppdc/sample.c:353
 msgid "Every 8 Labels"
 msgstr "Každých 8 štítků"
 
-#: ppdc/sample.c:354
 msgid "Every 9 Labels"
 msgstr "Každých 9 štítků"
 
-#: ppdc/sample.c:346
 msgid "Every Label"
 msgstr "Každý štítek"
 
-#: ppdc/sample.c:121
 msgid "Executive"
 msgstr ""
 
-#: cups/http-support.c:1327
 msgid "Expectation Failed"
 msgstr "Očekávané údaje jsou neplatné"
 
-#: cgi-bin/admin.c:2356 cgi-bin/admin.c:2375
 msgid "Export Printers to Samba"
 msgstr "Export tiskáren do Samby"
 
-#: systemv/cupstestdsc.c:172 systemv/cupstestdsc.c:189
-#: systemv/cupstestdsc.c:214 systemv/cupstestdsc.c:231
-#: systemv/cupstestdsc.c:255 systemv/cupstestdsc.c:273
-#: systemv/cupstestdsc.c:302 systemv/cupstestdsc.c:339
-#: systemv/cupstestdsc.c:349 systemv/cupstestdsc.c:359
-#: systemv/cupstestdsc.c:369 systemv/cupstestdsc.c:379
-#: systemv/cupstestdsc.c:387
+msgid "Expressions:"
+msgstr ""
+
 msgid "FAIL"
 msgstr ""
 
-#: ppdc/sample.c:122
 msgid "FanFold German"
 msgstr ""
 
-#: ppdc/sample.c:123
 msgid "FanFold Legal German"
 msgstr ""
 
-#: ppdc/sample.c:124
 msgid "Fanfold US"
 msgstr ""
 
-#: cups/file.c:300
 #, c-format
 msgid "File \"%s\" contains a relative path."
 msgstr ""
 
-#: cups/file.c:275
 #, c-format
 msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
 msgstr ""
 
-#: cups/file.c:289
 #, c-format
 msgid "File \"%s\" is a directory."
 msgstr ""
 
-#: cups/file.c:261
 #, c-format
 msgid "File \"%s\" not available: %s"
 msgstr ""
 
-#: cups/file.c:247
 #, c-format
 msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
 msgstr ""
 
-#: ppdc/sample.c:169
 msgid "File Folder "
 msgstr "Složka souborů "
 
-#: scheduler/ipp.c:2370
 #, c-format
-msgid "File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cupsd.conf\"."
+msgid ""
+"File device URIs have been disabled. To enable, see the FileDevice directive "
+"in \"%s/cups-files.conf\"."
 msgstr ""
 
-#: filter/rastertoepson.c:1117 filter/rastertohp.c:845
-#: filter/rastertolabel.c:1273
 #, c-format
 msgid "Finished page %d."
 msgstr ""
 
-#: ppdc/sample.c:125
 msgid "Folio"
 msgstr "Fólie"
 
-#: cups/http-support.c:1306
 msgid "Forbidden"
 msgstr "Zakázaný"
 
-#: cups/ppd.c:742 cups/ppd.c:1302
 msgid "General"
 msgstr "Obecný"
 
-#: ppdc/sample.c:259
 msgid "Generic"
 msgstr "Obecný"
 
-#: cups/snmp.c:1016
 msgid "Get-Response-PDU uses indefinite length"
 msgstr "\"Get-Response-PDU\" má neomezenou délku"
 
-#: ppdc/sample.c:290
 msgid "Glossy Paper"
 msgstr "Lesklý papír"
 
-#: scheduler/ipp.c:2952 scheduler/ipp.c:3352 scheduler/ipp.c:3890
-#: scheduler/ipp.c:6056 scheduler/ipp.c:6203 scheduler/ipp.c:7635
-#: scheduler/ipp.c:8753 scheduler/ipp.c:8979 scheduler/ipp.c:9328
-#: scheduler/ipp.c:9931
 msgid "Got a printer-uri attribute but no job-id."
 msgstr ""
 
-#: ppdc/sample.c:255
 msgid "Grayscale"
 msgstr "Stupně šedi"
 
-#: ppdc/sample.c:280
 msgid "HP"
 msgstr "HP"
 
-#: ppdc/sample.c:170
 msgid "Hanging Folder"
 msgstr "Závěsná složka"
 
-#: cgi-bin/help.c:143
 msgid "Help file not in index."
 msgstr ""
 
-#: cups/ipp.c:2687 cups/ipp.c:2714 cups/ipp.c:2737
 msgid "IPP 1setOf attribute with incompatible value tags."
 msgstr ""
 
-#: cups/ipp.c:2650
 msgid "IPP attribute has no name."
 msgstr ""
 
-#: cups/ipp.c:5487
 msgid "IPP attribute is not a member of the message."
 msgstr ""
 
-#: cups/ipp.c:3083
 msgid "IPP begCollection value not 0 bytes."
 msgstr ""
 
-#: cups/ipp.c:2873
 msgid "IPP boolean value not 1 byte."
 msgstr ""
 
-#: cups/ipp.c:2934
 msgid "IPP date value not 11 bytes."
 msgstr ""
 
-#: cups/ipp.c:3104
 msgid "IPP endCollection value not 0 bytes."
 msgstr ""
 
-#: cups/ipp.c:2848
 msgid "IPP enum value not 4 bytes."
 msgstr ""
 
-#: cups/ipp.c:2579
 msgid "IPP extension tag larger than 0x7FFFFFFF."
 msgstr ""
 
-#: cups/ipp.c:2845
 msgid "IPP integer value not 4 bytes."
 msgstr ""
 
-#: cups/ipp.c:3045
 msgid "IPP language length overflows value."
 msgstr ""
 
-#: cups/ipp.c:2764
+msgid "IPP language length too large."
+msgstr ""
+
 msgid "IPP member name is not empty."
 msgstr ""
 
-#: cups/ipp.c:3122
 msgid "IPP memberName value is empty."
 msgstr ""
 
-#: cups/ipp.c:2633
+msgid "IPP memberName with no attribute."
+msgstr ""
+
 msgid "IPP name larger than 32767 bytes."
 msgstr ""
 
-#: cups/ipp.c:3011
 msgid "IPP nameWithLanguage value less than minimum 4 bytes."
 msgstr ""
 
-#: cups/ipp.c:2979
+msgid "IPP octetString length too large."
+msgstr ""
+
 msgid "IPP rangeOfInteger value not 8 bytes."
 msgstr ""
 
-#: cups/ipp.c:2952
 msgid "IPP resolution value not 9 bytes."
 msgstr ""
 
-#: cups/ipp.c:3063
 msgid "IPP string length overflows value."
 msgstr ""
 
-#: cups/ipp.c:3007
 msgid "IPP textWithLanguage value less than minimum 4 bytes."
 msgstr ""
 
-#: cups/ipp.c:2831
 msgid "IPP value larger than 32767 bytes."
 msgstr ""
 
-#: ppdc/sample.c:1
 msgid "ISOLatin1"
 msgstr "ISOLatin1"
 
-#: cups/ppd.c:353
 msgid "Illegal control character"
 msgstr "Neplatný řídící znak"
 
-#: cups/ppd.c:354
 msgid "Illegal main keyword string"
 msgstr "Neplatné hlavní klíčové slovo řetězce"
 
-#: cups/ppd.c:355
 msgid "Illegal option keyword string"
 msgstr "Neplatná volba klíčového slova řetězce"
 
-#: cups/ppd.c:356
 msgid "Illegal translation string"
 msgstr "Neplatný překlad řetězce"
 
-#: cups/ppd.c:357
 msgid "Illegal whitespace character"
 msgstr "Nedovolený prázdný znak"
 
-#: ppdc/sample.c:274
 msgid "Installable Options"
 msgstr "Možnosti instalace"
 
-#: ppdc/sample.c:277
 msgid "Installed"
 msgstr "Instalovaný"
 
-#: ppdc/sample.c:293
 msgid "IntelliBar Label Printer"
 msgstr "Tiskárna štítků \"IntelliBar\""
 
-#: ppdc/sample.c:292
 msgid "Intellitech"
 msgstr "Intellitech"
 
-#: cups/http-support.c:1333
 msgid "Internal Server Error"
 msgstr ""
 
-#: cups/ppd.c:344
 msgid "Internal error"
 msgstr "Vniřní chyba"
 
-#: ppdc/sample.c:167
 msgid "Internet Postage 2-Part"
 msgstr "Internet Postage 2-Part"
 
-#: ppdc/sample.c:168
 msgid "Internet Postage 3-Part"
 msgstr "Internet Postage 3-Part"
 
-#: backend/ipp.c:307
 msgid "Internet Printing Protocol"
 msgstr "Internetový tiskový protokol"
 
-#: cups/dest-options.c:839
+msgid "Invalid media name arguments."
+msgstr ""
+
 msgid "Invalid media size."
 msgstr ""
 
-#: filter/commandtops.c:125
 #, c-format
 msgid "Invalid printer command \"%s\"."
 msgstr ""
 
-#: cups/ppd.c:1420
 msgid "JCL"
 msgstr "JCL"
 
-#: 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:9051
 #, c-format
 msgid "Job #%d cannot be restarted - no files."
 msgstr ""
 
-#: scheduler/ipp.c:2992 scheduler/ipp.c:3222 scheduler/ipp.c:3277
-#: scheduler/ipp.c:3454 scheduler/ipp.c:3900 scheduler/ipp.c:5720
-#: scheduler/ipp.c:6096 scheduler/ipp.c:6243 scheduler/ipp.c:6543
-#: scheduler/ipp.c:7482 scheduler/ipp.c:7504 scheduler/ipp.c:7676
-#: scheduler/ipp.c:7901 scheduler/ipp.c:7944 scheduler/ipp.c:8793
-#: scheduler/ipp.c:9019 scheduler/ipp.c:9368 scheduler/ipp.c:9971
 #, c-format
 msgid "Job #%d does not exist."
 msgstr ""
 
-#: scheduler/ipp.c:3486
 #, c-format
 msgid "Job #%d is already aborted - can't cancel."
 msgstr "Úloha #%d je již zrušena - nelze zrušit."
 
-#: scheduler/ipp.c:3480
 #, c-format
 msgid "Job #%d is already canceled - can't cancel."
 msgstr "Úloha #%d je již zrušena - nelze zrušit."
 
-#: scheduler/ipp.c:3492
 #, c-format
 msgid "Job #%d is already completed - can't cancel."
 msgstr "Úloha #%d je již dokončena - nelze zrušit."
 
-#: scheduler/ipp.c:7702 scheduler/ipp.c:7986 scheduler/ipp.c:9986
 #, c-format
 msgid "Job #%d is finished and cannot be altered."
 msgstr ""
 
-#: scheduler/ipp.c:9033
 #, c-format
 msgid "Job #%d is not complete."
 msgstr ""
 
-#: scheduler/ipp.c:3007
 #, c-format
 msgid "Job #%d is not held for authentication."
 msgstr ""
 
-#: scheduler/ipp.c:8807
 #, c-format
 msgid "Job #%d is not held."
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1055
 msgid "Job Completed"
 msgstr "Úloha dokončena"
 
-#: cgi-bin/ipp-var.c:1053
 msgid "Job Created"
 msgstr "Úloha vytvořena"
 
-#: cgi-bin/ipp-var.c:1059
 msgid "Job Options Changed"
 msgstr "Změna parametrů úlohy"
 
-#: cgi-bin/ipp-var.c:1057
 msgid "Job Stopped"
 msgstr "Úloha zastavena"
 
-#: scheduler/ipp.c:10068
 msgid "Job is completed and cannot be changed."
 msgstr "Úloha je dokončena a nelze ji změnit."
 
-#: cgi-bin/jobs.c:198
 msgid "Job operation failed"
 msgstr "Úloha se nezdařila"
 
-#: scheduler/ipp.c:10104 scheduler/ipp.c:10123 scheduler/ipp.c:10134
 msgid "Job state cannot be changed."
 msgstr "Stav úlohy nelze změnit."
 
-#: scheduler/ipp.c:8899
 msgid "Job subscriptions cannot be renewed."
 msgstr ""
 
-#: cgi-bin/jobs.c:103 cgi-bin/jobs.c:114 cgi-bin/jobs.c:195
 msgid "Jobs"
 msgstr "Úlohy"
 
-#: backend/lpd.c:185
 msgid "LPD/LPR Host or Printer"
 msgstr "LPD/LPR hostitel nebo tiskárna"
 
-#: ppdc/sample.c:230
 msgid "Label Printer"
 msgstr "Tiskárna štítků"
 
-#: ppdc/sample.c:446
 msgid "Label Top"
 msgstr "Horní štítek"
 
-#: scheduler/ipp.c:2070 scheduler/ipp.c:5643
 #, c-format
 msgid "Language \"%s\" not supported."
 msgstr ""
 
-#: ppdc/sample.c:164
 msgid "Large Address"
 msgstr "Plná adresa"
 
-#: ppdc/sample.c:291
 msgid "LaserJet Series PCL 4/5"
 msgstr "LaserJet Serie PCL 4/5"
 
-#: 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 "Světlý"
 
-#: cups/ppd.c:352
 msgid "Line longer than the maximum allowed (255 characters)"
 msgstr "Řádek je delší než maximální povolená velikost (255 znaků)"
 
-#: cgi-bin/admin.c:2393
 msgid "List Available Printers"
 msgstr "Seznam dostupných tiskáren"
 
-#: ppdc/sample.c:272
+msgid "Load paper."
+msgstr ""
+
 msgid "Long-Edge (Portrait)"
 msgstr "Delší okraj (na výšku)"
 
-#: cups/http-support.c:1558
-msgid "Looking for printer."
+msgid "Looking for printer..."
 msgstr ""
 
-#: ppdc/sample.c:268
 msgid "Manual Feed"
 msgstr "Ruční podávání"
 
-#: cups/ppd.c:789 cups/ppd.c:1357
 msgid "Media Size"
 msgstr "Velikost média"
 
-#: cups/ppd.c:793 cups/ppd.c:1361 ppdc/sample.c:262
 msgid "Media Source"
 msgstr "Zdroj média"
 
-#: ppdc/sample.c:364
 msgid "Media Tracking"
 msgstr "Sledování média"
 
-#: cups/ppd.c:791 cups/ppd.c:1359 ppdc/sample.c:285
 msgid "Media Type"
 msgstr "Typ média"
 
-#: ppdc/sample.c:237
 msgid "Medium"
 msgstr "Střední"
 
-#: cups/ppd.c:341
 msgid "Memory allocation error"
 msgstr "Chyba přidělení paměti"
 
-#: cups/ppd.c:361
 msgid "Missing CloseGroup"
 msgstr ""
 
-#: cups/ppd.c:342
 msgid "Missing PPD-Adobe-4.x header"
 msgstr "Chybějící záhlaví PPD-Adobe-4.x"
 
-#: cups/ppd.c:351
 msgid "Missing asterisk in column 1"
 msgstr "Chybí hvězdička ve sloupci 1"
 
-#: scheduler/ipp.c:6119
 msgid "Missing document-number attribute."
 msgstr ""
 
-#: cups/adminutil.c:273
 #, c-format
 msgid "Missing double quote on line %d."
 msgstr ""
 
-#: cgi-bin/admin.c:736 cgi-bin/admin.c:2106 cgi-bin/admin.c:2191
-#: cgi-bin/admin.c:2785 cgi-bin/admin.c:3039 cgi-bin/admin.c:3150
-#: cgi-bin/admin.c:3860
 msgid "Missing form variable"
 msgstr ""
 
-#: scheduler/ipp.c:9422
 msgid "Missing last-document attribute in request."
 msgstr ""
 
-#: cups/pwg-media.c:535
 msgid "Missing media or media-col."
 msgstr ""
 
-#: cups/pwg-media.c:454
 msgid "Missing media-size in media-col."
 msgstr ""
 
-#: scheduler/ipp.c:6673
 msgid "Missing notify-subscription-ids attribute."
 msgstr ""
 
-#: cups/ppd.c:359
 msgid "Missing option keyword"
 msgstr ""
 
-#: scheduler/ipp.c:3133 scheduler/ipp.c:3158
 msgid "Missing requesting-user-name attribute."
 msgstr ""
 
-#: scheduler/ipp.c:461
-msgid "Missing required attributes."
+msgid "Missing required attributes."
+msgstr ""
+
+msgid "Missing resource in URI"
+msgstr ""
+
+msgid "Missing scheme in URI"
 msgstr ""
 
-#: cups/adminutil.c:254
 #, c-format
 msgid "Missing value on line %d."
 msgstr ""
 
-#: cups/ppd.c:343
 msgid "Missing value string"
 msgstr "Chybí hodnota řetězce"
 
-#: cups/pwg-media.c:442
 msgid "Missing x-dimension in media-size."
 msgstr ""
 
-#: cups/pwg-media.c:448
 msgid "Missing y-dimension in media-size."
 msgstr ""
 
-#: systemv/lpinfo.c:470
 #, c-format
 msgid ""
 "Model:  name = %s\n"
@@ -3989,1520 +3532,1181 @@ msgid ""
 "        device-id = %s"
 msgstr ""
 
-#: cgi-bin/admin.c:570
+msgid "Modifiers:"
+msgstr ""
+
 msgid "Modify Class"
 msgstr "Úprava třídy"
 
-#: cgi-bin/admin.c:882
 msgid "Modify Printer"
 msgstr "Úprava tiskárny"
 
-#: cgi-bin/ipp-var.c:425 cgi-bin/ipp-var.c:516
 msgid "Move All Jobs"
 msgstr "Přesun všech úloh"
 
-#: cgi-bin/ipp-var.c:364 cgi-bin/ipp-var.c:423 cgi-bin/ipp-var.c:514
 msgid "Move Job"
 msgstr "Přesun úlohy"
 
-#: cups/http-support.c:1290
 msgid "Moved Permanently"
 msgstr "Trvale přesunuto"
 
-#: cups/ppd.c:340
 msgid "NULL PPD file pointer"
 msgstr "Prázdný ukazatel PPD souboru"
 
-#: cups/snmp.c:1053
 msgid "Name OID uses indefinite length"
 msgstr "Název \"OID\" má neomezenou délku"
 
-#: scheduler/ipp.c:1142
 msgid "Nested classes are not allowed."
 msgstr ""
 
-#: ppdc/sample.c:430
 msgid "Never"
 msgstr "Nikdy"
 
-#: ppdc/sample.c:256
-msgid "New Stylus Color Series"
-msgstr "New Stylus Color Series"
-
-#: ppdc/sample.c:258
-msgid "New Stylus Photo Series"
-msgstr "New Stylus Photo Series"
-
-#: cups/ppd.c:1949
 msgid "No"
 msgstr "Ne"
 
-#: cups/http-support.c:1287
 msgid "No Content"
 msgstr "Žádný obsah"
 
-#: cups/util.c:1298
 msgid "No PPD name"
 msgstr ""
 
-#: cups/snmp.c:1047
 msgid "No VarBind SEQUENCE"
 msgstr "Žádná VarBind SEQUENCE"
 
-#: cups/adminutil.c:788
 msgid "No Windows printer drivers are installed."
 msgstr ""
 
-#: cups/request.c:566 cups/request.c:908
 msgid "No active connection"
 msgstr "Není aktivní spojení"
 
-#: scheduler/ipp.c:3403
+msgid "No active connection."
+msgstr ""
+
 #, c-format
 msgid "No active jobs on %s."
 msgstr ""
 
-#: scheduler/ipp.c:302
 msgid "No attributes in request."
 msgstr ""
 
-#: scheduler/ipp.c:3034
 msgid "No authentication information provided."
 msgstr ""
 
-#: cups/snmp.c:1004
 msgid "No community name"
 msgstr "Žádný název komunity"
 
-#: scheduler/ipp.c:5919
 msgid "No default printer."
 msgstr ""
 
-#: cgi-bin/ipp-var.c:436 scheduler/ipp.c:7248
 msgid "No destinations added."
 msgstr "Zařízení nepřidáno."
 
-#: backend/usb.c:200
 msgid "No device URI found in argv[0] or in DEVICE_URI environment variable."
 msgstr ""
 
-#: cups/snmp.c:1034
 msgid "No error-index"
 msgstr "Žádný \"error-index\""
 
-#: cups/snmp.c:1026
 msgid "No error-status"
 msgstr "Žádný \"error-status\""
 
-#: scheduler/ipp.c:8190 scheduler/ipp.c:9436
 msgid "No file in print request."
 msgstr ""
 
-#: cups/util.c:923
 msgid "No modification time"
 msgstr ""
 
-#: cups/snmp.c:1051
 msgid "No name OID"
 msgstr "Žádný název OID"
 
-#: filter/rastertoepson.c:1147 filter/rastertohp.c:876
-#: filter/rastertolabel.c:1302
 msgid "No pages were found."
 msgstr ""
 
-#: cups/util.c:917
 msgid "No printer name"
 msgstr ""
 
-#: cups/util.c:1801
 msgid "No printer-uri found"
 msgstr ""
 
-#: cups/util.c:1786
 msgid "No printer-uri found for class"
 msgstr ""
 
-#: scheduler/ipp.c:6322
 msgid "No printer-uri in request."
 msgstr ""
 
-#: cups/snmp.c:1018
+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"
 
-#: scheduler/ipp.c:5528
 msgid "No subscription attributes in request."
 msgstr ""
 
-#: scheduler/ipp.c:7575
 msgid "No subscriptions found."
 msgstr "Nenalezeno předplatné."
 
-#: cups/snmp.c:1042
 msgid "No variable-bindings SEQUENCE"
 msgstr "Žádná \"variable-bindings\" SEQUENCE"
 
-#: cups/snmp.c:997
 msgid "No version number"
 msgstr "Není číslo verze"
 
-#: ppdc/sample.c:367
 msgid "Non-continuous (Mark sensing)"
 msgstr "Není souvislý (Mark Sensing)"
 
-#: ppdc/sample.c:366
 msgid "Non-continuous (Web sensing)"
 msgstr "Není souvislý (Web Sensing)"
 
-#: ppdc/sample.c:238
 msgid "Normal"
 msgstr "Normální"
 
-#: cups/http-support.c:1309
 msgid "Not Found"
 msgstr "Nebyl nalezen"
 
-#: cups/http-support.c:1321
 msgid "Not Implemented"
 msgstr "Nerealizováno"
 
-#: ppdc/sample.c:276
 msgid "Not Installed"
 msgstr "Nenainstalováno"
 
-#: cups/http-support.c:1296
 msgid "Not Modified"
 msgstr "Nezměněno"
 
-#: cups/http-support.c:1324
 msgid "Not Supported"
 msgstr "Nepodporováno"
 
-#: scheduler/ipp.c:1518 scheduler/ipp.c:10666
 msgid "Not allowed to print."
 msgstr "Není povoleno tisknout."
 
-#: ppdc/sample.c:146
 msgid "Note"
 msgstr "Poznámka"
 
-#: systemv/cupstestdsc.c:433
-msgid "Note: this program only validates the DSC comments, not the PostScript itself."
+msgid ""
+"Note: this program only validates the DSC comments, not the PostScript "
+"itself."
 msgstr ""
 
-#: cups/http-support.c:1278 cups/ppd.c:338
 msgid "OK"
 msgstr "OK"
 
-#: ppdc/sample.c:271
 msgid "Off (1-Sided)"
 msgstr "Vypnuto (jednostranný)"
 
-#: ppdc/sample.c:361
 msgid "Oki"
 msgstr "Oki"
 
-#: cgi-bin/help.c:91 cgi-bin/help.c:132 cgi-bin/help.c:142 cgi-bin/help.c:172
 msgid "Online Help"
 msgstr "Nápověda"
 
-#: cups/adminutil.c:955
 #, c-format
 msgid "Open of %s failed: %s"
 msgstr "Otevření %s selhalo: %s"
 
-#: cups/ppd.c:346
 msgid "OpenGroup without a CloseGroup first"
 msgstr "Opengroup nepředcházelo CloseGroup"
 
-#: cups/ppd.c:348
 msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"
 msgstr "OpenUI/JCLOpenUI nepředcházelo CloseUI/JCLCloseUI"
 
-#: cgi-bin/admin.c:3631
 msgid "Operation Policy"
 msgstr "Způsob ověření"
 
-#: filter/pstops.c:2205
 #, c-format
 msgid "Option \"%s\" cannot be included via %%%%IncludeFeature."
 msgstr ""
 
-#: cgi-bin/admin.c:3281 cgi-bin/admin.c:3365
 msgid "Options Installed"
 msgstr "Instalované možnosti"
 
-#: scheduler/cupsfilter.c:1430 scheduler/main.c:2018 systemv/cupsaddsmb.c:284
-#: systemv/cupsctl.c:203 systemv/cupstestdsc.c:429 systemv/cupstestppd.c:3797
-#: test/ipptool.c:4403 ppdc/ppdc.cxx:437 ppdc/ppdhtml.cxx:174
-#: ppdc/ppdi.cxx:130 ppdc/ppdmerge.cxx:369 ppdc/ppdpo.cxx:254
 msgid "Options:"
 msgstr ""
 
-#: cups/ppd-cache.c:156
 msgid "Out of date PPD cache file."
 msgstr ""
 
-#: cups/ppd-cache.c:1381
 msgid "Out of memory."
 msgstr ""
 
-#: cups/ppd.c:795 cups/ppd.c:1363
 msgid "Output Mode"
 msgstr "Výstupní režim"
 
-#: systemv/lpstat.c:1191 systemv/lpstat.c:1195
-#, c-format
-msgid "Output for printer %s is sent to %s"
-msgstr ""
-
-#: systemv/lpstat.c:1185
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
+msgid "Output bin is almost full."
 msgstr ""
 
-#: systemv/lpstat.c:1209 systemv/lpstat.c:1213
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
+msgid "Output bin is full."
 msgstr ""
 
-#: systemv/lpstat.c:1203
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+msgid "Output bin is missing."
 msgstr ""
 
-#: systemv/cupstestdsc.c:399
 msgid "PASS"
 msgstr ""
 
-#: ppdc/sample.c:260
 msgid "PCL Laser Printer"
 msgstr "PCL laserová tiskárna"
 
-#: ppdc/sample.c:149
 msgid "PRC16K"
 msgstr "PRC16K"
 
-#: ppdc/sample.c:150
 msgid "PRC16K Long Edge"
 msgstr ""
 
-#: ppdc/sample.c:151
 msgid "PRC32K"
 msgstr "PRC32K"
 
-#: 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/snmp.c:1014
 msgid "Packet does not contain a Get-Response-PDU"
 msgstr "Packet neobsahuje \"Get-Response-PDU\""
 
-#: cups/snmp.c:993
 msgid "Packet does not start with SEQUENCE"
 msgstr "Paket nezačíná SEQUENCÍ"
 
-#: ppdc/sample.c:360
+msgid "Paper jam."
+msgstr ""
+
+msgid "Paper tray is almost empty."
+msgstr ""
+
+msgid "Paper tray is empty."
+msgstr ""
+
+msgid "Paper tray is missing."
+msgstr ""
+
 msgid "ParamCustominCutInterval"
 msgstr "ParamCustominCutInterval"
 
-#: ppdc/sample.c:358
 msgid "ParamCustominTearInterval"
 msgstr "ParamCustominTearInterval"
 
-#: cups/auth.c:199 cups/auth.c:367
 #, c-format
 msgid "Password for %s on %s? "
 msgstr "Heslo pro %s na %s? "
 
-#: systemv/cupsaddsmb.c:252
 #, c-format
 msgid "Password for %s required to access %s via SAMBA: "
 msgstr "Heslo pro %s je vyžadováno pro přístup k %s přes Sambu: "
 
-#: cgi-bin/classes.c:167
 msgid "Pause Class"
 msgstr "Pozastavení třídy"
 
-#: cgi-bin/printers.c:170
 msgid "Pause Printer"
 msgstr "Pozastavení tiskárny"
 
-#: ppdc/sample.c:448
 msgid "Peel-Off"
 msgstr "Peel-Off"
 
-#: ppdc/sample.c:160
 msgid "Photo"
 msgstr "Fotografie"
 
-#: ppdc/sample.c:161
 msgid "Photo Labels"
 msgstr "Foto-samolepky"
 
-#: ppdc/sample.c:286
 msgid "Plain Paper"
 msgstr "Obyčejný papír"
 
-#: cgi-bin/admin.c:3299 cgi-bin/admin.c:3580
 msgid "Policies"
 msgstr "Pravidla"
 
-#: cgi-bin/admin.c:3306 cgi-bin/admin.c:3649 cgi-bin/admin.c:3662
 msgid "Port Monitor"
 msgstr "Monitorování portu"
 
-#: ppdc/sample.c:278
 msgid "PostScript Printer"
 msgstr "PostScriptová tiskárna"
 
-#: ppdc/sample.c:147
 msgid "Postcard"
 msgstr "Pohlednice"
 
-#: 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 ""
 
-#: ppdc/sample.c:295
+msgid "Preparing to print."
+msgstr ""
+
 msgid "Print Density"
 msgstr "Hustota tisku"
 
-#: cups/notify.c:82
 msgid "Print Job:"
 msgstr "Tisk úlohy:"
 
-#: ppdc/sample.c:340
 msgid "Print Mode"
 msgstr "Režim tisku"
 
-#: ppdc/sample.c:383
 msgid "Print Rate"
 msgstr "Kvalita tisku"
 
-#: cgi-bin/printers.c:179
 msgid "Print Self-Test Page"
 msgstr "Tisk \"self-test\" stránky"
 
-#: ppdc/sample.c:327
 msgid "Print Speed"
 msgstr "Rychlost tisku"
 
-#: cgi-bin/ipp-var.c:792
 msgid "Print Test Page"
 msgstr "Tisk zkušební stránky"
 
-#: ppdc/sample.c:356
 msgid "Print and Cut"
 msgstr "Tisk a vyjmout"
 
-#: ppdc/sample.c:344
 msgid "Print and Tear"
 msgstr "Tisk a odtrhnout"
 
-#: backend/ipp.c:1537
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr ""
-
-#: backend/ipp.c:1527
-msgid "Print file accepted - job ID unknown."
-msgstr ""
-
-#: backend/socket.c:424 backend/usb-unix.c:191
 msgid "Print file sent."
 msgstr ""
 
-#: backend/ipp.c:1488
-msgid "Print file was not accepted."
-msgstr ""
-
-#: backend/ipp.c:1895
 msgid "Print job canceled at printer."
 msgstr ""
 
-#: backend/ipp.c:1890
 msgid "Print job too large."
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1047
+msgid "Print job was not accepted."
+msgstr ""
+
 msgid "Printer Added"
 msgstr "Tiskárna přidána"
 
-#: ppdc/sample.c:263
 msgid "Printer Default"
 msgstr "Výchozí tiskárna"
 
-#: cgi-bin/ipp-var.c:1051
 msgid "Printer Deleted"
 msgstr "Tiskárna vymazána"
 
-#: cgi-bin/ipp-var.c:1049
 msgid "Printer Modified"
 msgstr "Tiskárna upravena"
 
-#: cgi-bin/ipp-var.c:1045
 msgid "Printer Paused"
 msgstr "Tiskárna zastavena"
 
-#: ppdc/sample.c:294
 msgid "Printer Settings"
 msgstr "Nastavení tiskárny"
 
-#: backend/ipp.c:1893
 msgid "Printer cannot print supplied content."
 msgstr ""
 
-#: cups/notify.c:126
+msgid "Printer cannot print with supplied options."
+msgstr ""
+
 msgid "Printer:"
 msgstr "Tiskárna:"
 
-#: cgi-bin/printers.c:204 cgi-bin/printers.c:332
 msgid "Printers"
 msgstr "Tiskárny"
 
-#: filter/rastertoepson.c:1093 filter/rastertohp.c:817
-#: filter/rastertolabel.c:1249
 #, c-format
-msgid "Printing page %d, %d%% complete."
+msgid "Printing page %d, %u%% complete."
 msgstr ""
 
-#: cgi-bin/classes.c:173 cgi-bin/printers.c:176
-msgid "Purge Jobs"
-msgstr "Výmaz úloh"
-
-#: ppdc/sample.c:155
 msgid "Quarto"
 msgstr "Quarto"
 
-#: scheduler/ipp.c:1513 scheduler/ipp.c:10661
 msgid "Quota limit reached."
 msgstr "Kvóta byla překročena."
 
-#: berkeley/lpq.c:515
 msgid "Rank    Owner   Job     File(s)                         Total Size"
 msgstr ""
 
-#. TRANSLATORS: Pri is job priority.
-#: berkeley/lpq.c:511
-msgid "Rank   Owner      Pri  Job        Files                       Total Size"
-msgstr ""
-
-#: cgi-bin/classes.c:171 cgi-bin/printers.c:174
 msgid "Reject Jobs"
 msgstr "Odmítnutí úloh"
 
-#: backend/lpd.c:1016 backend/lpd.c:1148
 #, c-format
 msgid "Remote host did not accept control file (%d)."
 msgstr ""
 
-#: backend/lpd.c:1101
 #, c-format
 msgid "Remote host did not accept data file (%d)."
 msgstr ""
 
-#: ppdc/sample.c:428
 msgid "Reprint After Error"
 msgstr "Opakovat tisk po chybě"
 
-#: cups/http-support.c:1312
 msgid "Request Entity Too Large"
 msgstr "Dotaz Entity je příliš dlouhý"
 
-#: cups/ppd.c:797 cups/ppd.c:1365 ppdc/sample.c:231
 msgid "Resolution"
 msgstr "Rozlišení"
 
-#: cgi-bin/classes.c:165
 msgid "Resume Class"
 msgstr "Obnovení třídy"
 
-#: cgi-bin/printers.c:167
 msgid "Resume Printer"
 msgstr "Obnovení tiskárny"
 
-#: ppdc/sample.c:165
 msgid "Return Address"
 msgstr "Návrat adresy"
 
-#: ppdc/sample.c:449
 msgid "Rewind"
 msgstr "Přetočit"
 
-#: cups/adminutil.c:2052
 #, c-format
 msgid "Running command: %s %s -N -A %s -c '%s'"
 msgstr ""
 
-#: cups/snmp.c:995
 msgid "SEQUENCE uses indefinite length"
 msgstr "\"SEQUENCE\" má neomezenou délku"
 
-#: cups/http-support.c:1336
 msgid "SSL/TLS Negotiation Error"
 msgstr ""
 
-#: cups/http-support.c:1293
 msgid "See Other"
 msgstr "Viz další"
 
-#: backend/usb-darwin.c:543 backend/usb-libusb.c:273
 msgid "Sending data to printer."
 msgstr ""
 
-#: cgi-bin/ipp-var.c:1061
 msgid "Server Restarted"
 msgstr "Restart serveru"
 
-#: cgi-bin/ipp-var.c:1067
 msgid "Server Security Auditing"
 msgstr "Audit bezpečnosti serveru"
 
-#: cgi-bin/ipp-var.c:1063
 msgid "Server Started"
 msgstr "Start serveru"
 
-#: cgi-bin/ipp-var.c:1065
 msgid "Server Stopped"
 msgstr "Zastavení serveru"
 
-#: cups/http-support.c:1330
+msgid "Server credentials not set."
+msgstr ""
+
 msgid "Service Unavailable"
 msgstr "Služba je nedostupná"
 
-#: cgi-bin/admin.c:2786 cgi-bin/admin.c:2832 cgi-bin/admin.c:2989
-#: cgi-bin/admin.c:3008
 msgid "Set Allowed Users"
 msgstr "Nastavení přístupu uživatelů"
 
-#: cgi-bin/admin.c:3035
 msgid "Set As Server Default"
 msgstr "Nastavení jako výchozí na serveru"
 
-#: cgi-bin/admin.c:3135
 msgid "Set Class Options"
 msgstr "Nastavení parametrů třídy"
 
-#: cgi-bin/admin.c:3135 cgi-bin/admin.c:3309 cgi-bin/admin.c:3691
 msgid "Set Printer Options"
 msgstr "Nastavení parametrů tiskárny"
 
-#: cgi-bin/admin.c:3861 cgi-bin/admin.c:3905 cgi-bin/admin.c:3923
 msgid "Set Publishing"
 msgstr "Nastavení vydávání"
 
-#: ppdc/sample.c:166
 msgid "Shipping Address"
 msgstr "Doručovací adresa"
 
-#: ppdc/sample.c:273
 msgid "Short-Edge (Landscape)"
 msgstr "Kratší okraj (na šířku)"
 
-#: ppdc/sample.c:288
 msgid "Special Paper"
 msgstr "Speciální papír"
 
-#: backend/lpd.c:1057
 #, c-format
 msgid "Spooling job, %.0f%% complete."
 msgstr ""
 
-#: ppdc/sample.c:341
 msgid "Standard"
 msgstr "Standardní"
 
 #. TRANSLATORS: Banner/cover sheet before the print job.
-#: cgi-bin/admin.c:3552
 msgid "Starting Banner"
 msgstr "Spuštění baneru"
 
-#: filter/rastertoepson.c:1069 filter/rastertohp.c:793
-#: filter/rastertolabel.c:1225
 #, c-format
 msgid "Starting page %d."
 msgstr ""
 
-#: ppdc/sample.c:156
 msgid "Statement"
 msgstr "Prohlášení"
 
-#: ppdc/sample.c:251
-msgid "Stylus Color Series"
-msgstr "Stylus Color Series"
-
-#: ppdc/sample.c:257
-msgid "Stylus Photo Series"
-msgstr "Stylus Photo Series"
-
-#: scheduler/ipp.c:3549 scheduler/ipp.c:6689 scheduler/ipp.c:7388
-#: scheduler/ipp.c:8887
 #, c-format
 msgid "Subscription #%d does not exist."
 msgstr ""
 
-#: ppdc/sample.c:157
+msgid "Substitutions:"
+msgstr ""
+
 msgid "Super A"
 msgstr "Super A"
 
-#: ppdc/sample.c:158
 msgid "Super B"
 msgstr "Super B"
 
-#: ppdc/sample.c:162
 msgid "Super B/A3"
 msgstr "Super B/A3"
 
-#: cups/http-support.c:1275
 msgid "Switching Protocols"
 msgstr "Protokol výměny"
 
-#: ppdc/sample.c:159
 msgid "Tabloid"
 msgstr "Tabloid"
 
-#: ppdc/sample.c:45
 msgid "Tabloid Oversize"
 msgstr ""
 
-#: ppdc/sample.c:46
 msgid "Tabloid Oversize Long Edge"
 msgstr ""
 
-#: ppdc/sample.c:342
 msgid "Tear"
 msgstr "Odtrhnout"
 
-#: ppdc/sample.c:447
 msgid "Tear-Off"
 msgstr "Odtrhnout"
 
-#: ppdc/sample.c:388
 msgid "Tear-Off Adjust Position"
 msgstr "Nastavení pozice odtržení"
 
-#: scheduler/ipp.c:6393 scheduler/ipp.c:6471 scheduler/ipp.c:6487
-#: scheduler/ipp.c:6505
+#, 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 ""
 
-#: scheduler/ipp.c:5118
 #, c-format
-msgid "The '%s' operation attribute cannot be supplied in a Create-Job request."
+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 ""
 
-#: scheduler/ipp.c:6919
 #, c-format
 msgid "The PPD file \"%s\" could not be found."
 msgstr "Soubor PPD \"%s\" nelze nalézt."
 
-#: scheduler/ipp.c:6906
 #, c-format
 msgid "The PPD file \"%s\" could not be opened: %s"
 msgstr "Soubor PPD \"%s\" nelze otevřít: %s"
 
-#: filter/rastertoepson.c:1038 filter/rastertohp.c:764
-#: filter/rastertolabel.c:1189
 msgid "The PPD file could not be opened."
 msgstr ""
 
-#: cgi-bin/admin.c:749
-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 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 (#)."
 
-#: cups/localize.c:353
 msgid "The developer unit needs to be replaced."
 msgstr ""
 
-#: cups/localize.c:351
 msgid "The developer unit will need to be replaced soon."
 msgstr ""
 
-#: cups/localize.c:343
 msgid "The fuser's temperature is high."
 msgstr ""
 
-#: cups/localize.c:345
 msgid "The fuser's temperature is low."
 msgstr ""
 
-#: scheduler/ipp.c:2097
-msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
+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."
 
-#: scheduler/ipp.c:2080 scheduler/ipp.c:5653
 #, c-format
 msgid "The notify-user-data value is too large (%d > 63 octets)."
 msgstr ""
 
-#: cups/localize.c:349
 msgid "The optical photoconductor needs to be replaced."
 msgstr ""
 
-#: cups/localize.c:347
 msgid "The optical photoconductor will need to be replaced soon."
 msgstr ""
 
-#: cups/localize.c:331
-msgid "The output bin is almost full."
-msgstr ""
-
-#: cups/localize.c:333
-msgid "The output bin is full."
-msgstr ""
-
-#: cups/localize.c:329
-msgid "The output bin is missing."
-msgstr ""
-
-#: cups/localize.c:325
-msgid "The paper tray is almost empty."
-msgstr ""
-
-#: cups/localize.c:327
-msgid "The paper tray is empty."
-msgstr ""
-
-#: cups/localize.c:323
-msgid "The paper tray is missing."
-msgstr ""
-
-#: cups/localize.c:306
-msgid "The paper tray needs to be filled."
+msgid "The printer configuration is incorrect or the printer no longer exists."
 msgstr ""
 
-#: backend/ipp.c:909
-msgid "The printer URI is incorrect or no longer exists."
+msgid "The printer did not respond."
 msgstr ""
 
-#: backend/lpd.c:619 backend/lpd.c:1009 backend/lpd.c:1091 backend/lpd.c:1141
-msgid "The printer did not respond."
+msgid "The printer is in use."
 msgstr ""
 
-#: backend/ipp.c:892 backend/ipp.c:899
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
+msgid "The printer is low on ink."
 msgstr ""
 
-#: backend/ipp.c:757 backend/ipp.c:874 backend/ipp.c:980 backend/ipp.c:1313
-#: backend/ipp.c:1464 backend/lpd.c:828 backend/socket.c:374
-#: backend/usb-unix.c:131 backend/usb-unix.c:424 backend/usb-unix.c:507
-msgid "The printer is in use."
+msgid "The printer is low on toner."
 msgstr ""
 
-#: backend/runloop.c:254 backend/runloop.c:374 cups/localize.c:311
 msgid "The printer is not connected."
 msgstr ""
 
-#: backend/ipp.c:735 backend/ipp.c:768 backend/ipp.c:870 backend/lpd.c:807
-#: backend/lpd.c:848 backend/socket.c:353 backend/socket.c:386
 msgid "The printer is not responding."
 msgstr ""
 
-#: backend/runloop.c:396
 msgid "The printer is now connected."
 msgstr ""
 
-#: backend/usb-darwin.c:1286
 msgid "The printer is now online."
 msgstr ""
 
-#: backend/usb-darwin.c:1307
 msgid "The printer is offline."
 msgstr ""
 
-#: cups/localize.c:335
-msgid "The printer is running low on ink."
-msgstr ""
-
-#: cups/localize.c:313
-msgid "The printer is running low on toner."
-msgstr ""
-
-#: backend/ipp.c:750 backend/lpd.c:821 backend/socket.c:367
 msgid "The printer is unreachable at this time."
 msgstr ""
 
-#: cups/localize.c:337
 msgid "The printer may be out of ink."
 msgstr ""
 
-#: cups/localize.c:315
 msgid "The printer may be out of toner."
 msgstr ""
 
-#: backend/ipp.c:744 backend/lpd.c:815 backend/socket.c:361
 msgid "The printer may not exist or is unavailable at this time."
 msgstr ""
 
-#: cgi-bin/admin.c:931
-msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
-msgstr "Název tiskárny může obsahovat až 127 tisknutelných znaků a nesmí obsahovat mezery, lomítka (/), nebo křížek (#)."
+msgid ""
+"The printer name may only contain up to 127 printable characters and may not "
+"contain spaces, slashes (/), or the pound sign (#)."
+msgstr ""
+"Název tiskárny může obsahovat až 127 tisknutelných znaků a nesmí obsahovat "
+"mezery, lomítka (/), nebo křížek (#)."
 
-#: scheduler/ipp.c:876 scheduler/ipp.c:1136 scheduler/ipp.c:3198
-#: scheduler/ipp.c:3369 scheduler/ipp.c:5101 scheduler/ipp.c:5487
-#: scheduler/ipp.c:5801 scheduler/ipp.c:6359 scheduler/ipp.c:7124
-#: scheduler/ipp.c:7180 scheduler/ipp.c:7494 scheduler/ipp.c:7760
-#: scheduler/ipp.c:7849 scheduler/ipp.c:7882 scheduler/ipp.c:8205
-#: scheduler/ipp.c:8598 scheduler/ipp.c:8679 scheduler/ipp.c:9840
-#: scheduler/ipp.c:10294 scheduler/ipp.c:10624 scheduler/ipp.c:10706
-#: scheduler/ipp.c:10998
 msgid "The printer or class does not exist."
 msgstr ""
 
-#: scheduler/ipp.c:1304
 msgid "The printer or class is not shared."
 msgstr ""
 
-#: cups/localize.c:317
 msgid "The printer's cover is open."
 msgstr ""
 
-#: cups/localize.c:321
 msgid "The printer's door is open."
 msgstr ""
 
-#: cups/localize.c:319
 msgid "The printer's interlock is open."
 msgstr ""
 
-#: cups/localize.c:339
 msgid "The printer's waste bin is almost full."
 msgstr ""
 
-#: cups/localize.c:341
 msgid "The printer's waste bin is full."
 msgstr ""
 
-#: scheduler/ipp.c:982 scheduler/ipp.c:2261
 #, c-format
 msgid "The printer-uri \"%s\" contains invalid characters."
 msgstr "Tiskárna-URI \"%s\" obsahuje neplatné znaky."
 
-#: scheduler/ipp.c:3175
 msgid "The printer-uri attribute is required."
 msgstr ""
 
-#: scheduler/ipp.c:966
-msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
+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\"."
 
-#: scheduler/ipp.c:2245
-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 printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
+msgstr ""
+"Tiskárna-URI musí být ve tvaru \"ipp://HOSTNAME/printers/PRINTERNAME\"."
 
-#: cgi-bin/admin.c:474
-msgid "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)."
-msgstr "Název předplatného nesmí obsahovat mezery, lomítka (/), otazník (?), nebo křížek (#)."
+msgid ""
+"The subscription name may not contain spaces, slashes (/), question marks "
+"(?), or the pound sign (#)."
+msgstr ""
+"Název předplatného nesmí obsahovat mezery, lomítka (/), otazník (?), nebo "
+"křížek (#)."
 
-#: scheduler/client.c:2450
-msgid "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it."
+msgid ""
+"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to "
+"enable it."
 msgstr ""
 
-#: scheduler/ipp.c:6454
 #, c-format
 msgid "The which-jobs value \"%s\" is not supported."
 msgstr ""
 
-#: scheduler/ipp.c:5731
 msgid "There are too many subscriptions."
 msgstr "Existuje příliš mnoho předplatných."
 
-#: cups/localize.c:308
-msgid "There is a paper jam."
-msgstr ""
-
-#: backend/usb-darwin.c:379 backend/usb-darwin.c:438 backend/usb-darwin.c:505
-#: backend/usb-darwin.c:526 backend/usb-libusb.c:235 backend/usb-libusb.c:256
 msgid "There was an unrecoverable USB error."
 msgstr ""
 
-#: ppdc/sample.c:435
 msgid "Thermal Transfer Media"
 msgstr "Termální tisková média"
 
-#: scheduler/ipp.c:1507
 msgid "Too many active jobs."
 msgstr "Příliš mnoho aktivních úloh."
 
-#: scheduler/ipp.c:1401
 #, c-format
 msgid "Too many job-sheets values (%d > 2)."
 msgstr ""
 
-#: scheduler/ipp.c:2529
 #, c-format
 msgid "Too many printer-state-reasons values (%d > %d)."
 msgstr ""
 
-#: ppdc/sample.c:289
 msgid "Transparency"
 msgstr "Průhlednost"
 
-#: ppdc/sample.c:284
 msgid "Tray"
 msgstr "Podavač"
 
-#: ppdc/sample.c:264
 msgid "Tray 1"
 msgstr "Podavač 1"
 
-#: ppdc/sample.c:265
 msgid "Tray 2"
 msgstr "Podavač 2"
 
-#: ppdc/sample.c:266
 msgid "Tray 3"
 msgstr "Podavač 3"
 
-#: ppdc/sample.c:267
 msgid "Tray 4"
 msgstr "Podavač 4"
 
-#: cups/http-support.c:1315
 msgid "URI Too Long"
 msgstr "URI je příliš dlouhá"
 
-#: ppdc/sample.c:138
+msgid "URI too large"
+msgstr ""
+
 msgid "US Ledger"
 msgstr "US Ledger"
 
-#: ppdc/sample.c:139
 msgid "US Legal"
 msgstr "US Legal"
 
-#: ppdc/sample.c:140
 msgid "US Legal Oversize"
 msgstr ""
 
-#: ppdc/sample.c:141
 msgid "US Letter"
 msgstr "US Letter"
 
-#: 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:1959 cgi-bin/admin.c:1972 cgi-bin/admin.c:1996
 msgid "Unable to access cupsd.conf file"
 msgstr "Nelze získat přístup k souboru \"cupsd.conf\""
 
-#: cgi-bin/help.c:133
 msgid "Unable to access help file."
 msgstr ""
 
-#: cgi-bin/admin.c:526
 msgid "Unable to add RSS subscription"
 msgstr "Nelze přidat RSS předplatné"
 
-#: cgi-bin/admin.c:814
 msgid "Unable to add class"
 msgstr "Nelze přidat třídu"
 
-#: backend/ipp.c:1635
 msgid "Unable to add document to print job."
 msgstr ""
 
-#: scheduler/ipp.c:1548
 #, c-format
 msgid "Unable to add job for destination \"%s\"."
 msgstr ""
 
-#: cgi-bin/admin.c:1059 cgi-bin/admin.c:1419
 msgid "Unable to add printer"
 msgstr "Nelze přidat tiskárnu"
 
-#: scheduler/ipp.c:1246
 msgid "Unable to allocate memory for file types."
 msgstr ""
 
-#: filter/pstops.c:451
 msgid "Unable to allocate memory for page info"
 msgstr ""
 
-#: filter/pstops.c:445
 msgid "Unable to allocate memory for pages array"
 msgstr ""
 
-#: cgi-bin/admin.c:1525
 msgid "Unable to cancel RSS subscription"
 msgstr "Nelze zrušit RSS předplatné"
 
-#: backend/ipp.c:1942
 msgid "Unable to cancel print job."
 msgstr ""
 
-#: cgi-bin/admin.c:2990
 msgid "Unable to change printer"
 msgstr "Nelze změnit tiskárnu"
 
-#: cgi-bin/admin.c:3906
 msgid "Unable to change printer-is-shared attribute"
 msgstr "Nelze změnit atribut \"sdílení tiskárny\""
 
-#: cgi-bin/admin.c:1657 cgi-bin/admin.c:1799
 msgid "Unable to change server settings"
 msgstr "Nelze změnit nastavení serveru"
 
-#: filter/commandtops.c:420
+#, 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 ""
 
-#: cups/adminutil.c:911 cups/request.c:1016
 msgid "Unable to connect to host."
 msgstr "Nelze se připojit k hostiteli."
 
-#: backend/ipp.c:713 backend/ipp.c:1138 backend/lpd.c:787 backend/socket.c:333
-#: backend/usb-unix.c:117
 msgid "Unable to contact printer, queuing on next printer in class."
 msgstr ""
 
-#: cups/adminutil.c:726
 #, c-format
 msgid "Unable to copy 64-bit CUPS printer driver files (%d)."
 msgstr ""
 
-#: cups/adminutil.c:691
 #, c-format
 msgid "Unable to copy 64-bit Windows printer driver files (%d)."
 msgstr ""
 
-#: cups/adminutil.c:522
 #, c-format
 msgid "Unable to copy CUPS printer driver files (%d)."
 msgstr ""
 
-#: scheduler/ipp.c:2649
 #, c-format
 msgid "Unable to copy PPD file - %s"
 msgstr ""
 
-#: scheduler/ipp.c:2704
 msgid "Unable to copy PPD file."
 msgstr ""
 
-#: cups/adminutil.c:487
 #, c-format
 msgid "Unable to copy Windows 2000 printer driver files (%d)."
 msgstr ""
 
-#: cups/adminutil.c:610
 #, c-format
 msgid "Unable to copy Windows 9x printer driver files (%d)."
 msgstr ""
 
-#: scheduler/ipp.c:2626
 #, c-format
 msgid "Unable to copy interface script - %s"
 msgstr ""
 
-#: backend/ipp.c:2034
-msgid "Unable to create compressed print file"
+msgid "Unable to create printer-uri"
 msgstr ""
 
-#: cups/util.c:602 cups/util.c:1656
-msgid "Unable to create printer-uri"
+msgid "Unable to create server credentials."
 msgstr ""
 
-#: cgi-bin/admin.c:1850 cgi-bin/admin.c:1862 scheduler/cupsfilter.c:1236
 msgid "Unable to create temporary file"
 msgstr ""
 
-#: cgi-bin/admin.c:2153
 msgid "Unable to delete class"
 msgstr "Nelze vymazat třídu"
 
-#: cgi-bin/admin.c:2238
 msgid "Unable to delete printer"
 msgstr "Nelze vymazat tiskárnu"
 
-#: cgi-bin/classes.c:260 cgi-bin/printers.c:269
 msgid "Unable to do maintenance command"
 msgstr "Nelze provést příkaz údržby"
 
-#: cgi-bin/admin.c:1974
 msgid "Unable to edit cupsd.conf files larger than 1MB"
 msgstr ""
 
-#: cups/http.c:4272
-msgid "Unable to establish a secure connection to host (certificate chain invalid)."
+msgid ""
+"Unable to establish a secure connection to host (certificate chain invalid)."
 msgstr ""
 
-#: cups/http.c:4262
-msgid "Unable to establish a secure connection to host (certificate not yet valid)."
+msgid ""
+"Unable to establish a secure connection to host (certificate not yet valid)."
 msgstr ""
 
-#: cups/http.c:4257
 msgid "Unable to establish a secure connection to host (expired certificate)."
 msgstr ""
 
-#: cups/http.c:4267
 msgid "Unable to establish a secure connection to host (host name mismatch)."
 msgstr ""
 
-#: cups/http.c:4277
-msgid "Unable to establish a secure connection to host (peer dropped connection before responding)."
+msgid ""
+"Unable to establish a secure connection to host (peer dropped connection "
+"before responding)."
 msgstr ""
 
-#: cups/http.c:4252
-msgid "Unable to establish a secure connection to host (self-signed certificate)."
+msgid ""
+"Unable to establish a secure connection to host (self-signed certificate)."
 msgstr ""
 
-#: cups/http.c:4247
-msgid "Unable to establish a secure connection to host (untrusted certificate)."
+msgid ""
+"Unable to establish a secure connection to host (untrusted certificate)."
 msgstr ""
 
-#: cups/http.c:4008 cups/http.c:4304 cups/http.c:4337 cups/http.c:4354
 msgid "Unable to establish a secure connection to host."
 msgstr ""
 
-#: cgi-bin/ipp-var.c:365
 msgid "Unable to find destination for job"
 msgstr ""
 
-#: cups/http-support.c:1748
 msgid "Unable to find printer."
 msgstr ""
 
-#: backend/ipp.c:2056
-msgid "Unable to generate compressed print file"
+msgid "Unable to find server credentials."
 msgstr ""
 
-#: backend/ipp.c:3009
 msgid "Unable to get backend exit status."
 msgstr ""
 
-#: cgi-bin/classes.c:450
 msgid "Unable to get class list"
 msgstr "Nelze získat seznam tříd"
 
-#: cgi-bin/classes.c:549
 msgid "Unable to get class status"
 msgstr "Nelze získat stav třídy"
 
-#: cgi-bin/admin.c:1320
 msgid "Unable to get list of printer drivers"
 msgstr "Nelze získat seznam ovladačů tiskárny"
 
-#: cgi-bin/admin.c:2840
 msgid "Unable to get printer attributes"
 msgstr "Nelze získat atributy tiskárny"
 
-#: cgi-bin/printers.c:467
 msgid "Unable to get printer list"
 msgstr "Nelze získat seznam tiskáren"
 
-#: cgi-bin/printers.c:569
 msgid "Unable to get printer status"
 msgstr ""
 
-#: backend/ipp.c:933
 msgid "Unable to get printer status."
 msgstr "Nelze získat stav tiskárny."
 
-#: cups/adminutil.c:565 cups/adminutil.c:769
 #, c-format
 msgid "Unable to install Windows 2000 printer driver files (%d)."
 msgstr ""
 
-#: cups/adminutil.c:639
 #, c-format
 msgid "Unable to install Windows 9x printer driver files (%d)."
 msgstr ""
 
-#: cgi-bin/help.c:92
 msgid "Unable to load help index."
 msgstr ""
 
-#: backend/ipp.c:642 backend/lpd.c:421 backend/socket.c:275
 #, c-format
 msgid "Unable to locate printer \"%s\"."
 msgstr ""
 
-#: backend/dnssd.c:781 backend/ipp.c:324 backend/lpd.c:204
-#: backend/socket.c:171
 msgid "Unable to locate printer."
 msgstr ""
 
-#: cgi-bin/admin.c:813
 msgid "Unable to modify class"
 msgstr "Nelze změnit třídu"
 
-#: cgi-bin/admin.c:1058 cgi-bin/admin.c:1418
 msgid "Unable to modify printer"
 msgstr "Nelze změnit tiskárnu"
 
-#: cgi-bin/ipp-var.c:432 cgi-bin/ipp-var.c:521
 msgid "Unable to move job"
 msgstr "Nelze přesunout úlohu"
 
-#: cgi-bin/ipp-var.c:434 cgi-bin/ipp-var.c:523
 msgid "Unable to move jobs"
 msgstr "Nelze přesunout úlohy"
 
-#: cgi-bin/admin.c:3186 cups/ppd.c:339
 msgid "Unable to open PPD file"
 msgstr "Nelze otevřít PPD soubor"
 
-#: backend/ipp.c:2040
-msgid "Unable to open compressed print file"
-msgstr ""
-
-#: cgi-bin/admin.c:2608
 msgid "Unable to open cupsd.conf file:"
 msgstr "Nelze otevřít soubor \"cupsd.conf\":"
 
-#: backend/usb-unix.c:141
 msgid "Unable to open device file"
 msgstr ""
 
-#: scheduler/ipp.c:6140
 #, c-format
 msgid "Unable to open document #%d in job #%d."
 msgstr ""
 
-#: cgi-bin/help.c:364
 msgid "Unable to open help file."
 msgstr ""
 
-#: backend/ipp.c:365 backend/ipp.c:1398 backend/ipp.c:1594 backend/ipp.c:2046
-#: backend/lpd.c:488 backend/socket.c:158 backend/usb.c:237
-#: filter/gziptoany.c:71 filter/pstops.c:300
 msgid "Unable to open print file"
 msgstr ""
 
-#: filter/rastertoepson.c:998 filter/rastertohp.c:724
-#: filter/rastertolabel.c:1147
 msgid "Unable to open raster file"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:795
 msgid "Unable to print test page"
 msgstr "Nelze vytisknout zkušební stránku"
 
-#: backend/runloop.c:96 backend/runloop.c:325 backend/usb-darwin.c:613
-#: backend/usb-darwin.c:657 backend/usb-libusb.c:343 backend/usb-libusb.c:378
 msgid "Unable to read print data."
 msgstr ""
 
-#: cups/dest.c:3402
-msgid "Unable to resolve printer URI."
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
 msgstr ""
 
-#: cups/adminutil.c:2088
 #, c-format
 msgid "Unable to run \"%s\": %s"
 msgstr ""
 
-#: filter/pstops.c:563
 msgid "Unable to see in file"
 msgstr ""
 
-#: cgi-bin/ipp-var.c:598 cgi-bin/ipp-var.c:618
 msgid "Unable to send command to printer driver"
 msgstr ""
 
-#: backend/usb-darwin.c:735 backend/usb-libusb.c:454
 msgid "Unable to send data to printer."
 msgstr ""
 
-#: cups/adminutil.c:821
 #, c-format
 msgid "Unable to set Windows printer driver (%d)."
 msgstr ""
 
-#: cgi-bin/admin.c:3807
 msgid "Unable to set options"
 msgstr "Nelze nastavit parametry"
 
-#: cgi-bin/admin.c:3077
 msgid "Unable to set server default"
 msgstr "Nelze nastavit výchozí server"
 
-#: backend/ipp.c:2868 backend/ipp.c:2945 backend/ipp.c:2953
 msgid "Unable to start backend process."
 msgstr ""
 
-#: cgi-bin/admin.c:1912
 msgid "Unable to upload cupsd.conf file"
 msgstr "Nelze nahrát soubor \"cupsd.conf\""
 
-#: backend/usb-darwin.c:1985 backend/usb-darwin.c:2009
 msgid "Unable to use legacy USB class driver."
 msgstr ""
 
-#: backend/runloop.c:125 backend/runloop.c:380
 msgid "Unable to write print data"
 msgstr ""
 
-#: filter/gziptoany.c:90
 #, c-format
 msgid "Unable to write uncompressed print data: %s"
 msgstr ""
 
-#: cups/http-support.c:1303
 msgid "Unauthorized"
 msgstr "Nepovolený"
 
-#: cgi-bin/admin.c:3503
 msgid "Units"
 msgstr "Jednotky"
 
-#: cups/http-support.c:1343 cups/ppd.c:366
 msgid "Unknown"
 msgstr "Neznámý"
 
-#: filter/pstops.c:2213
 #, c-format
 msgid "Unknown choice \"%s\" for option \"%s\"."
 msgstr ""
 
-#: backend/ipp.c:507
 #, c-format
 msgid "Unknown encryption option value: \"%s\"."
 msgstr ""
 
-#: backend/lpd.c:350
 #, c-format
 msgid "Unknown file order: \"%s\"."
 msgstr ""
 
-#: backend/lpd.c:321
 #, c-format
 msgid "Unknown format character: \"%c\"."
 msgstr ""
 
-#: cups/dest-options.c:770
 msgid "Unknown media size name."
 msgstr ""
 
-#: backend/ipp.c:554
 #, c-format
 msgid "Unknown option \"%s\" with value \"%s\"."
 msgstr ""
 
-#: filter/pstops.c:2196
 #, c-format
 msgid "Unknown option \"%s\"."
 msgstr ""
 
-#: backend/lpd.c:336
 #, c-format
 msgid "Unknown print mode: \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:10496
 #, c-format
 msgid "Unknown printer-error-policy \"%s\"."
 msgstr "Neznámá printer-error-policy „%s“."
 
-#: scheduler/ipp.c:10479
 #, c-format
 msgid "Unknown printer-op-policy \"%s\"."
 msgstr "Neznámá printer-op-policy „%s“."
 
-#: cups/http-addrlist.c:710
+msgid "Unknown request method."
+msgstr ""
+
+msgid "Unknown request version."
+msgstr ""
+
+msgid "Unknown scheme in URI"
+msgstr ""
+
 msgid "Unknown service name."
 msgstr ""
 
-#: backend/ipp.c:526
 #, c-format
 msgid "Unknown version option value: \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:402
+#, c-format
+msgid "Unsupported 'compression' value \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Unsupported 'document-format' value \"%s\"."
+msgstr ""
+
+msgid "Unsupported 'job-name' value."
+msgstr ""
+
 #, c-format
 msgid "Unsupported character set \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:8171 scheduler/ipp.c:9401 scheduler/ipp.c:10950
 #, c-format
 msgid "Unsupported compression \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:8305 scheduler/ipp.c:9551 scheduler/ipp.c:10979
 #, c-format
 msgid "Unsupported document-format \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:9534
 #, c-format
 msgid "Unsupported document-format \"%s/%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:1367
 #, c-format
 msgid "Unsupported format \"%s\"."
 msgstr ""
 
-#: scheduler/ipp.c:1465
 msgid "Unsupported margins."
 msgstr ""
 
-#: cups/pwg-media.c:529
 msgid "Unsupported media value."
 msgstr ""
 
-#: filter/pstops.c:2478
 #, c-format
 msgid "Unsupported number-up value %d, using number-up=1."
 msgstr ""
 
-#: filter/pstops.c:2512
 #, c-format
 msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb."
 msgstr ""
 
-#: filter/pstops.c:2563
 #, c-format
 msgid "Unsupported page-border value %s, using page-border=none."
 msgstr ""
 
-#: filter/rastertopwg.c:147 filter/rastertopwg.c:155 filter/rastertopwg.c:164
 msgid "Unsupported raster data."
 msgstr ""
 
-#: cups/snmp.c:1112
 msgid "Unsupported value type"
 msgstr "Nepodporovaný typ hodnoty"
 
-#: cups/http-support.c:1318
 msgid "Upgrade Required"
 msgstr "Povinné aktualizace"
 
-#: systemv/lpadmin.c:668
 msgid ""
 "Usage:\n"
 "\n"
@@ -5514,47 +4718,49 @@ msgid ""
 "                       [-u allow:user,user] [-u deny:user,user]"
 msgstr ""
 
-#: backend/dnssd.c:241 backend/ipp.c:313 backend/lpd.c:191
-#: backend/socket.c:135 backend/usb.c:183 filter/commandtops.c:74
-#: filter/gziptoany.c:50 filter/pstops.c:264 monitor/bcp.c:62
-#: monitor/tbcp.c:61
 #, c-format
 msgid "Usage: %s job-id user title copies options [file]"
 msgstr ""
 
-#: systemv/cupsaddsmb.c:281
 msgid "Usage: cupsaddsmb [options] printer1 ... printerN"
 msgstr ""
 
-#: systemv/cupsctl.c:200
 msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]"
 msgstr ""
 
-#: scheduler/main.c:2017
 msgid "Usage: cupsd [options]"
 msgstr ""
 
-#: scheduler/cupsfilter.c:1429
-msgid "Usage: cupsfilter [ options ] filename"
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
 msgstr ""
 
-#: systemv/cupstestdsc.c:425
 msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
 msgstr ""
 
-#: systemv/cupstestppd.c:3793
-msgid "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
+msgid ""
+"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
+msgstr ""
+
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+"       ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+
+msgid ""
+"Usage: ippfind [options] regtype[,subtype][.domain.] ... [expression]\n"
+"       ippfind [options] name[.regtype[.domain.]] ... [expression]\n"
+"       ippfind --help\n"
+"       ippfind --version"
 msgstr ""
 
-#: test/ipptool.c:4401
 msgid "Usage: ipptool [options] URI filename [ ... filenameN ]"
 msgstr ""
 
-#: systemv/lpmove.c:125
 msgid "Usage: lpmove job/src dest"
 msgstr ""
 
-#: systemv/lpoptions.c:553
 msgid ""
 "Usage: lpoptions [-h server] [-E] -d printer\n"
 "       lpoptions [-h server] [-E] [-p printer] -l\n"
@@ -5562,1160 +4768,968 @@ msgid ""
 "       lpoptions [-h server] [-E] -x printer"
 msgstr ""
 
-#: systemv/lppasswd.c:476
-msgid "Usage: lppasswd [-g groupname]"
-msgstr ""
-
-#: systemv/lppasswd.c:479
 msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-"       lppasswd [-g groupname] -a [username]\n"
-"       lppasswd [-g groupname] -x [username]"
-msgstr ""
-
-#: berkeley/lpq.c:670
-msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
+"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
 msgstr ""
 
-#: ppdc/ppdc.cxx:435
 msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]"
 msgstr ""
 
-#: ppdc/ppdhtml.cxx:172
 msgid "Usage: ppdhtml [options] filename.drv >filename.html"
 msgstr ""
 
-#: ppdc/ppdi.cxx:128
 msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]"
 msgstr ""
 
-#: ppdc/ppdmerge.cxx:367
 msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]"
 msgstr ""
 
-#: ppdc/ppdpo.cxx:252
-msgid "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]"
+msgid ""
+"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]"
 msgstr ""
 
-#: backend/snmp.c:218
 msgid "Usage: snmp [host-or-ip-address]"
 msgstr ""
 
-#: cups/snmp.c:1064
 msgid "Value uses indefinite length"
 msgstr "Hodnota má neomezenou délku"
 
-#: cups/snmp.c:1049
 msgid "VarBind uses indefinite length"
 msgstr "VarBind má neomezenou délku"
 
-#: cups/snmp.c:999
 msgid "Version uses indefinite length"
 msgstr "Version má neomezenou délku"
 
-#: backend/ipp.c:1675
 msgid "Waiting for job to complete."
 msgstr ""
 
-#: backend/usb-darwin.c:457 backend/usb-libusb.c:193
 msgid "Waiting for printer to become available."
 msgstr ""
 
-#: backend/socket.c:444
 msgid "Waiting for printer to finish."
 msgstr ""
 
-#: cups/adminutil.c:793
 msgid "Warning, no Windows 2000 printer drivers are installed."
 msgstr ""
 
-#: cups/http-support.c:1339
 msgid "Web Interface is Disabled"
 msgstr ""
 
-#: cups/ppd.c:1947
 msgid "Yes"
 msgstr "Ano"
 
-#: scheduler/client.c:2437
 #, c-format
-msgid "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
-msgstr Pro přístup k této stránce, použijte adresu URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
-
-#: systemv/lppasswd.c:254
-msgid "Your password must be at least 6 characters long, cannot contain your username, and must contain at least one letter and number."
+msgid ""
+"You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://"
+"%s:%d%s</A>."
 msgstr ""
+"Pro přístup k této stránce, použijte adresu URL <A HREF=\"https://%s:%d%s"
+"\">https://%s:%d%s</A>."
 
-#: ppdc/sample.c:439
 msgid "ZPL Label Printer"
 msgstr "Tiskárna štítků ZPL"
 
-#: ppdc/sample.c:362
 msgid "Zebra"
 msgstr "Zebra"
 
-#: cups/notify.c:102
 msgid "aborted"
 msgstr "zrušeno"
 
-#: cups/notify.c:99
 msgid "canceled"
 msgstr "zrušeno"
 
-#: cups/notify.c:105
 msgid "completed"
 msgstr "dokončeno"
 
-#: scheduler/ipp.c:6012
 msgid "cups-deviced failed to execute."
 msgstr "Nepodařilo se spustit \"cups-deviced\"."
 
-#: scheduler/ipp.c:6842 scheduler/ipp.c:7091
 msgid "cups-driverd failed to execute."
 msgstr "Nepodařilo se spustit \"cups-driverd\"."
 
-#: systemv/cupsaddsmb.c:233
 #, c-format
 msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s"
 msgstr ""
 
-#: systemv/cupsctl.c:141
 msgid "cupsctl: Cannot set Listen or Port directly."
 msgstr ""
 
-#: systemv/cupsctl.c:152
 #, c-format
 msgid "cupsctl: Unable to connect to server: %s"
 msgstr ""
 
-#: systemv/cupsctl.c:195
 #, c-format
 msgid "cupsctl: Unknown option \"%s\""
 msgstr ""
 
-#: systemv/cupsctl.c:197
 #, c-format
 msgid "cupsctl: Unknown option \"-%c\""
 msgstr ""
 
-#: scheduler/main.c:189
 msgid "cupsd: Expected config filename after \"-c\" option."
 msgstr ""
 
-#: scheduler/main.c:221 scheduler/main.c:228
+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 ""
 
-#: scheduler/main.c:295
+msgid "cupsd: Unable to get path to cups-files.conf file."
+msgstr ""
+
 #, c-format
 msgid "cupsd: Unknown argument \"%s\" - aborting."
 msgstr ""
 
-#: scheduler/main.c:288
 #, c-format
 msgid "cupsd: Unknown option \"%c\" - aborting."
 msgstr ""
 
-#: scheduler/main.c:255
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
-
-#: scheduler/cupsfilter.c:1209
 #, c-format
 msgid "cupsfilter: Invalid document number %d."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1203
 #, c-format
 msgid "cupsfilter: Invalid job ID %d."
 msgstr ""
 
-#: scheduler/cupsfilter.c:358
 msgid "cupsfilter: Only one filename can be specified."
 msgstr ""
 
-#: scheduler/cupsfilter.c:1251
 #, c-format
 msgid "cupsfilter: Unable to get job file - %s"
 msgstr ""
 
-#: systemv/cupstestppd.c:261
 msgid "cupstestppd: The -q option is incompatible with the -v option."
 msgstr ""
 
-#: systemv/cupstestppd.c:277
 msgid "cupstestppd: The -v option is incompatible with the -q option."
 msgstr ""
 
-#: systemv/lpstat.c:1231 systemv/lpstat.c:1234 systemv/lpstat.c:1237
 #, c-format
 msgid "device for %s/%s: %s"
 msgstr ""
 
-#: systemv/lpstat.c:1218 systemv/lpstat.c:1221 systemv/lpstat.c:1224
 #, c-format
 msgid "device for %s: %s"
 msgstr ""
 
-#: cups/snmp.c:1036
 msgid "error-index uses indefinite length"
 msgstr "\"error-index\" má neomezenou délku"
 
-#: cups/snmp.c:1028
 msgid "error-status uses indefinite length"
 msgstr "\"error-status\" má neomezenou délku"
 
-#: cups/notify.c:90
 msgid "held"
 msgstr "pozastaveno"
 
-#: berkeley/lpc.c:209
 msgid "help\t\tGet help on commands."
 msgstr ""
 
-#: cups/notify.c:131
 msgid "idle"
 msgstr "čeká"
 
-#: test/ipptool.c:373 test/ipptool.c:515 test/ipptool.c:539
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr ""
+
+msgid "ippfind: Cannot use --and after --or."
 msgstr ""
 
-#: test/ipptool.c:597
 #, c-format
-msgid "ipptool: Bad URI - %s."
+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 ""
+
+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 ""
 
-#: test/ipptool.c:362
 #, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
+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 \"-P\" and \"-X\"."
+msgstr ""
+
+#, c-format
+msgid "ipptool: Bad URI - %s."
 msgstr ""
 
-#: test/ipptool.c:508
 msgid "ipptool: Invalid seconds for \"-i\"."
 msgstr ""
 
-#: test/ipptool.c:578
 msgid "ipptool: May only specify a single URI."
 msgstr ""
 
-#: test/ipptool.c:531
 msgid "ipptool: Missing count for \"-n\"."
 msgstr ""
 
-#: test/ipptool.c:408
 msgid "ipptool: Missing filename for \"-f\"."
 msgstr ""
 
-#: test/ipptool.c:389
 msgid "ipptool: Missing name=value for \"-d\"."
 msgstr ""
 
-#: test/ipptool.c:498
 msgid "ipptool: Missing seconds for \"-i\"."
 msgstr ""
 
-#: test/ipptool.c:332
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr ""
-
-#: test/ipptool.c:345
-msgid "ipptool: Missing version for \"-V\"."
-msgstr ""
-
-#: test/ipptool.c:624
 msgid "ipptool: URI required before test file."
 msgstr ""
 
-#: test/ipptool.c:558
 #, c-format
 msgid "ipptool: Unknown option \"-%c\"."
 msgstr ""
 
-#: scheduler/ipp.c:7838
 msgid "job-printer-uri attribute missing."
 msgstr ""
 
-#: systemv/lpadmin.c:131 systemv/lpadmin.c:375
 msgid "lpadmin: Class name can only contain printable characters."
 msgstr ""
 
-#: systemv/lpadmin.c:614
 msgid "lpadmin: Expected PPD after \"-P\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:457
 msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:364
 msgid "lpadmin: Expected class after \"-r\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:120
 msgid "lpadmin: Expected class name after \"-c\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:558
 msgid "lpadmin: Expected description after \"-D\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:491
 msgid "lpadmin: Expected device URI after \"-v\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:574
 msgid "lpadmin: Expected file type(s) after \"-I\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:202
 msgid "lpadmin: Expected hostname after \"-h\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:221
 msgid "lpadmin: Expected interface after \"-i\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:594
 msgid "lpadmin: Expected location after \"-L\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:274
 msgid "lpadmin: Expected model after \"-m\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:417
 msgid "lpadmin: Expected name after \"-R\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:294
 msgid "lpadmin: Expected name=value after \"-o\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:313
 msgid "lpadmin: Expected printer after \"-p\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:164
 msgid "lpadmin: Expected printer name after \"-d\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:525
 msgid "lpadmin: Expected printer or class after \"-x\" option."
 msgstr ""
 
-#: systemv/lpadmin.c:975
 msgid "lpadmin: No member names were seen."
 msgstr ""
 
-#: systemv/lpadmin.c:762
 #, c-format
 msgid "lpadmin: Printer %s is already a member of class %s."
 msgstr ""
 
-#: systemv/lpadmin.c:989
 #, c-format
 msgid "lpadmin: Printer %s is not a member of class %s."
 msgstr ""
 
-#: systemv/lpadmin.c:175 systemv/lpadmin.c:324 systemv/lpadmin.c:536
 msgid "lpadmin: Printer name can only contain printable characters."
 msgstr ""
 
-#: systemv/lpadmin.c:105
 msgid ""
 "lpadmin: Unable to add a printer to the class:\n"
 "         You must specify a printer name first."
 msgstr ""
 
-#: systemv/lpadmin.c:96 systemv/lpadmin.c:149 systemv/lpadmin.c:253
-#: systemv/lpadmin.c:339 systemv/lpadmin.c:393 systemv/lpadmin.c:510
-#: systemv/lpadmin.c:647
 #, c-format
 msgid "lpadmin: Unable to connect to server: %s"
 msgstr ""
 
-#: systemv/lpadmin.c:1329
 msgid "lpadmin: Unable to create temporary file"
 msgstr ""
 
-#: systemv/lpadmin.c:402
 msgid ""
 "lpadmin: Unable to delete option:\n"
 "         You must specify a printer name first."
 msgstr ""
 
-#: systemv/lpadmin.c:1339
+#, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
 #, c-format
 msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
 msgstr ""
 
-#: systemv/lpadmin.c:348
 msgid ""
 "lpadmin: Unable to remove a printer from the class:\n"
 "         You must specify a printer name first."
 msgstr ""
 
-#: systemv/lpadmin.c:656
 msgid ""
 "lpadmin: Unable to set the printer options:\n"
 "         You must specify a printer name first."
 msgstr ""
 
-#: systemv/lpadmin.c:474
 #, c-format
 msgid "lpadmin: Unknown allow/deny option \"%s\"."
 msgstr ""
 
-#: systemv/lpadmin.c:629
 #, c-format
 msgid "lpadmin: Unknown argument \"%s\"."
 msgstr ""
 
-#: systemv/lpadmin.c:624
 #, c-format
 msgid "lpadmin: Unknown option \"%c\"."
 msgstr ""
 
-#: systemv/lpadmin.c:580
 msgid "lpadmin: Warning - content type list ignored."
 msgstr ""
 
-#: berkeley/lpc.c:76 berkeley/lpc.c:104 berkeley/lpc.c:140
 msgid "lpc> "
 msgstr "lpc> "
 
-#: systemv/lpinfo.c:137
 msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"."
 msgstr ""
 
-#: systemv/lpinfo.c:190
 msgid "lpinfo: Expected language after \"--language\"."
 msgstr ""
 
-#: systemv/lpinfo.c:207
 msgid "lpinfo: Expected make and model after \"--make-and-model\"."
 msgstr ""
 
-#: systemv/lpinfo.c:224
 msgid "lpinfo: Expected product string after \"--product\"."
 msgstr ""
 
-#: systemv/lpinfo.c:155
 msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"."
 msgstr ""
 
-#: systemv/lpinfo.c:173
 msgid "lpinfo: Expected scheme list after \"--include-schemes\"."
 msgstr ""
 
-#: systemv/lpinfo.c:241
 msgid "lpinfo: Expected timeout after \"--timeout\"."
 msgstr ""
 
-#: systemv/lpinfo.c:265
 #, c-format
 msgid "lpinfo: Unknown argument \"%s\"."
 msgstr ""
 
-#: systemv/lpinfo.c:259
 #, c-format
 msgid "lpinfo: Unknown option \"%c\"."
 msgstr ""
 
-#: systemv/lpinfo.c:252
 #, c-format
 msgid "lpinfo: Unknown option \"%s\"."
 msgstr ""
 
-#: systemv/lpmove.c:133
 #, c-format
 msgid "lpmove: Unable to connect to server: %s"
 msgstr ""
 
-#: systemv/lpmove.c:119
 #, c-format
 msgid "lpmove: Unknown argument \"%s\"."
 msgstr ""
 
-#: systemv/lpmove.c:97
 #, c-format
 msgid "lpmove: Unknown option \"%c\"."
 msgstr ""
 
-#: systemv/lpoptions.c:150 systemv/lpoptions.c:168 systemv/lpoptions.c:244
 msgid "lpoptions: No printers."
 msgstr ""
 
-#: systemv/lpoptions.c:219
 #, c-format
 msgid "lpoptions: Unable to add printer or instance: %s"
 msgstr ""
 
-#: systemv/lpoptions.c:521
 #, c-format
 msgid "lpoptions: Unable to get PPD file for %s: %s"
 msgstr ""
 
-#: systemv/lpoptions.c:529
 #, c-format
 msgid "lpoptions: Unable to open PPD file for %s."
 msgstr ""
 
-#: systemv/lpoptions.c:99
 msgid "lpoptions: Unknown printer or class."
 msgstr ""
 
-#: systemv/lppasswd.c:173
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr ""
-
-#: systemv/lppasswd.c:302
-msgid "lppasswd: Password file busy."
-msgstr ""
-
-#: systemv/lppasswd.c:431
-msgid "lppasswd: Password file not updated."
-msgstr ""
-
-#: systemv/lppasswd.c:398
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr ""
-
-#: systemv/lppasswd.c:253
-msgid "lppasswd: Sorry, password rejected."
-msgstr ""
-
-#: systemv/lppasswd.c:230
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr ""
-
-#: systemv/lppasswd.c:199 systemv/lppasswd.c:218
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:304 systemv/lppasswd.c:312 systemv/lppasswd.c:329
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:364 systemv/lppasswd.c:377 systemv/lppasswd.c:408
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:446
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:458
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr ""
-
-#: systemv/lppasswd.c:389
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr ""
-
-#: systemv/lpstat.c:1039
 #, c-format
-msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"."
+msgid ""
+"lpstat: error - %s environment variable names non-existent destination \"%s"
+"\"."
 msgstr ""
 
-#: systemv/lpstat.c:970
 #, c-format
 msgid "members of class %s:"
 msgstr ""
 
-#: berkeley/lpq.c:582
 msgid "no entries"
 msgstr ""
 
-#: systemv/lpstat.c:1043
 msgid "no system default destination"
 msgstr ""
 
-#: scheduler/ipp.c:5702
 msgid "notify-events not specified."
 msgstr ""
 
-#: scheduler/ipp.c:2034 scheduler/ipp.c:5607
 #, c-format
 msgid "notify-recipient-uri URI \"%s\" is already used."
 msgstr ""
 
-#: scheduler/ipp.c:2024 scheduler/ipp.c:5597
 #, c-format
 msgid "notify-recipient-uri URI \"%s\" uses unknown scheme."
 msgstr ""
 
-#: cups/notify.c:87
 msgid "pending"
 msgstr "nevyřízený"
 
-#: ppdc/ppdc.cxx:113 ppdc/ppdpo.cxx:93
 #, c-format
 msgid "ppdc: Adding include directory \"%s\"."
 msgstr ""
 
-#: ppdc/ppdpo.cxx:134
 #, c-format
 msgid "ppdc: Adding/updating UI text from %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:410
 #, c-format
 msgid "ppdc: Bad boolean value (%s) on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-import.cxx:264
 #, c-format
 msgid "ppdc: Bad font attribute: %s"
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1796
 #, c-format
 msgid "ppdc: Bad resolution name \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1113
 #, c-format
 msgid "ppdc: Bad status keyword %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2033
 #, c-format
 msgid "ppdc: Bad variable substitution ($%c) on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2719
 #, c-format
 msgid "ppdc: Choice found on line %d of %s with no Option."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1698
 #, c-format
 msgid "ppdc: Duplicate #po for locale %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:932
 #, c-format
 msgid "ppdc: Expected a filter definition on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:955
 #, c-format
 msgid "ppdc: Expected a program name on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:394
 #, c-format
 msgid "ppdc: Expected boolean value on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1093
 #, c-format
 msgid "ppdc: Expected charset after Font on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:447
 #, c-format
 msgid "ppdc: Expected choice code on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:435
 #, c-format
 msgid "ppdc: Expected choice name/text on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:503
 #, c-format
 msgid "ppdc: Expected color order for ColorModel on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:492
 #, c-format
 msgid "ppdc: Expected colorspace for ColorModel on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:514
 #, c-format
 msgid "ppdc: Expected compression for ColorModel on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:695
 #, c-format
 msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2905
 #, c-format
-msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s."
+msgid ""
+"ppdc: Expected driver type keyword following DriverType on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:826
 #, c-format
 msgid "ppdc: Expected duplex type after Duplex on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1077
 #, c-format
 msgid "ppdc: Expected encoding after Font on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1689
 #, c-format
 msgid "ppdc: Expected filename after #po %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1205
 #, c-format
 msgid "ppdc: Expected group name/text on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2619
 #, c-format
 msgid "ppdc: Expected include filename on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1502
 #, c-format
 msgid "ppdc: Expected integer on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1681
 #, c-format
 msgid "ppdc: Expected locale after #po on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:353
 #, c-format
 msgid "ppdc: Expected name after %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3277
 #, c-format
 msgid "ppdc: Expected name after FileName on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1058
 #, c-format
 msgid "ppdc: Expected name after Font on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3108
 #, c-format
 msgid "ppdc: Expected name after Manufacturer on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3141
 #, c-format
 msgid "ppdc: Expected name after MediaSize on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3231
 #, c-format
 msgid "ppdc: Expected name after ModelName on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3294
 #, c-format
 msgid "ppdc: Expected name after PCFileName on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1156
 #, c-format
 msgid "ppdc: Expected name/text after %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1245
 #, c-format
 msgid "ppdc: Expected name/text after Installable on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1782
 #, c-format
 msgid "ppdc: Expected name/text after Resolution on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:479
 #, c-format
 msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1574
 #, c-format
 msgid "ppdc: Expected option name/text on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1608
 #, c-format
 msgid "ppdc: Expected option section on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1586
 #, c-format
 msgid "ppdc: Expected option type on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1765
 #, c-format
 msgid "ppdc: Expected override field after Resolution on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-catalog.cxx:341 ppdc/ppdc-catalog.cxx:353
 #, c-format
 msgid "ppdc: Expected quoted string on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1004
 #, c-format
 msgid "ppdc: Expected real number on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:572
 #, c-format
-msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s."
+msgid ""
+"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1863
 #, c-format
-msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s."
+msgid ""
+"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d "
+"of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:361
 #, c-format
 msgid "ppdc: Expected selector after %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1101
 #, c-format
 msgid "ppdc: Expected status after Font on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2794
 #, c-format
 msgid "ppdc: Expected string after Copyright on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3397
 #, c-format
 msgid "ppdc: Expected string after Version on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:728
 #, c-format
 msgid "ppdc: Expected two option names on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:372
 #, c-format
 msgid "ppdc: Expected value after %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1085
 #, c-format
 msgid "ppdc: Expected version after Font on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:227
 #, c-format
 msgid "ppdc: Invalid #include/#po filename \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:972
 #, c-format
 msgid "ppdc: Invalid cost for filter on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:964
 #, c-format
 msgid "ppdc: Invalid empty MIME type for filter on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:980
 #, c-format
 msgid "ppdc: Invalid empty program name for filter on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1628
 #, c-format
 msgid "ppdc: Invalid option section \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1600
 #, c-format
 msgid "ppdc: Invalid option type \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc.cxx:251 ppdc/ppdpo.cxx:123
 #, c-format
 msgid "ppdc: Loading driver information file \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc.cxx:187
 #, c-format
 msgid "ppdc: Loading messages for locale \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc.cxx:126
 #, c-format
 msgid "ppdc: Loading messages from \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2412 ppdc/ppdc-source.cxx:2644
 #, c-format
 msgid "ppdc: Missing #endif at end of \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2513 ppdc/ppdc-source.cxx:2548
-#: ppdc/ppdc-source.cxx:2578
 #, c-format
 msgid "ppdc: Missing #if on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-catalog.cxx:418
 #, c-format
-msgid "ppdc: Need a msgid line before any translation strings on line %d of %s."
+msgid ""
+"ppdc: Need a msgid line before any translation strings on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-driver.cxx:730
 #, c-format
 msgid "ppdc: No message catalog provided for locale %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1651 ppdc/ppdc-source.cxx:2882
-#: ppdc/ppdc-source.cxx:2968 ppdc/ppdc-source.cxx:3061
-#: ppdc/ppdc-source.cxx:3194 ppdc/ppdc-source.cxx:3327
 #, c-format
 msgid "ppdc: Option %s defined in two different groups on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1644
 #, c-format
 msgid "ppdc: Option %s redefined with a different type on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:705
 #, c-format
 msgid "ppdc: Option constraint must *name on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2495
 #, c-format
 msgid "ppdc: Too many nested #if's on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc.cxx:374
 #, c-format
 msgid "ppdc: Unable to create PPD file \"%s\" - %s."
 msgstr ""
 
-#: ppdc/ppdc.cxx:266
 #, c-format
 msgid "ppdc: Unable to create output directory %s: %s"
 msgstr ""
 
-#: ppdc/ppdc.cxx:287
 #, c-format
 msgid "ppdc: Unable to create output pipes: %s"
 msgstr ""
 
-#: ppdc/ppdc.cxx:303 ppdc/ppdc.cxx:309
 #, c-format
 msgid "ppdc: Unable to execute cupstestppd: %s"
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1730
 #, c-format
 msgid "ppdc: Unable to find #po file %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2651
 #, c-format
 msgid "ppdc: Unable to find include file \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc.cxx:198
 #, c-format
 msgid "ppdc: Unable to find localization for \"%s\" - %s"
 msgstr ""
 
-#: ppdc/ppdc.cxx:135
 #, c-format
 msgid "ppdc: Unable to load localization file \"%s\" - %s"
 msgstr ""
 
-#: ppdc/ppdc-file.cxx:50
 #, c-format
 msgid "ppdc: Unable to open %s: %s"
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2054
 #, c-format
 msgid "ppdc: Undefined variable (%s) on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-catalog.cxx:435
 #, c-format
 msgid "ppdc: Unexpected text on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2924
 #, c-format
 msgid "ppdc: Unknown driver type %s on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:906
 #, c-format
 msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3154
 #, c-format
 msgid "ppdc: Unknown media size \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-catalog.cxx:463
 #, c-format
 msgid "ppdc: Unknown message catalog format for \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:3408
 #, c-format
 msgid "ppdc: Unknown token \"%s\" seen on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:1014
 #, c-format
-msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s."
+msgid ""
+"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc-source.cxx:2164
 #, c-format
 msgid "ppdc: Unterminated string starting with %c on line %d of %s."
 msgstr ""
 
-#: ppdc/ppdc.cxx:365
 #, c-format
 msgid "ppdc: Warning - overlapping filename \"%s\"."
 msgstr ""
 
-#: ppdc/ppdc.cxx:380
 #, c-format
 msgid "ppdc: Writing %s."
 msgstr ""
 
-#: ppdc/ppdc.cxx:148
 #, c-format
 msgid "ppdc: Writing PPD files to directory \"%s\"."
 msgstr ""
 
-#: ppdc/ppdmerge.cxx:136
 #, c-format
 msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s."
 msgstr ""
 
-#: ppdc/ppdmerge.cxx:176
 #, c-format
 msgid "ppdmerge: Ignoring PPD file %s."
 msgstr ""
 
-#: ppdc/ppdmerge.cxx:160
 #, c-format
 msgid "ppdmerge: Unable to backup %s to %s - %s"
 msgstr ""
 
-#: systemv/lpstat.c:1784
 #, c-format
 msgid "printer %s disabled since %s -"
 msgstr ""
 
-#: systemv/lpstat.c:1773
 #, c-format
 msgid "printer %s is idle.  enabled since %s"
 msgstr ""
 
-#: systemv/lpstat.c:1778
 #, c-format
 msgid "printer %s now printing %s-%d.  enabled since %s"
 msgstr ""
 
-#: systemv/lpstat.c:1909
 #, c-format
 msgid "printer %s/%s disabled since %s -"
 msgstr ""
 
-#: systemv/lpstat.c:1895
 #, c-format
 msgid "printer %s/%s is idle.  enabled since %s"
 msgstr ""
 
-#: systemv/lpstat.c:1902
 #, c-format
 msgid "printer %s/%s now printing %s-%d.  enabled since %s"
 msgstr ""
 
-#: cups/notify.c:93 cups/notify.c:134
 msgid "processing"
 msgstr "zpracování"
 
-#: systemv/lp.c:644
 #, c-format
 msgid "request id is %s-%d (%d file(s))"
 msgstr ""
 
-#: cups/snmp.c:1020
 msgid "request-id uses indefinite length"
 msgstr "ID požadavku má neomezenou délku"
 
-#: systemv/lpstat.c:2048
 msgid "scheduler is not running"
 msgstr ""
 
-#: systemv/lpstat.c:2044
 msgid "scheduler is running"
 msgstr ""
 
-#: cups/adminutil.c:2159
 #, c-format
 msgid "stat of %s failed: %s"
 msgstr "stav %s selhalo: %s"
 
-#: berkeley/lpc.c:211
 msgid "status\t\tShow status of daemon and queue."
 msgstr ""
 
-#: cups/notify.c:96 cups/notify.c:137
 msgid "stopped"
 msgstr "zastaveno"
 
-#: systemv/lpstat.c:1017
 #, c-format
 msgid "system default destination: %s"
 msgstr ""
 
-#: systemv/lpstat.c:1014
 #, c-format
 msgid "system default destination: %s/%s"
 msgstr ""
 
-#: cups/notify.c:108 cups/notify.c:140
 msgid "unknown"
 msgstr "neznámý"
 
-#: cups/notify.c:117
 msgid "untitled"
 msgstr "nepojmenovaný"
 
-#: cups/snmp.c:1045
 msgid "variable-bindings uses indefinite length"
 msgstr "\"variable-bindings\" má neomezenou délku"
 
+#~ msgid "720dpi"
+#~ msgstr "720 dpi"
 
-#
-# End of "$Id$".
-#
+#~ msgid "Enter old password:"
+#~ msgstr "Zadejte původní heslo:"
+
+#~ msgid "Enter password again:"
+#~ msgstr "Opakujte heslo:"
+
+#~ msgid "Enter password:"
+#~ msgstr "Zadejte heslo:"
+
+#~ msgid "New Stylus Color Series"
+#~ msgstr "New Stylus Color Series"
+
+#~ msgid "New Stylus Photo Series"
+#~ msgstr "New Stylus Photo Series"
+
+#~ msgid "Purge Jobs"
+#~ msgstr "Výmaz úloh"
+
+#~ msgid "Stylus Color Series"
+#~ msgstr "Stylus Color Series"
+
+#~ msgid "Stylus Photo Series"
+#~ msgstr "Stylus Photo Series"
diff --git a/locale/cups_de.po b/locale/cups_de.po
new file mode 100644 (file)
index 0000000..089ca04
--- /dev/null
@@ -0,0 +1,5774 @@
+#
+# "$Id$"
+#
+#   Message catalog template for CUPS.
+#
+#   Copyright 2007-2012 by Apple Inc.
+#   Copyright 2005-2007 by Easy Software Products.
+#
+#   These coded instructions, statements, and computer programs are the
+#   property of Apple Inc. and are protected by Federal copyright
+#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+#   which should have been included with this file.  If this file is
+#   file is missing or damaged, see the license at "http://www.cups.org/".
+#
+#
+# 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.0\n"
+"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
+"PO-Revision-Date: 2015-05-09 22:25+0100\n"
+"Last-Translator: Joachim Schwender <joachim.schwender@web.de>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: German\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 ""
+
+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/interfaces/%s"
+msgstr "\tSchnittstelle: %s/interfaces/%s"
+
+#, 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 ""
+
+msgid "\tUsers denied:"
+msgstr "\tGesperrte Benutzer:"
+
+msgid "\tdaemon present"
+msgstr ""
+
+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 "                          Ignore specific warnings."
+msgstr ""
+
+msgid "                          Issue warnings instead of errors."
+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 ""
+
+msgid "       cupsaddsmb [options] -a"
+msgstr ""
+
+msgid "       cupstestdsc [options] -"
+msgstr ""
+
+msgid "       program | cupstestppd [options] -"
+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 "    -h       Show program usage"
+msgstr ""
+
+#, c-format
+msgid ""
+"    Bad %%%%BoundingBox: on line %d.\n"
+"        REF: Page 39, %%%%BoundingBox:"
+msgstr ""
+
+#, c-format
+msgid ""
+"    Bad %%%%Page: on line %d.\n"
+"        REF: Page 53, %%%%Page:"
+msgstr ""
+
+#, c-format
+msgid ""
+"    Bad %%%%Pages: on line %d.\n"
+"        REF: Page 43, %%%%Pages:"
+msgstr ""
+
+#, c-format
+msgid ""
+"    Line %d is longer than 255 characters (%d).\n"
+"        REF: Page 25, Line Length"
+msgstr ""
+
+msgid ""
+"    Missing %!PS-Adobe-3.0 on first line.\n"
+"        REF: Page 17, 3.1 Conforming Documents"
+msgstr ""
+
+#, c-format
+msgid "    Missing %%EndComments comment.        REF: Page 41, %%EndComments"
+msgstr ""
+
+#, c-format
+msgid ""
+"    Missing or bad %%BoundingBox: comment.\n"
+"        REF: Page 39, %%BoundingBox:"
+msgstr ""
+
+#, c-format
+msgid ""
+"    Missing or bad %%Page: comments.\n"
+"        REF: Page 53, %%Page:"
+msgstr ""
+
+#, c-format
+msgid ""
+"    Missing or bad %%Pages: comment.\n"
+"        REF: Page 43, %%Pages:"
+msgstr ""
+
+msgid "    NO ERRORS FOUND"
+msgstr "     KEINE FEHLER GEFUNDEN"
+
+#, c-format
+msgid "    Saw %d lines that exceeded 255 characters."
+msgstr ""
+
+#, c-format
+msgid "    Too many %%BeginDocument comments."
+msgstr ""
+
+#, c-format
+msgid "    Too many %%EndDocument comments."
+msgstr ""
+
+msgid "    Warning: file contains binary data."
+msgstr ""
+
+#, c-format
+msgid "    Warning: no %%EndComments comment in file."
+msgstr ""
+
+#, c-format
+msgid "    Warning: obsolete DSC version %.1f in file."
+msgstr ""
+
+msgid "  ! expression            Unary NOT of expression."
+msgstr ""
+
+msgid "  ( expressions )         Group expressions."
+msgstr ""
+
+msgid "  --[no-]debug-logging    Turn debug logging on/off."
+msgstr ""
+
+msgid "  --[no-]remote-admin     Turn remote administration on/off."
+msgstr "  --[no-]remote-admin     Fernadministrierung ein/ausschalten."
+
+msgid "  --[no-]remote-any       Allow/prevent access from the Internet."
+msgstr "  --[no-]remote-any       Erlaube/sperre zugriff über das Internet."
+
+msgid "  --[no-]share-printers   Turn printer sharing on/off."
+msgstr "  --[no-]share-printers   Druckerfreigabe ein/aus."
+
+msgid "  --[no-]user-cancel-any  Allow/prevent users to cancel any job."
+msgstr ""
+"  --[no-]user-cancel-any  Erlaube/sperre Benutzern das abbrechen eines "
+"Druckauftrags."
+
+msgid "  --cr                    End lines with CR (Mac OS 9)."
+msgstr "  --cr                    Zeilenenden mit CR (OS 9)"
+
+msgid "  --crlf                  End lines with CR + LF (Windows)."
+msgstr "  --crlf                  Zeilenenden mit CR+LF (Windows)"
+
+msgid "  --domain regex          Match domain to regular expression."
+msgstr ""
+"  --domain regex          Prüfe auf Übereinstimmung mit Regulärem Ausdruck"
+
+msgid ""
+"  --exec utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+
+msgid "  --false                 Always false."
+msgstr ""
+
+msgid "  --help                  Show help."
+msgstr "  --help                  Zeige Hilfe."
+
+msgid "  --help                  Show this help."
+msgstr "  --help                  Zeige diese Hilfe."
+
+msgid "  --host regex            Match hostname to regular expression."
+msgstr ""
+"  --host regex            Prüfe den Hostnamen auf Übereinstimmung mit "
+"Regulärem Audruck"
+
+msgid "  --lf                    End lines with LF (UNIX/Linux/OS X)."
+msgstr "  --lf                    Zeilenenden mit LF (UNIX/Linux/OS X)"
+
+msgid "  --list-filters          List filters that will be used."
+msgstr "  --list-filters          Liste die Filter auf die benutzt werden."
+
+msgid "  --local                 True if service is local."
+msgstr "  --local                 Wahr wenn der Dienst lokal ist."
+
+msgid "  --ls                    List attributes."
+msgstr "  --ls                    Liste Attribute auf."
+
+msgid "  --name regex            Match service name to regular expression."
+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 "  --quiet                 Quietly report match via exit code."
+msgstr ""
+
+msgid "  --remote                True if service is remote."
+msgstr ""
+
+msgid ""
+"  --stop-after-include-error\n"
+"                          Stop tests after a failed INCLUDE."
+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 "  -4                      Connect using IPv4."
+msgstr ""
+
+msgid "  -6                      Connect using IPv6."
+msgstr ""
+
+msgid "  -C                      Send requests using chunking (default)."
+msgstr ""
+
+msgid "  -D                      Remove the input file when finished."
+msgstr ""
+
+msgid "  -D name=value           Set named variable to value."
+msgstr ""
+
+msgid "  -E                      Encrypt the connection."
+msgstr "  -E                      Verschlüssele die Verbindung."
+
+msgid "  -E                      Test with HTTP Upgrade to TLS."
+msgstr "  -E                      Teste mit HTTP Upgrade auf TLS."
+
+msgid ""
+"  -F                      Run in the foreground but detach from console."
+msgstr ""
+"  -F                      Laufe im Vordergrund aber abgetrennt von der "
+"Konsole."
+
+msgid "  -H samba-server         Use the named SAMBA server."
+msgstr "  -H samba-server         Benutze den SAMBA Server."
+
+msgid "  -I                      Ignore errors."
+msgstr "  -I                      Ignoriere Fehler."
+
+msgid "  -I include-dir          Add include directory to search path."
+msgstr ""
+
+msgid "  -I {filename,filters,none,profiles}"
+msgstr ""
+
+msgid "  -L                      Send requests using content-length."
+msgstr ""
+
+msgid ""
+"  -P filename.plist       Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+
+msgid "  -P filename.ppd         Set PPD file."
+msgstr "  -P filename.ppd         Lege PPD Datei fest."
+
+msgid "  -P number[-number]      Match port to number or range."
+msgstr ""
+
+msgid "  -R root-directory       Set alternate root."
+msgstr ""
+
+msgid "  -S                      Test with SSL encryption."
+msgstr "  -S                      Teste mit SSL Verschlüsselung."
+
+msgid "  -T seconds              Set the browse timeout in seconds."
+msgstr ""
+"  -T seconds              Setze die Zeitüberschreitung für das Browsen in "
+"Sekunden."
+
+msgid "  -T seconds              Set the receive/send timeout in seconds."
+msgstr ""
+"  -T seconds              Setze die Zeitüberschreitung für das Senden/"
+"Empfangen in Sekunden."
+
+msgid "  -U username             Specify username."
+msgstr "  -U username             Gebe den Benutzernamen an."
+
+msgid "  -V version              Set default IPP version."
+msgstr "  -V version              Setze die Voreingestellte IPP Version."
+
+msgid ""
+"  -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,"
+"translations}"
+msgstr ""
+
+msgid "  -X                      Produce XML plist instead of plain text."
+msgstr "  -X                      Erzeuge XML-Ausgaben anstatt von Text."
+
+msgid "  -a                      Browse for all services."
+msgstr "  -a                      Browse für alle Dienste."
+
+msgid "  -a                      Export all printers."
+msgstr "  -a                      Exportiere alle Drucker."
+
+msgid "  -c                      Produce CSV output."
+msgstr "  -c                      Erzeuge CSV Ausgabe."
+
+msgid "  -c catalog.po           Load the specified message catalog."
+msgstr ""
+
+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 "  -c cupsd.conf           Set cupsd.conf file to use."
+msgstr "  -c cups.conf            Setze die zu benutzende Datei cups.conf"
+
+msgid "  -d domain               Browse/resolve in specified domain."
+msgstr "  -d domain               Browse/löse auf in der angegebenen Domäne."
+
+msgid "  -d name=value           Set named variable to value."
+msgstr ""
+
+msgid "  -d output-dir           Specify the output directory."
+msgstr ""
+
+msgid "  -d printer              Use the named printer."
+msgstr "  -d printer              Benutze den genannten Drucker."
+
+msgid "  -d regex                Match domain to regular expression."
+msgstr ""
+
+msgid "  -e                      Use every filter from the PPD file."
+msgstr ""
+
+msgid "  -f                      Run in the foreground."
+msgstr "  -f                      Laufe im Vordergrund."
+
+msgid "  -f filename             Set default request filename."
+msgstr ""
+
+msgid "  -h                      Show this usage message."
+msgstr ""
+
+msgid "  -h regex                Match hostname to regular expression."
+msgstr ""
+
+msgid "  -h server[:port]        Specify server address."
+msgstr "  -h server[:port]        Spezifiziere die Server-Adresse."
+
+msgid "  -i mime/type            Set input MIME type (otherwise auto-typed)."
+msgstr ""
+
+msgid ""
+"  -i seconds              Repeat the last file with the given time interval."
+msgstr ""
+
+msgid ""
+"  -j job-id[,N]           Filter file N from the specified job (default is "
+"file 1)."
+msgstr ""
+
+msgid "  -l                      List attributes."
+msgstr ""
+
+msgid "  -l                      Produce plain text output."
+msgstr ""
+
+msgid "  -l                      Run cupsd on demand."
+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 "  -n copies               Lege die Anzahl der Kopien fest."
+
+msgid ""
+"  -n count                Repeat the last file the given number of times."
+msgstr ""
+
+msgid "  -n regex                Match service name to regular expression."
+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                      Print URI if true."
+msgstr ""
+
+msgid "  -p filename.ppd         Set PPD file."
+msgstr ""
+
+msgid "  -p program              Run specified program for each service."
+msgstr ""
+
+msgid "  -q                      Quietly report match via exit code."
+msgstr ""
+
+msgid "  -q                      Run silently."
+msgstr ""
+
+msgid "  -r                      True if service is remote."
+msgstr ""
+
+msgid "  -r                      Use 'relaxed' open mode."
+msgstr ""
+
+msgid "  -s                      Print service name if true."
+msgstr ""
+
+msgid "  -t                      Produce a test report."
+msgstr ""
+
+msgid "  -t                      Test PPDs instead of generating them."
+msgstr ""
+
+msgid "  -t                      Test the configuration file."
+msgstr ""
+
+msgid "  -t key                  True if the TXT record contains the key."
+msgstr ""
+
+msgid "  -t title                Set title."
+msgstr ""
+
+msgid "  -t type                 Browse/resolve with specified type."
+msgstr ""
+
+msgid "  -u                      Remove the PPD file when finished."
+msgstr ""
+
+msgid "  -u regex                Match URI to regular expression."
+msgstr ""
+
+msgid "  -v                      Be verbose."
+msgstr "  -v                      Sei ausführlich."
+
+msgid "  -vv                     Be very verbose."
+msgstr "  -vv                     Sei sehr ausführlich."
+
+msgid ""
+"  -x utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+
+msgid "  -z                      Compress PPD files using GNU zip."
+msgstr ""
+"  -z                      Komprimiere PPD Datei unter Verwendung von GNU zip."
+
+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 ""
+"  expression --and expression\n"
+"                          Logical AND."
+msgstr ""
+
+msgid ""
+"  expression --or expression\n"
+"                          Logical OR."
+msgstr ""
+
+msgid "  expression expression   Logical AND."
+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 " FAIL"
+msgstr ""
+
+msgid " PASS"
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#, c-format
+msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
+msgstr ""
+
+#, c-format
+msgid "%d x %d mm"
+msgstr "%d×%d mm"
+
+#, c-format
+msgid "%g x %g"
+msgstr "%g×%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 ""
+
+#, 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 ""
+
+#, c-format
+msgid "%s not accepting requests since %s -"
+msgstr ""
+
+#, c-format
+msgid "%s not supported."
+msgstr "%s nicht unterstützt."
+
+#, 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 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 - 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 read MIME database from \"%s\" or \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Unable to resolve \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "%s: Unknown destination \"%s\"."
+msgstr "%s: Unbekanntes Druckziel \"%s\"."
+
+#, c-format
+msgid "%s: Unknown destination MIME type %s/%s."
+msgstr "%s: Unbekannte Ziel-MIME-Type %s/%s."
+
+#, 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 "%s: Unbekannte Quell-MIME-Type %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 ""
+
+#, 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 "-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 "-20"
+msgstr "-20"
+
+msgid "-25"
+msgstr "-25"
+
+msgid "-3"
+msgstr "-3"
+
+msgid "-30"
+msgstr "-30"
+
+msgid "-35"
+msgstr "-35"
+
+msgid "-4"
+msgstr "-4"
+
+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 "-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 "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 ""
+
+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 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 ""
+
+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 ""
+
+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 ""
+
+msgid "3.00x1.00\""
+msgstr "3,00×1,00inch"
+
+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 ""
+
+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 ""
+
+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 ""
+
+msgid "65"
+msgstr "65"
+
+msgid "7"
+msgstr "7"
+
+msgid "7 inches/sec."
+msgstr "7 inch/s"
+
+msgid "7 x 9"
+msgstr ""
+
+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 ""
+
+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 ""
+
+msgid "A Samba password is required to export printer drivers"
+msgstr ""
+
+msgid "A Samba username is required to export printer drivers"
+msgstr ""
+
+#, 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össe"
+
+msgid "A3 Oversize Long Edge"
+msgstr "A3 Übergrösse lange Kante"
+
+msgid "A4"
+msgstr "DIN A4"
+
+msgid "A4 Long Edge"
+msgstr "A4 lange Kante"
+
+msgid "A4 Oversize"
+msgstr "A4 Übergrösse"
+
+msgid "A4 Small"
+msgstr "A4 klein"
+
+msgid "A5"
+msgstr "DIN A5"
+
+msgid "A5 Long Edge"
+msgstr ""
+
+msgid "A5 Oversize"
+msgstr "A5 Übergrösse"
+
+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 ""
+
+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 "Druckaufträge akzeptieren"
+
+msgid "Accepted"
+msgstr "Akzeptiert"
+
+msgid "Add Class"
+msgstr "Klasse hinzufügen"
+
+msgid "Add Printer"
+msgstr "Drucker hinzufügen"
+
+msgid "Add RSS Subscription"
+msgstr "RSS-Abo 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 "Applicator"
+
+#, 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 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 ""
+
+msgid "B6"
+msgstr "DIN B6"
+
+msgid "B7"
+msgstr "DIN B7"
+
+msgid "B8"
+msgstr "DIN B8"
+
+msgid "B9"
+msgstr "DIN B9"
+
+#, c-format
+msgid "Bad 'document-format' value \"%s\"."
+msgstr ""
+
+msgid "Bad NULL dests pointer"
+msgstr "Ungültiger NULL-Dests-Pointer"
+
+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 Request"
+msgstr "Ungültige Anfrage"
+
+msgid "Bad SNMP version number"
+msgstr "Ungültige SNMP-Versiosnummer"
+
+msgid "Bad UIConstraints"
+msgstr "Ungültige UIConstraints"
+
+msgid "Bad arguments to function"
+msgstr "Ungültige Argumente für Funktion"
+
+#, c-format
+msgid "Bad copies value %d."
+msgstr "Ungültige Angabe der Anzahl der Kopien %d."
+
+msgid "Bad custom parameter"
+msgstr "Ungültiger angepasster Parameter"
+
+#, 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 "Ungültiger Hostname/Adresse in URI"
+
+#, c-format
+msgid "Bad job-name value: %s"
+msgstr "Ungültiger Auftragsname: %s"
+
+msgid "Bad job-name value: Wrong type or count."
+msgstr "Ungültiger Auftragsname: Falscher Typ oder Anzahl."
+
+msgid "Bad job-priority value."
+msgstr "Ungültiger Wert für Auftragspriorität."
+
+#, 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 number-up value %d."
+msgstr "Ungültiger Number-Up-Wert „%d“."
+
+#, c-format
+msgid "Bad option + choice on line %d."
+msgstr ""
+
+#, 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 ""
+
+#, c-format
+msgid "Bad printer-state value %d."
+msgstr ""
+
+msgid "Bad printer-uri."
+msgstr "Ungültige Drucker-uri"
+
+#, c-format
+msgid "Bad request ID %d."
+msgstr ""
+
+#, c-format
+msgid "Bad request version number %d.%d."
+msgstr ""
+
+msgid "Bad resource in URI"
+msgstr "Ungültige Resource in URI"
+
+msgid "Bad scheme in URI"
+msgstr "Ungültiges Scheman in URI"
+
+msgid "Bad subscription ID"
+msgstr "Ungültige Subskriptions-ID"
+
+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"
+
+#, c-format
+msgid "Boolean expected for waiteof option \"%s\"."
+msgstr ""
+
+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 "Cancel RSS Subscription"
+msgstr "RSS-Abo widerrufen"
+
+msgid "Canceling print job."
+msgstr "Auftrag wird abgebrochen."
+
+msgid "Cannot share a remote Kerberized printer."
+msgstr ""
+
+msgid "Cassette"
+msgstr "Kasette"
+
+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 ""
+
+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 "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 "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."
+
+#, 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 "Direct Thermotransfermedia"
+
+#, 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 "Deaktiviert"
+
+#, c-format
+msgid "Document #%d does not exist in job #%d."
+msgstr ""
+
+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 "Empty PPD file."
+msgstr "Leere PPD Datei."
+
+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 "German"
+
+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 Kennwort oder den root-Benutzernamen "
+"und -Kennwort ein, um auf diese Seite zuzgreifen. 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 ""
+
+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 "Umschlagzuführung"
+
+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 "Fehlerbehandlung"
+
+msgid "Error reading raster data."
+msgstr ""
+
+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 "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 ""
+
+msgid "Expectation Failed"
+msgstr "Erwartete Daten nicht erhalten"
+
+msgid "Export Printers to Samba"
+msgstr "Drucker zu Samba exportieren"
+
+msgid "Expressions:"
+msgstr "Ausdrücke:"
+
+msgid "FAIL"
+msgstr ""
+
+msgid "FanFold German"
+msgstr ""
+
+msgid "FanFold Legal German"
+msgstr ""
+
+msgid "Fanfold US"
+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 "Datei \"%s\" nicht verfügbar: %s"
+
+#, c-format
+msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
+msgstr ""
+
+msgid "File Folder "
+msgstr "Datei-Verzeichnis "
+
+#, 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 "Folio"
+msgstr "Folio"
+
+msgid "Forbidden"
+msgstr "Verboten"
+
+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 ""
+
+msgid "Grayscale"
+msgstr "Graustufen"
+
+msgid "HP"
+msgstr "HP"
+
+msgid "Hanging Folder"
+msgstr "Hängeordner"
+
+msgid "Help file not in index."
+msgstr "Hilfedatei nicht im Index."
+
+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 "IPP Wert länger als 32767 byte"
+
+msgid "ISOLatin1"
+msgstr "UTF-8"
+
+msgid "Illegal control character"
+msgstr "Ungültiges Steuerungszeichen"
+
+msgid "Illegal main keyword string"
+msgstr "Ungültiger Main-Keyword-String"
+
+msgid "Illegal option keyword string"
+msgstr "Ungültiger Option-Keyword-String"
+
+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 media name arguments."
+msgstr "Ungültige Argumente des Mediennamens."
+
+msgid "Invalid media size."
+msgstr "Ungültige Mediengrösse."
+
+#, c-format
+msgid "Invalid printer command \"%s\"."
+msgstr "Ungültiges Druckkommando \"%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 "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 "Druckauftrag Nr. %d wurde bereits abgebrochen – Abbruch nicht möglich."
+
+#, c-format
+msgid "Job #%d is already canceled - can't cancel."
+msgstr "Druckauftrag Nr. %d wurde bereits abgebrochen – Abbruch nicht möglich."
+
+#, c-format
+msgid "Job #%d is already completed - can't cancel."
+msgstr ""
+"Druckauftrag Nr. %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 "Druckauftrag abgeschlossen"
+
+msgid "Job Created"
+msgstr "Druckauftrag erzeugt"
+
+msgid "Job Options Changed"
+msgstr "Druckauftragsoptionen wurden geändert"
+
+msgid "Job Stopped"
+msgstr "Druckauftrag gestoppt"
+
+msgid "Job is completed and cannot be changed."
+msgstr "Druckauftrag ist abgeschlossen und kann nicht geändert werden."
+
+msgid "Job operation failed"
+msgstr "Druckvorgang fehlgeschlagen:"
+
+msgid "Job state cannot be changed."
+msgstr "Druckauftragsstatus kann nicht geändert werden."
+
+msgid "Job subscriptions cannot be renewed."
+msgstr "Auftragssubskiptionen können nicht erneuert werden."
+
+msgid "Jobs"
+msgstr "Druckaufträge"
+
+msgid "LPD/LPR Host or Printer"
+msgstr "LPD/LPR-Host oder -Drucker"
+
+msgid "Label Printer"
+msgstr "Etikettendrucker"
+
+msgid "Label Top"
+msgstr "Etikett (oben)"
+
+#, c-format
+msgid "Language \"%s\" not supported."
+msgstr "Sprache \"%s\" nicht unterstützt."
+
+msgid "Large Address"
+msgstr "Adresse gross"
+
+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 "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"
+
+msgid "Load paper."
+msgstr "Lade Papier."
+
+msgid "Long-Edge (Portrait)"
+msgstr "Lange Kante (Hochformat)"
+
+msgid "Looking for printer..."
+msgstr ""
+
+msgid "Manual Feed"
+msgstr "Manuelle Papierzufuhr"
+
+msgid "Media Size"
+msgstr "Mediengrösse"
+
+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 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."
+
+#, c-format
+msgid "Missing double quote on line %d."
+msgstr "Fehlende Doppelhochkommas in Zeile %d."
+
+msgid "Missing form variable"
+msgstr "Fehlende form Variable"
+
+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 ""
+
+msgid "Missing required attributes."
+msgstr ""
+
+msgid "Missing resource in URI"
+msgstr "Fehlende Resource in URI"
+
+msgid "Missing scheme in URI"
+msgstr "Fehlendes Schema in URI"
+
+#, c-format
+msgid "Missing value on line %d."
+msgstr ""
+
+msgid "Missing value string"
+msgstr "Wertestring fehlt"
+
+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 "Modifikator:"
+
+msgid "Modify Class"
+msgstr "Klasse verändern"
+
+msgid "Modify Printer"
+msgstr "Drucker verändern"
+
+msgid "Move All Jobs"
+msgstr "Alle Druckaufträge verschieben"
+
+msgid "Move Job"
+msgstr "Druckauftrag verschieben"
+
+msgid "Moved Permanently"
+msgstr "Dauerhaft verschoben"
+
+msgid "NULL PPD file pointer"
+msgstr "NULL PPD File Pointer"
+
+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 "No"
+msgstr "Nein"
+
+msgid "No Content"
+msgstr "Kein Inhalt"
+
+msgid "No PPD name"
+msgstr "Kein PPD Name"
+
+msgid "No VarBind SEQUENCE"
+msgstr "Keine VarBind SEQUENCE"
+
+msgid "No Windows printer drivers are installed."
+msgstr "Keine Windows-Druckertreiber installiert."
+
+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 community name"
+msgstr "Kein Community-Name"
+
+msgid "No default printer."
+msgstr "Kein voreingestelltes Druckziel"
+
+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 ""
+
+msgid "No printer-uri in request."
+msgstr ""
+
+msgid "No request URI."
+msgstr ""
+
+msgid "No request protocol version."
+msgstr ""
+
+msgid "No request sent."
+msgstr "Keine Anfrage gesendet."
+
+msgid "No request-id"
+msgstr "Keine Anfrage-ID"
+
+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 "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 ""
+"Note: this program only validates the DSC comments, not the PostScript "
+"itself."
+msgstr ""
+"Hinweis: dieses Programme validiert nur die DSC Kommentare, nicht PostScript "
+"selber"
+
+msgid "OK"
+msgstr "OK"
+
+msgid "Off (1-Sided)"
+msgstr "Aus (Einseitig)"
+
+msgid "Oki"
+msgstr "Oki"
+
+msgid "Online Help"
+msgstr "Online-Hilfe"
+
+#, c-format
+msgid "Open of %s failed: %s"
+msgstr "%s öffnen 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 ""
+
+msgid "Options Installed"
+msgstr "Installierte Optionen"
+
+msgid "Options:"
+msgstr "Optionen:"
+
+msgid "Out of date PPD cache file."
+msgstr ""
+
+msgid "Out of memory."
+msgstr "Nicht genügend Hauptspeicher."
+
+msgid "Output Mode"
+msgstr "Ausgabemodus"
+
+msgid "Output bin is almost full."
+msgstr "Ausgabefach ist fast voll."
+
+msgid "Output bin is full."
+msgstr "Ausgabefach ist voll."
+
+msgid "Output bin is missing."
+msgstr "Ausgabefach fehlt."
+
+msgid "PASS"
+msgstr "Bestanden"
+
+msgid "PCL Laser Printer"
+msgstr "PCL Laserdrucker"
+
+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 "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 "Paper jam."
+msgstr "Papierstau."
+
+msgid "Paper tray is almost empty."
+msgstr "Papierfach ist fast leer."
+
+msgid "Paper tray is empty."
+msgstr "Papierfach ist leer."
+
+msgid "Paper tray is missing."
+msgstr "Papierfach ist nicht vorhanden."
+
+msgid "ParamCustominCutInterval"
+msgstr "ParamCustominCutInterval"
+
+msgid "ParamCustominTearInterval"
+msgstr "ParamCustominTearInterval"
+
+#, c-format
+msgid "Password for %s on %s? "
+msgstr "Kennwort für „%s“ auf „%s“? "
+
+#, c-format
+msgid "Password for %s required to access %s via SAMBA: "
+msgstr "Kennwort für „%s“ wird benötigt für den Zugriff auf „%s“ über SAMBA: "
+
+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 ""
+
+msgid "Postcard Double Long Edge"
+msgstr ""
+
+msgid "Postcard Long Edge"
+msgstr ""
+
+msgid "Preparing to print."
+msgstr ""
+
+msgid "Print Density"
+msgstr "Druckdichte"
+
+msgid "Print Job:"
+msgstr "Druckauftrag:"
+
+msgid "Print Mode"
+msgstr "Druckmodus"
+
+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 abziehen"
+
+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 gross."
+
+msgid "Print job was not accepted."
+msgstr "Der Druckauftrag wurde nicht angenommen."
+
+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:"
+msgstr "Drucker:"
+
+msgid "Printers"
+msgstr "Drucker"
+
+#, c-format
+msgid "Printing page %d, %u%% complete."
+msgstr "Drucke Seite %d, %u%% fertig."
+
+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össe"
+
+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 gross"
+
+msgid "Resolution"
+msgstr "Auflösung"
+
+msgid "Resume Class"
+msgstr "Klasse fortsetzen"
+
+msgid "Resume Printer"
+msgstr "Drucken fortsetzen"
+
+msgid "Return Address"
+msgstr "Antwort-Adresse"
+
+msgid "Rewind"
+msgstr "Zurückdrehen"
+
+#, c-format
+msgid "Running command: %s %s -N -A %s -c '%s'"
+msgstr ""
+
+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 "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"
+
+#. 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 ""
+
+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 "Protokoll wechseln"
+
+msgid "Tabloid"
+msgstr "US Tabloid"
+
+msgid "Tabloid Oversize"
+msgstr ""
+
+msgid "Tabloid Oversize Long Edge"
+msgstr ""
+
+msgid "Tear"
+msgstr "Abreissen"
+
+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 ""
+
+#, 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 "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 developer unit needs to be replaced."
+msgstr "Die Entwicklereinheit muss gewechselt werden."
+
+msgid "The developer unit will need to be replaced soon."
+msgstr "Die entwicklereinheit muss demnächst gewechselt werden."
+
+msgid "The fuser's temperature is high."
+msgstr "Die Temperatur der Fixiereinheit ist hoch."
+
+msgid "The fuser's temperature is low."
+msgstr "Die Temperatur der Fixiereinheit ist niedrig."
+
+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 ""
+
+msgid "The optical photoconductor needs to be replaced."
+msgstr ""
+
+msgid "The optical photoconductor will need to be replaced soon."
+msgstr ""
+
+msgid "The printer configuration is incorrect or the printer no longer exists."
+msgstr ""
+
+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 low on ink."
+msgstr "Der Drucker hat niedrigen Tintenstand"
+
+msgid "The printer is low on toner."
+msgstr "Der Drucker hat niedrigen Tonerstand"
+
+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 be out of ink."
+msgstr "Der Drucker hat mochlicherweise keine Tinte mehr"
+
+msgid "The printer may be out of toner."
+msgstr "Der Drucker könnte zu wenig Toner haben."
+
+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 (/), or the pound sign (#)."
+msgstr ""
+"Der Druckername darf maximal 127 druckbare Zeichen haben und darf keine "
+"Leerzeichen, Schrägstriche (/) oder Rautezeichen (#) enthalten."
+
+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."
+
+msgid "The printer's cover is open."
+msgstr "Die Druckerabdeckung ist offen."
+
+msgid "The printer's door is open."
+msgstr "Die Klappe des Druckers ist offen"
+
+msgid "The printer's interlock is open."
+msgstr "Die Sicherheitsverriegelung des Druckers ist offen."
+
+msgid "The printer's waste bin is almost full."
+msgstr "Der Resttonerbehälter des Druckers ist fast voll"
+
+msgid "The printer's waste bin is full."
+msgstr "Der Resttonerbehälter des Druckers ist voll"
+
+#, 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 ""
+
+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 subscription name may not contain spaces, slashes (/), question marks "
+"(?), or the pound sign (#)."
+msgstr ""
+"Der Subkriptionsname darf keine Leerzeichen, Schrägstriche (/), Fragezeichen "
+"(?) oder Rautezeichen (#) enthalten."
+
+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 ""
+
+msgid "There are too many subscriptions."
+msgstr "Es gibt zu viele Subskriptionen."
+
+msgid "There was an unrecoverable USB error."
+msgstr "Ein nicht zu behebenden 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 ""
+
+#, c-format
+msgid "Too many printer-state-reasons values (%d > %d)."
+msgstr ""
+
+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 "URI Too Long"
+msgstr "URI zu lang"
+
+msgid "URI too large"
+msgstr "URI zu gross"
+
+msgid "US Ledger"
+msgstr "US Ledger"
+
+msgid "US Legal"
+msgstr "US Lang"
+
+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 "Kein Zugriff auf die Datei cupsd.conf"
+
+msgid "Unable to access help file."
+msgstr "Kein Zugriff auf die Hilfe-Datei."
+
+msgid "Unable to add RSS subscription"
+msgstr "RSS-Abo konnte nicht hinzugefügt werden:"
+
+msgid "Unable to add class"
+msgstr "Klasse konnte nicht hinzugefügt werden:"
+
+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 "Drucker konnte nicht hinzugefügt werden:"
+
+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 cancel RSS subscription"
+msgstr "RSS-Abo konnte nicht widerrufen werden:"
+
+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 ""
+
+#, c-format
+msgid "Unable to compile naturalLanguage regular expression: %s."
+msgstr ""
+
+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 ""
+
+#, c-format
+msgid "Unable to copy 64-bit CUPS printer driver files (%d)."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy 64-bit Windows printer driver files (%d)."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy CUPS printer driver files (%d)."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy PPD file - %s"
+msgstr ""
+
+msgid "Unable to copy PPD file."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy Windows 2000 printer driver files (%d)."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy Windows 9x printer driver files (%d)."
+msgstr ""
+
+#, c-format
+msgid "Unable to copy interface script - %s"
+msgstr ""
+
+msgid "Unable to create printer-uri"
+msgstr ""
+
+msgid "Unable to create server credentials."
+msgstr ""
+
+msgid "Unable to create temporary file"
+msgstr "Temporäre Datei konntenicht 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 ""
+
+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 ""
+
+msgid "Unable to find destination for job"
+msgstr ""
+
+msgid "Unable to find printer."
+msgstr ""
+
+msgid "Unable to find server credentials."
+msgstr "Die Server-Zugangsdaten konnten nicht gefunden werden."
+
+msgid "Unable to get backend exit status."
+msgstr ""
+
+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:"
+
+#, c-format
+msgid "Unable to install Windows 2000 printer driver files (%d)."
+msgstr ""
+
+#, c-format
+msgid "Unable to install Windows 9x printer driver files (%d)."
+msgstr ""
+
+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 "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 ""
+
+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 ""
+
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
+msgstr ""
+
+#, c-format
+msgid "Unable to run \"%s\": %s"
+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 "Kann Daten nicht zum Drucker senden."
+
+#, c-format
+msgid "Unable to set Windows printer driver (%d)."
+msgstr "Kann Windows Druckertreiber (%d) nicht setzen."
+
+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 ""
+
+msgid "Unauthorized"
+msgstr "Nicht berechtigt"
+
+msgid "Units"
+msgstr "Einheiten"
+
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#, c-format
+msgid "Unknown choice \"%s\" for option \"%s\"."
+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 media size name."
+msgstr ""
+
+#, c-format
+msgid "Unknown option \"%s\" with value \"%s\"."
+msgstr ""
+
+#, 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 ""
+
+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 "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 ""
+
+msgid "Unsupported 'job-name' value."
+msgstr "Nicht unterstützter 'job-name' Wert."
+
+#, 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 "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 ""
+
+#, 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 "Wertetyp nicht unterstützt"
+
+msgid "Upgrade Required"
+msgstr "Aktualisierung erforderlich"
+
+msgid ""
+"Usage:\n"
+"\n"
+"    lpadmin [-h server] -d destination\n"
+"    lpadmin [-h server] -x destination\n"
+"    lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n"
+"                       [-r remove-class] [-v device] [-D description]\n"
+"                       [-P ppd-file] [-o name=value]\n"
+"                       [-u allow:user,user] [-u deny:user,user]"
+msgstr ""
+
+#, c-format
+msgid "Usage: %s job-id user title copies options [file]"
+msgstr ""
+
+msgid "Usage: cupsaddsmb [options] printer1 ... printerN"
+msgstr ""
+
+msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]"
+msgstr ""
+
+msgid "Usage: cupsd [options]"
+msgstr ""
+
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
+msgstr ""
+
+msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
+msgstr ""
+
+msgid ""
+"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
+msgstr ""
+
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+"       ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+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: lpmove job/src dest"
+msgstr ""
+
+msgid ""
+"Usage: lpoptions [-h server] [-E] -d printer\n"
+"       lpoptions [-h server] [-E] [-p printer] -l\n"
+"       lpoptions [-h server] [-E] -p printer -o option[=value] ...\n"
+"       lpoptions [-h server] [-E] -x printer"
+msgstr ""
+
+msgid ""
+"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
+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 ""
+
+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, no Windows 2000 printer drivers are installed."
+msgstr "Warnung, keine Win2k Treiber installiert."
+
+msgid "Web Interface is Disabled"
+msgstr "Web-Schnittstelle ist abgeschaltet"
+
+msgid "Yes"
+msgstr "Ja"
+
+#, c-format
+msgid ""
+"You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://"
+"%s:%d%s</A>."
+msgstr ""
+"Auf diese Seite greifen Sie zu über die URL <A HREF=\"https://%s:%d%s"
+"\">https://%s:%d%s</A>."
+
+msgid "ZPL Label Printer"
+msgstr "ZPL Etikettendrucker"
+
+msgid "Zebra"
+msgstr "Zebra"
+
+msgid "aborted"
+msgstr "abgebrochen"
+
+msgid "canceled"
+msgstr "abgebrochen"
+
+msgid "completed"
+msgstr "abgeschlossen"
+
+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 "cupsaddsmb: No PPD file for printer \"%s\" - %s"
+msgstr ""
+
+msgid "cupsctl: Cannot set Listen or Port 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 ""
+
+#, c-format
+msgid "device for %s/%s: %s"
+msgstr ""
+
+#, c-format
+msgid "device for %s: %s"
+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 "held"
+msgstr "gehalten"
+
+msgid "help\t\tGet help on commands."
+msgstr ""
+
+msgid "idle"
+msgstr "inaktiv"
+
+#, 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 ""
+
+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 \"-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 \"-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 ""
+
+#, c-format
+msgid "ipptool: Unknown option \"-%c\"."
+msgstr ""
+
+msgid "job-printer-uri attribute missing."
+msgstr ""
+
+msgid "lpadmin: Class name can only contain printable characters."
+msgstr "lpadmin: Klassenname darf nur druckbare Zeichen enthalten."
+
+msgid "lpadmin: Expected PPD after \"-P\" option."
+msgstr "lpadmin: Nach der \"-P\" 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 ""
+
+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 interface after \"-i\" 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 name can only contain printable characters."
+msgstr "lpadmin: Druckername darf nur druckbare Zeichen enthalten."
+
+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 ""
+
+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 on line %d."
+msgstr ""
+
+#, c-format
+msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
+msgstr "lpadmin: Kann PPD Datei \"%s\" - %s nicht öffnen"
+
+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 "lpadmin: unbekanntes Argument \"%s\"."
+
+#, c-format
+msgid "lpadmin: Unknown option \"%c\"."
+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 "lpinfo: Unknown argument \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "lpinfo: Unknown option \"%c\"."
+msgstr ""
+
+#, c-format
+msgid "lpinfo: Unknown option \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "lpmove: Unable to connect to server: %s"
+msgstr ""
+
+#, c-format
+msgid "lpmove: Unknown argument \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "lpmove: Unknown option \"%c\"."
+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 ""
+
+#, c-format
+msgid "members of class %s:"
+msgstr ""
+
+msgid "no entries"
+msgstr ""
+
+msgid "no system default destination"
+msgstr ""
+
+msgid "notify-events not specified."
+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 ""
+
+msgid "pending"
+msgstr "in Verarbeitung"
+
+#, 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 ""
+
+#, c-format
+msgid "printer %s disabled 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 ""
+
+msgid "processing"
+msgstr "in Verarbeitung"
+
+#, c-format
+msgid "request id is %s-%d (%d file(s))"
+msgstr ""
+
+msgid "request-id uses indefinite length"
+msgstr "Anfrage-ID hat unbestimmte Länge"
+
+msgid "scheduler is not running"
+msgstr ""
+
+msgid "scheduler is running"
+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 ""
+
+msgid "stopped"
+msgstr "angehalten"
+
+#, c-format
+msgid "system default destination: %s"
+msgstr ""
+
+#, c-format
+msgid "system default destination: %s/%s"
+msgstr ""
+
+msgid "unknown"
+msgstr "Unbekannt"
+
+msgid "untitled"
+msgstr "Ohne Titel"
+
+msgid "variable-bindings uses indefinite length"
+msgstr "variable-bindings hat unbestimmte Länge"
+
+#~ msgid "720dpi"
+#~ msgstr "720 dpi"
+
+#~ msgid "Enter old password:"
+#~ msgstr "Altes Passwort eingeben :"
+
+#~ msgid "Enter password again:"
+#~ msgstr "Neues Passwort wiederholen :"
+
+#~ msgid "Enter password:"
+#~ msgstr "Neues Passwort eingeben :"
+
+#~ msgid "Looking for printer."
+#~ msgstr "Suche nach Drucker."
+
+#~ msgid "New Stylus Color Series"
+#~ msgstr "Neue Stylus Color Serie"
+
+#~ msgid "New Stylus Photo Series"
+#~ msgstr "Neue Stylus Photo Serie"
+
+#~ msgid "Purge Jobs"
+#~ msgstr "Aufträge löschen"
+
+#~ msgid "Stylus Color Series"
+#~ msgstr "Stylus Color Serie"
+
+#~ msgid "Stylus Photo Series"
+#~ msgstr "Stylus Photo Serie"
index b5e7b0a..fcef34c 100644 (file)
@@ -16,11 +16,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 1.6\n"
 "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2013-07-08 07:38-0400\n"
-"PO-Revision-Date: 2012-07-01 20:21+0100\n"
-"Last-Translator: Juan Pablo González Riopedre <riopedre13@yahoo.es>\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
+"PO-Revision-Date: 2014-09-23 23:45+0100\n"
+"Last-Translator: Juan Pablo González Riopedre <jpgriopedre@yahoo.es>\n"
 "Language-Team: Spanish\n"
-"Language: \n"
+"Language: Spanish\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -50,7 +50,7 @@ msgid "\tBanner required"
 msgstr "\tSe necesita un rótulo"
 
 msgid "\tCharset sets:"
-msgstr "\tAjustes del juego de caracteres:"
+msgstr "\tJuegos de caracteres:"
 
 msgid "\tConnection: direct"
 msgstr "\tConexión: directa"
@@ -153,7 +153,7 @@ msgstr "                          Ignorar advertencias (warnings) específicas."
 
 msgid "                          Issue warnings instead of errors."
 msgstr ""
-"                          Emitor advertencias (warnings) en vez de errores."
+"                          Emitir advertencias (warnings) en vez de errores."
 
 msgid "                REF: Page 15, section 3.1."
 msgstr "                REF: Página 15, sección 3.1."
@@ -365,7 +365,7 @@ msgstr "      %s  %s %s no existe."
 
 #, c-format
 msgid "      %s  %s file \"%s\" has the wrong capitalization."
-msgstr "      %s  archivo %s \"%s\" tiene las mayúsculas equivocadas"
+msgstr "      %s  %s archivo \"%s\" tiene las mayúsculas equivocadas."
 
 #, c-format
 msgid ""
@@ -391,7 +391,7 @@ msgstr "      %s  Valor cupsFilter \"%s\" incorrecto."
 
 #, c-format
 msgid "      %s  Bad cupsFilter2 value \"%s\"."
-msgstr "      %s  Valor cupsFilter2 incorrecto \"%s\"."
+msgstr "      %s  Valor cupsFilter2 \"%s\" incorrecto."
 
 #, c-format
 msgid "      %s  Bad cupsICCProfile %s."
@@ -427,7 +427,7 @@ msgstr "      %s  Las preferencias predeterminadas están en conflicto."
 
 #, c-format
 msgid "      %s  Empty cupsUIConstraints %s"
-msgstr "      %s  cupsUIConstraints %s vacío."
+msgstr "      %s  cupsUIConstraints vacío %s"
 
 #, c-format
 msgid "      %s  Missing \"%s\" translation string for option %s, choice %s."
@@ -510,7 +510,7 @@ msgstr ""
 
 #, c-format
 msgid "      %s  cupsICCProfile %s hash value collides with %s."
-msgstr "      %s  valor hash de cupsICCProfile %s colisiona con %s."
+msgstr "      %s  Valor hash de cupsICCProfile %s colisiona con %s."
 
 #, c-format
 msgid "      %s  cupsUIResolver %s causes a loop."
@@ -924,6 +924,12 @@ msgstr "    Advertencia: no hay comentario %%EndComments en el archivo."
 msgid "    Warning: obsolete DSC version %.1f in file."
 msgstr "    Advertencia: versión DSC %.1f obsoleta en el archivo."
 
+msgid "  ! expression            Unary NOT of expression."
+msgstr "  ! expresión            NOT unario de la expresión."
+
+msgid "  ( expressions )         Group expressions."
+msgstr "  ( expresiones )         Agrupar expresiones."
+
 msgid "  --[no-]debug-logging    Turn debug logging on/off."
 msgstr "  --[no-]debug-logging    Activar/desactivar registro de depuración."
 
@@ -948,9 +954,105 @@ 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 "  --domain regex          Match domain to regular expression."
+msgstr ""
+"  --domain regex          Hacer coincidir el dominio con la expresión "
+"regular."
+
+msgid ""
+"  --exec utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+"  --exec utilidad [argumento ...] ;\n"
+"                          Ejecutar programa si es cierto."
+
+msgid "  --false                 Always false."
+msgstr "  --false                 Siempre falso."
+
+msgid "  --help                  Show help."
+msgstr "  --help                  Muestra ayuda."
+
+msgid "  --help                  Show this help."
+msgstr "  --help                  Muestra esta ayuda."
+
+msgid "  --host regex            Match hostname to regular expression."
+msgstr ""
+"  --host regex            Hacer coincidir el nombre del equipo con la "
+"expresión regular."
+
 msgid "  --lf                    End lines with LF (UNIX/Linux/OS X)."
 msgstr "  --lf                    Finalizar líneas con LF (UNIX/Linux/OS X)."
 
+msgid "  --list-filters          List filters that will be used."
+msgstr "  --list-filters          Listar los filtros a usar."
+
+msgid "  --local                 True if service is local."
+msgstr "  --local                 Cierto si el servicio es local."
+
+msgid "  --ls                    List attributes."
+msgstr "  --ls                    Lista atributos."
+
+msgid "  --name regex            Match service name to regular expression."
+msgstr ""
+"  --name regex            Hacer coincidir el servicio con la expresión "
+"regular."
+
+msgid "  --not expression        Unary NOT of expression."
+msgstr "  [parcial]expresión            NOT unario de la expresión."
+
+msgid "  --path regex            Match resource path to regular expression."
+msgstr ""
+"  --path regex            Hacer coincidir la ruta del recurso con la "
+"expresión regular."
+
+msgid "  --port number[-number]  Match port to number or range."
+msgstr ""
+"  --port número[-número]  Hacer coincidir el puerto con un número o "
+"intervalo de números."
+
+msgid "  --print                 Print URI if true."
+msgstr "  --print                 Imprimir URI si es cierto."
+
+msgid "  --print-name            Print service name if true."
+msgstr "  --print-name            Imprimir nombre del servicio si es cierto."
+
+msgid "  --quiet                 Quietly report match via exit code."
+msgstr ""
+"  --quiet                 Silenciosamente informar de la coincidencia via "
+"código de salida."
+
+msgid "  --remote                True if service is remote."
+msgstr "  --remote                Cierto si el servicio es remoto."
+
+msgid ""
+"  --stop-after-include-error\n"
+"                          Stop tests after a failed INCLUDE."
+msgstr ""
+"  --stop-after-include-error\n"
+"                          Detiene las pruebas tras un INCLUDE fallido."
+
+msgid "  --true                  Always true."
+msgstr "  --true                  Siempre cierto."
+
+msgid "  --txt key               True if the TXT record contains the key."
+msgstr ""
+"  --txt clave               Cierto si el registro TXT contiene la clave."
+
+msgid "  --txt-* regex           Match TXT record key to regular expression."
+msgstr ""
+"  --txt-* regex           Hacer coincidir la clave del registro TXT a la "
+"expresión regular."
+
+msgid "  --uri regex             Match URI to regular expression."
+msgstr ""
+"  --uri regex             Hacer coincidir la URI a la expresión regular."
+
+msgid "  --version               Show program version."
+msgstr "  --version               Muestra la versión del programa."
+
+msgid "  --version               Show version."
+msgstr "  --version               Muestra la versión."
+
 msgid "  -4                      Connect using IPv4."
 msgstr "  -4                      Conectar usando IPv4."
 
@@ -996,15 +1098,32 @@ msgstr "  -I {filename,filters,none,profiles}"
 msgid "  -L                      Send requests using content-length."
 msgstr "  -L                      Envía peticiones usando content-length."
 
+msgid ""
+"  -P filename.plist       Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+"  -P filename.plist       Produce plist XML a un archivo y un informe de "
+"prueba a la salida estandar."
+
 msgid "  -P filename.ppd         Set PPD file."
 msgstr "  -P nombre_archivo.ppd         Establece archivo PPD."
 
+msgid "  -P number[-number]      Match port to number or range."
+msgstr ""
+"  -P número[-número]    Hacer coincidir el puerto con un número o intervalo "
+"de números."
+
 msgid "  -R root-directory       Set alternate root."
 msgstr "  -R directorio-raíz       Establece directorio raíz alternativo."
 
 msgid "  -S                      Test with SSL encryption."
 msgstr "  -S                      Prueba con cifrado SSL."
 
+msgid "  -T seconds              Set the browse timeout in seconds."
+msgstr ""
+"  -T segundos              Establece el tiempo de espera de navegación en "
+"segundos."
+
 msgid "  -T seconds              Set the receive/send timeout in seconds."
 msgstr ""
 "  -T segundos             Establece el tiempo de espera de recepción/envío "
@@ -1027,15 +1146,28 @@ msgid "  -X                      Produce XML plist instead of plain text."
 msgstr ""
 "  -X                      Produce XML plist en vez de texto sin formato."
 
+msgid "  -a                      Browse for all services."
+msgstr "  -a                      Explorar todos los servicios."
+
 msgid "  -a                      Export all printers."
 msgstr "  -a                      Exporta todas las impresoras."
 
+msgid "  -c                      Produce CSV output."
+msgstr "  -c                      Produce salida CSV."
+
 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 "  -c cupsd.conf           Set cupsd.conf file to use."
 msgstr "  -c cupsd.conf           Establece el archivo cupsd.conf a usar."
 
+msgid "  -d domain               Browse/resolve in specified domain."
+msgstr ""
+"  -d dominio               Explora/resuelve en el dominio especificado."
+
 msgid "  -d name=value           Set named variable to value."
 msgstr "  -d nombre=valor           Establece la variable al valor."
 
@@ -1045,6 +1177,10 @@ msgstr "  -d dir-salida           Especifica el directorio de salida."
 msgid "  -d printer              Use the named printer."
 msgstr "  -d impresora              Usa la impresora especificada."
 
+msgid "  -d regex                Match domain to regular expression."
+msgstr ""
+"  -d regex               Hacer coincidir el dominio con la expresión regular."
+
 msgid "  -e                      Use every filter from the PPD file."
 msgstr "  -e                      Usa cada filtro desde el archivo PPD."
 
@@ -1058,6 +1194,11 @@ msgstr ""
 msgid "  -h                      Show this usage message."
 msgstr "  -h                      Muestra este mensaje de uso."
 
+msgid "  -h regex                Match hostname to regular expression."
+msgstr ""
+"  -h regex                Hacer coincidir el nombre del equipo con la "
+"expresión regular."
+
 msgid "  -h server[:port]        Specify server address."
 msgstr "  -h servidor[:puerto]        Especifica la dirección del servidor."
 
@@ -1079,8 +1220,14 @@ msgstr ""
 "  -j id-trabajo[,N]           Filtra el archivo N desde el trabajo "
 "especificado (predeterminado archivo 1)."
 
-msgid "  -l                      Run cupsd from launchd(8)."
-msgstr "  -l                      Ejecuta cupsd desde launchd(8)."
+msgid "  -l                      List attributes."
+msgstr "  -l                    Lista atributos."
+
+msgid "  -l                      Produce plain text output."
+msgstr "  -l                      Produce salida en texto plano."
+
+msgid "  -l                      Run cupsd on demand."
+msgstr "  -l                      Ejecuta cupsd según demanda."
 
 msgid "  -l lang[,lang,...]      Specify the output language(s) (locale)."
 msgstr ""
@@ -1106,6 +1253,11 @@ msgstr ""
 "  -n contador                Repite el último archivo el número de veces "
 "especificado."
 
+msgid "  -n regex                Match service name to regular expression."
+msgstr ""
+"  -n regex            Hacer coincidir el nombre del servicio con la "
+"expresión regular."
+
 msgid ""
 "  -o filename.drv         Set driver information file (otherwise ppdi.drv)."
 msgstr ""
@@ -1120,15 +1272,34 @@ msgstr ""
 msgid "  -o name=value           Set option(s)."
 msgstr "  -o nombre=valor           Establece opciones."
 
+msgid "  -p                      Print URI if true."
+msgstr "  -p                      Imprimir URI si es cierto."
+
 msgid "  -p filename.ppd         Set PPD file."
 msgstr "  -p nombre_archivo.ppd         Establece archivo PPD."
 
+msgid "  -p program              Run specified program for each service."
+msgstr ""
+"  -p program              Ejecuta el programa especificado para cada "
+"servicio."
+
+msgid "  -q                      Quietly report match via exit code."
+msgstr ""
+"  -q                      Silenciosamente informar de la coincidencia via "
+"código de salida."
+
 msgid "  -q                      Run silently."
 msgstr "  -q                      Ejecución silenciosa."
 
+msgid "  -r                      True if service is remote."
+msgstr "  -r                      Cierto si el servicio es remoto."
+
 msgid "  -r                      Use 'relaxed' open mode."
 msgstr "  -r                      Usa modo abierto 'relajado'."
 
+msgid "  -s                      Print service name if true."
+msgstr "  -s                      Imprimir nombre del servicio si es cierto."
+
 msgid "  -t                      Produce a test report."
 msgstr "  -t                      Produce un informe de la prueba."
 
@@ -1138,21 +1309,110 @@ msgstr "  -t                      Prueba los PPDs en vez de generarlos."
 msgid "  -t                      Test the configuration file."
 msgstr "  -t                      Prueba el archivo de configuración."
 
+msgid "  -t key                  True if the TXT record contains the key."
+msgstr "  -t clave                Cierto si el registro TXT contiene la clave."
+
 msgid "  -t title                Set title."
-msgstr "  -t título                Establece título."
+msgstr "  -t título               Establece título."
+
+msgid "  -t type                 Browse/resolve with specified type."
+msgstr "  -t tipo                 Explora/resuelve con el tipo especificado."
 
 msgid "  -u                      Remove the PPD file when finished."
 msgstr "  -u                      Borra el archivo PPD tras terminar."
 
+msgid "  -u regex                Match URI to regular expression."
+msgstr ""
+"  -u regex                Hacer coincidir la URI a la expresión regular."
+
 msgid "  -v                      Be verbose."
-msgstr "  -v                     Ser detallado."
+msgstr "  -v                      Ser detallado."
 
 msgid "  -vv                     Be very verbose."
 msgstr "  -vv                     Ser muy detallado."
 
+msgid ""
+"  -x utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+"  -x utilidad [argumento ...] ;\n"
+"                        Ejecutar programa si es cierto."
+
 msgid "  -z                      Compress PPD files using GNU zip."
 msgstr "  -z                      Comprimir archivos PPD usando GNU zip."
 
+msgid "  IPPFIND_SERVICE_DOMAIN  Domain name"
+msgstr "  IPPFIND_SERVICE_DOMAIN  Nombre de dominio"
+
+msgid ""
+"  IPPFIND_SERVICE_HOSTNAME\n"
+"                          Fully-qualified domain name"
+msgstr ""
+"  IPPFIND_SERVICE_HOSTNAME\n"
+"                          Nombre de dominio completo"
+
+msgid "  IPPFIND_SERVICE_NAME    Service instance name"
+msgstr "  IPPFIND_SERVICE_NAME    Nombre de la instancia del servicio"
+
+msgid "  IPPFIND_SERVICE_PORT    Port number"
+msgstr "  IPPFIND_SERVICE_PORT    Número del puerto"
+
+msgid "  IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr "  IPPFIND_SERVICE_REGTYPE Tipo de registro DNS-SD"
+
+msgid "  IPPFIND_SERVICE_SCHEME  URI scheme"
+msgstr "  IPPFIND_SERVICE_SCHEME  Esquema URI"
+
+msgid "  IPPFIND_SERVICE_URI     URI"
+msgstr "  IPPFIND_SERVICE_URI     URI"
+
+msgid "  IPPFIND_TXT_*           Value of TXT record key"
+msgstr "  IPPFIND_TXT_*           Valor de la clave del registro TXT"
+
+msgid ""
+"  expression --and expression\n"
+"                          Logical AND."
+msgstr ""
+"  expresión --and expresión\n"
+"                            AND lógico."
+
+msgid ""
+"  expression --or expression\n"
+"                          Logical OR."
+msgstr ""
+"  expresión --or expresión\n"
+"                            OR lógico."
+
+msgid "  expression expression   Logical AND."
+msgstr "  expresión expresión     AND lógico."
+
+msgid "  {service_domain}        Domain name"
+msgstr "  {service_domain}        Nombre de dominio"
+
+msgid "  {service_hostname}      Fully-qualified domain name"
+msgstr "  {service_hostname}      Nombre de dominio completo"
+
+msgid "  {service_name}          Service instance name"
+msgstr "  {service_name}          Nombre de la instancia del servicio"
+
+msgid "  {service_port}          Port number"
+msgstr "  {service_port}          Número de puerto"
+
+msgid "  {service_regtype}       DNS-SD registration type"
+msgstr "  {service_regtype}       Tipo de registro DNS-SD"
+
+msgid "  {service_scheme}        URI scheme"
+msgstr "  {service_scheme}        Esquema URI"
+
+msgid "  {service_uri}           URI"
+msgstr "  {service_uri}           URI"
+
+msgid "  {txt_*}                 Value of TXT record key"
+msgstr "  {txt_*}                 Valor de la clave del registro TXT"
+
+msgid "  {}                      URI"
+msgstr "  {}                      URI"
+
 msgid " FAIL"
 msgstr " FALLO"
 
@@ -1160,14 +1420,248 @@ msgid " PASS"
 msgstr " PASA"
 
 #, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
-msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr "\"%s\": Valor URI \"%s\" incorrecto - %s (RFC 2911 sección 4.1.5)."
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+"\"%s\": Valor URI \"%s\" incorrecto - longitud %d incorrecta (RFC 2911 "
+"sección 4.1.5)."
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": Nombre de atributo incorrecto - longitud %d incorrecta (RFC 2911 "
+"sección 4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": Nombre de atributo incorrecto - carácter inválido (RFC 2911 sección "
+"4.1.3)."
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr "\"%s\": Valor lógico \"%d\" incorrecto (RFC 2911 sección 4.1.11)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": Valor del juego de caracteres \"%s\" incorrecto - caracteres "
+"incorrectos (RFC 2911 sección 4.1.7)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": Valor del juego de caracteres \"%s\" incorrecto - longitud %d "
+"incorrecta (RFC 2911 sección 4.1.7)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Horas dateTime UTC %u incorrectas (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Minutos dateTime UTC %u incorrectos (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Signo dateTime UTC %c incorrecto (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Día dateTime %u incorrecto (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+"\"%s\": Décimas de segundo dateTime %u incorrectas (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Horas dateTime %u incorrectas (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Minutos dateTime %u incorrectos (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Mes dateTime %u incorrecto (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Segundos dateTime %u incorrectos (RFC 2911 sección 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+"\"%s\": Valor enumerado %d incorrecto - fuera de intervalo (RFC 2911 sección "
+"4.1.4)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": Valor clave \"%s\" incorrecto - longitud %d incorrecta (RFC 2911 "
+"sección 4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+"\"%s\": Valor clave \"%s\" incorrecto - carácter inválido (RFC 2911 sección "
+"4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": Valor mimeMediaType \"%s\" incorrecto - caracteres incorrectos (RFC "
+"2911 sección 4.1.9)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": Valor mimeMediaType \"%s\" incorrecto - longitud %d incorrecta (RFC "
+"2911 sección 4.1.9)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": Valor del nombre \"%s\" incorrecto - secuencia UTF-8 incorrecta (RFC "
+"2911 sección 4.1.2)."
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": Valor del nombre \"%s\" incorrecto - longitud %d incorrecta (RFC "
+"2911 sección 4.1.2)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": Valor naturalLanguage \"%s\" incorrecto - caracteres incorrectos "
+"(RFC 2911 sección 4.1.8)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": Valor naturalLanguage \"%s\" incorrecto - longitud %d incorrecta "
+"(RFC 2911 sección 4.1.8)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+"\"%s\": Valor octetString incorrecto - longitud %d incorrecta (RFC 2911 "
+"sección 4.1.10)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+"\"%s\": Valor rangeOfInteger %d-%d incorrecto - el más bajo es mayor que el "
+"más alto (RFC 2911 section 4.1.13)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+"\"%s\": Valor de resolución %dx%d%s incorrecto - valores de unidades "
+"incorrectas (RFC 2911 section 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+"\"%s\": Valor de resolución %dx%d%s incorrecto - la resolución de la "
+"alimentación cruzada debe ser positiva (RFC 2911 sección 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+"\"%s\": Valor de resolución %dx%d%s incorrecto - la resolución de la "
+"alimentación debe ser positiva (RFC 2911 sección 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": Valor del texto \"%s\" incorrecto - secuencia UTF-8 incorrecta (RFC "
+"2911 sección 4.1.1)."
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": Valor del texto \"%s\" incorrecto - longitud %d incorrecta (RFC 2911 "
+"sección 4.1.1)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": Valor uriScheme \"%s\" incorrecto - caracteres incorrectos (RFC 2911 "
+"sección 4.1.6)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": Valor uriScheme \"%s\" incorrecto - longitud %d incorrecta (RFC 2911 "
+"sección 4.1.6)."
 
 #, 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 (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"
 
@@ -1201,7 +1695,7 @@ msgstr "%s no acepta peticiones desde %s -"
 
 #, c-format
 msgid "%s not supported."
-msgstr "No se admite el uso de %s."
+msgstr "%s no está implementado."
 
 #, c-format
 msgid "%s/%s accepting requests since %s"
@@ -1225,6 +1719,14 @@ msgid "%s: %s failed: %s"
 msgstr "%s: %s ha fallado: %s"
 
 #, c-format
+msgid "%s: Bad printer URI \"%s\"."
+msgstr ""
+
+#, 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."
 
@@ -1236,7 +1738,7 @@ msgstr ""
 
 #, c-format
 msgid "%s: Error - add '/version=1.1' to server name."
-msgstr ""
+msgstr "%s: Error - añada '/version=1.1' al nombre del servidor."
 
 #, c-format
 msgid "%s: Error - bad job ID."
@@ -1264,23 +1766,19 @@ 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 \"-#\"."
+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\"."
+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 \"-b\" option."
-msgstr "%s: Error - se esperaba un destino tras la opción \"-b\"."
-
-#, c-format
 msgid "%s: Error - expected destination after \"-d\" option."
-msgstr "%s: Error -  se esperaba un destino tras la opción \"-d\"."
+msgstr "%s: Error - se esperaba un destino tras la opción \"-d\"."
 
 #, c-format
 msgid "%s: Error - expected form after \"-f\" option."
@@ -1292,11 +1790,11 @@ 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 ordenador tras la opción \"-H\"."
+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 ordenador tras la opción \"-h\"."
+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."
@@ -1304,7 +1802,7 @@ 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\"."
+msgstr "%s: Error - se esperaba un nombre tras la opción \"-%c\"."
 
 #, c-format
 msgid "%s: Error - expected option=value after \"-o\" option."
@@ -1336,7 +1834,7 @@ 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\"."
+msgstr "%s: Error - se esperaba un valor tras la opción \"-%c\"."
 
 #, c-format
 msgid ""
@@ -1384,11 +1882,11 @@ msgstr "%s: Error - opción \"%c\" desconocida."
 
 #, c-format
 msgid "%s: Error - unknown option \"%s\"."
-msgstr "%s: Error: opción \"%s\" desconocida."
+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\"."
+msgstr "%s: Se esperaba una ID de trabajo tras la opción \"-i\"."
 
 #, c-format
 msgid "%s: Invalid destination name in list \"%s\"."
@@ -1399,6 +1897,18 @@ 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\"."
@@ -1413,7 +1923,11 @@ msgstr "%s: La operación ha fallado: %s"
 
 #, c-format
 msgid "%s: Sorry, no encryption support."
-msgstr "%s: Lo siento, no está compilado con la opción de cifrado."
+msgstr "%s: Lo siento, no está implementado el cifrado."
+
+#, c-format
+msgid "%s: Unable to connect to \"%s:%d\": %s"
+msgstr ""
 
 #, c-format
 msgid "%s: Unable to connect to server."
@@ -1424,10 +1938,18 @@ 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 ""
+
+#, 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"
 
@@ -1440,6 +1962,10 @@ 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 ""
+
+#, c-format
 msgid "%s: Unknown destination \"%s\"."
 msgstr "%s: Destino \"%s\" desconocido."
 
@@ -1452,6 +1978,14 @@ 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."
 
@@ -2007,9 +2541,6 @@ msgstr "7 x 9"
 msgid "70"
 msgstr "70"
 
-msgid "720dpi"
-msgstr "720ppp"
-
 msgid "75"
 msgstr "75"
 
@@ -2273,7 +2804,7 @@ msgstr "B9"
 
 #, c-format
 msgid "Bad 'document-format' value \"%s\"."
-msgstr ""
+msgstr "Valor 'document-format' \"%s\" incorrecto."
 
 msgid "Bad NULL dests pointer"
 msgstr "Puntero destino NULLincorrecto"
@@ -2299,6 +2830,9 @@ msgstr "Número de versión SNMP incorrecto"
 msgid "Bad UIConstraints"
 msgstr "UIConstraints incorrecto"
 
+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."
@@ -2325,14 +2859,15 @@ msgstr "document-format-default \"%s\" incorrecto."
 msgid "Bad filename buffer"
 msgstr "Nombre de archivo del búfer incorrecto"
 
-msgid "Bad job-name value: Bad UTF-8 sequence."
-msgstr ""
+msgid "Bad hostname/address in URI"
+msgstr "Nombre de equipo/dirección incorrecto en la URI"
 
-msgid "Bad job-name value: Name too long."
-msgstr ""
+#, c-format
+msgid "Bad job-name value: %s"
+msgstr "Valor job-name incorrecto: %s"
 
 msgid "Bad job-name value: Wrong type or count."
-msgstr ""
+msgstr "Valor job-name incorrecto: tipo o contador equivocado."
 
 msgid "Bad job-priority value."
 msgstr "Valor job-priority incorrecto."
@@ -2371,17 +2906,20 @@ msgstr "Opción + preferencia incorrectas en línea %d."
 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."
 
-msgid "Bad printer URI."
-msgstr "URI de impresora 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."
@@ -2390,12 +2928,24 @@ msgstr "Petición incorrecta de ID %d."
 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 subscription ID"
 msgstr "ID de subscripción incorrecto"
 
+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"
 
@@ -2415,6 +2965,9 @@ msgstr "CMYK"
 msgid "CPCL Label Printer"
 msgstr "Impresora de etiquetas CPCL"
 
+msgid "Cancel Jobs"
+msgstr "Cancelar trabajos"
+
 msgid "Cancel RSS Subscription"
 msgstr "Cancelar subscripción RSS"
 
@@ -2583,6 +3136,9 @@ msgstr "Editar archivo de configuración"
 msgid "Empty PPD file."
 msgstr "Archivo PPD vacío."
 
+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"
@@ -2590,15 +3146,6 @@ msgstr "Rótulo final"
 msgid "English"
 msgstr "Spanish"
 
-msgid "Enter old password:"
-msgstr "Introduzca la contraseña antigua:"
-
-msgid "Enter password again:"
-msgstr "Introduzca nuevamente la contraseña:"
-
-msgid "Enter password:"
-msgstr "Introduzca la contraseña:"
-
 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 "
@@ -2609,7 +3156,7 @@ msgstr ""
 "autentificación Kerberos, asegúrese de que tiene un ticket Kerberos válido."
 
 msgid "Envelope #10 "
-msgstr "Sobre #10"
+msgstr "Sobre #10 "
 
 msgid "Envelope #11"
 msgstr "Sobre #11"
@@ -2699,7 +3246,7 @@ msgid "Envelope Monarch"
 msgstr "Sobre Monarch"
 
 msgid "Envelope PRC1 "
-msgstr "Sobre PRC1"
+msgstr "Sobre PRC1 "
 
 msgid "Envelope PRC1 Long Edge"
 msgstr "Sobre PRC1 lado largo"
@@ -2767,17 +3314,23 @@ 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 ""
+
 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 ordenador tras la opción \"-h\"."
+msgstr "Error: se necesita un nombre de equipo tras la opción \"-h\"."
 
 msgid "Every 10 Labels"
 msgstr "Cada 10 etiquetas"
@@ -2818,6 +3371,9 @@ msgstr "Lo que se esperaba, falló."
 msgid "Export Printers to Samba"
 msgstr "Exportar impresoras a Samba"
 
+msgid "Expressions:"
+msgstr "Expresiones:"
+
 msgid "FAIL"
 msgstr "FALLO"
 
@@ -2851,7 +3407,7 @@ 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"
+msgstr "Carpeta de archivo "
 
 #, c-format
 msgid ""
@@ -2896,13 +3452,13 @@ msgid "Hanging Folder"
 msgstr "Carpeta colgante"
 
 msgid "Help file not in index."
-msgstr "El archivo de ayuda no está en el índice"
+msgstr "El archivo de ayuda no está en el índice."
 
 msgid "IPP 1setOf attribute with incompatible value tags."
-msgstr "IPP atributo 1setOf con etiquetas de valor incompatibles"
+msgstr "Atributo IPP 1setOf con etiquetas de valor incompatibles."
 
 msgid "IPP attribute has no name."
-msgstr "IPP atributo sin nombre"
+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."
@@ -2931,6 +3487,9 @@ 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."
 
@@ -2938,7 +3497,7 @@ msgid "IPP memberName value is empty."
 msgstr "IPP el valor memberName está vacío."
 
 msgid "IPP memberName with no attribute."
-msgstr ""
+msgstr "IPP memberName sin atributo."
 
 msgid "IPP name larger than 32767 bytes."
 msgstr "IPP nombre mayor de 32767 bytes."
@@ -2946,6 +3505,9 @@ 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."
 
@@ -3006,8 +3568,11 @@ msgstr "Correo por Internet Parte-3"
 msgid "Internet Printing Protocol"
 msgstr "Protocolo de Impresión de Internet IPP"
 
+msgid "Invalid media name arguments."
+msgstr "Argumentos del nombre del papel no válidos."
+
 msgid "Invalid media size."
-msgstr "Tamaño del papel no válido"
+msgstr "Tamaño de papel no válido."
 
 #, c-format
 msgid "Invalid printer command \"%s\"."
@@ -3155,11 +3720,14 @@ msgstr "Línea más larga que el máximo permitido (255 caracteres)"
 msgid "List Available Printers"
 msgstr "Listar impresoras disponibles"
 
+msgid "Load paper."
+msgstr "Cargar papel."
+
 msgid "Long-Edge (Portrait)"
 msgstr "Lado largo (retrato)"
 
-msgid "Looking for printer."
-msgstr "Buscando impresora."
+msgid "Looking for printer..."
+msgstr ""
 
 msgid "Manual Feed"
 msgstr "Alimentación manual"
@@ -3222,6 +3790,12 @@ msgstr "Falta el atributo requesting-user-name."
 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"
+
 #, c-format
 msgid "Missing value on line %d."
 msgstr "Falta un valor en la línea %d."
@@ -3247,6 +3821,9 @@ msgstr ""
 "        make-and-model = %s\n"
 "        device-id = %s"
 
+msgid "Modifiers:"
+msgstr "Modificadores:"
+
 msgid "Modify Class"
 msgstr "Modificar clase"
 
@@ -3274,12 +3851,6 @@ msgstr "No se permiten clases anidadas."
 msgid "Never"
 msgstr "Nunca"
 
-msgid "New Stylus Color Series"
-msgstr "Nueva Stylus Color Series"
-
-msgid "New Stylus Photo Series"
-msgstr "Nueva Stylus Photo Series"
-
 msgid "No"
 msgstr "No"
 
@@ -3298,6 +3869,9 @@ msgstr "No está instalado ningún controlador de impresora de Windows."
 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."
@@ -3329,7 +3903,7 @@ msgid "No error-status"
 msgstr "No hay error-status"
 
 msgid "No file in print request."
-msgstr "No hay ningún archivo en la petición de impresión."
+msgstr "No hay ningún archivo en la solicitud de impresión."
 
 msgid "No modification time"
 msgstr "No hay tiempo de modificación"
@@ -3350,7 +3924,16 @@ 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 petición."
+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"
@@ -3389,7 +3972,7 @@ msgid "Not Modified"
 msgstr "No modificado"
 
 msgid "Not Supported"
-msgstr "No permitido"
+msgstr "No implementado"
 
 msgid "Not allowed to print."
 msgstr "No se permite imprimir."
@@ -3436,7 +4019,7 @@ msgid "Options Installed"
 msgstr "Opciones instaladas"
 
 msgid "Options:"
-msgstr "Opciones: "
+msgstr "Opciones:"
 
 msgid "Out of date PPD cache file."
 msgstr "Archivo de caché PPD obsoleto."
@@ -3447,23 +4030,14 @@ msgstr "Sin memoria."
 msgid "Output Mode"
 msgstr "Modo de salida"
 
-#, c-format
-msgid "Output for printer %s is sent to %s"
-msgstr "La salida de la impresora %s se ha enviado a %s"
+msgid "Output bin is almost full."
+msgstr "El recipiente de salida está casi lleno."
 
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
-msgstr ""
-"La salida de la impresora %s se ha enviado a la impresora remota %s en %s"
-
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
-msgstr "La salida de la impresora %s/%s se ha enviado a %s"
+msgid "Output bin is full."
+msgstr "El recipiente de salida está lleno."
 
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
-msgstr ""
-"La salida de la impresora %s/%s se ha enviado a la impresora remota %s en %s"
+msgid "Output bin is missing."
+msgstr "No se encuentra el recipiente de salida."
 
 msgid "PASS"
 msgstr "PASA"
@@ -3495,6 +4069,18 @@ msgstr "El paquete no contiene un Get-Response-PDU"
 msgid "Packet does not start with SEQUENCE"
 msgstr "El paquete no empieza por SEQUENCE"
 
+msgid "Paper jam."
+msgstr "Atasco de papel."
+
+msgid "Paper tray is almost empty."
+msgstr "La bandeja de papel está casi vacía."
+
+msgid "Paper tray is empty."
+msgstr "La bandeja de papel está vacía."
+
+msgid "Paper tray is missing."
+msgstr "No se encuentra la bandeja de papel."
+
 msgid "ParamCustominCutInterval"
 msgstr "ParamCustominCutInterval"
 
@@ -3540,7 +4126,7 @@ msgid "Postcard"
 msgstr "Postal"
 
 msgid "Postcard Double "
-msgstr "Postal doble"
+msgstr "Postal doble "
 
 msgid "Postcard Double Long Edge"
 msgstr "Postal doble lado largo"
@@ -3548,6 +4134,9 @@ 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"
 
@@ -3575,25 +4164,18 @@ msgstr "Imprimir y cortar"
 msgid "Print and Tear"
 msgstr "Imprimir y romper"
 
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr "Archivo de impresión aceptado: ID de trabajo %d."
-
-msgid "Print file accepted - job ID unknown."
-msgstr "Archivo de impresión aceptado: ID de trabajo desconocido."
-
 msgid "Print file sent."
 msgstr "Archivo de impresión enviado."
 
-msgid "Print file was not accepted."
-msgstr "No se ha aceptado el archivo de impresión."
-
 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."
+
 msgid "Printer Added"
 msgstr "Impresora añadida"
 
@@ -3615,6 +4197,9 @@ 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:"
 msgstr "Impresora:"
 
@@ -3622,11 +4207,8 @@ msgid "Printers"
 msgstr "Impresoras"
 
 #, c-format
-msgid "Printing page %d, %d%% complete."
-msgstr "Imprimiendo página %d, %d%% completado."
-
-msgid "Purge Jobs"
-msgstr "Purgar trabajos"
+msgid "Printing page %d, %u%% complete."
+msgstr "Imprimiendo página %d, %u%% completado."
 
 msgid "Quarto"
 msgstr "Quarto"
@@ -3637,22 +4219,16 @@ 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"
 
-#. TRANSLATORS: Pri is job priority.
-msgid ""
-"Rank   Owner      Pri  Job        Files                       Total Size"
-msgstr ""
-"Rango  Propiet.   Pri  Trabajo    Archivos                    Tamaño total"
-
 msgid "Reject Jobs"
 msgstr "Rechazar trabajos"
 
 #, c-format
 msgid "Remote host did not accept control file (%d)."
-msgstr "El ordenador remoto no ha aceptado el archivo de control (%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 ordenador remoto no ha aceptado el archivo de datos (%d)."
+msgstr "El equipo remoto no ha aceptado el archivo de datos (%d)."
 
 msgid "Reprint After Error"
 msgstr "Volver a imprimir tras un error"
@@ -3703,6 +4279,9 @@ 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"
 
@@ -3748,16 +4327,13 @@ msgstr "Iniciando página %d."
 msgid "Statement"
 msgstr "Declaración"
 
-msgid "Stylus Color Series"
-msgstr "Stylus Color Series"
-
-msgid "Stylus Photo Series"
-msgstr "Stylus Photo Series"
-
 #, c-format
 msgid "Subscription #%d does not exist."
 msgstr "Subscripción #%d no existe."
 
+msgid "Substitutions:"
+msgstr "Substituciones:"
+
 msgid "Super A"
 msgstr "Super A"
 
@@ -3789,13 +4365,16 @@ 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 Description attribute cannot be supplied in a job creation "
-"request."
+"The '%s' Job Status attribute cannot be supplied in a job creation request."
 msgstr ""
 
 #, c-format
@@ -3824,16 +4403,16 @@ msgstr ""
 "no puede contener espacios, barras (/), o la almohadilla (#)."
 
 msgid "The developer unit needs to be replaced."
-msgstr "La unidad de revelado debe ser reemplazada"
+msgstr "La unidad de revelado debe ser reemplazada."
 
 msgid "The developer unit will need to be replaced soon."
 msgstr "La unidad de revelado necesitará ser cambiada pronto."
 
 msgid "The fuser's temperature is high."
-msgstr "Temperatura del fusor alta"
+msgstr "Temperatura del fusor alta."
 
 msgid "The fuser's temperature is low."
-msgstr "Temperatura del fusor baja"
+msgstr "Temperatura del fusor baja."
 
 msgid ""
 "The notify-lease-duration attribute cannot be used with job subscriptions."
@@ -3851,40 +4430,22 @@ msgstr "El fotoconductor óptico necesita ser cambiado."
 msgid "The optical photoconductor will need to be replaced soon."
 msgstr "El fotoconductor óptico necesitará ser cambiado pronto."
 
-msgid "The output bin is almost full."
-msgstr "Recipiente de salida casi lleno"
-
-msgid "The output bin is full."
-msgstr "Bandeja de salida llena."
-
-msgid "The output bin is missing."
-msgstr "Falta la bandeja de salida."
-
-msgid "The paper tray is almost empty."
-msgstr "Bandeja de papel casi vacía."
-
-msgid "The paper tray is empty."
-msgstr "Bandeja de papel vacía."
-
-msgid "The paper tray is missing."
-msgstr "Falta la bandeja de papel."
-
-msgid "The paper tray needs to be filled."
-msgstr "Hay que poner papel en la bandeja."
-
-msgid "The printer URI is incorrect or no longer exists."
-msgstr "El URI de la impresora es incorrecto o ya no existe."
+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ó."
 
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
-msgstr "La impresora no es compatible con IPP/%d.%d, probando IPP/%s."
-
 msgid "The printer is in use."
 msgstr "La impresora está en uso."
 
+msgid "The printer is low on ink."
+msgstr "La impresora tiene poca tinta."
+
+msgid "The printer is low on toner."
+msgstr "La impresora tiene poco toner."
+
 msgid "The printer is not connected."
 msgstr "La impresora no está conectada."
 
@@ -3900,12 +4461,6 @@ 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 running low on ink."
-msgstr "La impresora está funcionando con poca tinta."
-
-msgid "The printer is running low on toner."
-msgstr "La impresora está funcionando con poco toner."
-
 msgid "The printer is unreachable at this time."
 msgstr "La impresora es inalcanzable en este momento."
 
@@ -3956,13 +4511,13 @@ 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_ORDENADOR/classes/"
+"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_ORDENADOR/printers/"
+"El printer-uri debe ser de la forma \"ipp://NOMBRE_EQUIPO/printers/"
 "NOMBRE_IMPRESORA\"."
 
 msgid ""
@@ -3986,9 +4541,6 @@ msgstr "No se admite el uso del valor which-jobs \"%s\"."
 msgid "There are too many subscriptions."
 msgstr "Hay demasiadas subscripciones."
 
-msgid "There is a paper jam."
-msgstr "Hay un atasco de papel."
-
 msgid "There was an unrecoverable USB error."
 msgstr "Ha habido un error USB irrecuperable."
 
@@ -4027,6 +4579,9 @@ msgstr "Bandeja 4"
 msgid "URI Too Long"
 msgstr "URI demasiado largo"
 
+msgid "URI too large"
+msgstr "URI demasiado grande"
+
 msgid "US Ledger"
 msgstr "Libro Mayor, 17 x 11 pulg."
 
@@ -4097,11 +4652,19 @@ 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 servidor."
+msgstr "No se ha podido conectar al equipo."
 
 msgid "Unable to contact printer, queuing on next printer in class."
 msgstr ""
@@ -4149,12 +4712,12 @@ msgstr ""
 msgid "Unable to copy interface script - %s"
 msgstr "No se ha podido copiar el script de interfaz - %s"
 
-msgid "Unable to create compressed print file"
-msgstr "No se ha podido crear el archivo de impresión comprimido"
-
 msgid "Unable to create printer-uri"
 msgstr "No se ha podido crear printer-uri"
 
+msgid "Unable to create server credentials."
+msgstr "No se han podido crear las credenciales del servidor."
+
 msgid "Unable to create temporary file"
 msgstr "No se ha podido crear el archivo temporal"
 
@@ -4173,46 +4736,46 @@ msgstr "No se pueden editar archivos cupsd.conf mayores de 1MB"
 msgid ""
 "Unable to establish a secure connection to host (certificate chain invalid)."
 msgstr ""
-"No se ha podido establecer una conexión segura con el servidor (cadena "
+"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 servidor (el "
-"certificado aún no es válido)."
+"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 servidor (certificado "
+"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 servidor (el nombre de "
-"ordenador no coincide)."
+"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 servidor (el par cortó "
+"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 servidor (certificado "
+"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 servidor (certificado "
-"no seguro)."
+"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 servidor."
+msgstr "No se ha podido establecer una conexión segura al equipo."
 
 msgid "Unable to find destination for job"
 msgstr "No se ha podido encontrar destino para el trabajo"
@@ -4220,11 +4783,11 @@ 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 generate compressed print file"
-msgstr "No se ha podido crear el archivo de impresión comprimido"
+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"
+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"
@@ -4284,9 +4847,6 @@ 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 compressed print file"
-msgstr "No se ha podido abrir el archivo de impresión comprimido"
-
 msgid "Unable to open cupsd.conf file:"
 msgstr "No se ha podido abrir el archivo cupsd.conf:"
 
@@ -4312,8 +4872,11 @@ 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."
 
-msgid "Unable to resolve printer URI."
-msgstr "No se ha podido resolver el URI de la impresora."
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
+msgstr "No se ha podido resolver printer-uri."
 
 #, c-format
 msgid "Unable to run \"%s\": %s"
@@ -4390,7 +4953,7 @@ msgstr "Opción \"%s\" con valor \"%s\" desconocida."
 
 #, c-format
 msgid "Unknown option \"%s\"."
-msgstr "Opción \"%s\" desconocida"
+msgstr "Opción \"%s\" desconocida."
 
 #, c-format
 msgid "Unknown print mode: \"%s\"."
@@ -4404,6 +4967,15 @@ msgstr "printer-error-policy \"%s\" incorrecto."
 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."
 
@@ -4413,63 +4985,63 @@ msgstr "Valor de opción de versión \"%s\" desconocida."
 
 #, c-format
 msgid "Unsupported 'compression' value \"%s\"."
-msgstr ""
+msgstr "Valor 'compression' \"%s\" no implementado."
 
 #, c-format
 msgid "Unsupported 'document-format' value \"%s\"."
-msgstr ""
+msgstr "Valor 'document-format' \"%s\" no implementado."
 
 msgid "Unsupported 'job-name' value."
-msgstr ""
+msgstr "Valor 'job-name' no implementado."
 
 #, c-format
 msgid "Unsupported character set \"%s\"."
-msgstr "Juego de caracteres \"%s\" no permitido."
+msgstr "Juego de caracteres \"%s\" no implementado."
 
 #, c-format
 msgid "Unsupported compression \"%s\"."
-msgstr "Compresión \"%s\" no permitida."
+msgstr "Compresión \"%s\" no implementada."
 
 #, c-format
 msgid "Unsupported document-format \"%s\"."
-msgstr "document-format \"%s\" no permitido."
+msgstr "document-format \"%s\" no implementado."
 
 #, c-format
 msgid "Unsupported document-format \"%s/%s\"."
-msgstr "document-format \"%s/%s\" no permitido."
+msgstr "document-format \"%s/%s\" no implementado."
 
 #, c-format
 msgid "Unsupported format \"%s\"."
-msgstr "Formato \"%s\" no permitido."
+msgstr "Formato \"%s\" no implementado."
 
 msgid "Unsupported margins."
-msgstr "Márgenes no permitidos."
+msgstr "Márgenes no implementados."
 
 msgid "Unsupported media value."
-msgstr "Valor del medio no permitido."
+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 permitido; usando number-up=1."
+"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 permitido; "
-"usando number-up-layout=lrtb."
+"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 permitido; usando page-"
+"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 permitidos."
+msgstr "Trama de datos no implementados."
 
 msgid "Unsupported value type"
-msgstr "Tipo de valor no permitido"
+msgstr "Tipo de valor no implementado"
 
 msgid "Upgrade Required"
 msgstr "Se requiere actualización"
@@ -4504,10 +5076,10 @@ msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]"
 msgstr "Uso: cupsctl [opciones] [param=valor ... paramN=valorN]"
 
 msgid "Usage: cupsd [options]"
-msgstr "Uso: cupsd [opciones)"
+msgstr "Uso: cupsd [opciones]"
 
-msgid "Usage: cupsfilter [ options ] filename"
-msgstr "Uso: cupsfilter ( opciones ) archivo"
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
+msgstr "Uso: cupsfilter [ opciones ] [ -- ] nombre_archivo"
 
 msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
 msgstr "Uso: cupstestdsc [opciones] nombre_archivo.ps [... nombre_archivo.ps]"
@@ -4518,6 +5090,28 @@ msgstr ""
 "Uso: cupstestppd [opciones] nombre_archivo1.ppd[.gz] [... nombre_archivoN.ppd"
 "[.gz]]"
 
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+"       ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+"Uso: ippdiscover [opciones] -a\n"
+"       ippdiscover [opciones] \"nombre servicio\"\n"
+"\n"
+"Opciones:"
+
+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 ]"
 
@@ -4535,23 +5129,11 @@ msgstr ""
 "     lpoptions [-h servidor] [-E] -p impresora -o opción[=valor] ...\n"
 "     lpoptions [-h servidor] [-E] -x impresora"
 
-msgid "Usage: lppasswd [-g groupname]"
-msgstr "Uso: lppasswd [-g nombre_grupo]"
-
-msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-"       lppasswd [-g groupname] -a [username]\n"
-"       lppasswd [-g groupname] -x [username]"
-msgstr ""
-"Uso: lppasswd [-g nombre_grupo] [nombre_usuario]\n"
-"     lppasswd [-g nombre_grupo] -a [nombre_usuario]\n"
-"     lppasswd [-g nombre_grupo] -x [nombre_usuario]"
-
 msgid ""
 "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
 msgstr ""
-"Uso: lpq (-P dest) (-U nombre_usuario) (-h nombre_ordenador(:puerto)) (-l) "
-"(+intervalo)"
+"Uso: lpq [-P dest] [-U nombre_usuario] [-h nombre_equipo[:puerto]] [-l] "
+"[+intervalo]"
 
 msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]"
 msgstr "Uso: ppdc [opciones] nombre_archivo.drv [ ... nombre_archivoN.drv ]"
@@ -4573,7 +5155,7 @@ msgstr ""
 "nombre_archivoN.drv ]"
 
 msgid "Usage: snmp [host-or-ip-address]"
-msgstr "Uso: snmp [ordenador-o-dirección-ip]"
+msgstr "Uso: snmp [equipo-o-dirección-ip]"
 
 msgid "Value uses indefinite length"
 msgstr "Valor usa una longitud indefinida"
@@ -4612,13 +5194,6 @@ msgstr ""
 "Debe acceder a esta página usando el URL <A HREF=\"https://%s:%d%s\">https://"
 "%s:%d%s</A>."
 
-msgid ""
-"Your password must be at least 6 characters long, cannot contain your "
-"username, and must contain at least one letter and number."
-msgstr ""
-"Su contraseña debe tener al menos 6 caracteres, no puede contener su nombre "
-"de usuario, y debe tener al menos una letra y un número."
-
 msgid "ZPL Label Printer"
 msgstr "Impresora de etiquetas ZPL"
 
@@ -4666,15 +5241,21 @@ msgstr ""
 
 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: Relative cups-files.conf filename not allowed."
+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 ""
+msgstr "cupsd: No se ha podido obtener la ruta al archivo cups-files.conf."
 
 #, c-format
 msgid "cupsd: Unknown argument \"%s\" - aborting."
@@ -4684,11 +5265,6 @@ msgstr "cupsd: Argumento \"%s\" desconocido - cancelando."
 msgid "cupsd: Unknown option \"%c\" - aborting."
 msgstr "cupsd: Opción \"%c\" desconocida - cancelando."
 
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
-"cupsd: el uso de launchd(8) no ha sido compilado, ejecutándose en modo "
-"normal."
-
 #, c-format
 msgid "cupsfilter: Invalid document number %d."
 msgstr "cupsfilter: Número de documento %d no válido."
@@ -4733,16 +5309,88 @@ msgstr "help\t\tProporciona ayuda sobre los comandos."
 msgid "idle"
 msgstr "inactiva"
 
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
-msgstr "ipptool: \"-i\" y \"-n\" son incompatibles with -X\"."
+#, 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 "ipptool: Bad URI - %s."
-msgstr "ipptool: URI - %s incorrecto."
+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 "ipptool: Bad version %s for \"-V\"."
-msgstr "ipptool: Versión %s para \"-V\" incorrecta."
+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."
+
+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 \"-P\" and \"-X\"."
+msgstr "ipptool: \"-i\" y \"-n\" no son compatibles con \"-P\" y \"-X\"."
+
+#, c-format
+msgid "ipptool: Bad URI - %s."
+msgstr "ipptool: URI - %s incorrecto."
 
 msgid "ipptool: Invalid seconds for \"-i\"."
 msgstr "ipptool: Número de segundos no válido para \"-i\"."
@@ -4762,12 +5410,6 @@ 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: Missing timeout for \"-T\"."
-msgstr "ipptool: Falta un tiempo de espera para \"-T\"."
-
-msgid "ipptool: Missing version for \"-V\"."
-msgstr "ipptool: Falta la versión para \"-V\"."
-
 msgid "ipptool: URI required before test file."
 msgstr "ipptool: Se requiere un URI antes del archivo de prueba."
 
@@ -4804,7 +5446,7 @@ 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 ordenador tras la opción \"-h\"."
+msgstr "lpadmin: Se esperaba un nombre de equipo tras la opción \"-h\"."
 
 msgid "lpadmin: Expected interface after \"-i\" option."
 msgstr "lpadmin: Se esperaba una interfaz tras la opción \"-i\"."
@@ -4831,7 +5473,7 @@ 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"
+msgstr "lpadmin: No se han visto nombres de miembros."
 
 #, c-format
 msgid "lpadmin: Printer %s is already a member of class %s."
@@ -4868,6 +5510,10 @@ msgstr ""
 "         Primero debe especificar un nombre de impresora."
 
 #, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
+#, c-format
 msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
 msgstr "lpadmin: No se ha podido abrir el archivo PPD \"%s\" - %s"
 
@@ -4967,50 +5613,6 @@ msgstr "lpoptions: No se ha podido abrir el archivo PPD para %s."
 msgid "lpoptions: Unknown printer or class."
 msgstr "lpoptions: Impresora o clase desconocida."
 
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr "lppasswd: Solo el usuario root puede añadir o borrar contraseñas."
-
-msgid "lppasswd: Password file busy."
-msgstr "lppasswd: Archivo de contraseñas ocupado."
-
-msgid "lppasswd: Password file not updated."
-msgstr "lppasswd: Archivo de contraseñas no actualizado."
-
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr "lppasswd: Lo siento, la contraseña no coincide."
-
-msgid "lppasswd: Sorry, password rejected."
-msgstr "lppasswd: Lo siento, la contraseña ha sido rechazada."
-
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr "lppasswd: Lo siento, las contraseñas no coinciden."
-
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr "lppasswd: No se ha podido copiar la cadena de contraseña: %s"
-
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr "lppasswd: No se ha podido abrir el archivo de contraseñas: %s"
-
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr "lppasswd: No se ha podido escribir en el archivo de contraseñas: %s"
-
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr ""
-"lppasswd: falló al hacer una copia de seguridad del antiguo archivo de "
-"contraseñas: %s"
-
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr "lppasswd: falló al cambiar de nombre al archivo de contraseñas: %s"
-
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr "lppasswd: el usuario \"%s\" y el grupo \"%s\" no existen."
-
 #, c-format
 msgid ""
 "lpstat: error - %s environment variable names non-existent destination \"%s"
@@ -5057,7 +5659,7 @@ 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: %s incorrecto"
+msgstr "ppdc: Atributo de fuente incorrecto: %s"
 
 #, c-format
 msgid "ppdc: Bad resolution name \"%s\" on line %d of %s."
@@ -5449,7 +6051,7 @@ 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 seguridad de %s a %s- %s"
+msgstr "ppdmerge: No se ha podido hacer copia de respaldo de %s a %s - %s"
 
 #, c-format
 msgid "printer %s disabled since %s -"
@@ -5517,3 +6119,13 @@ msgstr "sin título"
 
 msgid "variable-bindings uses indefinite length"
 msgstr "variable-bindings usa una longitud indefinida"
+
+#~ msgid "Looking for printer."
+#~ msgstr "Buscando impresora."
+
+#~ msgid ""
+#~ "The '%s' Job Description attribute cannot be supplied in a job creation "
+#~ "request."
+#~ msgstr ""
+#~ "El atributo de descripción de trabajo '%s' no puede ser suministrado en "
+#~ "una solicitud de creación de trabajo."
index 7241284..385fe0e 100644 (file)
@@ -29,7 +29,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 1.6\n"
 "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2013-07-08 07:38-0400\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
 "PO-Revision-Date: 2012-12-12 11:12+0100\n"
 "Last-Translator: denis meramdjougoma <dcmeram@libertysurf.fr>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -788,6 +788,12 @@ msgstr ""
 msgid "    Warning: obsolete DSC version %.1f in file."
 msgstr ""
 
+msgid "  ! expression            Unary NOT of expression."
+msgstr ""
+
+msgid "  ( expressions )         Group expressions."
+msgstr ""
+
 msgid "  --[no-]debug-logging    Turn debug logging on/off."
 msgstr ""
 
@@ -809,9 +815,85 @@ msgstr ""
 msgid "  --crlf                  End lines with CR + LF (Windows)."
 msgstr ""
 
+msgid "  --domain regex          Match domain to regular expression."
+msgstr ""
+
+msgid ""
+"  --exec utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+
+msgid "  --false                 Always false."
+msgstr ""
+
+msgid "  --help                  Show help."
+msgstr ""
+
+msgid "  --help                  Show this help."
+msgstr ""
+
+msgid "  --host regex            Match hostname to regular expression."
+msgstr ""
+
 msgid "  --lf                    End lines with LF (UNIX/Linux/OS X)."
 msgstr ""
 
+msgid "  --list-filters          List filters that will be used."
+msgstr ""
+
+msgid "  --local                 True if service is local."
+msgstr ""
+
+msgid "  --ls                    List attributes."
+msgstr ""
+
+msgid "  --name regex            Match service name to regular expression."
+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 "  --quiet                 Quietly report match via exit code."
+msgstr ""
+
+msgid "  --remote                True if service is remote."
+msgstr ""
+
+msgid ""
+"  --stop-after-include-error\n"
+"                          Stop tests after a failed INCLUDE."
+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 "  -4                      Connect using IPv4."
 msgstr ""
 
@@ -852,15 +934,26 @@ msgstr ""
 msgid "  -L                      Send requests using content-length."
 msgstr ""
 
+msgid ""
+"  -P filename.plist       Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+
 msgid "  -P filename.ppd         Set PPD file."
 msgstr ""
 
+msgid "  -P number[-number]      Match port to number or range."
+msgstr ""
+
 msgid "  -R root-directory       Set alternate root."
 msgstr ""
 
 msgid "  -S                      Test with SSL encryption."
 msgstr ""
 
+msgid "  -T seconds              Set the browse timeout in seconds."
+msgstr ""
+
 msgid "  -T seconds              Set the receive/send timeout in seconds."
 msgstr ""
 
@@ -878,15 +971,27 @@ msgstr ""
 msgid "  -X                      Produce XML plist instead of plain text."
 msgstr ""
 
+msgid "  -a                      Browse for all services."
+msgstr ""
+
 msgid "  -a                      Export all printers."
 msgstr ""
 
+msgid "  -c                      Produce CSV output."
+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 "  -c cupsd.conf           Set cupsd.conf file to use."
 msgstr ""
 
+msgid "  -d domain               Browse/resolve in specified domain."
+msgstr ""
+
 msgid "  -d name=value           Set named variable to value."
 msgstr ""
 
@@ -896,6 +1001,9 @@ msgstr ""
 msgid "  -d printer              Use the named printer."
 msgstr ""
 
+msgid "  -d regex                Match domain to regular expression."
+msgstr ""
+
 msgid "  -e                      Use every filter from the PPD file."
 msgstr ""
 
@@ -908,6 +1016,9 @@ msgstr ""
 msgid "  -h                      Show this usage message."
 msgstr ""
 
+msgid "  -h regex                Match hostname to regular expression."
+msgstr ""
+
 msgid "  -h server[:port]        Specify server address."
 msgstr ""
 
@@ -923,7 +1034,13 @@ msgid ""
 "file 1)."
 msgstr ""
 
-msgid "  -l                      Run cupsd from launchd(8)."
+msgid "  -l                      List attributes."
+msgstr ""
+
+msgid "  -l                      Produce plain text output."
+msgstr ""
+
+msgid "  -l                      Run cupsd on demand."
 msgstr ""
 
 msgid "  -l lang[,lang,...]      Specify the output language(s) (locale)."
@@ -943,6 +1060,9 @@ msgid ""
 "  -n count                Repeat the last file the given number of times."
 msgstr ""
 
+msgid "  -n regex                Match service name to regular expression."
+msgstr ""
+
 msgid ""
 "  -o filename.drv         Set driver information file (otherwise ppdi.drv)."
 msgstr ""
@@ -953,15 +1073,30 @@ msgstr ""
 msgid "  -o name=value           Set option(s)."
 msgstr ""
 
+msgid "  -p                      Print URI if true."
+msgstr ""
+
 msgid "  -p filename.ppd         Set PPD file."
 msgstr ""
 
+msgid "  -p program              Run specified program for each service."
+msgstr ""
+
+msgid "  -q                      Quietly report match via exit code."
+msgstr ""
+
 msgid "  -q                      Run silently."
 msgstr ""
 
+msgid "  -r                      True if service is remote."
+msgstr ""
+
 msgid "  -r                      Use 'relaxed' open mode."
 msgstr ""
 
+msgid "  -s                      Print service name if true."
+msgstr ""
+
 msgid "  -t                      Produce a test report."
 msgstr ""
 
@@ -971,21 +1106,101 @@ msgstr ""
 msgid "  -t                      Test the configuration file."
 msgstr ""
 
+msgid "  -t key                  True if the TXT record contains the key."
+msgstr ""
+
 msgid "  -t title                Set title."
 msgstr ""
 
+msgid "  -t type                 Browse/resolve with specified type."
+msgstr ""
+
 msgid "  -u                      Remove the PPD file when finished."
 msgstr ""
 
+msgid "  -u regex                Match URI to regular expression."
+msgstr ""
+
 msgid "  -v                      Be verbose."
 msgstr ""
 
 msgid "  -vv                     Be very verbose."
 msgstr ""
 
+msgid ""
+"  -x utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+
 msgid "  -z                      Compress PPD files using GNU zip."
 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 ""
+"  expression --and expression\n"
+"                          Logical AND."
+msgstr ""
+
+msgid ""
+"  expression --or expression\n"
+"                          Logical OR."
+msgstr ""
+
+msgid "  expression expression   Logical AND."
+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 " FAIL"
 msgstr ""
 
@@ -993,7 +1208,166 @@ msgid " PASS"
 msgstr ""
 
 #, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
 msgstr ""
 
 #, c-format
@@ -1001,6 +1375,34 @@ 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 ""
 
@@ -1058,6 +1460,14 @@ 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 ""
 
@@ -1103,10 +1513,6 @@ msgid "%s: Error - expected destination after \"-P\" option."
 msgstr ""
 
 #, c-format
-msgid "%s: Error - expected destination after \"-b\" option."
-msgstr ""
-
-#, c-format
 msgid "%s: Error - expected destination after \"-d\" option."
 msgstr ""
 
@@ -1225,6 +1631,18 @@ 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 ""
 
@@ -1241,6 +1659,10 @@ 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 ""
 
@@ -1249,10 +1671,18 @@ 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 ""
 
@@ -1265,6 +1695,10 @@ 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 destination \"%s\"."
 msgstr ""
 
@@ -1277,6 +1711,14 @@ 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 ""
 
@@ -1830,9 +2272,6 @@ msgstr ""
 msgid "70"
 msgstr "70"
 
-msgid "720dpi"
-msgstr "720 ppp"
-
 msgid "75"
 msgstr "75"
 
@@ -2117,6 +2556,9 @@ msgstr ""
 msgid "Bad UIConstraints"
 msgstr ""
 
+msgid "Bad arguments to function"
+msgstr ""
+
 #, c-format
 msgid "Bad copies value %d."
 msgstr ""
@@ -2143,10 +2585,11 @@ msgstr ""
 msgid "Bad filename buffer"
 msgstr ""
 
-msgid "Bad job-name value: Bad UTF-8 sequence."
+msgid "Bad hostname/address in URI"
 msgstr ""
 
-msgid "Bad job-name value: Name too long."
+#, c-format
+msgid "Bad job-name value: %s"
 msgstr ""
 
 msgid "Bad job-name value: Wrong type or count."
@@ -2189,17 +2632,20 @@ msgstr ""
 msgid "Bad page-ranges values %d-%d."
 msgstr "Intervalle de pages erroné : %d-%d."
 
-#, c-format
-msgid "Bad port-monitor \"%s\"."
+msgid "Bad port number in URI"
 msgstr ""
 
-msgid "Bad printer 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 ""
@@ -2208,12 +2654,24 @@ msgstr ""
 msgid "Bad request version number %d.%d."
 msgstr ""
 
+msgid "Bad resource in URI"
+msgstr ""
+
+msgid "Bad scheme in URI"
+msgstr ""
+
 msgid "Bad subscription ID"
 msgstr ""
 
+msgid "Bad username in URI"
+msgstr ""
+
 msgid "Bad value string"
 msgstr ""
 
+msgid "Bad/empty URI"
+msgstr ""
+
 msgid "Banners"
 msgstr "Bannières"
 
@@ -2233,6 +2691,9 @@ msgstr "CMJN"
 msgid "CPCL Label Printer"
 msgstr "Imprimante pour étiquettes CPCL"
 
+msgid "Cancel Jobs"
+msgstr ""
+
 msgid "Cancel RSS Subscription"
 msgstr "Annuler abonnement RSS"
 
@@ -2392,6 +2853,9 @@ msgstr "Modifier le fichier de configuration"
 msgid "Empty PPD file."
 msgstr ""
 
+msgid "Encryption is not supported."
+msgstr ""
+
 #. TRANSLATORS: Banner/cover sheet after the print job.
 msgid "Ending Banner"
 msgstr "Fin de la bannière"
@@ -2399,15 +2863,6 @@ msgstr "Fin de la bannière"
 msgid "English"
 msgstr "French"
 
-msgid "Enter old password:"
-msgstr "Ancien mot de passe :"
-
-msgid "Enter password again:"
-msgstr "Confirmez le nouveau mot de passe :"
-
-msgid "Enter password:"
-msgstr "Entrez le nouveau mot de passe :"
-
 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 "
@@ -2573,12 +3028,18 @@ msgstr ""
 msgid "Envelope You4 Long Edge"
 msgstr ""
 
+msgid "Environment Variables:"
+msgstr ""
+
 msgid "Epson"
 msgstr "Epson"
 
 msgid "Error Policy"
 msgstr "Règles d’erreur"
 
+msgid "Error reading raster data."
+msgstr ""
+
 msgid "Error sending raster data."
 msgstr ""
 
@@ -2624,6 +3085,9 @@ msgstr "Échec de la condition de valeur attendue"
 msgid "Export Printers to Samba"
 msgstr "Exporter les imprimantes vers SAMBA"
 
+msgid "Expressions:"
+msgstr ""
+
 msgid "FAIL"
 msgstr ""
 
@@ -2735,6 +3199,9 @@ msgstr ""
 msgid "IPP language length overflows value."
 msgstr ""
 
+msgid "IPP language length too large."
+msgstr ""
+
 msgid "IPP member name is not empty."
 msgstr ""
 
@@ -2750,6 +3217,9 @@ 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 ""
 
@@ -2810,6 +3280,9 @@ msgstr "Affranchissement Internet en 3 parties"
 msgid "Internet Printing Protocol"
 msgstr "Internet Printing Protocol"
 
+msgid "Invalid media name arguments."
+msgstr ""
+
 msgid "Invalid media size."
 msgstr ""
 
@@ -2959,10 +3432,13 @@ msgstr "Ligne dépassant la longueur maximale autorisée (255 caractères)"
 msgid "List Available Printers"
 msgstr ""
 
+msgid "Load paper."
+msgstr ""
+
 msgid "Long-Edge (Portrait)"
 msgstr "Bord le plus long (Portrait)"
 
-msgid "Looking for printer."
+msgid "Looking for printer..."
 msgstr ""
 
 msgid "Manual Feed"
@@ -3026,6 +3502,12 @@ msgstr ""
 msgid "Missing required attributes."
 msgstr ""
 
+msgid "Missing resource in URI"
+msgstr ""
+
+msgid "Missing scheme in URI"
+msgstr ""
+
 #, c-format
 msgid "Missing value on line %d."
 msgstr ""
@@ -3047,6 +3529,9 @@ msgid ""
 "        device-id = %s"
 msgstr ""
 
+msgid "Modifiers:"
+msgstr ""
+
 msgid "Modify Class"
 msgstr "Modifier la classe"
 
@@ -3074,12 +3559,6 @@ msgstr ""
 msgid "Never"
 msgstr "Jamais"
 
-msgid "New Stylus Color Series"
-msgstr "Nouvelles série Stylus Color"
-
-msgid "New Stylus Photo Series"
-msgstr "Nouvelles série Stylus Photo"
-
 msgid "No"
 msgstr "Non"
 
@@ -3098,6 +3577,9 @@ msgstr ""
 msgid "No active connection"
 msgstr "Aucune connexion active"
 
+msgid "No active connection."
+msgstr ""
+
 #, c-format
 msgid "No active jobs on %s."
 msgstr ""
@@ -3150,6 +3632,15 @@ 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"
 
@@ -3244,20 +3735,13 @@ msgstr ""
 msgid "Output Mode"
 msgstr "Mode de sortie"
 
-#, c-format
-msgid "Output for printer %s is sent to %s"
-msgstr ""
-
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
+msgid "Output bin is almost full."
 msgstr ""
 
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
+msgid "Output bin is full."
 msgstr ""
 
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+msgid "Output bin is missing."
 msgstr ""
 
 msgid "PASS"
@@ -3290,6 +3774,18 @@ 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 "Paper jam."
+msgstr ""
+
+msgid "Paper tray is almost empty."
+msgstr ""
+
+msgid "Paper tray is empty."
+msgstr ""
+
+msgid "Paper tray is missing."
+msgstr ""
+
 msgid "ParamCustominCutInterval"
 msgstr "ParamCustominCutInterval"
 
@@ -3343,6 +3839,9 @@ msgstr ""
 msgid "Postcard Long Edge"
 msgstr ""
 
+msgid "Preparing to print."
+msgstr ""
+
 msgid "Print Density"
 msgstr "Densité d’impression"
 
@@ -3370,25 +3869,18 @@ msgstr "Impression à découper"
 msgid "Print and Tear"
 msgstr "Impression à détacher"
 
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr ""
-
-msgid "Print file accepted - job ID unknown."
-msgstr ""
-
 msgid "Print file sent."
 msgstr ""
 
-msgid "Print file was not accepted."
-msgstr ""
-
 msgid "Print job canceled at printer."
 msgstr ""
 
 msgid "Print job too large."
 msgstr ""
 
+msgid "Print job was not accepted."
+msgstr ""
+
 msgid "Printer Added"
 msgstr "ajoutée"
 
@@ -3410,6 +3902,9 @@ msgstr "Réglages de l’imprimante"
 msgid "Printer cannot print supplied content."
 msgstr ""
 
+msgid "Printer cannot print with supplied options."
+msgstr ""
+
 msgid "Printer:"
 msgstr "Imprimante :"
 
@@ -3417,12 +3912,9 @@ msgid "Printers"
 msgstr ""
 
 #, c-format
-msgid "Printing page %d, %d%% complete."
+msgid "Printing page %d, %u%% complete."
 msgstr ""
 
-msgid "Purge Jobs"
-msgstr "Purger les tâches"
-
 msgid "Quarto"
 msgstr "Quarto"
 
@@ -3432,11 +3924,6 @@ msgstr ""
 msgid "Rank    Owner   Job     File(s)                         Total Size"
 msgstr ""
 
-#. TRANSLATORS: Pri is job priority.
-msgid ""
-"Rank   Owner      Pri  Job        Files                       Total Size"
-msgstr ""
-
 msgid "Reject Jobs"
 msgstr "Refuser les tâches"
 
@@ -3497,6 +3984,9 @@ 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"
 
@@ -3542,16 +4032,13 @@ msgstr ""
 msgid "Statement"
 msgstr "Déclaration"
 
-msgid "Stylus Color Series"
-msgstr "Série Stylus Color"
-
-msgid "Stylus Photo Series"
-msgstr "Série Stylus Photo"
-
 #, c-format
 msgid "Subscription #%d does not exist."
 msgstr ""
 
+msgid "Substitutions:"
+msgstr ""
+
 msgid "Super A"
 msgstr ""
 
@@ -3583,13 +4070,16 @@ 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 Description attribute cannot be supplied in a job creation "
-"request."
+"The '%s' Job Status attribute cannot be supplied in a job creation request."
 msgstr ""
 
 #, c-format
@@ -3643,38 +4133,19 @@ msgstr ""
 msgid "The optical photoconductor will need to be replaced soon."
 msgstr ""
 
-msgid "The output bin is almost full."
-msgstr ""
-
-msgid "The output bin is full."
+msgid "The printer configuration is incorrect or the printer no longer exists."
 msgstr ""
 
-msgid "The output bin is missing."
-msgstr ""
-
-msgid "The paper tray is almost empty."
-msgstr ""
-
-msgid "The paper tray is empty."
-msgstr ""
-
-msgid "The paper tray is missing."
-msgstr ""
-
-msgid "The paper tray needs to be filled."
-msgstr ""
-
-msgid "The printer URI is incorrect or no longer exists."
+msgid "The printer did not respond."
 msgstr ""
 
-msgid "The printer did not respond."
+msgid "The printer is in use."
 msgstr ""
 
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
+msgid "The printer is low on ink."
 msgstr ""
 
-msgid "The printer is in use."
+msgid "The printer is low on toner."
 msgstr ""
 
 msgid "The printer is not connected."
@@ -3692,12 +4163,6 @@ msgstr ""
 msgid "The printer is offline."
 msgstr ""
 
-msgid "The printer is running low on ink."
-msgstr ""
-
-msgid "The printer is running low on toner."
-msgstr ""
-
 msgid "The printer is unreachable at this time."
 msgstr ""
 
@@ -3776,9 +4241,6 @@ msgstr ""
 msgid "There are too many subscriptions."
 msgstr "Les abonnements sont trop nombreux."
 
-msgid "There is a paper jam."
-msgstr ""
-
 msgid "There was an unrecoverable USB error."
 msgstr ""
 
@@ -3817,6 +4279,9 @@ msgstr "Bac 4"
 msgid "URI Too Long"
 msgstr "URI trop long"
 
+msgid "URI too large"
+msgstr ""
+
 msgid "US Ledger"
 msgstr "US Ledger"
 
@@ -3887,6 +4352,14 @@ 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 ""
 
@@ -3927,10 +4400,10 @@ msgstr ""
 msgid "Unable to copy interface script - %s"
 msgstr ""
 
-msgid "Unable to create compressed print file"
+msgid "Unable to create printer-uri"
 msgstr ""
 
-msgid "Unable to create printer-uri"
+msgid "Unable to create server credentials."
 msgstr ""
 
 msgid "Unable to create temporary file"
@@ -3984,7 +4457,7 @@ msgstr ""
 msgid "Unable to find printer."
 msgstr ""
 
-msgid "Unable to generate compressed print file"
+msgid "Unable to find server credentials."
 msgstr ""
 
 msgid "Unable to get backend exit status."
@@ -4044,9 +4517,6 @@ msgstr "Impossible de transférer les tâches."
 msgid "Unable to open PPD file"
 msgstr ""
 
-msgid "Unable to open compressed print file"
-msgstr ""
-
 msgid "Unable to open cupsd.conf file:"
 msgstr "Impossible d’ouvrir le fichier cupsd.conf :"
 
@@ -4072,7 +4542,10 @@ msgstr "Impossible d’imprimer la page de test :"
 msgid "Unable to read print data."
 msgstr ""
 
-msgid "Unable to resolve printer URI."
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
 msgstr ""
 
 #, c-format
@@ -4162,6 +4635,15 @@ msgstr "Paramètre printer-error-policy « %s » inconnu."
 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 ""
 
@@ -4251,7 +4733,7 @@ msgstr ""
 msgid "Usage: cupsd [options]"
 msgstr ""
 
-msgid "Usage: cupsfilter [ options ] filename"
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
 msgstr ""
 
 msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
@@ -4261,6 +4743,20 @@ msgid ""
 "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
 msgstr ""
 
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+"       ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+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 ""
 
@@ -4274,15 +4770,6 @@ msgid ""
 "       lpoptions [-h server] [-E] -x printer"
 msgstr ""
 
-msgid "Usage: lppasswd [-g groupname]"
-msgstr ""
-
-msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-"       lppasswd [-g groupname] -a [username]\n"
-"       lppasswd [-g groupname] -x [username]"
-msgstr ""
-
 msgid ""
 "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
 msgstr ""
@@ -4341,11 +4828,6 @@ msgstr ""
 "Vous devez accéder à cette page par l’URL <A HREF=\"https://%s:%d%s"
 "\">https://%s:%d%s</A>."
 
-msgid ""
-"Your password must be at least 6 characters long, cannot contain your "
-"username, and must contain at least one letter and number."
-msgstr ""
-
 msgid "ZPL Label Printer"
 msgstr "Imprimante pour étiquettes ZPL"
 
@@ -4392,6 +4874,9 @@ 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 ""
 
@@ -4409,9 +4894,6 @@ msgstr ""
 msgid "cupsd: Unknown option \"%c\" - aborting."
 msgstr ""
 
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
-
 #, c-format
 msgid "cupsfilter: Invalid document number %d."
 msgstr ""
@@ -4456,15 +4938,87 @@ msgstr ""
 msgid "idle"
 msgstr "inactive"
 
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
+#, c-format
+msgid "ippfind: Bad regular expression: %s"
+msgstr ""
+
+msgid "ippfind: Cannot use --and after --or."
 msgstr ""
 
 #, c-format
-msgid "ipptool: Bad URI - %s."
+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 ""
+
+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 \"-P\" and \"-X\"."
 msgstr ""
 
 #, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
+msgid "ipptool: Bad URI - %s."
 msgstr ""
 
 msgid "ipptool: Invalid seconds for \"-i\"."
@@ -4485,12 +5039,6 @@ msgstr ""
 msgid "ipptool: Missing seconds for \"-i\"."
 msgstr ""
 
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr ""
-
-msgid "ipptool: Missing version for \"-V\"."
-msgstr ""
-
 msgid "ipptool: URI required before test file."
 msgstr ""
 
@@ -4584,6 +5132,10 @@ msgid ""
 msgstr ""
 
 #, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
+#, c-format
 msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
 msgstr ""
 
@@ -4678,48 +5230,6 @@ msgstr ""
 msgid "lpoptions: Unknown printer or class."
 msgstr ""
 
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr ""
-
-msgid "lppasswd: Password file busy."
-msgstr ""
-
-msgid "lppasswd: Password file not updated."
-msgstr ""
-
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr ""
-
-msgid "lppasswd: Sorry, password rejected."
-msgstr ""
-
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr ""
-
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr ""
-
 #, c-format
 msgid ""
 "lpstat: error - %s environment variable names non-existent destination \"%s"
@@ -5198,3 +5708,30 @@ msgstr "sans titre"
 
 msgid "variable-bindings uses indefinite length"
 msgstr ""
+
+#~ msgid "720dpi"
+#~ msgstr "720 ppp"
+
+#~ msgid "Enter old password:"
+#~ msgstr "Ancien mot de passe :"
+
+#~ msgid "Enter password again:"
+#~ msgstr "Confirmez le nouveau mot de passe :"
+
+#~ msgid "Enter password:"
+#~ msgstr "Entrez le nouveau mot de passe :"
+
+#~ msgid "New Stylus Color Series"
+#~ msgstr "Nouvelles série Stylus Color"
+
+#~ msgid "New Stylus Photo Series"
+#~ msgstr "Nouvelles série Stylus Photo"
+
+#~ msgid "Purge Jobs"
+#~ msgstr "Purger les tâches"
+
+#~ msgid "Stylus Color Series"
+#~ msgstr "Série Stylus Color"
+
+#~ msgid "Stylus Photo Series"
+#~ msgstr "Série Stylus Photo"
diff --git a/locale/cups_it.po b/locale/cups_it.po
new file mode 100644 (file)
index 0000000..1a2ae3f
--- /dev/null
@@ -0,0 +1,6261 @@
+#
+# "$Id$"
+#
+#   Message catalog template for CUPS.
+#
+#   Copyright 2007-2012 by Apple Inc.
+#   Copyright 2005-2007 by Easy Software Products.
+#
+#   These coded instructions, statements, and computer programs are the
+#   property of Apple Inc. and are protected by Federal copyright
+#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+#   which should have been included with this file.  If this file is
+#   file is missing or damaged, see the license at "http://www.cups.org/".
+#
+#
+# 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.
+#
+# Giovanni Scafora <giovanni@archlinux.org>, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: CUPS 1.6\n"
+"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
+"PO-Revision-Date: 2013-07-14 12:00+0200\n"
+"Last-Translator: Giovanni Scafora <giovanni@archlinux.org>\n"
+"Language-Team: Arch Linux Italian Team <giovanni@archlinux.org>\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/interfaces/%s"
+msgstr "\tInterfaccia: %s/interfacce/%s"
+
+#, 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 "                          Ignore specific warnings."
+msgstr "                          Ignora avvisi specifici."
+
+msgid "                          Issue warnings instead of errors."
+msgstr ""
+"                          Avvisa in caso di problemi invece degli errori."
+
+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."
+
+msgid "       cupsaddsmb [options] -a"
+msgstr "       cupsaddsmb [opzioni] -a"
+
+msgid "       cupstestdsc [options] -"
+msgstr "       cupstestdsc [opzioni] -"
+
+msgid "       program | cupstestppd [options] -"
+msgstr "       programma | cupstestppd [opzioni] -"
+
+#, 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 "    -h       Show program usage"
+msgstr "    -h       Mostra l'uso del programma"
+
+#, c-format
+msgid ""
+"    Bad %%%%BoundingBox: on line %d.\n"
+"        REF: Page 39, %%%%BoundingBox:"
+msgstr ""
+"    Non è valido %%%%BoundingBox: alla riga %d.\n"
+"        RIF: pagina 39, %%%%BoundingBox:"
+
+#, c-format
+msgid ""
+"    Bad %%%%Page: on line %d.\n"
+"        REF: Page 53, %%%%Page:"
+msgstr ""
+"    Non è valido %%%%Page: alla riga %d.\n"
+"        RIF: pagina 53, %%%%Page:"
+
+#, c-format
+msgid ""
+"    Bad %%%%Pages: on line %d.\n"
+"        REF: Page 43, %%%%Pages:"
+msgstr ""
+"    Non è valido %%%%Pages: alla riga %d.\n"
+"        RIF: pagina 43, %%%%Pages:"
+
+#, c-format
+msgid ""
+"    Line %d is longer than 255 characters (%d).\n"
+"        REF: Page 25, Line Length"
+msgstr ""
+"    La riga %d è più lunga di 255 caratteri (%d).\n"
+"        RIF: pagina 25, Lunghezza della riga"
+
+msgid ""
+"    Missing %!PS-Adobe-3.0 on first line.\n"
+"        REF: Page 17, 3.1 Conforming Documents"
+msgstr ""
+"    Manca %!PS-Adobe-3.0 nella prima riga.\n"
+"        RIF: pagina 17, 3.1 Documenti conformi"
+
+#, c-format
+msgid "    Missing %%EndComments comment.        REF: Page 41, %%EndComments"
+msgstr ""
+"    Manca il commento %%EndComments.        RIF: pagina 41, %%EndComments"
+
+#, c-format
+msgid ""
+"    Missing or bad %%BoundingBox: comment.\n"
+"        REF: Page 39, %%BoundingBox:"
+msgstr ""
+"    Manca o non è valido %%BoundingBox: commento.\n"
+"        RIF: pagina 39, %%BoundingBox:"
+
+#, c-format
+msgid ""
+"    Missing or bad %%Page: comments.\n"
+"        REF: Page 53, %%Page:"
+msgstr ""
+"    Manca o non è valido %%Page: commenti.\n"
+"        RIF: pagina 53, %%Page:"
+
+#, c-format
+msgid ""
+"    Missing or bad %%Pages: comment.\n"
+"        REF: Page 43, %%Pages:"
+msgstr ""
+"    Manca o non è valido %%Pages: commento.\n"
+"        RIF: pagina 43, %%Pages:"
+
+msgid "    NO ERRORS FOUND"
+msgstr "    NON SONO STATI TROVATI ERRORI"
+
+#, c-format
+msgid "    Saw %d lines that exceeded 255 characters."
+msgstr "    Tagliare %d righe che hanno superato i 255 caratteri."
+
+#, c-format
+msgid "    Too many %%BeginDocument comments."
+msgstr "    Troppi %%BeginDocument commenti."
+
+#, c-format
+msgid "    Too many %%EndDocument comments."
+msgstr "    Troppi %%EndDocument commenti."
+
+msgid "    Warning: file contains binary data."
+msgstr "    Attenzione: il file contiene dei dati binari."
+
+#, c-format
+msgid "    Warning: no %%EndComments comment in file."
+msgstr "    Attenzione: nessun %%EndComments commento nel file."
+
+#, c-format
+msgid "    Warning: obsolete DSC version %.1f in file."
+msgstr "    Attenzione: versione obsoleta di DSC %.1f nel file."
+
+msgid "  ! expression            Unary NOT of expression."
+msgstr "  ! expression            Unario NON di espressione."
+
+msgid "  ( expressions )         Group expressions."
+msgstr "  ( espressioni )         Gruppo di espressioni."
+
+msgid "  --[no-]debug-logging    Turn debug logging on/off."
+msgstr "  --[no-]debug-logging    Attiva/disattiva il logging del debug."
+
+msgid "  --[no-]remote-admin     Turn remote administration on/off."
+msgstr "  --[no-]remote-admin     Attiva/disattiva l'amministrazione remota."
+
+msgid "  --[no-]remote-any       Allow/prevent access from the Internet."
+msgstr "  --[no-]remote-any       Consente/previene l'accesso da Internet."
+
+msgid "  --[no-]share-printers   Turn printer sharing on/off."
+msgstr ""
+"  --[no-]share-printers   Attiva/disattiva la condivisione della stampante."
+
+msgid "  --[no-]user-cancel-any  Allow/prevent users to cancel any job."
+msgstr ""
+"  --[no-]user-cancel-any  Consente/vieta che gli utenti eliminino le stampe."
+
+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 "  --domain regex          Match domain to regular expression."
+msgstr ""
+"  --domain regex          Corrispondenza del dominio con l'espressione "
+"regolare."
+
+msgid ""
+"  --exec utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+"  --exec utility [argument ...] ;\n"
+"                          Esegue il programma se vero."
+
+msgid "  --false                 Always false."
+msgstr "  --false                 Sempre falso."
+
+msgid "  --help                  Show help."
+msgstr ""
+
+msgid "  --help                  Show this help."
+msgstr "  --help                  Mostra questo aiuto."
+
+msgid "  --host regex            Match hostname to regular expression."
+msgstr ""
+"  --host regex            Corrispondenza dell'hostname con l'espressione "
+"regolare."
+
+msgid "  --lf                    End lines with LF (UNIX/Linux/OS X)."
+msgstr "  --lf                    Termina le righe con LF (UNIX/Linux/OS X)."
+
+msgid "  --list-filters          List filters that will be used."
+msgstr ""
+
+msgid "  --local                 True if service is local."
+msgstr "  --local                 Vero se il servizio è locale."
+
+msgid "  --ls                    List attributes."
+msgstr "  --ls                    Elenco attributi."
+
+msgid "  --name regex            Match service name to regular expression."
+msgstr ""
+"  --name regex            Corrispondenza del nome del servizio con "
+"l'espressione regolare."
+
+msgid "  --not expression        Unary NOT of expression."
+msgstr "  --not expression        Unario NON di espressione."
+
+msgid "  --path regex            Match resource path to regular expression."
+msgstr ""
+"  --path regex            Corrispondenza del path della risorsa con "
+"l'espressione regolare."
+
+msgid "  --port number[-number]  Match port to number or range."
+msgstr ""
+"  --port number[-numero]  Corrispondenza della porta con il numero o con "
+"l'intervallo."
+
+msgid "  --print                 Print URI if true."
+msgstr "  --print                 Stampa URI se vero."
+
+msgid "  --print-name            Print service name if true."
+msgstr "  --print-name            Stampa il nome del servizio se vero."
+
+msgid "  --quiet                 Quietly report match via exit code."
+msgstr ""
+"  --quiet                 Riporta silenziosamente la corrispondenza tramite "
+"il codice d'uscita."
+
+msgid "  --remote                True if service is remote."
+msgstr "  --remote                Vero se il servizio è remoto."
+
+msgid ""
+"  --stop-after-include-error\n"
+"                          Stop tests after a failed INCLUDE."
+msgstr ""
+
+msgid "  --true                  Always true."
+msgstr "  --true                  Sempre vero."
+
+msgid "  --txt key               True if the TXT record contains the key."
+msgstr "  --txt key               Vero se il record TXT contiene la chiave."
+
+msgid "  --txt-* regex           Match TXT record key to regular expression."
+msgstr ""
+"  --txt-* regex           Corrispondenza della chiave del record TXT con "
+"l'espressione regolare."
+
+msgid "  --uri regex             Match URI to regular expression."
+msgstr ""
+"  --uri regex             Corrispondenza dell'URI con l'espressione regolare."
+
+msgid "  --version               Show program version."
+msgstr "  --version               Mostra la versione del programma."
+
+msgid "  --version               Show version."
+msgstr ""
+
+msgid "  -4                      Connect using IPv4."
+msgstr "  -4                      Connetti utilizzando IPv4."
+
+msgid "  -6                      Connect using IPv6."
+msgstr "  -6                      Connetti utilizzando IPv6."
+
+msgid "  -C                      Send requests using chunking (default)."
+msgstr ""
+"  -C                      Invia richieste utilizzando la suddivisione in "
+"blocchi (predefinito)."
+
+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 "  -E                      Encrypt the connection."
+msgstr "  -E                      Crittografa la connessione."
+
+msgid "  -E                      Test with HTTP Upgrade to TLS."
+msgstr "  -E                      Prova con l'aggiornamento HTTP a TLS."
+
+msgid ""
+"  -F                      Run in the foreground but detach from console."
+msgstr "  -F                      Avvia in foreground ma esce dalla console."
+
+msgid "  -H samba-server         Use the named SAMBA server."
+msgstr "  -H samba-server         Utilizza il server SAMBA."
+
+msgid "  -I                      Ignore errors."
+msgstr "  -I                      Ignora gli errori."
+
+msgid "  -I include-dir          Add include directory to search path."
+msgstr ""
+"  -I include-dir          Aggiunge la directory include al percorso della "
+"ricerca."
+
+msgid "  -I {filename,filters,none,profiles}"
+msgstr "  -I {file,filtri,nessuno,profili}"
+
+msgid "  -L                      Send requests using content-length."
+msgstr "  -L                      Invia richieste utilizzando content-length."
+
+msgid ""
+"  -P filename.plist       Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+
+msgid "  -P filename.ppd         Set PPD file."
+msgstr "  -P filename.ppd         Imposta il file PPD."
+
+msgid "  -P number[-number]      Match port to number or range."
+msgstr ""
+"  -P number[-number]      Corrispondenza della porta con il numero o con "
+"l'intervallo."
+
+msgid "  -R root-directory       Set alternate root."
+msgstr "  -R root-directory       Imposta una root alternativa."
+
+msgid "  -S                      Test with SSL encryption."
+msgstr "  -S                      Prova con crittografia SSL."
+
+msgid "  -T seconds              Set the browse timeout in seconds."
+msgstr "  -T seconds              Imposta il timeout in secondi."
+
+msgid "  -T seconds              Set the receive/send timeout in seconds."
+msgstr ""
+"  -T seconds              Imposta il timeout della ricezione/invio in "
+"secondi."
+
+msgid "  -U username             Specify username."
+msgstr "  -U username             Specifica l'username."
+
+msgid "  -V version              Set default IPP version."
+msgstr "  -V version              Imposta la versione predefinita di IPP."
+
+msgid ""
+"  -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,"
+"translations}"
+msgstr ""
+"  -W {tutto,nessuno,vincoli,predefiniti,duplex,filtri,profili,dimensioni,"
+"traduzioni}"
+
+msgid "  -X                      Produce XML plist instead of plain text."
+msgstr ""
+"  -X                      Produce una plist XML invece di un testo normale."
+
+msgid "  -a                      Browse for all services."
+msgstr "  -a                      Mostra tutti i servizi."
+
+msgid "  -a                      Export all printers."
+msgstr "  -a                      Esporta tutte le stampanti."
+
+msgid "  -c                      Produce CSV output."
+msgstr ""
+
+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 "  -c cupsd.conf           Set cupsd.conf file to use."
+msgstr "  -c cupsd.conf           Imposta il file cupsd.conf da utilizzare."
+
+msgid "  -d domain               Browse/resolve in specified domain."
+msgstr "  -d domain               Mostra/risolve il dominio specificato."
+
+msgid "  -d name=value           Set named variable to value."
+msgstr "  -d name=value           Imposta la variabile specificata al valore."
+
+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 "  -d regex                Match domain to regular expression."
+msgstr ""
+"  -d regex                Corrispondenza del dominio con l'espressione "
+"regolare."
+
+msgid "  -e                      Use every filter from the PPD file."
+msgstr "  -e                      Utilizza tutti i filtri dal file PPD."
+
+msgid "  -f                      Run in the foreground."
+msgstr "  -f                      Avvia in foreground."
+
+msgid "  -f filename             Set default request filename."
+msgstr "  -f filename             Imposta il file predefinito richiesto."
+
+msgid "  -h                      Show this usage message."
+msgstr "  -h                      Mostra questo messaggio di utilizzo."
+
+msgid "  -h regex                Match hostname to regular expression."
+msgstr ""
+"  -h regex                Corrispondenza dell'hostname con l'espressione "
+"regolare."
+
+msgid "  -h server[:port]        Specify server address."
+msgstr "  -h server[:porta]        Specifica l'indirizzo del server."
+
+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 ""
+"  -i seconds              Repeat the last file with the given time interval."
+msgstr ""
+"  -i secondi              Ripeti l'ultimo file con il dato intervallo di "
+"tempo."
+
+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                      List attributes."
+msgstr "  -l                      Elenca gli attributi."
+
+msgid "  -l                      Produce plain text output."
+msgstr ""
+
+msgid "  -l                      Run cupsd on demand."
+msgstr ""
+
+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 ""
+"  -n count                Repeat the last file the given number of times."
+msgstr ""
+"  -n count                Ripete un numero di volte l'ultimo file dato."
+
+msgid "  -n regex                Match service name to regular expression."
+msgstr ""
+"  -n regex                Corrispondenza del nome del servizio con "
+"l'espressione regolare."
+
+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                      Print URI if true."
+msgstr "  -p                      Stampa l'URI se vero."
+
+msgid "  -p filename.ppd         Set PPD file."
+msgstr "  -p filename.ppd         Imposta il file PPD."
+
+msgid "  -p program              Run specified program for each service."
+msgstr ""
+"  -p program              Avvia il programma specificato per ogni servizio."
+
+msgid "  -q                      Quietly report match via exit code."
+msgstr ""
+"  -q                      Riporta silenziosamente la corrispondenza tramite "
+"il codice d'uscita."
+
+msgid "  -q                      Run silently."
+msgstr "  -q                      Avvia silenziosamente."
+
+msgid "  -r                      True if service is remote."
+msgstr "  -r                      Vero se il servizio è remoto."
+
+msgid "  -r                      Use 'relaxed' open mode."
+msgstr "  -r                      Utilizza la modalità di apertura 'relaxed'."
+
+msgid "  -s                      Print service name if true."
+msgstr "  -s                      Stampa il nome del servizio se è vero."
+
+msgid "  -t                      Produce a test report."
+msgstr "  -t                      Produce un rapporto di prova."
+
+msgid "  -t                      Test PPDs instead of generating them."
+msgstr "  -t                      Prova i PPD invece di generarli."
+
+msgid "  -t                      Test the configuration file."
+msgstr "  -t                      Prova il file di configurazione."
+
+msgid "  -t key                  True if the TXT record contains the key."
+msgstr "  -t key                  Vero se il record di TXT contiene la chiave."
+
+msgid "  -t title                Set title."
+msgstr "  -t title                Imposta il titolo."
+
+msgid "  -t type                 Browse/resolve with specified type."
+msgstr "  -t type                 Mostra/risolve con il tipo specificato."
+
+msgid "  -u                      Remove the PPD file when finished."
+msgstr "  -u                      Rimuove il file PPD una volta terminato."
+
+msgid "  -u regex                Match URI to regular expression."
+msgstr ""
+"  -u regex                Corrispondenza dell'URI con l'espressione regolare."
+
+msgid "  -v                      Be verbose."
+msgstr "  -v                      Fornisce maggiori dettagli."
+
+msgid "  -vv                     Be very verbose."
+msgstr "  -vv                     Fornisce tantissimi dettagli."
+
+msgid ""
+"  -x utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+"  -x utility [argument ...] ;\n"
+"                          Esegue il programma se è vero."
+
+msgid "  -z                      Compress PPD files using GNU zip."
+msgstr ""
+"  -z                      Il file PPD compresso sta utilizzando GNU zip."
+
+msgid "  IPPFIND_SERVICE_DOMAIN  Domain name"
+msgstr "  IPPFIND_SERVICE_DOMAIN  Nome del dominio"
+
+msgid ""
+"  IPPFIND_SERVICE_HOSTNAME\n"
+"                          Fully-qualified domain name"
+msgstr ""
+"  IPPFIND_SERVICE_HOSTNAME\n"
+"                          Nome del dominio completo"
+
+msgid "  IPPFIND_SERVICE_NAME    Service instance name"
+msgstr "  IPPFIND_SERVICE_NAME    Nome istanza del servizio"
+
+msgid "  IPPFIND_SERVICE_PORT    Port number"
+msgstr "  IPPFIND_SERVICE_PORT    Numero della porta"
+
+msgid "  IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr "  IPPFIND_SERVICE_REGTYPE DNS-SD tipo di registrazione"
+
+msgid "  IPPFIND_SERVICE_SCHEME  URI scheme"
+msgstr "  IPPFIND_SERVICE_SCHEME  schema dell'URI"
+
+msgid "  IPPFIND_SERVICE_URI     URI"
+msgstr "  IPPFIND_SERVICE_URI     URI"
+
+msgid "  IPPFIND_TXT_*           Value of TXT record key"
+msgstr "  IPPFIND_TXT_*           Value della chiave del record TXT"
+
+msgid ""
+"  expression --and expression\n"
+"                          Logical AND."
+msgstr ""
+"  espressione --and espressione\n"
+"                          AND logico."
+
+msgid ""
+"  expression --or expression\n"
+"                          Logical OR."
+msgstr ""
+"  espressione --or espressione\n"
+"                          OR logico."
+
+msgid "  expression expression   Logical AND."
+msgstr "  espressione espressione   AND logico."
+
+msgid "  {service_domain}        Domain name"
+msgstr "  {service_domain}        Nome del dominio"
+
+msgid "  {service_hostname}      Fully-qualified domain name"
+msgstr "  {service_hostname}      Nome del dominio completo"
+
+msgid "  {service_name}          Service instance name"
+msgstr "  {service_name}          Nome istanza del servizio"
+
+msgid "  {service_port}          Port number"
+msgstr "  {service_port}          Numero della porta"
+
+msgid "  {service_regtype}       DNS-SD registration type"
+msgstr "  {service_regtype}       Tipo di registrazione DNS-SD"
+
+msgid "  {service_scheme}        URI scheme"
+msgstr "  {service_scheme}        Schema dell'URI"
+
+msgid "  {service_uri}           URI"
+msgstr "  {service_uri}           URI"
+
+msgid "  {txt_*}                 Value of TXT record key"
+msgstr "  {txt_*}                 Valore della chiave del record TXT"
+
+msgid "  {}                      URI"
+msgstr "  {}                      URI"
+
+msgid " FAIL"
+msgstr " OPERAZIONE NON RIUSCITA CORRETTAMENTE"
+
+msgid " PASS"
+msgstr " OPERAZIONE RIUSCITA CON SUCCESSO"
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr ""
+"\"%s\": il valore dell'URI non è valido \"%s\" - %s (RFC 2911 sezione 4.1.5)."
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+"\"%s\": il valore dell'URI non è valido \"%s\" - la lunghezza non è valida "
+"%d (RFC 2911 sezione 4.1.5)."
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": il nome dell'attributo non è valido - la lunghezza non è valida %d "
+"(RFC 2911 sezione 4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": il nome dell'attributo non è valido - il carattere non è valido (RFC "
+"2911 sezione 4.1.3)."
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr "\"%s\": il valore booleano non è valido %d (RFC 2911 sezione 4.1.11)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": il valore del set dei caratteri non è valido \"%s\" - i caratteri "
+"non sono validi (RFC 2911 sezione 4.1.7)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": il valore del set dei caratteri non è valido \"%s\" - la lunghezza "
+"non è valida %d (RFC 2911 sezione 4.1.7)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime UTC non è valido ore %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime UTC non è valido minuti %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+"\"%s\": dateTime UTC non è valido segno '%c' (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime non è valido giorno %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+"\"%s\": dateTime non è valido decimi di secondi %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime non è valido ore %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime non è valido minuti %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime non è valido mese %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime non è valido secondi %u (RFC 2911 sezione 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr ""
+"\"%s\": il valore enum non è valido %d - fuori intervallo (RFC 2911 sezione "
+"4.1.4)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": il valore della parola chiave non è valido \"%s\" - la lunghezza non "
+"è valida %d (RFC 2911 sezione 4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+"\"%s\": il valore della parola chiave non è valido \"%s\" - il carattere non "
+"è valido (RFC 2911 sezione 4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": il valore di mimeMediaType non è valido \"%s\" - i caratteri non "
+"sono validi (RFC 2911 sezione 4.1.9)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": il valore di mimeMediaType non è valido \"%s\" - la lunghezza non è "
+"valida %d (RFC 2911 sezione 4.1.9)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": il valore del nome non è valido \"%s\" - la sequenza UTF-8 non è "
+"valida (RFC 2911 sezione 4.1.2)."
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": il valore del nome non è valido \"%s\" - la lunghezza non è valida "
+"%d (RFC 2911 sezione 4.1.2)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": il valore di naturalLanguage non è valido \"%s\" - i caratteri non "
+"sono validi (RFC 2911 sezione 4.1.8)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": il valore di naturalLanguage non è valido \"%s\" - la lunghezza non "
+"è valida %d (RFC 2911 sezione 4.1.8)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+"\"%s\": il valore di octetString non è valido - la lunghezza non è valida %d "
+"(RFC 2911 sezione 4.1.10)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+"\"%s\": il valore di rangeOfInteger non è valido %d-%d - il più piccolo è "
+"superiore al più grande (RFC 2911 sezione 4.1.13)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+"\"%s\": il valore di resolution non è valido %dx%d%s - il valore dell'unità "
+"non è valida (RFC 2911 sezione 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+"\"%s\": il valore della risoluzione non è valido %dx%d%s - la risoluzione "
+"del feed deve essere positiva (RFC 2911 sezione 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+"\"%s\": il valore della risoluzione non è valido %dx%d%s - la risoluzione "
+"del feed deve essere positiva (RFC 2911 sezione 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": il valore del testo non è valido \"%s\" - la sequenza UTF-8 non è "
+"valida (RFC 2911 sezione 4.1.1)."
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": il valore del testo non è valido \"%s\" - la lunghezza non è valida "
+"%d (RFC 2911 sezione 4.1.1)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": il valore di uriScheme non è valido \"%s\" - i caratteri non sono "
+"validi (RFC 2911 sezione 4.1.6)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": il valore di uriScheme non è valido \"%s\" - la lunghezza non è "
+"valida %d (RFC 2911 sezione 4.1.6)."
+
+#, 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 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 - 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 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 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 "-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 "-20"
+msgstr "-20"
+
+msgid "-25"
+msgstr "-25"
+
+msgid "-3"
+msgstr "-3"
+
+msgid "-30"
+msgstr "-30"
+
+msgid "-35"
+msgstr "-35"
+
+msgid "-4"
+msgstr "-4"
+
+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 "-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 "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."
+
+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"
+
+#, 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 "Add RSS Subscription"
+msgstr "Aggiungere l'abbonamento RSS"
+
+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 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 'document-format' value \"%s\"."
+msgstr "Il valore di 'document-format' non è valido \"%s\"."
+
+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 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 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 number-up value %d."
+msgstr "Il valore di number-up %d non è valido."
+
+#, c-format
+msgid "Bad option + choice on line %d."
+msgstr "L'opzione + scelta alla riga %d non è valida."
+
+#, 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 subscription ID"
+msgstr "L'ID della sottoscrizione non è valido"
+
+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"
+
+#, 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 "Cancel RSS Subscription"
+msgstr "Eliminare l'abbonamento RSS"
+
+msgid "Canceling print job."
+msgstr "Eliminazione del processo di stampa in corso."
+
+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 "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 "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."
+
+#, 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 "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 "Empty PPD file."
+msgstr "Il file PPD è vuoto."
+
+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 "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 "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 "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 "Export Printers to Samba"
+msgstr "Esporta le stampanti per Samba"
+
+msgid "Expressions:"
+msgstr "Espressioni:"
+
+msgid "FAIL"
+msgstr "OPERAZIONE NON RIUSCITA CORRETTAMENTE"
+
+msgid "FanFold German"
+msgstr "FanFold German"
+
+msgid "FanFold Legal German"
+msgstr "FanFold Legal German"
+
+msgid "Fanfold US"
+msgstr "FanFold US"
+
+#, 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 "Directory del file"
+
+#, 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 "Folio"
+msgstr "Foglio"
+
+msgid "Forbidden"
+msgstr "Vietato"
+
+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 "Help file not in index."
+msgstr "Il file di aiuto non è nell'indice."
+
+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 "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 media name arguments."
+msgstr "Gli argomenti del nome del supporto non sono validi."
+
+msgid "Invalid media size."
+msgstr "La dimensione del supporto non è valida."
+
+#, 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 "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"
+
+msgid "Load paper."
+msgstr ""
+
+msgid "Long-Edge (Portrait)"
+msgstr "Long-Edge (Portrait)"
+
+msgid "Looking for printer..."
+msgstr ""
+
+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 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."
+
+#, c-format
+msgid "Missing double quote on line %d."
+msgstr "Mancano le virgolette alla riga %d."
+
+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."
+
+msgid "Missing required attributes."
+msgstr "Mancano gli attributi richiesti."
+
+msgid "Missing resource in URI"
+msgstr ""
+
+msgid "Missing scheme in URI"
+msgstr ""
+
+#, c-format
+msgid "Missing value on line %d."
+msgstr "Manca il valore alla riga %d."
+
+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 "No"
+msgstr "No"
+
+msgid "No Content"
+msgstr "Nessun contenuto"
+
+msgid "No PPD name"
+msgstr "Nessun nome del PPD"
+
+msgid "No VarBind SEQUENCE"
+msgstr "Nessuna SEQUENZA di VarBind"
+
+msgid "No Windows printer drivers are installed."
+msgstr "Non è stato installato nessun driver della stampante di Windows."
+
+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 community name"
+msgstr "Nessun nome della comunità"
+
+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 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 "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 ""
+"Note: this program only validates the DSC comments, not the PostScript "
+"itself."
+msgstr ""
+"Nota: questo programma convalida solo i commenti DSC, non il PostScript "
+"stesso."
+
+msgid "OK"
+msgstr "OK"
+
+msgid "Off (1-Sided)"
+msgstr "Off (1-Sided)"
+
+msgid "Oki"
+msgstr "Oki"
+
+msgid "Online Help"
+msgstr "Guida in linea"
+
+#, 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 "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 "Output bin is almost full."
+msgstr ""
+
+msgid "Output bin is full."
+msgstr ""
+
+msgid "Output bin is missing."
+msgstr ""
+
+msgid "PASS"
+msgstr "OPERAZIONE RIUSCITA CON SUCCESSO"
+
+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 "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 "Paper jam."
+msgstr ""
+
+msgid "Paper tray is almost empty."
+msgstr ""
+
+msgid "Paper tray is empty."
+msgstr ""
+
+msgid "Paper tray is missing."
+msgstr ""
+
+msgid "ParamCustominCutInterval"
+msgstr "ParamCustominCutInterval"
+
+msgid "ParamCustominTearInterval"
+msgstr "ParamCustominTearInterval"
+
+#, c-format
+msgid "Password for %s on %s? "
+msgstr "Password di %s su %s? "
+
+#, c-format
+msgid "Password for %s required to access %s via SAMBA: "
+msgstr "La password di %s richiesta per accedere a %s tramite SAMBA:"
+
+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 "Cartolina doppia "
+
+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 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."
+
+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:"
+msgstr "Stampante:"
+
+msgid "Printers"
+msgstr "Stampanti"
+
+#, c-format
+msgid "Printing page %d, %u%% complete."
+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"
+
+#, c-format
+msgid "Running command: %s %s -N -A %s -c '%s'"
+msgstr "Avvio in corso del comando: %s %s -N -A %s -c '%s'"
+
+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 "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"
+
+#. 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 developer unit needs to be replaced."
+msgstr "L'unità di sviluppo deve essere sostituita."
+
+msgid "The developer unit will need to be replaced soon."
+msgstr "L'unità di sviluppo dovrà essere sostituita a breve."
+
+msgid "The fuser's temperature is high."
+msgstr "La temperatura di fusione è alta."
+
+msgid "The fuser's temperature is low."
+msgstr "La temperatura di fusione è bassa."
+
+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 optical photoconductor needs to be replaced."
+msgstr "Il fotoconduttore ottico deve essere sostituito."
+
+msgid "The optical photoconductor will need to be replaced soon."
+msgstr "Il fotoconduttore ottico dovrà essere sostituito a breve."
+
+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 low on ink."
+msgstr ""
+
+msgid "The printer is low on toner."
+msgstr ""
+
+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 be out of ink."
+msgstr "L'inchiostro della stampante potrebbe essere esaurito."
+
+msgid "The printer may be out of toner."
+msgstr "Il toner della stampante potrebbe essere esaurito."
+
+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 (/), or the pound sign (#)."
+msgstr ""
+"Il nome della stampante può contenere solo un massimo di 127 caratteri "
+"stampabili e non può contenere spazi, barre (/) oppure il simbolo del "
+"cancelletto (#)."
+
+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."
+
+msgid "The printer's cover is open."
+msgstr "Il coperchio della stampante è aperto."
+
+msgid "The printer's door is open."
+msgstr "La porta della stampante è aperta."
+
+msgid "The printer's interlock is open."
+msgstr "Il blocco della stampante è aperto."
+
+msgid "The printer's waste bin is almost full."
+msgstr "Il cestino della stampante è quasi pieno."
+
+msgid "The printer's waste bin is full."
+msgstr "Il cestino della stampante è pieno."
+
+#, 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 subscription name may not contain spaces, slashes (/), question marks "
+"(?), or the pound sign (#)."
+msgstr ""
+"Il nome della sottoscrizione non può contenere spazi, barre (/), punti "
+"interrogativi (?) o cancelletto (#)."
+
+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 "URI Too Long"
+msgstr "L'URI è troppo lungo"
+
+msgid "URI too large"
+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 RSS subscription"
+msgstr "Non è possibile aggiungere l'abbonamento RSS"
+
+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 cancel RSS subscription"
+msgstr "Non è possibile eliminare l'abbonamento RSS"
+
+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 64-bit CUPS printer driver files (%d)."
+msgstr ""
+"Non è possibile copiare i driver della stampante di CUPS a 64-bit (%d)."
+
+#, c-format
+msgid "Unable to copy 64-bit Windows printer driver files (%d)."
+msgstr ""
+"Non è possibile copiare i driver della stampante di Windows a 64-bit (%d)."
+
+#, c-format
+msgid "Unable to copy CUPS printer driver files (%d)."
+msgstr "Non è possibile copiare i driver della stampante di CUPS (%d)."
+
+#, 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."
+
+#, c-format
+msgid "Unable to copy Windows 2000 printer driver files (%d)."
+msgstr "Non è possibile copiare i driver di Windows 2000 della stampante (%d)."
+
+#, c-format
+msgid "Unable to copy Windows 9x printer driver files (%d)."
+msgstr "Non è possibile copiare i driver di Windows 9x della stampante (%d)."
+
+#, c-format
+msgid "Unable to copy interface script - %s"
+msgstr "Non è possibile copiare lo script dell'interfaccia - %s"
+
+msgid "Unable to create printer-uri"
+msgstr "Non è possibile creare il printer-uri"
+
+msgid "Unable to create server credentials."
+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"
+
+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."
+
+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"
+
+#, c-format
+msgid "Unable to install Windows 2000 printer driver files (%d)."
+msgstr ""
+"Non è possibile installare i driver di Windows 2000 della stampante (%d)."
+
+#, c-format
+msgid "Unable to install Windows 9x printer driver files (%d)."
+msgstr ""
+"Non è possibile installare i driver di Windows 9x della stampante (%d)."
+
+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."
+
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
+msgstr ""
+
+#, c-format
+msgid "Unable to run \"%s\": %s"
+msgstr "Non è possibile avviare \"%s\": %s"
+
+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."
+
+#, c-format
+msgid "Unable to set Windows printer driver (%d)."
+msgstr "Non è possibile impostare i driver di Windows della stampante (%d)."
+
+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 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 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-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"
+
+msgid ""
+"Usage:\n"
+"\n"
+"    lpadmin [-h server] -d destination\n"
+"    lpadmin [-h server] -x destination\n"
+"    lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n"
+"                       [-r remove-class] [-v device] [-D description]\n"
+"                       [-P ppd-file] [-o name=value]\n"
+"                       [-u allow:user,user] [-u deny:user,user]"
+msgstr ""
+"Uso:\n"
+"\n"
+"    lpadmin [-h server] -d destinazione\n"
+"    lpadmin [-h server] -x destinazione\n"
+"    lpadmin [-h server] -p stampante [-c add-class] [-i interfaccia] [-m "
+"modello]\n"
+"                       [-r remove-class] [-v dispositivo] [-D descrizione]\n"
+"                       [-P ppd-file] [-o nome=valore]\n"
+"                       [-u allow:utente,utente] [-u deny:utente,utente]"
+
+#, c-format
+msgid "Usage: %s job-id user title copies options [file]"
+msgstr "Uso: %s job-id utente titolo copie opzioni [file]"
+
+msgid "Usage: cupsaddsmb [options] printer1 ... printerN"
+msgstr "Uso: cupsaddsmb [opzioni] stampante1 ... stampanteN"
+
+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: cupstestdsc [options] filename.ps [... filename.ps]"
+msgstr "Uso: cupstestdsc [opzioni] file.ps [... file.ps]"
+
+msgid ""
+"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
+msgstr "Uso: cupstestppd [opzioni] file1.ppd[.gz] [... fileN.ppd[.gz]]"
+
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+"       ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+"Uso: ippdiscover [opzioni] -a\n"
+"     ippdiscover [opzioni] \"nome del servizio\"\n"
+"\n"
+"Opzioni:"
+
+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: lpmove job/src dest"
+msgstr "Uso: lpmove job/src dest"
+
+msgid ""
+"Usage: lpoptions [-h server] [-E] -d printer\n"
+"       lpoptions [-h server] [-E] [-p printer] -l\n"
+"       lpoptions [-h server] [-E] -p printer -o option[=value] ...\n"
+"       lpoptions [-h server] [-E] -x printer"
+msgstr ""
+"Uso: lpoptions [-h server] [-E] -d stampante\n"
+"     lpoptions [-h server] [-E] [-p stampante] -l\n"
+"     lpoptions [-h server] [-E] -p stampante -o opzione[=valore] ...\n"
+"     lpoptions [-h server] [-E] -x stampante"
+
+msgid ""
+"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
+msgstr ""
+"Uso: lpq [-P dest] [-U username] [-h hostname[:porta]] [-l] [+intervallo]"
+
+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]"
+
+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, no Windows 2000 printer drivers are installed."
+msgstr ""
+"Attenzione, nessun driver di Windows 2000 della stampante è stato installato."
+
+msgid "Web Interface is Disabled"
+msgstr "L'interfaccia web è stata disabilitata"
+
+msgid "Yes"
+msgstr "Sì"
+
+#, c-format
+msgid ""
+"You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://"
+"%s:%d%s</A>."
+msgstr ""
+"Bisogna accedere a questa pagina, usando l'URL <A HREF=\"https://%s:%d%s"
+"\">https://%s:%d%s</A>."
+
+msgid "ZPL Label Printer"
+msgstr "ZPL Label Printer"
+
+msgid "Zebra"
+msgstr "Zebra"
+
+msgid "aborted"
+msgstr "interrotto"
+
+msgid "canceled"
+msgstr "eliminato"
+
+msgid "completed"
+msgstr "completato"
+
+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 "cupsaddsmb: No PPD file for printer \"%s\" - %s"
+msgstr "cupsaddsmb: nessun file PPD per la stampante \"%s\" - %s"
+
+msgid "cupsctl: Cannot set Listen or Port directly."
+msgstr "cupsctl: non è possibile impostare direttamente Listen o Port."
+
+#, 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."
+
+#, 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"
+
+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 "held"
+msgstr "svolto"
+
+msgid "help\t\tGet help on commands."
+msgstr "help\t\tOttenere un aiuto per i comandi."
+
+msgid "idle"
+msgstr "inattiva"
+
+#, 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."
+
+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 \"-P\" and \"-X\"."
+msgstr ""
+
+#, c-format
+msgid "ipptool: Bad URI - %s."
+msgstr "ipptool: l'URI non è valido - %s."
+
+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 \"-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."
+
+#, c-format
+msgid "ipptool: Unknown option \"-%c\"."
+msgstr "ipptool: opzione sconosciuta \"-%c\"."
+
+msgid "job-printer-uri attribute missing."
+msgstr "manca l'attributo di job-printer-uri."
+
+msgid "lpadmin: Class name can only contain printable characters."
+msgstr "lpadmin: il nome della classe può contenere solo caratteri stampabili."
+
+msgid "lpadmin: Expected PPD after \"-P\" option."
+msgstr "lpadmin: è previsto PPD dopo l'opzione \"-P\"."
+
+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 interface after \"-i\" option."
+msgstr "lpadmin: è prevista l'interfaccia dopo l'opzione \"-i\"."
+
+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 name can only contain printable characters."
+msgstr ""
+"lpadmin: il nome della stampante può contenere solo caratteri stampabili."
+
+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 on line %d."
+msgstr ""
+
+#, c-format
+msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
+msgstr "lpadmin: non è possibile aprile il file PPD \"%s\" - %s"
+
+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: 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 "lpinfo: Unknown argument \"%s\"."
+msgstr "lpinfo: argomento sconosciuto \"%s\"."
+
+#, c-format
+msgid "lpinfo: Unknown option \"%c\"."
+msgstr "lpinfo: opzione sconosciuta \"%c\"."
+
+#, c-format
+msgid "lpinfo: Unknown option \"%s\"."
+msgstr "lpinfo: opzione sconosciuta \"%s\"."
+
+#, 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\"."
+
+#, c-format
+msgid "lpmove: Unknown option \"%c\"."
+msgstr "lpmove: opzione sconosciuta \"%c\"."
+
+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."
+
+#, c-format
+msgid "members of class %s:"
+msgstr "membri della classe %s:"
+
+msgid "no entries"
+msgstr "nessuna voce"
+
+msgid "no system default destination"
+msgstr "nessuna destinazione predefinita di sistema"
+
+msgid "notify-events not specified."
+msgstr "notify-events non è stato specificato."
+
+#, 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."
+
+msgid "pending"
+msgstr "in attesa"
+
+#, 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"
+
+#, c-format
+msgid "printer %s disabled since %s -"
+msgstr "la stampante %s è stata disabilitata da %s"
+
+#, 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"
+
+msgid "processing"
+msgstr "elaborazione in corso"
+
+#, 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"
+
+msgid "scheduler is not running"
+msgstr "lo scheduler non è in funzione"
+
+msgid "scheduler is running"
+msgstr "lo scheduler è in funzione"
+
+#, 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."
+
+msgid "stopped"
+msgstr "fermato"
+
+#, 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"
+
+msgid "unknown"
+msgstr "sconosciuto"
+
+msgid "untitled"
+msgstr "senza titolo"
+
+msgid "variable-bindings uses indefinite length"
+msgstr "variable-bindings utilizza una lunghezza indefinita"
+
+#~ msgid "  -l                      Run cupsd from launchd(8)."
+#~ msgstr "  -l                      Avvia cupsd da launchd(8)."
+
+#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f byte"
+
+#~ msgid "720dpi"
+#~ msgstr "720dpi"
+
+#~ msgid "Bad printer URI."
+#~ msgstr "L'URI della stampante non è valido."
+
+#~ msgid "Enter old password:"
+#~ msgstr "Digitare la vecchia password:"
+
+#~ msgid "Enter password again:"
+#~ msgstr "Digitare di nuovo la password:"
+
+#~ msgid "Enter password:"
+#~ msgstr "Digitare la password:"
+
+#~ msgid "Looking for printer."
+#~ msgstr "Cerca una stampante."
+
+#~ msgid "New Stylus Color Series"
+#~ msgstr "Nuova Stylus Color Series"
+
+#~ msgid "New Stylus Photo Series"
+#~ msgstr "Nuova Stylus Photo Series"
+
+#~ msgid "Output for printer %s is sent to %s"
+#~ msgstr "L'output della stampante %s è stato inviato a %s"
+
+#~ msgid "Output for printer %s is sent to remote printer %s on %s"
+#~ msgstr ""
+#~ "L'output della stampante %s è stato inviato alla stampante remota %s su %s"
+
+#~ msgid "Output for printer %s/%s is sent to %s"
+#~ msgstr "L'output della stampante %s/%s è stato inviato a %s"
+
+#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+#~ msgstr ""
+#~ "L'output della stampante %s/%s è stato inviato alla stampante remota %s "
+#~ "su %s"
+
+#~ msgid "Printing page %d, %d%% complete."
+#~ msgstr "Stampa della pagina %d, %d%% completato."
+
+#~ msgid "Purge Jobs"
+#~ msgstr "Elimina le stampe"
+
+#~ msgid ""
+#~ "Rank   Owner      Pri  Job        Files                       Total Size"
+#~ msgstr ""
+#~ "Rank   Owner      Pri  Job        Files                       Total Size"
+
+#~ msgid "Stylus Color Series"
+#~ msgstr "Stylus Color Series"
+
+#~ msgid "Stylus Photo Series"
+#~ msgstr "Stylus Photo Series"
+
+#~ msgid ""
+#~ "The '%s' Job Description attribute cannot be supplied in a job creation "
+#~ "request."
+#~ msgstr ""
+#~ "L'attributo della descrizione del processo '%s' non può essere fornito "
+#~ "nella richiesta di creazione di un processo."
+
+#~ msgid "The output bin is almost full."
+#~ msgstr "Il raccoglitore di uscita è quasi pieno."
+
+#~ msgid "The output bin is full."
+#~ msgstr "Il raccoglitore di uscita è pieno."
+
+#~ msgid "The output bin is missing."
+#~ msgstr "Manca il raccoglitore di uscita."
+
+#~ msgid "The paper tray is almost empty."
+#~ msgstr "Il vassoio della carta è quasi vuoto."
+
+#~ msgid "The paper tray is empty."
+#~ msgstr "Il vassoio della carta è vuoto."
+
+#~ msgid "The paper tray is missing."
+#~ msgstr "Manca il vassoio della carta."
+
+#~ msgid "The paper tray needs to be filled."
+#~ msgstr "Il vassoio della carta deve essere riempito."
+
+#~ msgid "The printer is running low on ink."
+#~ msgstr "L'inchiostro della stampante sta per esaurirsi."
+
+#~ msgid "The printer is running low on toner."
+#~ msgstr "Il toner della stampante sta per esaurirsi."
+
+#~ msgid "There is a paper jam."
+#~ msgstr "Vi è un inceppamento della carta."
+
+#~ msgid "Unable to resolve printer URI."
+#~ msgstr "Non è possibile risolvere l'URI della stampante."
+
+#~ msgid "Usage: cupsfilter [ options ] filename"
+#~ msgstr "Uso: cupsfilter [ opzioni ] file"
+
+#~ msgid "Usage: lppasswd [-g groupname]"
+#~ msgstr "Uso: lppasswd [-g groupname]"
+
+#~ msgid ""
+#~ "Usage: lppasswd [-g groupname] [username]\n"
+#~ "       lppasswd [-g groupname] -a [username]\n"
+#~ "       lppasswd [-g groupname] -x [username]"
+#~ msgstr ""
+#~ "Uso: lppasswd [-g groupname] [username]\n"
+#~ "     lppasswd [-g groupname] -a [username]\n"
+#~ "     lppasswd [-g groupname] -x [username]"
+
+#~ msgid ""
+#~ "Your password must be at least 6 characters long, cannot contain your "
+#~ "username, and must contain at least one letter and number."
+#~ msgstr ""
+#~ "La password deve contenere almeno 6 caratteri, non può contenere "
+#~ "l'username e deve contenere almeno una lettera ed un numero."
+
+#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
+#~ msgstr ""
+#~ "cupsd: launchd(8) non supporta i compilati, quando è in modalità normale."
+
+#~ msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
+#~ msgstr "ipptool: \"-i\" e \"-n\" sono incompatibili con -X\"."
+
+#~ msgid "lppasswd: Only root can add or delete passwords."
+#~ msgstr "lppasswd: solo root può aggiungere o eliminare le password."
+
+#~ msgid "lppasswd: Password file busy."
+#~ msgstr "lppasswd: il file delle password è già in uso."
+
+#~ msgid "lppasswd: Password file not updated."
+#~ msgstr "lppasswd: il file delle password non è aggiornato."
+
+#~ msgid "lppasswd: Sorry, password doesn't match."
+#~ msgstr "lppasswd: spiacenti, la password non è esatta."
+
+#~ msgid "lppasswd: Sorry, password rejected."
+#~ msgstr "lppasswd: spiacenti, la password è stata rifiutata."
+
+#~ msgid "lppasswd: Sorry, passwords don't match."
+#~ msgstr "lppasswd: spiacenti, le password non sono esatte."
+
+#~ msgid "lppasswd: Unable to copy password string: %s"
+#~ msgstr "lppasswd: non è possibile copiare la stringa della password: %s"
+
+#~ msgid "lppasswd: Unable to open password file: %s"
+#~ msgstr "lppasswd: non è possibile aprire il file delle password: %s"
+
+#~ msgid "lppasswd: Unable to write to password file: %s"
+#~ msgstr ""
+#~ "lppasswd: non è possibile scrivere all'interno del file delle password: %s"
+
+#~ msgid "lppasswd: failed to backup old password file: %s"
+#~ msgstr ""
+#~ "lppasswd: non è possibile eseguire il backup del vecchio file delle "
+#~ "password: %s"
+
+#~ msgid "lppasswd: failed to rename password file: %s"
+#~ msgstr "lppasswd: non è possibile rinominare il file delle password: %s"
+
+#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
+#~ msgstr "lppasswd: l'utente \"%s\" ed il gruppo \"%s\" non esistono."
index 9f6cef4..39bd735 100644 (file)
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: CUPS 1.6\n"
+"Project-Id-Version: CUPS 2.0\n"
 "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2013-07-08 07:38-0400\n"
-"PO-Revision-Date: 2012-06-13 01:20+0900\n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
+"PO-Revision-Date: 2014-11-15 19:27+0900\n"
 "Last-Translator: OPFC TRANSCUPS <opfc-transcups@sourceforge.jp>\n"
 "Language-Team: OPFC TRANSCUPS <opfc-transcups@sourceforge.jp>\n"
 "Language: ja\n"
@@ -401,7 +401,7 @@ msgstr "      %s  不正な値が cupsFilter2 に設定されています。 \"%
 
 #, c-format
 msgid "      %s  Bad cupsICCProfile %s."
-msgstr "      %s  不正な cupsICCProfile %sです。"
+msgstr "      %s  不正な cupsICCProfile %s です。"
 
 #, c-format
 msgid "      %s  Bad cupsPreFilter value \"%s\"."
@@ -409,11 +409,11 @@ msgstr "      %s  不正な値が cupsPreFilter に設定されています。 \
 
 #, c-format
 msgid "      %s  Bad cupsUIConstraints %s: \"%s\""
-msgstr "      %s  不正な cupsUIConstraints %s: \"%s\"です。"
+msgstr "      %s  不正な cupsUIConstraints %s: \"%s\" です。"
 
 #, c-format
 msgid "      %s  Bad language \"%s\"."
-msgstr "      %s  無効な言語 \"%s\"です。"
+msgstr "      %s  無効な言語 \"%s\" です。"
 
 #, c-format
 msgid "      %s  Bad permissions on %s file \"%s\"."
@@ -433,7 +433,7 @@ msgstr "      %s  デフォルトの選択肢が競合しています。"
 
 #, c-format
 msgid "      %s  Empty cupsUIConstraints %s"
-msgstr "      %s 空の cupsUIConstraints %sです。"
+msgstr "      %s 空の cupsUIConstraints %s です。"
 
 #, c-format
 msgid "      %s  Missing \"%s\" translation string for option %s, choice %s."
@@ -930,6 +930,12 @@ msgstr "    警告: ファイルに %%EndComments コメントがありません
 msgid "    Warning: obsolete DSC version %.1f in file."
 msgstr "    警告: ファイルは時代遅れの DSC バージョン %.1f です。"
 
+msgid "  ! expression            Unary NOT of expression."
+msgstr "! <式>                  式を否定する単項演算子。"
+
+msgid "  ( expressions )         Group expressions."
+msgstr "  ( <複数の式> )          グループ化された複数の式。"
+
 msgid "  --[no-]debug-logging    Turn debug logging on/off."
 msgstr "  --[no-]debug-logging    デバッグログの有効/無効を切り替える。"
 
@@ -953,9 +959,92 @@ msgstr "  --cr                    行末を CR とする (Mac OS 9)。"
 msgid "  --crlf                  End lines with CR + LF (Windows)."
 msgstr "  --crlf                  行末を CR + LF とする (Windows)。"
 
+msgid "  --domain regex          Match domain to regular expression."
+msgstr "  --domain <正規表現>     ドメインが正規表現にマッチするか。"
+
+msgid ""
+"  --exec utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+"  --exec <実行ファイル名> [引数 ...] ;\n"
+"                          成功した場合、<実行ファイル名>を実行する。"
+
+msgid "  --false                 Always false."
+msgstr "  --false                 常に失敗。"
+
+msgid "  --help                  Show help."
+msgstr "  --help                  ヘルプを表示する。"
+
+msgid "  --help                  Show this help."
+msgstr "  --help                  このヘルプを表示する。"
+
+msgid "  --host regex            Match hostname to regular expression."
+msgstr "  --host <正規表現>       ホスト名が正規表現にマッチするか。"
+
 msgid "  --lf                    End lines with LF (UNIX/Linux/OS X)."
 msgstr "  --lf                    行末を LF とする (UNIX/Linux/OS X)。"
 
+msgid "  --list-filters          List filters that will be used."
+msgstr "  --list-filters          使用されるフィルターのリストを表示する。"
+
+msgid "  --local                 True if service is local."
+msgstr "  --local                 サービスがローカルなら真。"
+
+msgid "  --ls                    List attributes."
+msgstr "  --ls                    属性の一覧を表示する。"
+
+msgid "  --name regex            Match service name to regular expression."
+msgstr "  --name <正規表現>       サービス名が正規表現とマッチするか。"
+
+msgid "  --not expression        Unary NOT of expression."
+msgstr "  --not <式>              式を否定する単項演算子。"
+
+msgid "  --path regex            Match resource path to regular expression."
+msgstr "  --path <正規表現>       リソースのパスが正規表現とマッチするか。"
+
+msgid "  --port number[-number]  Match port to number or range."
+msgstr ""
+"  --port 番号[-番号]      ポートが指定された番号または範囲とマッチするか。"
+
+msgid "  --print                 Print URI if true."
+msgstr "  --print                 結果が真なら URI を表示する。"
+
+msgid "  --print-name            Print service name if true."
+msgstr "  --print-name            結果が真ならサービス名を表示する。"
+
+msgid "  --quiet                 Quietly report match via exit code."
+msgstr ""
+"  --quiet                 マッチ結果を終了コードで報告し、出力をしない。"
+
+msgid "  --remote                True if service is remote."
+msgstr "  --remote                サービスがリモートなら真。"
+
+msgid ""
+"  --stop-after-include-error\n"
+"                          Stop tests after a failed INCLUDE."
+msgstr ""
+"  --stop-after-include-error\n"
+"                          INCLUDE が失敗したときテストを停止する。"
+
+msgid "  --true                  Always true."
+msgstr "  --true                  常に真。"
+
+msgid "  --txt key               True if the TXT record contains the key."
+msgstr "  --txt <キー名>          TXT レコードがキー名を含んでいたら真。"
+
+msgid "  --txt-* regex           Match TXT record key to regular expression."
+msgstr ""
+"  --txt-* <正規表現>      TXT レコードのキーが正規表現とマッチしたら真。"
+
+msgid "  --uri regex             Match URI to regular expression."
+msgstr "  --uri <正規表現>        URI が正規表現とマッチするか。"
+
+msgid "  --version               Show program version."
+msgstr "  --version               プログラムのバージョンを表示。"
+
+msgid "  --version               Show version."
+msgstr "  --version               バージョンを表示する。"
+
 msgid "  -4                      Connect using IPv4."
 msgstr "  -4                      IPv4 で接続する。"
 
@@ -1002,15 +1091,29 @@ msgstr "  -I {filename,filters,none,profiles}"
 msgid "  -L                      Send requests using content-length."
 msgstr "  -L                      content-length を用いてリクエストを送る。"
 
+msgid ""
+"  -P filename.plist       Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+"  -P filename.plist       XML の plist 形式で書き出しテストリポートを標準出力"
+"にする。"
+
 msgid "  -P filename.ppd         Set PPD file."
 msgstr "  -P filename.ppd         PPD ファイルを指定する。"
 
+msgid "  -P number[-number]      Match port to number or range."
+msgstr ""
+"  -P 番号[-番号]          ポートが指定された番号または範囲とマッチするか。"
+
 msgid "  -R root-directory       Set alternate root."
 msgstr "  -R root-directory       別のルートディレクトリーを指定する。"
 
 msgid "  -S                      Test with SSL encryption."
 msgstr "  -S                      SSL 暗号化でテストする。"
 
+msgid "  -T seconds              Set the browse timeout in seconds."
+msgstr "  -T <秒>                 ブラウズのタイムアウトを秒で指定する。"
+
 msgid "  -T seconds              Set the receive/send timeout in seconds."
 msgstr "  -T seconds              受信/送信タイムアウトを秒で指定する。"
 
@@ -1030,15 +1133,27 @@ msgstr ""
 msgid "  -X                      Produce XML plist instead of plain text."
 msgstr "  -X                      プレーンテキストの代わりに XML を用いる。"
 
+msgid "  -a                      Browse for all services."
+msgstr "  -a                      すべてのサービスをブラウズする。"
+
 msgid "  -a                      Export all printers."
 msgstr "  -a                      すべてのプリンターをエクスポートする。"
 
+msgid "  -c                      Produce CSV output."
+msgstr "  -c                      CSV 出力を行う。"
+
 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 "  -c cupsd.conf           Set cupsd.conf file to use."
 msgstr "  -c cupsd.conf           使用する cupsd.conf ファイルを指定する。"
 
+msgid "  -d domain               Browse/resolve in specified domain."
+msgstr "  -d <ドメイン名>         指定されたドメインでブラウズ/名前解決する。"
+
 msgid "  -d name=value           Set named variable to value."
 msgstr ""
 "  -d name=value           name で指定された変数に値 value をセットする。"
@@ -1049,6 +1164,9 @@ msgstr "  -d output-dir           出力先ディレクトリーを指定する
 msgid "  -d printer              Use the named printer."
 msgstr "  -d printer              指定されたプリンターを利用する。"
 
+msgid "  -d regex                Match domain to regular expression."
+msgstr "  -d <正規表現>           ドメインが正規表現にマッチするか。"
+
 msgid "  -e                      Use every filter from the PPD file."
 msgstr ""
 "  -e                      PPD ファイルからすべてのフィルターを使用する。"
@@ -1062,6 +1180,9 @@ msgstr "  -f filename             デフォルトのリクエストファイル
 msgid "  -h                      Show this usage message."
 msgstr "  -h                      このヘルプメッセージを表示する。"
 
+msgid "  -h regex                Match hostname to regular expression."
+msgstr "  -h <正規表現>           ホスト名が正規表現にマッチするか。"
+
 msgid "  -h server[:port]        Specify server address."
 msgstr "  -h server[:port]        サーバーアドレスを指定する。"
 
@@ -1082,8 +1203,14 @@ msgstr ""
 "  -j job-id[,N]           フィルターファイル N を指定されたジョブから使用す"
 "る (デフォルトは ファイル 1)。"
 
-msgid "  -l                      Run cupsd from launchd(8)."
-msgstr "  -l                      launchd(8) から cupsd を実行する。"
+msgid "  -l                      List attributes."
+msgstr "  -l                      属性の一覧を表示する。"
+
+msgid "  -l                      Produce plain text output."
+msgstr "  -l                      プレーンテキスト出力を行う。"
+
+msgid "  -l                      Run cupsd on demand."
+msgstr "  -l                      cupsd をオンデマンドで実行する。"
 
 msgid "  -l lang[,lang,...]      Specify the output language(s) (locale)."
 msgstr "  -l lang[,lang,...]      出力言語を指定する。(複数可能)"
@@ -1104,6 +1231,9 @@ msgid ""
 "  -n count                Repeat the last file the given number of times."
 msgstr "  -n count                最後のファイルを与えられた回数だけ繰り返す。"
 
+msgid "  -n regex                Match service name to regular expression."
+msgstr "  -n <正規表現>           サービス名が正規表現とマッチするか。"
+
 msgid ""
 "  -o filename.drv         Set driver information file (otherwise ppdi.drv)."
 msgstr ""
@@ -1117,15 +1247,33 @@ msgstr ""
 msgid "  -o name=value           Set option(s)."
 msgstr "  -o name=value           オプションを指定する。"
 
+msgid "  -p                      Print URI if true."
+msgstr "  -p                      結果が真なら URI を表示する。"
+
 msgid "  -p filename.ppd         Set PPD file."
 msgstr "  -p filename.ppd         PPD ファイルを指定する。"
 
+msgid "  -p program              Run specified program for each service."
+msgstr ""
+"  -p <プログラム名>       指定されたプログラムをそれぞれのサービスに対し実行"
+"する。"
+
+msgid "  -q                      Quietly report match via exit code."
+msgstr ""
+"  -q                      マッチ結果を終了コードで報告し、出力をしない。"
+
 msgid "  -q                      Run silently."
 msgstr "  -q                      詳細は表示しない。"
 
+msgid "  -r                      True if service is remote."
+msgstr "  -r                      サービスがリモートなら真。"
+
 msgid "  -r                      Use 'relaxed' open mode."
 msgstr "  -r                      寛容モードを用いる。"
 
+msgid "  -s                      Print service name if true."
+msgstr "  -s                      結果が真ならサービス名を表示する。"
+
 msgid "  -t                      Produce a test report."
 msgstr "  -t                      テストリポートを出力する。"
 
@@ -1135,21 +1283,105 @@ msgstr "  -t                      PPD を出力しないでテストする。"
 msgid "  -t                      Test the configuration file."
 msgstr "  -t                      設定ファイルをテストする。"
 
+msgid "  -t key                  True if the TXT record contains the key."
+msgstr "  -t <キー名>             TXT レコードがキー名を含んでいたら真。"
+
 msgid "  -t title                Set title."
 msgstr "  -t title                タイトルを指定する。"
 
+msgid "  -t type                 Browse/resolve with specified type."
+msgstr "  -t タイプ               指定されたタイプでブラウズ/名前解決する。"
+
 msgid "  -u                      Remove the PPD file when finished."
 msgstr "  -u                      終了したときに PPD ファイルを削除する。"
 
+msgid "  -u regex                Match URI to regular expression."
+msgstr "  -u <正規表現>           URI が正規表現とマッチするか。"
+
 msgid "  -v                      Be verbose."
 msgstr "  -v                      冗長出力を行う。"
 
 msgid "  -vv                     Be very verbose."
 msgstr "  -vv                     より冗長な出力を行う。"
 
+msgid ""
+"  -x utility [argument ...] ;\n"
+"                          Execute program if true."
+msgstr ""
+"  -x <実行ファイル名> [引数 ...] ;\n"
+"                          成功した場合、<実行ファイル名> を実行する。"
+
 msgid "  -z                      Compress PPD files using GNU zip."
 msgstr "  -z                      PPD ファイルを GNU zip を使って圧縮する。"
 
+msgid "  IPPFIND_SERVICE_DOMAIN  Domain name"
+msgstr "  IPPFIND_SERVICE_DOMAIN  ドメイン名"
+
+msgid ""
+"  IPPFIND_SERVICE_HOSTNAME\n"
+"                          Fully-qualified domain name"
+msgstr ""
+"  IPPFIND_SERVICE_HOSTNAME\n"
+"                          完全修飾ドメイン名 (FQDN)"
+
+msgid "  IPPFIND_SERVICE_NAME    Service instance name"
+msgstr "  IPPFIND_SERVICE_NAME    サービスインスタンス名"
+
+msgid "  IPPFIND_SERVICE_PORT    Port number"
+msgstr "  IPPFIND_SERVICE_PORT    ポート番号"
+
+msgid "  IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr "  IPPFIND_SERVICE_REGTYPE DNS-SD 登録タイプ"
+
+msgid "  IPPFIND_SERVICE_SCHEME  URI scheme"
+msgstr "  IPPFIND_SERVICE_SCHEME  URI スキーム"
+
+msgid "  IPPFIND_SERVICE_URI     URI"
+msgstr "  IPPFIND_SERVICE_URI     URI"
+
+msgid "  IPPFIND_TXT_*           Value of TXT record key"
+msgstr "  IPPFIND_TXT_*           TXT レコードキーの値"
+
+msgid ""
+"  expression --and expression\n"
+"                          Logical AND."
+msgstr "  <式> --and <式>         論理 AND。"
+
+msgid ""
+"  expression --or expression\n"
+"                          Logical OR."
+msgstr "  <式> --or <式>          論理 OR。"
+
+msgid "  expression expression   Logical AND."
+msgstr "  <式> <式>               論理 AND。"
+
+msgid "  {service_domain}        Domain name"
+msgstr "  {service_domain}        ドメイン名"
+
+msgid "  {service_hostname}      Fully-qualified domain name"
+msgstr "  {service_hostname}      完全修飾ドメイン名 (FQDN)"
+
+msgid "  {service_name}          Service instance name"
+msgstr "  {service_name}          サービスインスタンス名"
+
+msgid "  {service_port}          Port number"
+msgstr "  {service_port}          ポート番号"
+
+msgid "  {service_regtype}       DNS-SD registration type"
+msgstr "  {service_regtype}       DNS-SD 登録タイプ"
+
+msgid "  {service_scheme}        URI scheme"
+msgstr "  {service_scheme}        URI スキーム"
+
+msgid "  {service_uri}           URI"
+msgstr "  {service_uri}           URI"
+
+msgid "  {txt_*}                 Value of TXT record key"
+msgstr "  {txt_*}                 TXT レコードキーの値"
+
+msgid "  {}                      URI"
+msgstr "  {}                      URI"
+
 msgid " FAIL"
 msgstr " 失敗"
 
@@ -1157,14 +1389,238 @@ msgid " PASS"
 msgstr " 合格"
 
 #, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
-msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f バイト"
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr "\"%s\": URI の値 \"%s\" が誤っています - %s (RFC 2911 4.1.5 節)。"
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
+msgstr ""
+"\"%s\": URI の値 \"%s\" が誤っています - 長さの誤り %d (RFC 2911 4.1.5 節)。"
+
+#, c-format
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
+msgstr "\"%s\": 属性名が誤っています - 長さの誤り %d (RFC 2911 4.1.3 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
+msgstr "\"%s\": 属性名が誤っています - 不正な文字 (RFC 2911 4.1.3 節)。"
+
+#, c-format
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr "\"%s\": 真偽値 %d が誤っています (RFC 2911 4.1.11 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": charset の値 \"%s\" が誤っています - 不正な文字 (RFC 2911 4.1.7 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
+msgstr ""
+"\"%s\": charset の値 \"%s\" が誤っています - 不正な長さ %d (RFC 2911 section "
+"4.1.7)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr ""
+"\"%s\": dateTime UTC の時間指定 %u が誤っています (RFC 2911 4.1.14 節)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime UTC の分指定 %u が誤っています (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr ""
+"\"%s\": dateTime UTC の符号指定 '%c' が誤っています (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime の日付指定 %u が誤っています (RFC 2911 4.1.14 節)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr ""
+"\"%s\": dateTime の 0.1 秒の指定 %u が誤っています (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime の時間指定 %u が誤っています (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime の分指定が誤っています %u (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": dateTime の月指定 %u が誤っています (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": 日時の秒指定 %u が誤っています (RFC 2911 4.1.14 節)。"
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
+msgstr "\"%s\": enum の値 %d が誤っています - 範囲外の値 (RFC 2911 4.1.4 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
+msgstr ""
+"\"%s\": keyword の値 \"%s\" が誤っています -  %d (RFC 2911 section 4.1.3)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
+msgstr ""
+"\"%s\": keyword の値 \"%s\" が誤っています - 不正な文字 (RFC 2911 4.1.3 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": mimeMediaType の値 \"%s\" が誤っています - 誤った文字 (RFC 2911 "
+"4.1.9 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
+msgstr ""
+"\"%s\": mimeMediaType の値 \"%s\" が誤っています - 長さの誤り %d (RFC 2911 "
+"4.1.9 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": name の値 \"%s\" が誤っています - UTF-8 として誤った並び (RFC 2911 "
+"4.1.2 節)。"
+
+#, c-format
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
+msgstr ""
+"\"%s\": name の値 \"%s\" が誤っています - 誤った長さ %d (RFC 2911 section "
+"4.1.2)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": naturalLanguage の値 \"%s\" が誤っています - 誤った文字 (RFC 2911 "
+"4.1.8 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": naturalLanguage の値 \"%s\" が誤っています - 誤った長さ %d (RFC 2911 "
+"4.1.8 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+"\"%s\": octetString 値が誤っています - 誤った長さ %d (RFC 2911 4.1.10 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+"\"%s\": rangeOfInteger の値 %d-%d が誤っています  - 下限が上限よりも大きい "
+"(RFC 2911 4.1.13 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+"\"%s\": resolution の値 %dx%d%s が誤っています - 単位値の誤り (RFC 2911 "
+"4.1.15 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+"\"%s\": resolution の値 %dx%d%s が誤っています - 主走査解像度が負 (RFC 2911 "
+"4.1.15 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+"\"%s\": resolution の値 %dx%d%s が誤っています - 副走査解像度が負 (RFC 2911 "
+"4.1.15 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": text の値 \"%s\" が誤っています - UTF-8 として誤った並び (RFC 2911 "
+"4.1.1 節)。"
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": text の値 \"%s\" が誤っています - 不正な長さ %d (RFC 2911 4.1.1 節)。"
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": uriScheme の値 \"%s\" が誤っています - 誤った文字 (RFC 2911 4.1.6 "
+"節)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": uriScheme の値 \"%s\" が誤っています - 不正な長さ %d (RFC 2911 4.1.6 "
+"節)."
 
 #, 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 "%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 からリクエストを受け付けています"
 
@@ -1222,6 +1678,14 @@ 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: 何が起きているか不明です。"
 
@@ -1232,7 +1696,7 @@ msgstr "%s: エラー - 環境変数 %s が存在しない宛先 \"%s\" を指
 
 #, c-format
 msgid "%s: Error - add '/version=1.1' to server name."
-msgstr ""
+msgstr "%s: エラー - '/version=1.1' をサーバー名に付与してください。"
 
 #, c-format
 msgid "%s: Error - bad job ID."
@@ -1270,10 +1734,6 @@ msgid "%s: Error - expected destination after \"-P\" option."
 msgstr "%s: エラー - \"-P\" オプションのあとには宛先が必要です。"
 
 #, c-format
-msgid "%s: Error - expected destination after \"-b\" option."
-msgstr "%s: エラー - \"-b\" オプションのあとに宛先が必要です。"
-
-#, c-format
 msgid "%s: Error - expected destination after \"-d\" option."
 msgstr "%s: エラー - \"-d\" オプションのあとにはプリンター名が必要です。"
 
@@ -1394,6 +1854,18 @@ 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') が必要です。"
 
@@ -1410,6 +1882,10 @@ 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: サーバーに接続できません"
 
@@ -1418,10 +1894,18 @@ 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"
 
@@ -1435,6 +1919,10 @@ msgstr ""
 "%s: \"%s\" または \"%s\" から MIME データベースを読み取ることができません。"
 
 #, c-format
+msgid "%s: Unable to resolve \"%s\"."
+msgstr ""
+
+#, c-format
 msgid "%s: Unknown destination \"%s\"."
 msgstr "%s: \"%s\" は未知の宛先です。"
 
@@ -1447,6 +1935,14 @@ 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 タイプです。"
 
@@ -2002,9 +2498,6 @@ msgstr "7 x 9 インチ"
 msgid "70"
 msgstr "70"
 
-msgid "720dpi"
-msgstr "720dpi"
-
 msgid "75"
 msgstr "75"
 
@@ -2265,7 +2758,7 @@ msgstr "B9"
 
 #, c-format
 msgid "Bad 'document-format' value \"%s\"."
-msgstr ""
+msgstr "誤った 'document-format' の値です \"%s\"。"
 
 msgid "Bad NULL dests pointer"
 msgstr "不正な NULL 送信先ポインター"
@@ -2291,6 +2784,9 @@ msgstr "不正な SNMP バージョン番号"
 msgid "Bad UIConstraints"
 msgstr "不正な UIConstraints"
 
+msgid "Bad arguments to function"
+msgstr "関数の引数が不正"
+
 #, c-format
 msgid "Bad copies value %d."
 msgstr "%d は不正なコピー値です。"
@@ -2317,14 +2813,15 @@ msgstr "\"%s\" は不正な document-format-default です。"
 msgid "Bad filename buffer"
 msgstr "不正なファイル名バッファーです。"
 
-msgid "Bad job-name value: Bad UTF-8 sequence."
-msgstr ""
+msgid "Bad hostname/address in URI"
+msgstr "URI のホスト名/アドレスが不正"
 
-msgid "Bad job-name value: Name too long."
-msgstr ""
+#, c-format
+msgid "Bad job-name value: %s"
+msgstr "誤った job-name 値: %s"
 
 msgid "Bad job-name value: Wrong type or count."
-msgstr ""
+msgstr "誤った job-name 値: 型かカウントが誤っています。"
 
 msgid "Bad job-priority value."
 msgstr "不正な job-priority 値です。"
@@ -2363,17 +2860,20 @@ msgstr "%d 行に不正なオプションと選択があります。"
 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 です。"
 
-msgid "Bad printer URI."
-msgstr "不正なプリンター URI です。"
-
 #, 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です。"
@@ -2382,12 +2882,24 @@ msgstr "%d は無効なリクエストIDです。"
 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 subscription ID"
-msgstr "不正なサブスクリプション ID です。"
+msgstr "不正なサブスクリプション ID"
+
+msgid "Bad username in URI"
+msgstr "URI のユーザー名が不正"
 
 msgid "Bad value string"
 msgstr "値文字列がありません"
 
+msgid "Bad/empty URI"
+msgstr "URI が不正か空"
+
 msgid "Banners"
 msgstr "バナー"
 
@@ -2407,6 +2919,9 @@ msgstr "CMYK"
 msgid "CPCL Label Printer"
 msgstr "CPCL ラベルプリンター"
 
+msgid "Cancel Jobs"
+msgstr "ジョブをキャンセル"
+
 msgid "Cancel RSS Subscription"
 msgstr "RSS 購読をキャンセル"
 
@@ -2496,7 +3011,7 @@ msgid "Darkness"
 msgstr "濃さ"
 
 msgid "Data file sent successfully."
-msgstr "データファイルが正常に送信されました"
+msgstr "データファイルが正常に送信されました"
 
 msgid "Delete Class"
 msgstr "クラスの削除"
@@ -2578,6 +3093,9 @@ msgstr "設定ファイルの編集"
 msgid "Empty PPD file."
 msgstr "PPD ファイルが空です。"
 
+msgid "Encryption is not supported."
+msgstr "暗号化はサポートされていません。"
+
 #. TRANSLATORS: Banner/cover sheet after the print job.
 msgid "Ending Banner"
 msgstr "終了バナー"
@@ -2585,15 +3103,6 @@ msgstr "終了バナー"
 msgid "English"
 msgstr "English"
 
-msgid "Enter old password:"
-msgstr "古いパスワードを入力:"
-
-msgid "Enter password again:"
-msgstr "パスワードを再度入力:"
-
-msgid "Enter password:"
-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 "
@@ -2762,12 +3271,18 @@ 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 "ラスターデータの送信でエラーが起きました。"
 
@@ -2813,6 +3328,9 @@ msgstr "予測に失敗しました"
 msgid "Export Printers to Samba"
 msgstr "Samba へプリンターをエクスポート"
 
+msgid "Expressions:"
+msgstr "式:"
+
 msgid "FAIL"
 msgstr "失敗"
 
@@ -2928,6 +3446,9 @@ 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 のメンバー名が空ではありません。"
 
@@ -2935,7 +3456,7 @@ msgid "IPP memberName value is empty."
 msgstr "IPP の memberName の値が空です。"
 
 msgid "IPP memberName with no attribute."
-msgstr ""
+msgstr "IPP の memberName に属性がありません。"
 
 msgid "IPP name larger than 32767 bytes."
 msgstr "IPP 名が 32767 バイトより大きいです。"
@@ -2943,6 +3464,9 @@ 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 バイトになっていません。"
 
@@ -3003,6 +3527,9 @@ msgstr "Internet Postage 3-Part"
 msgid "Internet Printing Protocol"
 msgstr "インターネット印刷プロトコル"
 
+msgid "Invalid media name arguments."
+msgstr "無効なメディア名引数です。"
+
 msgid "Invalid media size."
 msgstr "無効なメディアサイズです。"
 
@@ -3150,13 +3677,16 @@ msgid "Line longer than the maximum allowed (255 characters)"
 msgstr "1 行が最大値 (255 文字) を超えています"
 
 msgid "List Available Printers"
-msgstr "使用可能なプリンターをリスト化"
+msgstr "使用可能なプリンター一覧"
+
+msgid "Load paper."
+msgstr "用紙を補給してください。"
 
 msgid "Long-Edge (Portrait)"
 msgstr "長辺給紙 (縦向き)"
 
-msgid "Looking for printer."
-msgstr "プリンターを探しています。"
+msgid "Looking for printer..."
+msgstr ""
 
 msgid "Manual Feed"
 msgstr "手差し"
@@ -3219,6 +3749,12 @@ msgstr "requesting-user-name 属性が設定されていません。"
 msgid "Missing required attributes."
 msgstr "必須の属性が設定されていません。"
 
+msgid "Missing resource in URI"
+msgstr "URI のリソースがない"
+
+msgid "Missing scheme in URI"
+msgstr "URI のスキームがない"
+
 #, c-format
 msgid "Missing value on line %d."
 msgstr "%d 行に値がありません。"
@@ -3244,6 +3780,9 @@ msgstr ""
 "        プリンタードライバー = %s\n"
 "        デバイス ID = %s"
 
+msgid "Modifiers:"
+msgstr "修飾子:"
+
 msgid "Modify Class"
 msgstr "クラスの変更"
 
@@ -3271,12 +3810,6 @@ msgstr "入れ子になったクラスは許可されていません。"
 msgid "Never"
 msgstr "Never"
 
-msgid "New Stylus Color Series"
-msgstr "New Stylus Color シリーズ"
-
-msgid "New Stylus Photo Series"
-msgstr "New Stylus Photo シリーズ"
-
 msgid "No"
 msgstr "いいえ"
 
@@ -3295,6 +3828,9 @@ msgstr "Windows プリンタードライバーがインストールされてい
 msgid "No active connection"
 msgstr "アクティブな接続はありません"
 
+msgid "No active connection."
+msgstr "アクティブな接続はありません。"
+
 #, c-format
 msgid "No active jobs on %s."
 msgstr "%s にはアクティブなジョブはありません。"
@@ -3309,14 +3845,13 @@ msgid "No community name"
 msgstr "コミュニティ名がありません"
 
 msgid "No default printer."
-msgstr "デフォルトのプリンターはありません"
+msgstr "デフォルトのプリンターはありません"
 
 msgid "No destinations added."
-msgstr "追加された宛先はありません"
+msgstr "追加された宛先はありません"
 
 msgid "No device URI found in argv[0] or in DEVICE_URI environment variable."
-msgstr ""
-"ERROR: argv[0] または 環境変数 DEVICE_URI にデバイス URI が見つかりません。"
+msgstr "argv[0] または 環境変数 DEVICE_URI にデバイス URI が見つかりません。"
 
 msgid "No error-index"
 msgstr "エラーインデックスがありません"
@@ -3328,26 +3863,35 @@ msgid "No file in print request."
 msgstr "印刷リクエストにファイルがありません。"
 
 msgid "No modification time"
-msgstr "変更時刻がありません"
+msgstr "変更時刻がありません"
 
 msgid "No name OID"
 msgstr "OID 名がありません"
 
 msgid "No pages were found."
-msgstr "ERROR: ページが見つかりません。"
+msgstr " ページが見つかりません。"
 
 msgid "No printer name"
-msgstr "プリンター名がありません"
+msgstr "プリンター名がありません"
 
 msgid "No printer-uri found"
-msgstr "プリンター URI が見つかりません"
+msgstr "プリンター URI が見つかりません"
 
 msgid "No printer-uri found for class"
-msgstr "クラスのプリンター URI が見つかりません"
+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 がありません"
 
@@ -3444,21 +3988,14 @@ msgstr "メモリーが足りません。"
 msgid "Output Mode"
 msgstr "出力モード"
 
-#, c-format
-msgid "Output for printer %s is sent to %s"
-msgstr "プリンター %s の出力は %s に送られます"
+msgid "Output bin is almost full."
+msgstr "排紙ビンがほとんど満杯です。"
 
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
-msgstr "プリンター %s の出力は、リモートプリンター %s (%s 上) に送られます"
+msgid "Output bin is full."
+msgstr "排紙ビンが満杯です。"
 
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
-msgstr "プリンター %s/%s の出力は %s に送られます"
-
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
-msgstr "プリンター %s/%s の出力は、リモートプリンター %s (%s 上) に送られます"
+msgid "Output bin is missing."
+msgstr "排紙ビンがありません。"
 
 msgid "PASS"
 msgstr "合格"
@@ -3490,6 +4027,18 @@ msgstr "パケットが Get-Response-PDU を含んでいません"
 msgid "Packet does not start with SEQUENCE"
 msgstr "パケットが SEQUENCE から始まりません"
 
+msgid "Paper jam."
+msgstr "用紙詰まりです。"
+
+msgid "Paper tray is almost empty."
+msgstr "給紙トレイがほとんど空です。"
+
+msgid "Paper tray is empty."
+msgstr "給紙トレイが空です。"
+
+msgid "Paper tray is missing."
+msgstr "給紙トレイがありません。"
+
 msgid "ParamCustominCutInterval"
 msgstr "ParamCustominCutInterval"
 
@@ -3543,6 +4092,9 @@ msgstr "往復ハガキ 長辺送り"
 msgid "Postcard Long Edge"
 msgstr "ハガキ 長辺送り"
 
+msgid "Preparing to print."
+msgstr "印刷準備中です。"
+
 msgid "Print Density"
 msgstr "印刷密度"
 
@@ -3570,25 +4122,18 @@ msgstr "プリントしてカット"
 msgid "Print and Tear"
 msgstr "プリントして切り取る"
 
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr "プリントファイルを受け付けました - ジョブ ID %d。"
-
-msgid "Print file accepted - job ID unknown."
-msgstr "NOTICE: プリントファイルを受け付けました - ジョブ ID 不明。"
-
 msgid "Print file sent."
 msgstr "プリントファイルが送られました。"
 
-msgid "Print file was not accepted."
-msgstr "プリントファイルが受け付けられませんでした。"
-
 msgid "Print job canceled at printer."
 msgstr "印刷ジョブはプリンターでキャンセルされました。"
 
 msgid "Print job too large."
 msgstr "印刷ジョブが大きすぎます。"
 
+msgid "Print job was not accepted."
+msgstr "印刷ジョブが受け付けられませんでした。"
+
 msgid "Printer Added"
 msgstr "追加されたプリンター"
 
@@ -3610,6 +4155,9 @@ msgstr "プリンター設定"
 msgid "Printer cannot print supplied content."
 msgstr "プリンターは受信した内容を印刷できませんでした。"
 
+msgid "Printer cannot print with supplied options."
+msgstr "指定されたオプションではプリンターは印刷できません。"
+
 msgid "Printer:"
 msgstr "プリンター:"
 
@@ -3617,11 +4165,8 @@ msgid "Printers"
 msgstr "プリンター"
 
 #, c-format
-msgid "Printing page %d, %d%% complete."
-msgstr "ページ %d を印刷中、%d%% 完了しました。"
-
-msgid "Purge Jobs"
-msgstr "ジョブの削除"
+msgid "Printing page %d, %u%% complete."
+msgstr "ページ %d, %u%% の印刷が完了しました。"
 
 msgid "Quarto"
 msgstr "Quarto"
@@ -3632,12 +4177,6 @@ msgstr "クォータの制限に達しました。"
 msgid "Rank    Owner   Job     File(s)                         Total Size"
 msgstr "ランク  所有者  ジョブ  ファイル                        合計サイズ"
 
-#. TRANSLATORS: Pri is job priority.
-msgid ""
-"Rank   Owner      Pri  Job        Files                       Total Size"
-msgstr ""
-"ランク 所有者     優先 ジョブ     ファイル                    合計サイズ"
-
 msgid "Reject Jobs"
 msgstr "ジョブの拒否"
 
@@ -3698,6 +4237,9 @@ msgstr "開始されたサーバー"
 msgid "Server Stopped"
 msgstr "停止されたサーバー"
 
+msgid "Server credentials not set."
+msgstr "サーバー証明書が設定されていません。"
+
 msgid "Service Unavailable"
 msgstr "利用できないサービス"
 
@@ -3743,16 +4285,13 @@ msgstr "ページ %d を開始しています。"
 msgid "Statement"
 msgstr "記述"
 
-msgid "Stylus Color Series"
-msgstr "Stylus Color シリーズ"
-
-msgid "Stylus Photo Series"
-msgstr "Stylus Photo シリーズ"
-
 #, c-format
 msgid "Subscription #%d does not exist."
 msgstr "サブスクリプション番号 %d は存在しません。"
 
+msgid "Substitutions:"
+msgstr "置換:"
+
 msgid "Super A"
 msgstr "スーパー A"
 
@@ -3784,13 +4323,16 @@ 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 Description attribute cannot be supplied in a job creation "
-"request."
+"The '%s' Job Status attribute cannot be supplied in a job creation request."
 msgstr ""
 
 #, c-format
@@ -3813,8 +4355,8 @@ msgid ""
 "The class name may only contain up to 127 printable characters and may not "
 "contain spaces, slashes (/), or the pound sign (#)."
 msgstr ""
-"ã\82¯ã\83©ã\82¹å\90\8dã\81¯ 127 æ\96\87å­\97以å\86\85ã\81®è¡¨ç¤ºå\8f¯è\83½æ\96\87å­\97ã\81\8bã\82\89ã\81ªã\82\8aã\80\81空ç\99½ã\80\81ã\82¹ã\83©ã\83\83ã\82·ã\83¥ (/)ã\80\81ã\82·ã\83£ã\83¼"
-"ã\83\97 (#) を含んではなりません。"
+"ã\82¯ã\83©ã\82¹å\90\8dã\81¯ 127 æ\96\87å­\97以å\86\85ã\81®è¡¨ç¤ºå\8f¯è\83½æ\96\87å­\97ã\81\8bã\82\89ã\81ªã\82\8aã\80\81空ç\99½ã\80\81ã\82¹ã\83©ã\83\83ã\82·ã\83¥ (/)ã\80\81ã\83\8fã\83\83"
+"ã\82·ã\83¥ (#) を含んではなりません。"
 
 msgid "The developer unit needs to be replaced."
 msgstr "現像ユニットの交換が必要です。"
@@ -3844,40 +4386,21 @@ msgstr "感光体の交換が必要です。"
 msgid "The optical photoconductor will need to be replaced soon."
 msgstr "もうすぐ感光体の交換時期です。"
 
-msgid "The output bin is almost full."
-msgstr "排紙トレイがほとんど一杯です。"
-
-msgid "The output bin is full."
-msgstr "排紙トレイが一杯です。"
-
-msgid "The output bin is missing."
-msgstr "排紙トレイが見つかりません。"
-
-msgid "The paper tray is almost empty."
-msgstr "用紙トレイが空になりかけています。"
-
-msgid "The paper tray is empty."
-msgstr "用紙トレイが空です。"
-
-msgid "The paper tray is missing."
-msgstr "用紙トレイが見つかりません。"
-
-msgid "The paper tray needs to be filled."
-msgstr "用紙トレイに補充が必要です。"
-
-msgid "The printer URI is incorrect or no longer exists."
-msgstr "プリンター URI が誤っているか、もう存在しません。"
+msgid "The printer configuration is incorrect or the printer no longer exists."
+msgstr "プリンターの設定が正しくないかプリンターはすでに存在しません。"
 
 msgid "The printer did not respond."
 msgstr "プリンターが応答しません。"
 
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
-msgstr "プリンターが IPP/%d.%d をサポートしていません。IPP/%s を試します。"
-
 msgid "The printer is in use."
 msgstr "プリンターは使用中です。"
 
+msgid "The printer is low on ink."
+msgstr "インク残量が残り少なくなっています。"
+
+msgid "The printer is low on toner."
+msgstr "トナー残量が残り少なくなっています。"
+
 msgid "The printer is not connected."
 msgstr "プリンターは接続されていません。"
 
@@ -3893,12 +4416,6 @@ msgstr "プリンターは現在オンラインです。"
 msgid "The printer is offline."
 msgstr "プリンターはオフラインです。"
 
-msgid "The printer is running low on ink."
-msgstr "プリンターのインクがもうすぐなくなります。"
-
-msgid "The printer is running low on toner."
-msgstr "プリンターのトナーがもうすぐなくなります。"
-
 msgid "The printer is unreachable at this time."
 msgstr "プリンターには現在到達できません。"
 
@@ -3915,8 +4432,8 @@ msgid ""
 "The printer name may only contain up to 127 printable characters and may not "
 "contain spaces, slashes (/), or the pound sign (#)."
 msgstr ""
-"ã\83\97ã\83ªã\83³ã\82¿ã\83¼å\90\8dã\81¯ 127 æ\96\87å­\97以å\86\85ã\81®è¡¨ç¤ºå\8f¯è\83½æ\96\87å­\97ã\81\8bã\82\89æ\88\90ã\82\8aã\80\81空ç\99½ã\80\81ã\82¹ã\83©ã\83\83ã\82·ã\83¥ (/)ã\80\81ã\83\9dã\83³"
-"ã\83\89è¨\98å\8f· (#) を含んではなりません。"
+"ã\83\97ã\83ªã\83³ã\82¿ã\83¼å\90\8dã\81¯ 127 æ\96\87å­\97以å\86\85ã\81®è¡¨ç¤ºå\8f¯è\83½æ\96\87å­\97ã\81\8bã\82\89æ\88\90ã\82\8aã\80\81空ç\99½ã\80\81ã\82¹ã\83©ã\83\83ã\82·ã\83¥ (/)ã\80\81ã\83\8fã\83\83"
+"ã\82·ã\83¥ (#) を含んではなりません。"
 
 msgid "The printer or class does not exist."
 msgstr "プリンターまたはクラスは存在しません。"
@@ -3962,8 +4479,8 @@ msgid ""
 "The subscription name may not contain spaces, slashes (/), question marks "
 "(?), or the pound sign (#)."
 msgstr ""
-"ã\82µã\83\96ã\82¹ã\82¯ã\83ªã\83\97ã\82·ã\83§ã\83³å\90\8dã\81«ã\81¯ã\80\81ã\82¹ã\83\9aã\83¼ã\82¹ã\80\81ã\82¹ã\83©ã\83\83ã\82·ã\83¥ (/)ã\80\81ç\96\91å\95\8fåº\9c (?)ã\80\81ã\83\9dã\83³ã\83\89è¨\98å\8f· "
-"(#) を使用しないでください。"
+"ã\82µã\83\96ã\82¹ã\82¯ã\83ªã\83\97ã\82·ã\83§ã\83³å\90\8dã\81«ã\81¯ã\80\81ã\82¹ã\83\9aã\83¼ã\82¹ã\80\81ã\82¹ã\83©ã\83\83ã\82·ã\83¥ (/)ã\80\81ç\96\91å\95\8fåº\9c (?)ã\80\81ã\83\8fã\83\83ã\82·ã\83¥ (#) "
+"を使用しないでください。"
 
 msgid ""
 "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to "
@@ -3979,9 +4496,6 @@ msgstr "which-jobs の値 \"%s\" はサポートされていません。"
 msgid "There are too many subscriptions."
 msgstr "サブスクリプションが多すぎます。"
 
-msgid "There is a paper jam."
-msgstr "用紙づまりが発生しています。"
-
 msgid "There was an unrecoverable USB error."
 msgstr "回復不可能な USB のエラーが発生しています。"
 
@@ -4020,6 +4534,9 @@ msgstr "トレイ 4"
 msgid "URI Too Long"
 msgstr "URI が長すぎます"
 
+msgid "URI too large"
+msgstr "URI が長すぎる"
+
 msgid "US Ledger"
 msgstr "US レジャー"
 
@@ -4051,7 +4568,7 @@ msgid "Unable to access help file."
 msgstr "ヘルプファイルにアクセスできません。"
 
 msgid "Unable to add RSS subscription"
-msgstr " RSS 購読を追加できません"
+msgstr "RSS 購読を追加できません"
 
 msgid "Unable to add class"
 msgstr "クラスを追加できません"
@@ -4090,6 +4607,14 @@ 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 "プリンターオプションを設定できません。"
 
@@ -4132,11 +4657,11 @@ msgstr ""
 msgid "Unable to copy interface script - %s"
 msgstr "インターフェイススクリプトをコピーできません - %s"
 
-msgid "Unable to create compressed print file"
-msgstr "圧縮プリントファイルを作成できません"
-
 msgid "Unable to create printer-uri"
-msgstr "printer-uri を作成できません。"
+msgstr "printer-uri を作成できません"
+
+msgid "Unable to create server credentials."
+msgstr "サーバー証明書を作成できません。"
 
 msgid "Unable to create temporary file"
 msgstr "テンポラリーファイルを作成できません"
@@ -4151,7 +4676,7 @@ msgid "Unable to do maintenance command"
 msgstr "メンテナンスコマンドを実行できません"
 
 msgid "Unable to edit cupsd.conf files larger than 1MB"
-msgstr "1MB 以上の cupsd.conf ファイルは編集できません"
+msgstr "1MB 以上の cupsd.conf ファイルは編集できません"
 
 msgid ""
 "Unable to establish a secure connection to host (certificate chain invalid)."
@@ -4190,8 +4715,8 @@ msgstr "ジョブの宛先が見つかりません"
 msgid "Unable to find printer."
 msgstr "プリンターが見つかりません。"
 
-msgid "Unable to generate compressed print file"
-msgstr "圧縮プリントファイルを生成できません"
+msgid "Unable to find server credentials."
+msgstr "サーバー証明書を見つけられません。"
 
 msgid "Unable to get backend exit status."
 msgstr "バックエンドの終了ステータスを取得できません。"
@@ -4253,9 +4778,6 @@ msgstr "複数のジョブを移動できません"
 msgid "Unable to open PPD file"
 msgstr "PPD ファイルを読み込むことができません"
 
-msgid "Unable to open compressed print file"
-msgstr "圧縮プリントファイルを開けません"
-
 msgid "Unable to open cupsd.conf file:"
 msgstr "cupsd.conf ファイルを開けません:"
 
@@ -4281,8 +4803,11 @@ msgstr "テストページを印刷できません"
 msgid "Unable to read print data."
 msgstr "プリントデータを読み込めません。"
 
-msgid "Unable to resolve printer URI."
-msgstr "プリンター URI を解決できません。"
+msgid "Unable to rename job document file."
+msgstr ""
+
+msgid "Unable to resolve printer-uri."
+msgstr "printer-uri を解決できません。"
 
 #, c-format
 msgid "Unable to run \"%s\": %s"
@@ -4371,6 +4896,15 @@ msgstr "\"%s\" は未知の printer-error-policy です。"
 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 "未知のサービス名です。"
 
@@ -4380,14 +4914,14 @@ msgstr "\"%s\" は未知のバージョンオプション値です。"
 
 #, c-format
 msgid "Unsupported 'compression' value \"%s\"."
-msgstr ""
+msgstr "\"%s\" はサポートされていない 'compression' の値です。"
 
 #, c-format
 msgid "Unsupported 'document-format' value \"%s\"."
-msgstr ""
+msgstr "\"%s\" はサポートされていない 'document-format' の値です。"
 
 msgid "Unsupported 'job-name' value."
-msgstr ""
+msgstr "サポートされていない 'job-name' の値です。"
 
 #, c-format
 msgid "Unsupported character set \"%s\"."
@@ -4473,11 +5007,11 @@ msgstr "Usage: cupsctl [オプション] [パラメータ=値 ... パラメー
 msgid "Usage: cupsd [options]"
 msgstr "使い方: cupsd [オプション]"
 
-msgid "Usage: cupsfilter [ options ] filename"
-msgstr "使い方: cupsfilter [オプション] ファイル名"
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
+msgstr "使い方: cupsfilter [ オプション ] [ -- ] ファイル名"
 
 msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
-msgstr "使い方: cupstestdsc [オプション] filename.ps [... filename.ps]"
+msgstr "使い方: cupstestdsc [オプション] ファイル名.ps [... ファイル名.ps]"
 
 msgid ""
 "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
@@ -4485,6 +5019,28 @@ msgstr ""
 "使い方: cupstestppd [オプション] ファイル名1.ppd[.gz] [... ファイル名N.ppd[."
 "gz]]"
 
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+"       ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+"使い方: ippdiscover [オプション] -a\n"
+"        ippdiscover [オプション] \"サービス名\"\n"
+"\n"
+"オプション:"
+
+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 ]"
 
@@ -4502,18 +5058,6 @@ msgstr ""
 "        lpoptions [-h サーバー] [-E] -p プリンター -o オプション[=値] ...\n"
 "        lpoptions [-h サーバー] [-E] -x プリンター"
 
-msgid "Usage: lppasswd [-g groupname]"
-msgstr "使い方: lppasswd [-g グループ名]"
-
-msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-"       lppasswd [-g groupname] -a [username]\n"
-"       lppasswd [-g groupname] -x [username]"
-msgstr ""
-"使い方: lppasswd [-g グループ名] [ユーザー名]\n"
-"        lppasswd [-g グループ名] -a [ユーザー名]\n"
-"        lppasswd [-g グループ名] -x [ユーザー名]"
-
 msgid ""
 "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
 msgstr ""
@@ -4538,7 +5082,7 @@ msgstr ""
 "drv ]"
 
 msgid "Usage: snmp [host-or-ip-address]"
-msgstr "使い方: snmp [ホストまたはIPアドレス]"
+msgstr "使い方: snmp [ホストまたはIPアドレス]"
 
 msgid "Value uses indefinite length"
 msgstr "値は不定長です"
@@ -4575,13 +5119,6 @@ msgstr ""
 "このページには URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A> を使ってア"
 "クセスする必要があります。"
 
-msgid ""
-"Your password must be at least 6 characters long, cannot contain your "
-"username, and must contain at least one letter and number."
-msgstr ""
-"パスワードは少なくとも 6 文字以上で、あなたのユーザー名を含んではならず、少な"
-"くとも 1 つの英字および数値を含んでなければなりません。"
-
 msgid "ZPL Label Printer"
 msgstr "ZPL ラベルプリンター"
 
@@ -4627,15 +5164,21 @@ msgstr "cupsd: \"-c\" オプションのあとには設定ファイル名が必
 
 msgid "cupsd: Expected cups-files.conf filename after \"-s\" option."
 msgstr ""
+"cupsd: cups-files.conf ファイル名は \"-s\" オプションの後ろにあるべきです。"
 
-msgid "cupsd: Relative cups-files.conf filename not allowed."
+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 ""
+msgstr "cupsd: cups-files.conf ファイルへのパスが取得できません。"
 
 #, c-format
 msgid "cupsd: Unknown argument \"%s\" - aborting."
@@ -4645,11 +5188,6 @@ msgstr "cupsd: \"%s\" は未知の引数です - 停止します。"
 msgid "cupsd: Unknown option \"%c\" - aborting."
 msgstr "cupsd: \"%c\" は未知のオプションです - 停止します。"
 
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
-"cupsd: launchd(8) サポートがコンパイルされていないので、通常モードで動作しま"
-"す。"
-
 #, c-format
 msgid "cupsfilter: Invalid document number %d."
 msgstr "cupsfilter: 不正な文書番号 %d です。"
@@ -4694,16 +5232,89 @@ msgstr "help\t\tコマンドのヘルプを取得。"
 msgid "idle"
 msgstr "待機中"
 
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
-msgstr "ipptool: \"-i\" と \"-n\" は \"-X\" と組み合わせられません。"
+#, 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 "ipptool: Bad URI - %s."
-msgstr "ipptool: 不正な URI です - %s。"
+msgid "ippfind: Expected key name after %s."
+msgstr "ippfind: %s のあとにはキー名が必要です。"
 
 #, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
-msgstr "ipptool: \"-V\" オプションに不正なバージョン %s が指定されました。"
+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 のあとにはキー名が必要です。"
+
+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 \"-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\" に不正な秒数が指定されました。"
@@ -4723,12 +5334,6 @@ msgstr "ipptool: \"-d\" に 名前=値 の指定がありません。"
 msgid "ipptool: Missing seconds for \"-i\"."
 msgstr "ipptool: \"-i\" に秒数の指定がありません。"
 
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr "ipptool: \"-T\" にタイムアウトの指定がありません。"
-
-msgid "ipptool: Missing version for \"-V\"."
-msgstr "ipptool: \"-V\" にバージョンの指定がありません。"
-
 msgid "ipptool: URI required before test file."
 msgstr "ipptool: テストファイルの前に URI の指定が必要です。"
 
@@ -4828,6 +5433,10 @@ msgstr ""
 "         先にプリンター名を指定する必要があります。"
 
 #, c-format
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
+msgstr ""
+
+#, c-format
 msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
 msgstr "lpadmin: PPD ファイル \"%s\" を開けません - %s"
 
@@ -4873,8 +5482,8 @@ msgstr "lpinfo: \"--language\" のあとには、言語を指定する必要が
 
 msgid "lpinfo: Expected make and model after \"--make-and-model\"."
 msgstr ""
-"lpinfo: \"--make-and-model\" の後には、メーカーとモデルを指定する必要がありま"
-"す。"
+"lpinfo: \"--make-and-model\" のあとには、メーカーとモデルを指定する必要があり"
+"ã\81¾ã\81\99ã\80\82"
 
 msgid "lpinfo: Expected product string after \"--product\"."
 msgstr "lpinfo: \"--product\" のあとには、製品名を指定する必要があります。"
@@ -4922,7 +5531,7 @@ msgstr "lpoptions: プリンターがありません。"
 
 #, c-format
 msgid "lpoptions: Unable to add printer or instance: %s"
-msgstr "lpoptions: プリンターまたはインスタンスを追加できません: %s"
+msgstr "lpoptions: プリンターまたはインスタンスを追加できません: %s"
 
 #, c-format
 msgid "lpoptions: Unable to get PPD file for %s: %s"
@@ -4935,48 +5544,6 @@ msgstr "lpoptions: %s の PPD ファイルを開けません。"
 msgid "lpoptions: Unknown printer or class."
 msgstr "lpoptions: 未知のプリンターまたはクラスです。"
 
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr "lppasswd: root だけがパスワードの追加と削除を行えます。"
-
-msgid "lppasswd: Password file busy."
-msgstr "lppasswd: パスワードファイルがビジー状態です。"
-
-msgid "lppasswd: Password file not updated."
-msgstr "lppasswd: パスワードファイルは更新されません。"
-
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr "lppasswd: 残念ながら、パスワードがマッチしません。"
-
-msgid "lppasswd: Sorry, password rejected."
-msgstr "lppasswd: 残念ながら、パスワードは拒否されました。"
-
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr "lppasswd: 残念ながら、パスワードがマッチしません。"
-
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr "lppasswd: パスワード文字列をコピーできません: %s"
-
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr "lppasswd: パスワードファイルを開けません: %s"
-
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr "lppasswd: パスワードファイルに書き込めません: %s"
-
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr "lppasswd: 古いパスワードファイルのバックアップに失敗しました: %s"
-
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr "lppasswd: パスワードファイルの名前の変更に失敗しました: %s"
-
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr "lppasswd: ユーザー \"%s\" およびグループ \"%s\" は存在しません。"
-
 #, c-format
 msgid ""
 "lpstat: error - %s environment variable names non-existent destination \"%s"
@@ -5006,7 +5573,7 @@ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme."
 msgstr "notify-recipient-uri URI \"%s\" には未知のスキームが使われています。"
 
 msgid "pending"
-msgstr "保留"
+msgstr "プリンター待ち"
 
 #, c-format
 msgid "ppdc: Adding include directory \"%s\"."
@@ -5026,13 +5593,11 @@ msgstr "不正なフォント属性: %s"
 
 #, c-format
 msgid "ppdc: Bad resolution name \"%s\" on line %d of %s."
-msgstr ""
-"ppdc: 不正な resolution 名 \"%s\" があります。%d 行目、ファイル名 %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 。"
+msgstr "ppdc: 不正な status キーワード %s があります。%d 行目、ファイル名 %s。"
 
 #, c-format
 msgid "ppdc: Bad variable substitution ($%c) on line %d of %s."
@@ -5047,7 +5612,7 @@ msgstr ""
 msgid "ppdc: Duplicate #po for locale %s on line %d of %s."
 msgstr ""
 "ppdc: locale %s に対して #po が二重に定義されています。%d 行目、ファイル名 "
-"%s 。"
+"%s。"
 
 #, c-format
 msgid "ppdc: Expected a filter definition on line %d of %s."
@@ -5125,7 +5690,7 @@ msgstr "ppdc: %d 行目、ファイル名 %s において group name/text が必
 
 #, c-format
 msgid "ppdc: Expected include filename on line %d of %s."
-msgstr "ppdc: %d 行目、ファイル名 %s において include ファイル名が必要です。"
+msgstr "ppdc: %d 行目、ファイル名 %s において include ファイル名 が必要です。"
 
 #, c-format
 msgid "ppdc: Expected integer on line %d of %s."
@@ -5488,7 +6053,7 @@ msgid "stat of %s failed: %s"
 msgstr "%s の状態取得に失敗しました: %s"
 
 msgid "status\t\tShow status of daemon and queue."
-msgstr "status\t\tデーモンとキューの状態を表示"
+msgstr "status\t\tデーモンとキューの状態を表示"
 
 msgid "stopped"
 msgstr "停止"
@@ -5509,3 +6074,209 @@ msgstr "タイトルなし"
 
 msgid "variable-bindings uses indefinite length"
 msgstr "variable-bindings の長さが不定"
+
+#~ msgid "  -l                      Run cupsd from launchd(8)."
+#~ msgstr "  -l                      launchd(8) から cupsd を実行する。"
+
+#~ msgid ""
+#~ "\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 4.1.6 節)."
+#~ msgstr ""
+#~ "\"%s\": uriScheme 値 \"%s\" が誤っています - 誤った長さ %d (RFC 2911 "
+#~ "4.1.6 節)."
+
+#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f バイト"
+
+#~ msgid "%s: Error - expected destination after \"-b\" option."
+#~ msgstr "%s: エラー - \"-b\" オプションのあとに宛先が必要です。"
+
+#~ msgid "720dpi"
+#~ msgstr "720dpi"
+
+#~ msgid "Bad printer URI."
+#~ msgstr "不正なプリンター URI です。"
+
+#~ msgid "Enter old password:"
+#~ msgstr "古いパスワードを入力:"
+
+#~ msgid "Enter password again:"
+#~ msgstr "パスワードを再度入力:"
+
+#~ msgid "Enter password:"
+#~ msgstr "パスワードを入力:"
+
+#~ msgid "Looking for printer."
+#~ msgstr "プリンターを探しています。"
+
+#~ msgid "New Stylus Color Series"
+#~ msgstr "New Stylus Color シリーズ"
+
+#~ msgid "New Stylus Photo Series"
+#~ msgstr "New Stylus Photo シリーズ"
+
+#~ msgid "Output for printer %s is sent to %s"
+#~ msgstr "プリンター %s の出力は %s に送られます"
+
+#~ msgid "Output for printer %s is sent to remote printer %s on %s"
+#~ msgstr "プリンター %s の出力は、リモートプリンター %s (%s 上) に送られます"
+
+#~ msgid "Output for printer %s/%s is sent to %s"
+#~ msgstr "プリンター %s/%s の出力は %s に送られます"
+
+#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s"
+#~ msgstr ""
+#~ "プリンター %s/%s の出力は、リモートプリンター %s (%s 上) に送られます"
+
+#~ msgid "Print file accepted - job ID %d."
+#~ msgstr "プリントファイルを受け付けました - ジョブ ID %d。"
+
+#~ msgid "Print file accepted - job ID unknown."
+#~ msgstr "NOTICE: プリントファイルを受け付けました - ジョブ ID 不明。"
+
+#~ msgid "Print file was not accepted."
+#~ msgstr "プリントファイルが受け付けられませんでした。"
+
+#~ msgid "Printing page %d, %d%% complete."
+#~ msgstr "ページ %d を印刷中、%d%% 完了しました。"
+
+#~ msgid "Purge Jobs"
+#~ msgstr "ジョブの削除"
+
+#~ msgid ""
+#~ "Rank   Owner      Pri  Job        Files                       Total Size"
+#~ msgstr ""
+#~ "ランク 所有者     優先 ジョブ     ファイル                    合計サイズ"
+
+#~ msgid "Stylus Color Series"
+#~ msgstr "Stylus Color シリーズ"
+
+#~ msgid "Stylus Photo Series"
+#~ msgstr "Stylus Photo シリーズ"
+
+#~ msgid ""
+#~ "The '%s' Job Description attribute cannot be supplied in a job creation "
+#~ "request."
+#~ msgstr "'%s' Job Description 属性はジョブ作成要求の中で指定できません。"
+
+#~ msgid "The output bin is almost full."
+#~ msgstr "排紙トレイがほとんど一杯です。"
+
+#~ msgid "The output bin is full."
+#~ msgstr "排紙トレイが一杯です。"
+
+#~ msgid "The output bin is missing."
+#~ msgstr "排紙トレイが見つかりません。"
+
+#~ msgid "The paper tray is almost empty."
+#~ msgstr "用紙トレイが空になりかけています。"
+
+#~ msgid "The paper tray is empty."
+#~ msgstr "用紙トレイが空です。"
+
+#~ msgid "The paper tray is missing."
+#~ msgstr "用紙トレイが見つかりません。"
+
+#~ msgid "The paper tray needs to be filled."
+#~ msgstr "用紙トレイに補充が必要です。"
+
+#~ msgid "The printer URI is incorrect or no longer exists."
+#~ msgstr "プリンター URI が誤っているか、もう存在しません。"
+
+#~ msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
+#~ msgstr "プリンターが IPP/%d.%d をサポートしていません。IPP/%s を試します。"
+
+#~ msgid "The printer is running low on ink."
+#~ msgstr "プリンターのインクがもうすぐなくなります。"
+
+#~ msgid "The printer is running low on toner."
+#~ msgstr "プリンターのトナーがもうすぐなくなります。"
+
+#~ msgid "There is a paper jam."
+#~ msgstr "用紙づまりが発生しています。"
+
+#~ msgid "Unable to create compressed print file"
+#~ msgstr "圧縮プリントファイルを作成できません"
+
+#~ msgid "Unable to generate compressed print file"
+#~ msgstr "圧縮プリントファイルを生成できません"
+
+#~ msgid "Unable to open compressed print file"
+#~ msgstr "圧縮プリントファイルを開けません"
+
+#~ msgid "Unable to resolve printer URI."
+#~ msgstr "プリンター URI を解決できません。"
+
+#~ msgid "Usage: cupsfilter [ options ] filename"
+#~ msgstr "使い方: cupsfilter [オプション] ファイル名"
+
+#~ msgid "Usage: lppasswd [-g groupname]"
+#~ msgstr "使い方: lppasswd [-g グループ名]"
+
+#~ msgid ""
+#~ "Usage: lppasswd [-g groupname] [username]\n"
+#~ "       lppasswd [-g groupname] -a [username]\n"
+#~ "       lppasswd [-g groupname] -x [username]"
+#~ msgstr ""
+#~ "使い方: lppasswd [-g グループ名] [ユーザー名]\n"
+#~ "        lppasswd [-g グループ名] -a [ユーザー名]\n"
+#~ "        lppasswd [-g グループ名] -x [ユーザー名]"
+
+#~ msgid ""
+#~ "Your password must be at least 6 characters long, cannot contain your "
+#~ "username, and must contain at least one letter and number."
+#~ msgstr ""
+#~ "パスワードは少なくとも 6 文字以上で、あなたのユーザー名を含んではならず、"
+#~ "少なくとも 1 つの英字および数値を含んでなければなりません。"
+
+#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
+#~ msgstr ""
+#~ "cupsd: launchd(8) サポートがコンパイルされていないので、通常モードで動作し"
+#~ "ます。"
+
+#~ msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
+#~ msgstr "ipptool: \"-i\" と \"-n\" は \"-X\" と組み合わせられません。"
+
+#~ msgid "ipptool: Bad version %s for \"-V\"."
+#~ msgstr "ipptool: \"-V\" オプションに不正なバージョン %s が指定されました。"
+
+#~ msgid "ipptool: Missing timeout for \"-T\"."
+#~ msgstr "ipptool: \"-T\" にタイムアウトの指定がありません。"
+
+#~ msgid "ipptool: Missing version for \"-V\"."
+#~ msgstr "ipptool: \"-V\" にバージョンの指定がありません。"
+
+#~ msgid "lppasswd: Only root can add or delete passwords."
+#~ msgstr "lppasswd: root だけがパスワードの追加と削除を行えます。"
+
+#~ msgid "lppasswd: Password file busy."
+#~ msgstr "lppasswd: パスワードファイルがビジー状態です。"
+
+#~ msgid "lppasswd: Password file not updated."
+#~ msgstr "lppasswd: パスワードファイルは更新されません。"
+
+#~ msgid "lppasswd: Sorry, password doesn't match."
+#~ msgstr "lppasswd: 残念ながら、パスワードがマッチしません。"
+
+#~ msgid "lppasswd: Sorry, password rejected."
+#~ msgstr "lppasswd: 残念ながら、パスワードは拒否されました。"
+
+#~ msgid "lppasswd: Sorry, passwords don't match."
+#~ msgstr "lppasswd: 残念ながら、パスワードがマッチしません。"
+
+#~ msgid "lppasswd: Unable to copy password string: %s"
+#~ msgstr "lppasswd: パスワード文字列をコピーできません: %s"
+
+#~ msgid "lppasswd: Unable to open password file: %s"
+#~ msgstr "lppasswd: パスワードファイルを開けません: %s"
+
+#~ msgid "lppasswd: Unable to write to password file: %s"
+#~ msgstr "lppasswd: パスワードファイルに書き込めません: %s"
+
+#~ msgid "lppasswd: failed to backup old password file: %s"
+#~ msgstr "lppasswd: 古いパスワードファイルのバックアップに失敗しました: %s"
+
+#~ msgid "lppasswd: failed to rename password file: %s"
+#~ msgstr "lppasswd: パスワードファイルの名前の変更に失敗しました: %s"
+
+#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
+#~ msgstr "lppasswd: ユーザー \"%s\" およびグループ \"%s\" は存在しません。"
index 517c1a4..88a618c 100644 (file)
 msgid ""
 msgstr ""
-"Project-Id-Version: CUPS 1.4\n"
+"Project-Id-Version: CUPS 2.0\n"
 "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2013-07-08 07:38-0400\n"
-"PO-Revision-Date: 2009-02-16 12:00-0800\n"
-"Last-Translator: Apple Inc.\n"
-"Language-Team: Apple Inc.\n"
-"Language: \n"
+"POT-Creation-Date: 2015-07-20 14:24-0400\n"
+"PO-Revision-Date: 2015-01-28 12:00-0800\n"
+"Last-Translator: Aleksandr Proklov\n"
+"Language-Team: 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 ""
+msgstr "\t\t(все)"
 
 msgid "\t\t(none)"
-msgstr ""
+msgstr "\t\t(нет)"
 
 #, c-format
 msgid "\t%d entries"
-msgstr ""
+msgstr "\tзаписей: %d"
 
 #, c-format
 msgid "\t%s"
-msgstr ""
+msgstr "\t%s"
 
 msgid "\tAfter fault: continue"
-msgstr ""
+msgstr "\tПосле ошибки: продолжить"
 
 #, c-format
 msgid "\tAlerts: %s"
-msgstr ""
+msgstr "\tПредупреждения: %s"
 
 msgid "\tBanner required"
-msgstr ""
+msgstr "\tТребуется баннер"
 
 msgid "\tCharset sets:"
-msgstr ""
+msgstr "\tНабор символов устанавливает:"
 
 msgid "\tConnection: direct"
-msgstr ""
+msgstr "\tПодключение: прямое"
 
 msgid "\tConnection: remote"
-msgstr ""
+msgstr "\tПодключение: удаленное"
 
 msgid "\tContent types: any"
-msgstr ""
+msgstr "\tТип содержимого: любой"
 
 msgid "\tDefault page size:"
-msgstr ""
+msgstr "\tРазмер страницы по умолчанию:"
 
 msgid "\tDefault pitch:"
-msgstr ""
+msgstr "\tВысота по умолчанию:"
 
 msgid "\tDefault port settings:"
-msgstr ""
+msgstr "\tНастройки порта по умолчанию:"
 
 #, c-format
 msgid "\tDescription: %s"
-msgstr ""
+msgstr "\tОписание: %s"
 
 msgid "\tForm mounted:"
-msgstr ""
+msgstr "\tФорма подключения:"
 
 msgid "\tForms allowed:"
-msgstr ""
+msgstr "\tРазрешенные формы:"
 
 #, c-format
 msgid "\tInterface: %s.ppd"
-msgstr ""
+msgstr "\tИнтерфейс: %s.ppd"
 
 #, c-format
 msgid "\tInterface: %s/interfaces/%s"
-msgstr ""
+msgstr "\tИнтерфейс: %s/интерфейсы/%s"
 
 #, c-format
 msgid "\tInterface: %s/ppd/%s.ppd"
-msgstr ""
+msgstr "\tИнтерфейс: %s/ppd/%s.ppd"
 
 #, c-format
 msgid "\tLocation: %s"
-msgstr ""
+msgstr "\tРасположение: %s"
 
 msgid "\tOn fault: no alert"
-msgstr ""
+msgstr "\tПри ошибке: не выводить предупреждение"
 
 msgid "\tPrinter types: unknown"
-msgstr ""
+msgstr "\tТип принтера: неизвестен"
 
 #, c-format
 msgid "\tStatus: %s"
-msgstr ""
+msgstr "\tСтатус: %s"
 
 msgid "\tUsers allowed:"
-msgstr ""
+msgstr "\tРазрешенные пользователи:"
 
 msgid "\tUsers denied:"
-msgstr ""
+msgstr "\tЗапрещенные пользователи:"
 
 msgid "\tdaemon present"
-msgstr ""
+msgstr "\tдемон присутствует"
 
 msgid "\tno entries"
-msgstr ""
+msgstr "\tнет записей"
 
 #, c-format
 msgid "\tprinter is on device '%s' speed -1"
-msgstr ""
+msgstr "\tпринтер на скорости -1 устройства «%s»"
 
 msgid "\tprinting is disabled"
-msgstr ""
+msgstr "\tпечать отключена"
 
 msgid "\tprinting is enabled"
-msgstr ""
+msgstr "\tпечать включена"
 
 #, c-format
 msgid "\tqueued for %s"
-msgstr ""
+msgstr "\tочередь для %s"
 
 msgid "\tqueuing is disabled"
-msgstr ""
+msgstr "\tочередь отключена"
 
 msgid "\tqueuing is enabled"
-msgstr ""
+msgstr "\tочередь включена"
 
 msgid "\treason unknown"
-msgstr ""
+msgstr "\tпричина неизвестна"
 
 msgid ""
 "\n"
 "    DETAILED CONFORMANCE TEST RESULTS"
 msgstr ""
+"\n"
+"    ПОДРОБНЫЕ РЕЗУЛЬТАТЫ ТЕСТА СООТВЕТСТВИЯ"
 
 msgid "                          Ignore specific warnings."
-msgstr ""
+msgstr "                Игнорировать конкретные предупреждения"
 
 msgid "                          Issue warnings instead of errors."
-msgstr ""
+msgstr "                     Выдавать предупреждения вместо ошибки"
 
 msgid "                REF: Page 15, section 3.1."
-msgstr ""
+msgstr "                REF: Стр. 15, раздел 3.1."
 
 msgid "                REF: Page 15, section 3.2."
-msgstr ""
+msgstr "                REF: Стр. 15, раздел 3.2."
 
 msgid "                REF: Page 19, section 3.3."
-msgstr ""
+msgstr "                REF: Стр. 19, раздел 3.3."
 
 msgid "                REF: Page 20, section 3.4."
-msgstr ""
+msgstr "                REF: Стр. 20, раздел 3.4."
 
 msgid "                REF: Page 27, section 3.5."
-msgstr ""
+msgstr "                REF: Стр. 27, раздел 3.5."
 
 msgid "                REF: Page 42, section 5.2."
-msgstr ""
+msgstr "                REF: Стр. 42, раздел 5.2."
 
 msgid "                REF: Pages 16-17, section 3.2."
-msgstr ""
+msgstr "                REF: Стр. 16-17, раздел 3.2."
 
 msgid "                REF: Pages 42-45, section 5.2."
-msgstr ""
+msgstr "                REF: Стр. 42-45, раздел 5.2."
 
 msgid "                REF: Pages 45-46, section 5.2."
-msgstr ""
+msgstr "                REF: Стр. 45-46, раздел 5.2."
 
 msgid "                REF: Pages 48-49, section 5.2."
-msgstr ""
+msgstr "                REF: Стр. 48-49, раздел 5.2."
 
 msgid "                REF: Pages 52-54, section 5.2."
-msgstr ""
+msgstr "                REF: Стр. 52-54, раздел 5.2."
 
 #, c-format
 msgid "        %-39.39s %.0f bytes"
-msgstr ""
+msgstr "        %-39.39s %.0f байт"
 
 #, c-format
 msgid "        PASS    Default%s"
-msgstr ""
+msgstr "        PASS    Default%s"
 
 msgid "        PASS    DefaultImageableArea"
-msgstr ""
+msgstr "        PASS    DefaultImageableArea"
 
 msgid "        PASS    DefaultPaperDimension"
-msgstr ""
+msgstr "        PASS    DefaultPaperDimension"
 
 msgid "        PASS    FileVersion"
-msgstr ""
+msgstr "        PASS    FileVersion"
 
 msgid "        PASS    FormatVersion"
-msgstr ""
+msgstr "        PASS    FormatVersion"
 
 msgid "        PASS    LanguageEncoding"
-msgstr ""
+msgstr "        PASS    LanguageEncoding"
 
 msgid "        PASS    LanguageVersion"
-msgstr ""
+msgstr "        PASS    LanguageVersion"
 
 msgid "        PASS    Manufacturer"
-msgstr ""
+msgstr "        PASS    Manufacturer"
 
 msgid "        PASS    ModelName"
-msgstr ""
+msgstr "        PASS    ModelName"
 
 msgid "        PASS    NickName"
-msgstr ""
+msgstr "        PASS    NickName"
 
 msgid "        PASS    PCFileName"
-msgstr ""
+msgstr "        PASS    PCFileName"
 
 msgid "        PASS    PSVersion"
-msgstr ""
+msgstr "        PASS    PSVersion"
 
 msgid "        PASS    PageRegion"
-msgstr ""
+msgstr "        PASS    PageRegion"
 
 msgid "        PASS    PageSize"
-msgstr ""
+msgstr "        PASS    PageSize"
 
 msgid "        PASS    Product"
-msgstr ""
+msgstr "        PASS    Product"
 
 msgid "        PASS    ShortNickName"
-msgstr ""
+msgstr "        PASS    ShortNickName"
 
 #, c-format
 msgid "        WARN    %s has no corresponding options."
-msgstr ""
+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 ""
@@ -240,144 +244,169 @@ msgid ""
 "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 ""
+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 ""
+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."
 
 msgid "       cupsaddsmb [options] -a"
-msgstr ""
+msgstr "\tcupsaddsmb [options] -a"
 
 msgid "       cupstestdsc [options] -"
-msgstr ""
+msgstr "\tcupstestdsc [options] -"
 
 msgid "       program | cupstestppd [options] -"
-msgstr ""
+msgstr "\tprogram | cupstestppd [options] -"
 
 #, 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 ""
+msgstr "\t%s  %s %s не существует."
 
 #, c-format
 msgid "      %s  %s file \"%s\" has the wrong capitalization."
-msgstr ""
+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 ""
+msgstr "\t%s Неверный перевод UTF-8 \"%s\" для параметра %s, выбора %s"
 
 #, c-format
 msgid "      %s  Bad UTF-8 \"%s\" translation string for option %s."
-msgstr ""
+msgstr "\t%s Неверный перевод UTF-8 \"%s\" для параметра %s"
 
 #, c-format
 msgid "      %s  Bad cupsFilter value \"%s\"."
-msgstr ""
+msgstr "\t%s Неверное значение cupsFilter \"%s\"."
 
 #, c-format
 msgid "      %s  Bad cupsFilter2 value \"%s\"."
-msgstr ""
+msgstr "\t%s Неверное значение cupsFilter2 \"%s\"."
 
 #, c-format
 msgid "      %s  Bad cupsICCProfile %s."
-msgstr ""
+msgstr "\t%s Неверный cupsICCProfile %s."
 
 #, c-format
 msgid "      %s  Bad cupsPreFilter value \"%s\"."
-msgstr ""
+msgstr "\t%s Неверное значение cupsPreFilter \"%s\"."
 
 #, c-format
 msgid "      %s  Bad cupsUIConstraints %s: \"%s\""
-msgstr ""
+msgstr "\t%s Неверное значение cupsUIConstraints %s: \"%s\""
 
 #, c-format
 msgid "      %s  Bad language \"%s\"."
-msgstr ""
+msgstr "\t%s Неверный язык \"%s\"."
 
 #, c-format
 msgid "      %s  Bad permissions on %s file \"%s\"."
-msgstr ""
+msgstr "\t%s Неверные права %s для файла \"%s\"."
 
 #, c-format
 msgid "      %s  Bad spelling of %s - should be %s."
-msgstr ""
+msgstr "      %s Ошибки в %s - должно быть %s."
 
 #, c-format
 msgid "      %s  Cannot provide both APScanAppPath and APScanAppBundleID."
-msgstr ""
+msgstr "\t%s Невозможно предоставить APScanAppPath и APScanAppBundleID вместе."
 
 #, c-format
 msgid "      %s  Default choices conflicting."
-msgstr ""
+msgstr "\t%s\tЗначения, используемые по умолчанию, конфликтуют."
 
 #, c-format
 msgid "      %s  Empty cupsUIConstraints %s"
-msgstr ""
+msgstr "      %s Пустой cupsUIConstraints %s"
 
 #, c-format
 msgid "      %s  Missing \"%s\" translation string for option %s, choice %s."
-msgstr ""
+msgstr "\t%s Перевод \"%s\" отсутствует для параметра %s, выбора %s"
 
 #, c-format
 msgid "      %s  Missing \"%s\" translation string for option %s."
@@ -385,218 +414,266 @@ msgstr ""
 
 #, c-format
 msgid "      %s  Missing %s file \"%s\"."
-msgstr ""
+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 ""
+msgstr "      %s Выбор *%s %s отсутствует в UIConstraints \"*%s %s *%s %s\"."
 
 #, c-format
 msgid "      %s  Missing choice *%s %s in cupsUIConstraints %s: \"%s\""
-msgstr ""
+msgstr "      %s Выбор *%s %s отсутствует в cupsUIConstraints %s: \"%s\""
 
 #, c-format
 msgid "      %s  Missing cupsUIResolver %s"
-msgstr ""
+msgstr "\t%s cupsUIResolver отсутствует %s"
 
 #, c-format
 msgid "      %s  Missing option %s in UIConstraints \"*%s %s *%s %s\"."
-msgstr ""
+msgstr "\t%s Отсутствует параметр %s у UIConstraints \"*%s %s *%s %s\"."
 
 #, c-format
 msgid "      %s  Missing option %s in cupsUIConstraints %s: \"%s\""
-msgstr ""
+msgstr "\t%s Отсутствует параметр %s у cupsUIConstraints %s: \"%s\""
 
 #, c-format
 msgid "      %s  No base translation \"%s\" is included in file."
-msgstr ""
+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\n"
 
 #, c-format
 msgid "      %s  Size \"%s\" defined for %s but not for %s."
-msgstr ""
+msgstr "\t%s Размер \"%s\" определен для %s, но не определен для %s."
 
 #, c-format
 msgid "      %s  Size \"%s\" has unexpected dimensions (%gx%g)."
-msgstr ""
+msgstr "\t%s  Размер \"%s\"  имеет неверное значение (%gx%g)."
 
 #, c-format
 msgid "      %s  Size \"%s\" should be \"%s\"."
-msgstr ""
+msgstr "\t%s  Размер \"%s\" должен быть \"%s\"."
 
 #, c-format
 msgid "      %s  Size \"%s\" should be the Adobe standard name \"%s\"."
-msgstr ""
+msgstr "\t%s  Размер \"%s\" должен быть в формате Adobe standard name \"%s\"."
 
 #, c-format
 msgid "      %s  cupsICCProfile %s hash value collides with %s."
-msgstr ""
+msgstr "\tХеш-значение %s cupsICCProfile %s конфликтует с %s."
 
 #, c-format
 msgid "      %s  cupsUIResolver %s causes a loop."
-msgstr ""
+msgstr "\t%s cupsUIResolver %s создает цикл."
 
 #, c-format
 msgid ""
 "      %s  cupsUIResolver %s does not list at least two different options."
-msgstr ""
+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 ""
+msgstr "\t**FAIL**  Неверный LanguageEncoding %s - должен быть ISOLatin1."
 
 #, c-format
 msgid "      **FAIL**  Bad LanguageVersion %s - must be English."
-msgstr ""
+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 ""
+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 ""
+msgstr "\t**FAIL** Имена групп %s и %s отличаются только регистром символов."
 
 #, c-format
 msgid "      **FAIL**  Multiple occurrences of option %s choice name %s."
-msgstr ""
+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 ""
@@ -604,57 +681,81 @@ msgid ""
 "                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 ""
@@ -662,56 +763,73 @@ msgid ""
 "                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 ""
+msgstr "\t**FAIL**  Не удается открыть PPD-файл – %s в строке %d."
 
 #, c-format
 msgid "    %d ERRORS FOUND"
-msgstr ""
+msgstr "    ОБНАРУЖЕНО ОШИБОК: %d"
 
 msgid "    -h       Show program usage"
-msgstr ""
+msgstr "    -h       Показать справку по использованию программы"
 
 #, c-format
 msgid ""
 "    Bad %%%%BoundingBox: on line %d.\n"
 "        REF: Page 39, %%%%BoundingBox:"
 msgstr ""
+"    Неверный %%%%BoundingBox: в строке %d\n"
+"        REF: Стр. 39, %%%%BoundingBox:"
 
 #, c-format
 msgid ""
 "    Bad %%%%Page: on line %d.\n"
 "        REF: Page 53, %%%%Page:"
 msgstr ""
+"    Неверная %%%%Page: в строке %d\n"
+"        REF: Стр. 53, %%%%Page:"
 
 #, c-format
 msgid ""
 "    Bad %%%%Pages: on line %d.\n"
 "        REF: Page 43, %%%%Pages:"
 msgstr ""
+"    Неверная %%%%Pages: в строке %d\n"
+"        REF: Стр. 43, %%%%Pages:"
 
 #, c-format
 msgid ""
 "    Line %d is longer than 255 characters (%d).\n"
 "        REF: Page 25, Line Length"
 msgstr ""
+"    Длина строки %d больше 255 символов (%d)\n"
+"        REF: Стр. 25, Длина строки "
 
 msgid ""
 "    Missing %!PS-Adobe-3.0 on first line.\n"
 "        REF: Page 17, 3.1 Conforming Documents"
 msgstr ""
+"    %!PS-Adobe-3.0 отсутствует в первой строке.\n"
+"        REF: Стр. 17, 3.1 Соответствующие документы"
 
 #, c-format
 msgid "    Missing %%EndComments comment.        REF: Page 41, %%EndComments"
@@ -722,558 +840,1110 @@ msgid ""
 "    Missing or bad %%BoundingBox: comment.\n"
 "        REF: Page 39, %%BoundingBox:"
 msgstr ""
+"    Отсутствует или неверный %%BoundingBox: комментарий.\n"
+"        REF: Стр. 39, %%BoundingBox:"
 
 #, c-format
 msgid ""
 "    Missing or bad %%Page: comments.\n"
 "        REF: Page 53, %%Page:"
 msgstr ""
+"    Отсутствует или неверная %%Page: комментарий.\n"
+"        REF: Стр. 53, %%Page:"
 
 #, c-format
 msgid ""
 "    Missing or bad %%Pages: comment.\n"
 "        REF: Page 43, %%Pages:"
 msgstr ""
+"    Отсутствуют или неверные %%Pages:  комментарий.\n"
+"        REF: Стр. 43, %%Pages:"
 
 msgid "    NO ERRORS FOUND"
-msgstr ""
+msgstr "    ОШИБОК НЕ ОБНАРУЖЕНО"
 
 #, c-format
 msgid "    Saw %d lines that exceeded 255 characters."
-msgstr ""
+msgstr "\tНайдено %d строк, длина которых превышает 255 символов."
 
 #, c-format
 msgid "    Too many %%BeginDocument comments."
-msgstr ""
+msgstr "\tСлишком много комментариев %%BeginDocument"
 
 #, c-format
 msgid "    Too many %%EndDocument comments."
-msgstr ""
+msgstr "\tСлишком много комментариев %%EndDocument"
 
 msgid "    Warning: file contains binary data."
-msgstr ""
+msgstr "\tWARNING: файл содержит бинарные данные."
 
 #, c-format
 msgid "    Warning: no %%EndComments comment in file."
-msgstr ""
+msgstr "    WARNING: нет комментария %%EndComments в файле."
 
 #, c-format
 msgid "    Warning: obsolete DSC version %.1f in file."
-msgstr ""
+msgstr "    WARNING: устаревшая версия DSC %.1f в файле."
+
+msgid "  ! expression            Unary NOT of expression."
+msgstr "  ! expression            Логическое NOT для выражения."
+
+msgid "  ( expressions )         Group expressions."
+msgstr "  ( expressions )         Группа выражений."
 
 msgid "  --[no-]debug-logging    Turn debug logging on/off."
-msgstr ""
+msgstr "  --[no-]debug-logging    Вкл./откл. ведение журнала."
 
 msgid "  --[no-]remote-admin     Turn remote administration on/off."
-msgstr ""
+msgstr "  --[no-]remote-admin     Вкл./откл. удаленное администрирование."
 
 msgid "  --[no-]remote-any       Allow/prevent access from the Internet."
-msgstr ""
+msgstr "  --[no-]remote-any       Разрешается/запрещается доступ из Интернет."
 
 msgid "  --[no-]share-printers   Turn printer sharing on/off."
 msgstr ""
+"  --[no-]share-printers   Вкл./откл. совместное использование принтеров."
 
 msgid "  --[no-]user-cancel-any  Allow/prevent users to cancel any job."
 msgstr ""
+"  --[no-]user-cancel-any  Пользователям разрешается/запрещается отменять "
+"задания."
 
 msgid "  --cr                    End lines with CR (Mac OS 9)."
-msgstr ""
+msgstr "  --cr                    Строки заканчиваются на CR (Mac OS 9)."
 
 msgid "  --crlf                  End lines with CR + LF (Windows)."
+msgstr "  --crlf                  Строки заканчиваются на CR + LF (Windows)."
+
+msgid "  --domain regex          Match domain to regular expression."
+msgstr "  --domain regex          Искать домен по регулярному выражению."
+
+msgid ""
+"  --exec utility [argument ...] ;\n"
+"                          Execute program if true."
 msgstr ""
+"  --exec utility [argument ...] ;\n"
+"                          Выполнить программу."
+
+msgid "  --false                 Always false."
+msgstr "  --false                 Всегда Ложь."
+
+msgid "  --help                  Show help."
+msgstr "  --help                  Показать справку."
+
+msgid "  --help                  Show this help."
+msgstr "  --help                  Показать эту справку."
+
+msgid "  --host regex            Match hostname to regular expression."
+msgstr "  --host regex            Найти hostname по регулярному выражению."
 
 msgid "  --lf                    End lines with LF (UNIX/Linux/OS X)."
 msgstr ""
+"  --lf                    Строки заканчиваются на LF (UNIX/Linux/Mac OS X)."
 
-msgid "  -4                      Connect using IPv4."
+msgid "  --list-filters          List filters that will be used."
 msgstr ""
+"  --list-filters          Список фильтров которые должны использоваться."
 
-msgid "  -6                      Connect using IPv6."
+msgid "  --local                 True if service is local."
+msgstr "  --local                 \"Истина\" если сервис локальный."
+
+msgid "  --ls                    List attributes."
+msgstr "  --ls                    Список атрибутов."
+
+msgid "  --name regex            Match service name to regular expression."
+msgstr "  --name regex            Найти имя по регулярному выражению."
+
+msgid "  --not expression        Unary NOT of expression."
+msgstr "  --not expression        Логическое NOT для выражения."
+
+msgid "  --path regex            Match resource path to regular expression."
+msgstr ""
+"  --path regex            Найти путь к ресурсу по регулярному выражению."
+
+msgid "  --port number[-number]  Match port to number or range."
+msgstr ""
+"  --port number[-number]  Найти номер порта по номеру или диапазону портов."
+
+msgid "  --print                 Print URI if true."
+msgstr "  --print                 Печать URI при соответствии."
+
+msgid "  --print-name            Print service name if true."
+msgstr "  --print-name            Печать имени сервиса если соответствует."
+
+msgid "  --quiet                 Quietly report match via exit code."
+msgstr ""
+"  --quiet                 Кратко уведомлять о совпадении через код выхода."
+
+msgid "  --remote                True if service is remote."
+msgstr "  --remote                \"Истина\" если сервис удаленный."
+
+msgid ""
+"  --stop-after-include-error\n"
+"                          Stop tests after a failed INCLUDE."
 msgstr ""
+"  --stop-after-include-error\n"
+"                          Останавливать проверку после ошибки INCLUDE."
+
+msgid "  --true                  Always true."
+msgstr "  --true                  Всегда Истина."
+
+msgid "  --txt key               True if the TXT record contains the key."
+msgstr "  --txt key               \"Истина\" если TXT запись содержит key."
+
+msgid "  --txt-* regex           Match TXT record key to regular expression."
+msgstr "  --txt-* regex           Найти запись TXT по регулярному выражению."
+
+msgid "  --uri regex             Match URI to regular expression."
+msgstr "  --uri regex             Найти URI по регулярному выражению."
+
+msgid "  --version               Show program version."
+msgstr "  --version               Показать версию программы."
+
+msgid "  --version               Show version."
+msgstr "  --version               Показать версию."
+
+msgid "  -4                      Connect using IPv4."
+msgstr "  -4                      Соединение используя IPv4."
+
+msgid "  -6                      Connect using IPv6."
+msgstr "  -6                      Соединение используя IPv6."
 
 msgid "  -C                      Send requests using chunking (default)."
 msgstr ""
+"  -C                      Передача запроса с использованием chunking (по "
+"умолчанию)"
 
 msgid "  -D                      Remove the input file when finished."
-msgstr ""
+msgstr "  -D                      Удалить входной файл после завершения."
 
 msgid "  -D name=value           Set named variable to value."
-msgstr ""
+msgstr "  -D name=value           Определение переменной."
 
 msgid "  -E                      Encrypt the connection."
-msgstr ""
+msgstr "  -E                      Подключение к серверу шифруется."
 
 msgid "  -E                      Test with HTTP Upgrade to TLS."
-msgstr ""
+msgstr "  -E                      Проверять что HTTP использует TLS."
 
 msgid ""
 "  -F                      Run in the foreground but detach from console."
 msgstr ""
+"  -F                      Запускать с высоким приоритетом и отдельно от "
+"консоли."
 
 msgid "  -H samba-server         Use the named SAMBA server."
-msgstr ""
+msgstr "  -H samba-server         Использовать заданный сервер SAMBA."
 
 msgid "  -I                      Ignore errors."
-msgstr ""
+msgstr "  -I                      Игнорировать ошибки."
 
 msgid "  -I include-dir          Add include directory to search path."
-msgstr ""
+msgstr "  -I include-dir          Добавить каталог include в путь поиска."
 
 msgid "  -I {filename,filters,none,profiles}"
-msgstr ""
+msgstr "  -I {filename,filters,none,profiles}"
 
 msgid "  -L                      Send requests using content-length."
 msgstr ""
+"  -L                      Передача запроса с использованием content-length."
+
+msgid ""
+"  -P filename.plist       Produce XML plist to a file and test report to "
+"standard output."
+msgstr ""
+"  -P filename.plist       Вывести XML plist в файл и проверить результат на "
+"стандартном выводе."
 
 msgid "  -P filename.ppd         Set PPD file."
+msgstr "  -P filename.ppd         Задать PPD-файл."
+
+msgid "  -P number[-number]      Match port to number or range."
 msgstr ""
+"  -P number[-number]      Найти номер порта по номеру или диапазону портов."
 
 msgid "  -R root-directory       Set alternate root."
-msgstr ""
+msgstr "  -R root-directory       Задать корневой каталог."
 
 msgid "  -S                      Test with SSL encryption."
-msgstr ""
+msgstr "  -S                      Проверять шифрование SSL."
+
+msgid "  -T seconds              Set the browse timeout in seconds."
+msgstr "  -T seconds              Задать время ожидания в секундах."
 
 msgid "  -T seconds              Set the receive/send timeout in seconds."
 msgstr ""
+"  -T seconds              Задать время ожидания приема/передачи в секундах."
 
 msgid "  -U username             Specify username."
-msgstr ""
+msgstr "  -U username             Указание имени пользователя."
 
 msgid "  -V version              Set default IPP version."
-msgstr ""
+msgstr "  -V version              Задать версию IPP по умолчанию."
 
 msgid ""
 "  -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,"
 "translations}"
 msgstr ""
+"  -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,"
+"translations}"
 
 msgid "  -X                      Produce XML plist instead of plain text."
-msgstr ""
+msgstr "  -X                      Выводить XML plist вместо обычного текста."
+
+msgid "  -a                      Browse for all services."
+msgstr "  -a                      Обзор всех сервисов."
 
 msgid "  -a                      Export all printers."
-msgstr ""
+msgstr "  -a                      Экспорт всех принтеров."
+
+msgid "  -c                      Produce CSV output."
+msgstr "  -c                      Вывод в формате CSV."
 
 msgid "  -c catalog.po           Load the specified message catalog."
-msgstr ""
+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 "  -c cupsd.conf           Set cupsd.conf file to use."
-msgstr ""
+msgstr "  -c cupsd.conf           Использовать заданный cupsd.conf"
+
+msgid "  -d domain               Browse/resolve in specified domain."
+msgstr "  -d domain               Просмотр в заданном домене."
 
 msgid "  -d name=value           Set named variable to value."
-msgstr ""
+msgstr "  -d name=value           Указанной переменной присваивается значение."
 
 msgid "  -d output-dir           Specify the output directory."
-msgstr ""
+msgstr "  -d output-dir           Задать выходной каталог."
 
 msgid "  -d printer              Use the named printer."
-msgstr ""
+msgstr "  -d printer              Использовать заданный принтер."
+
+msgid "  -d regex                Match domain to regular expression."
+msgstr "  -d regex                Искать домен по регулярному выражению."
 
 msgid "  -e                      Use every filter from the PPD file."
-msgstr ""
+msgstr "  -e                      Использовать каждый фильтр из PPD-файла."
 
 msgid "  -f                      Run in the foreground."
-msgstr ""
+msgstr "  -f                      Запускать с высоким приоритетом."
 
 msgid "  -f filename             Set default request filename."
-msgstr ""
+msgstr "  -f filename             Задать имя файла по умолчанию."
 
 msgid "  -h                      Show this usage message."
-msgstr ""
+msgstr "  -h                      Show this usage message."
+
+msgid "  -h regex                Match hostname to regular expression."
+msgstr "  -h regex                Найти hostname по регулярному выражению."
 
 msgid "  -h server[:port]        Specify server address."
-msgstr ""
+msgstr "  -h server[:port]        Задать адрес и порт сервера."
 
 msgid "  -i mime/type            Set input MIME type (otherwise auto-typed)."
 msgstr ""
+"  -i mime/type            Указать MIME-тип данных на входе (иначе "
+"автоопред.)."
 
 msgid ""
 "  -i seconds              Repeat the last file with the given time interval."
 msgstr ""
+"  -i seconds              Повтор последнего файла через заданный интервал в "
+"сек."
 
 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                      Run cupsd from launchd(8)."
-msgstr ""
+msgid "  -l                      List attributes."
+msgstr "  -l                      Список атрибутов."
+
+msgid "  -l                      Produce plain text output."
+msgstr "  -l                      Вывод в формате простого текста."
+
+msgid "  -l                      Run cupsd on demand."
+msgstr "  -l                      Запускать cupsd по запросу."
 
 msgid "  -l lang[,lang,...]      Specify the output language(s) (locale)."
-msgstr ""
+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 ""
+msgstr "  -n copies               Указать количество копий."
 
 msgid ""
 "  -n count                Repeat the last file the given number of times."
-msgstr ""
+msgstr "  -n count                Повтор последнего файла заданное число раз."
+
+msgid "  -n regex                Match service name to regular expression."
+msgstr "  -n regex                Найти имя по регулярному выражению."
 
 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 ""
+msgstr "  -o filename.ppd[.gz]    Задать выходной файл (иначе stdout)."
 
 msgid "  -o name=value           Set option(s)."
-msgstr ""
+msgstr "  -o name=value           Задать параметры."
+
+msgid "  -p                      Print URI if true."
+msgstr "  -p                      Печать URI при соответствии."
 
 msgid "  -p filename.ppd         Set PPD file."
+msgstr "  -p filename.ppd         Задать PPD-файл."
+
+msgid "  -p program              Run specified program for each service."
+msgstr "  -p program              Запустить указанную программу."
+
+msgid "  -q                      Quietly report match via exit code."
 msgstr ""
+"  -q                      Кратко уведомлять о совпадении через код выхода."
 
 msgid "  -q                      Run silently."
-msgstr ""
+msgstr "  -q                      Команда выполняется в «тихом» режиме."
+
+msgid "  -r                      True if service is remote."
+msgstr "  -r                      \"Истина\" если сервис удаленный."
 
 msgid "  -r                      Use 'relaxed' open mode."
-msgstr ""
+msgstr "  -r                      Используется открытый режим."
+
+msgid "  -s                      Print service name if true."
+msgstr "  -s                      Печать имени сервиса если соответствует."
 
 msgid "  -t                      Produce a test report."
-msgstr ""
+msgstr "  -t                      Создать тестовый отчет."
 
 msgid "  -t                      Test PPDs instead of generating them."
-msgstr ""
+msgstr "  -t                      Тест PPDs вместо его создания."
 
 msgid "  -t                      Test the configuration file."
-msgstr ""
+msgstr "  -t                      Проверка файла конфигурации."
+
+msgid "  -t key                  True if the TXT record contains the key."
+msgstr "  -t key                  \"Истина\" если TXT запись содержит key."
 
 msgid "  -t title                Set title."
-msgstr ""
+msgstr "  -t title                Задать заголовок."
+
+msgid "  -t type                 Browse/resolve with specified type."
+msgstr "  -t type                 Просмотр/определение по указанному типу."
 
 msgid "  -u                      Remove the PPD file when finished."
-msgstr ""
+msgstr "  -u                      Удалить PPD-файл после завершения."
+
+msgid "  -u regex                Match URI to regular expression."
+msgstr "  -u regex                Найти URI по регулярному выражению."
 
 msgid "  -v                      Be verbose."
-msgstr ""
+msgstr "  -v                      Подробный вывод лога."
 
 msgid "  -vv                     Be very verbose."
+msgstr "  -vv                     Очень подробный вывод лога."
+
+msgid ""
+"  -x utility [argument ...] ;\n"
+"                          Execute program if true."
 msgstr ""
+"  -x utility [argument ...] ;\n"
+"                          Выполнить программу."
 
 msgid "  -z                      Compress PPD files using GNU zip."
+msgstr "  -z                      Сжимать PPD-файл используя GNU zip."
+
+msgid "  IPPFIND_SERVICE_DOMAIN  Domain name"
+msgstr "  IPPFIND_SERVICE_DOMAIN  Имя домена"
+
+msgid ""
+"  IPPFIND_SERVICE_HOSTNAME\n"
+"                          Fully-qualified domain name"
 msgstr ""
+"  IPPFIND_SERVICE_HOSTNAME\n"
+"                          Полный путь с учетом домена"
 
-msgid " FAIL"
+msgid "  IPPFIND_SERVICE_NAME    Service instance name"
+msgstr "  IPPFIND_SERVICE_NAME    Имя сервиса"
+
+msgid "  IPPFIND_SERVICE_PORT    Port number"
+msgstr "  IPPFIND_SERVICE_PORT    Номер порта"
+
+msgid "  IPPFIND_SERVICE_REGTYPE DNS-SD registration type"
+msgstr "  IPPFIND_SERVICE_REGTYPE Тип регистрации DNS-SD"
+
+msgid "  IPPFIND_SERVICE_SCHEME  URI scheme"
+msgstr "  IPPFIND_SERVICE_SCHEME  Схема URI"
+
+msgid "  IPPFIND_SERVICE_URI     URI"
+msgstr "  IPPFIND_SERVICE_URI     URI"
+
+msgid "  IPPFIND_TXT_*           Value of TXT record key"
+msgstr "  IPPFIND_TXT_*           Значение TXT записи key"
+
+msgid ""
+"  expression --and expression\n"
+"                          Logical AND."
 msgstr ""
+"  expression --and expression\n"
+"                          Логическое И."
 
-msgid " PASS"
+msgid ""
+"  expression --or expression\n"
+"                          Logical OR."
 msgstr ""
+"  expression --or expression\n"
+"                          Логическое ИЛИ."
+
+msgid "  expression expression   Logical AND."
+msgstr "  expression expression   Логическое И."
+
+msgid "  {service_domain}        Domain name"
+msgstr "  {service_domain}        Имя домена"
+
+msgid "  {service_hostname}      Fully-qualified domain name"
+msgstr "  {service_hostname}      Полный путь с учетом домена"
+
+msgid "  {service_name}          Service instance name"
+msgstr "  {service_name}          Имя сервиса"
+
+msgid "  {service_port}          Port number"
+msgstr "  {service_port}          Номер порта"
+
+msgid "  {service_regtype}       DNS-SD registration type"
+msgstr "  {service_regtype}       Тип регистрации DNS-SD"
+
+msgid "  {service_scheme}        URI scheme"
+msgstr "  {service_scheme}        Схема URI"
+
+msgid "  {service_uri}           URI"
+msgstr "  {service_uri}           URI"
+
+msgid "  {txt_*}                 Value of TXT record key"
+msgstr "  {txt_*}                 Значение TXT записи key"
+
+msgid "  {}                      URI"
+msgstr "  {}                      URI"
+
+msgid " FAIL"
+msgstr " FAIL"
+
+msgid " PASS"
+msgstr " PASS"
 
 #, c-format
-msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"
+msgid "\"%s\": Bad URI value \"%s\" - %s (RFC 2911 section 4.1.5)."
+msgstr "\"%s\": Неправильное значение URI \"%s\" - %s (RFC 2911 раздел 4.1.5)."
+
+#, c-format
+msgid "\"%s\": Bad URI value \"%s\" - bad length %d (RFC 2911 section 4.1.5)."
 msgstr ""
+"\"%s\": Неправильное значение URI \"%s\" - ошибка длины %d (RFC 2911 раздел "
+"4.1.5)."
 
 #, c-format
-msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes"
+msgid "\"%s\": Bad attribute name - bad length %d (RFC 2911 section 4.1.3)."
 msgstr ""
+"\"%s\": Неправильный атрибут имени - ошибка длины %d (RFC 2911 раздел 4.1.3)."
 
 #, c-format
-msgid "%s accepting requests since %s"
+msgid ""
+"\"%s\": Bad attribute name - invalid character (RFC 2911 section 4.1.3)."
 msgstr ""
+"\"%s\": Неправильный атрибут имени - недопустимый символ (RFC 2911 раздел "
+"4.1.3)."
 
 #, c-format
-msgid "%s cannot be changed."
-msgstr "%s не может быть изменен."
+msgid "\"%s\": Bad boolen value %d (RFC 2911 section 4.1.11)."
+msgstr "\"%s\": Неправильное двоичное значение %d (RFC 2911 раздел 4.1.11)."
 
 #, c-format
-msgid "%s is not implemented by the CUPS version of lpc."
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad characters (RFC 2911 section 4.1.7)."
 msgstr ""
+"\"%s\": Неправильное символьное значение \"%s\" - недопустимые символы (RFC "
+"2911 раздел 4.1.7)."
 
 #, c-format
-msgid "%s is not ready"
+msgid ""
+"\"%s\": Bad charset value \"%s\" - bad length %d (RFC 2911 section 4.1.7)."
 msgstr ""
+"\"%s\": Неправильное символьное значение \"%s\" - ошибка длины %d (RFC 2911 "
+"раздел 4.1.7)."
 
 #, c-format
-msgid "%s is ready"
+msgid "\"%s\": Bad dateTime UTC hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime UTC часов %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime UTC минут %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime UTC sign '%c' (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime UTC sign '%c' (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime day %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime дни %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime deciseconds %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime миллисекунды %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime hours %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime часы %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime minutes %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime минуты %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime month %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime месяц %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad dateTime seconds %u (RFC 2911 section 4.1.14)."
+msgstr "\"%s\": Ошибка в dateTime секунды %u (RFC 2911 раздел 4.1.14)."
+
+#, c-format
+msgid "\"%s\": Bad enum value %d - out of range (RFC 2911 section 4.1.4)."
 msgstr ""
+"\"%s\": Ошибка в значении %d - за пределами диапазона (RFC 2911 раздел "
+"4.1.4)."
 
 #, c-format
-msgid "%s is ready and printing"
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 2911 section 4.1.3)."
 msgstr ""
+"\"%s\": Ошибка в значении \"%s\" - неправильная длина %d (RFC 2911 раздел "
+"4.1.3)."
 
 #, c-format
-msgid "%s job-id user title copies options [file]"
+msgid ""
+"\"%s\": Bad keyword value \"%s\" - invalid character (RFC 2911 section "
+"4.1.3)."
 msgstr ""
+"\"%s\": Ошибка в значении \"%s\" - недопустимый символ (RFC 2911 раздел "
+"4.1.3)."
 
 #, c-format
-msgid "%s not accepting requests since %s -"
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 2911 section "
+"4.1.9)."
 msgstr ""
+"\"%s\": Ошибка mimeMediaType значение \"%s\" - недопустимые символы (RFC "
+"2911  раздел 4.1.9)."
 
 #, c-format
-msgid "%s not supported."
+msgid ""
+"\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.9)."
 msgstr ""
+"\"%s\": Ошибка mimeMediaType значение \"%s\" - неправильная длина %d (RFC "
+"2911 раздел 4.1.9)."
 
 #, c-format
-msgid "%s/%s accepting requests since %s"
+msgid ""
+"\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.2)."
 msgstr ""
+"\"%s\": Неправильное имя \"%s\" - ошибка в UTF-8 (RFC 2911 раздел 4.1.2)."
 
 #, c-format
-msgid "%s/%s not accepting requests since %s -"
+msgid "\"%s\": Bad name value \"%s\" - bad length %d (RFC 2911 section 4.1.2)."
 msgstr ""
+"\"%s\": Неправильное имя \"%s\" - неправильная длина %d (RFC 2911 раздел "
+"4.1.2)."
 
 #, c-format
-msgid "%s: %-33.33s [job %d localhost]"
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": Ошибка naturalLanguage значение \"%s\" - недопустимые символы (RFC "
+"2911 раздел 4.1.8)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 2911 section "
+"4.1.8)."
+msgstr ""
+"\"%s\": Ошибка naturalLanguage значение \"%s\" - неправильная длина %d (RFC "
+"2911 раздел 4.1.8)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad octetString value - bad length %d (RFC 2911 section 4.1.10)."
+msgstr ""
+"\"%s\": Ошибка значения octetString - неправильная длина %d (RFC 2911 раздел "
+"4.1.10)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 2911 "
+"section 4.1.13)."
+msgstr ""
+"\"%s\": Ошибка rangeOfInteger значение %d-%d - первое больше чем второе (RFC "
+"2911 раздел 4.1.13)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 2911 section "
+"4.1.15)."
+msgstr ""
+"\"%s\": Неправильное значение разрешения %dx%d%s - ошибка в значении units "
+"(RFC 2911 раздел 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be "
+"positive (RFC 2911 section 4.1.15)."
+msgstr ""
+"\"%s\": Неправильное значение разрешения %dx%d%s - значение cross feed "
+"должно быть положительным (RFC 2911 раздел 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC "
+"2911 section 4.1.15)."
+msgstr ""
+"\"%s\": Неправильное значение разрешения %dx%d%s - значение feed должно быть "
+"положительным (RFC 2911 раздел 4.1.15)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": Неправильное текстовое значение \"%s\" - ошибка в UTF-8 (RFC 2911 "
+"раздел 4.1.1)."
+
+#, c-format
+msgid "\"%s\": Bad text value \"%s\" - bad length %d (RFC 2911 section 4.1.1)."
+msgstr ""
+"\"%s\": Неправильное текстовое значение \"%s\" - ошибка длины %d (RFC 2911 "
+"раздел 4.1.1)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 2911 section 4.1.6)."
+msgstr ""
+"\"%s\": Ошибка uriScheme значение \"%s\" - недопустимые символы (RFC 2911 "
+"раздел 4.1.6)."
+
+#, c-format
+msgid ""
+"\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 2911 section 4.1.6)."
 msgstr ""
+"\"%s\": Ошибка uriScheme значение \"%s\" - ошибка длины %d (RFC 2911 раздел "
+"4.1.6)."
+
+#, 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 задание пользователь название копий параметры [файл]"
+
+#, 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 ""
+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 ""
+msgstr "%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 ""
+msgstr "%s: Ошибка - добавьте '/version=1.1' к имени сервера."
 
 #, c-format
 msgid "%s: Error - bad job ID."
-msgstr ""
+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 - expected character set after \"-S\" option."
-msgstr ""
+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 ""
-
-#, c-format
-msgid "%s: Error - expected destination after \"-b\" option."
-msgstr ""
+msgstr "%s: Ошибка - после параметра \"-P\" должно быть указано назначение."
 
 #, c-format
 msgid "%s: Error - expected destination after \"-d\" option."
-msgstr ""
+msgstr "%s: Ошибка - после параметра \"-d\" должно быть указано назначение."
 
 #, c-format
 msgid "%s: Error - expected form after \"-f\" option."
-msgstr ""
+msgstr "%s: Ошибка - после параметра \"-f\" должна быть указана форма."
 
 #, c-format
 msgid "%s: Error - expected hold name after \"-H\" option."
-msgstr ""
+msgstr "%s: Ошибка - после параметра \"-H\" должно быть указано имя хоста."
 
 #, c-format
 msgid "%s: Error - expected hostname after \"-H\" option."
-msgstr ""
+msgstr "%s: Ошибка - после параметра \"-H\" должно быть указано имя хоста."
 
 #, c-format
 msgid "%s: Error - expected hostname after \"-h\" option."
-msgstr ""
+msgstr "%s: Ошибка - после параметра \"-h\" должно быть указано имя хоста."
 
 #, c-format
 msgid "%s: Error - expected mode list after \"-y\" option."
-msgstr ""
+msgstr "%s: Ошибка - после параметра \"-y\" должен быть указан список режимов."
 
 #, c-format
 msgid "%s: Error - expected name after \"-%c\" option."
-msgstr ""
+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 ""
+msgstr "%s: Ошибка – после параметра \"-P\" должен идти список страниц."
 
 #, c-format
 msgid "%s: Error - expected priority after \"-%c\" option."
-msgstr ""
+msgstr "%s: Ошибка - после параметра \"-%c\" должен быть указан приоритет."
 
 #, c-format
 msgid "%s: Error - expected reason text after \"-r\" option."
-msgstr ""
+msgstr "%s: Ошибка - после параметра \"-r\" должен идти текст причины."
 
 #, c-format
 msgid "%s: Error - expected title after \"-t\" option."
-msgstr ""
+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 ""
+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 ""
+msgstr "%s: Ошибка – нет доступного назначения по умолчанию."
 
 #, c-format
 msgid "%s: Error - priority must be between 1 and 100."
-msgstr ""
+msgstr "%s: Ошибка – приоритет должен быть от 1 до 100."
 
 #, c-format
 msgid "%s: Error - scheduler not responding."
-msgstr ""
+msgstr "%s: Ошибка - планировщик не отвечает."
 
 #, c-format
 msgid "%s: Error - too many files - \"%s\"."
-msgstr ""
+msgstr "%s: Ошибка – слишком много файлов – \"%s\"."
 
 #, c-format
 msgid "%s: Error - unable to access \"%s\" - %s"
-msgstr ""
+msgstr "%s: Ошибка – не удается получить доступ к \"%s\" – %s"
 
 #, c-format
 msgid "%s: Error - unable to queue from stdin - %s."
-msgstr ""
+msgstr "%s: Ошибка – не удается поставить в очередь из stdin - %s."
 
 #, c-format
 msgid "%s: Error - unknown destination \"%s\"."
-msgstr ""
+msgstr "%s: Ошибка - неизвестное назначение \"%s\"."
 
 #, c-format
 msgid "%s: Error - unknown destination \"%s/%s\"."
-msgstr ""
+msgstr "%s: ошибка - неизвестное назначение \"%s/%s\"."
 
 #, c-format
 msgid "%s: Error - unknown option \"%c\"."
-msgstr ""
+msgstr "%s: Ошибка - неизвестный параметр \"%c\"."
 
 #, c-format
 msgid "%s: Error - unknown option \"%s\"."
-msgstr ""
+msgstr "%s: Ошибка - неизвестный параметр \"%s\"."
 
 #, c-format
 msgid "%s: Expected job ID after \"-i\" option."
-msgstr ""
+msgstr "%s: После параметра \"-i\" должен быть указан ID задания."
 
 #, c-format
 msgid "%s: Invalid destination name in list \"%s\"."
-msgstr ""
+msgstr "%s: Недопустимое имя назначения в списке \"%s\"."
 
 #, c-format
 msgid "%s: Invalid filter string \"%s\"."
-msgstr ""
+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 ""
+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 ""
+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 ""
+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 ""
+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 ""
+msgstr "%s: Не удается открыть %s: %s"
 
 #, c-format
 msgid "%s: Unable to open PPD file: %s on line %d."
-msgstr ""
+msgstr "%s: Не удается открыть PPD-файл: %s в строке %d."
 
 #, 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 destination \"%s\"."
-msgstr ""
+msgstr "%s: Неизвестное назначение \"%s\"."
 
 #, c-format
 msgid "%s: Unknown destination MIME type %s/%s."
-msgstr ""
+msgstr "%s: Неизвестный MIME-тип назначения %s/%s."
 
 #, c-format
 msgid "%s: Unknown option \"%c\"."
-msgstr ""
+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 ""
+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 ""
+msgstr "%s: Внимание - параметр набора символов пропущен."
 
 #, c-format
 msgid "%s: Warning - content type option ignored."
-msgstr ""
+msgstr "%s: Внимание - параметр типа содержимого пропущен."
 
 #, c-format
 msgid "%s: Warning - form option ignored."
-msgstr ""
+msgstr "%s: Внимание - параметр формы пропущен."
 
 #, c-format
 msgid "%s: Warning - mode option ignored."
-msgstr ""
+msgstr "%s: Внимание - параметр режима пропущен."
 
 msgid "-1"
 msgstr "-1"
@@ -1803,9 +2473,6 @@ msgstr ""
 msgid "70"
 msgstr "70"
 
-msgid "720dpi"
-msgstr "720dpi"
-
 msgid "75"
 msgstr "75"
 
@@ -1880,11 +2547,11 @@ msgstr "Для экспорта драйверов принтера требуе
 
 #, c-format
 msgid "A class named \"%s\" already exists."
-msgstr ""
+msgstr "Группа с именем \"%s\" уже существует."
 
 #, c-format
 msgid "A printer named \"%s\" already exists."
-msgstr ""
+msgstr "Принтер с именем \"%s\" уже существует."
 
 msgid "A0"
 msgstr "A0"
@@ -1995,7 +2662,7 @@ msgid "Accepted"
 msgstr "Принято"
 
 msgid "Add Class"
-msgstr "Ð\94обавиÑ\82Ñ\8c ÐºÐ»Ð°Ñ\81Ñ\81"
+msgstr "Ð\94обавиÑ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\83"
 
 msgid "Add Printer"
 msgstr "Добавить принтер"
@@ -2007,7 +2674,7 @@ msgid "Address"
 msgstr "Адрес"
 
 msgid "Administration"
-msgstr "Ð\90дминиÑ\81Ñ\82Ñ\80аÑ\86иÑ\8f"
+msgstr "Ð\90дминиÑ\81Ñ\82Ñ\80иÑ\80ование"
 
 msgid "Always"
 msgstr "Всегда"
@@ -2020,11 +2687,11 @@ msgstr "Исполнительное устройство"
 
 #, c-format
 msgid "Attempt to set %s printer-state to bad value %d."
-msgstr ""
+msgstr "Попытка установить %s printer-state на неверное значение %d"
 
 #, c-format
 msgid "Attribute groups are out of order (%x < %x)."
-msgstr ""
+msgstr "Атрибут группы не в диапазоне (%x < %x)"
 
 msgid "B0"
 msgstr "B0"
@@ -2090,6 +2757,9 @@ msgstr "Неверный номер версии SNMP"
 msgid "Bad UIConstraints"
 msgstr "Неверное значение UIConstraints"
 
+msgid "Bad arguments to function"
+msgstr "Неверные аргументы для функции"
+
 #, c-format
 msgid "Bad copies value %d."
 msgstr "Неверное значение количества копий %d."
@@ -2099,56 +2769,57 @@ msgstr "Неверный индивидуальный параметр"
 
 #, c-format
 msgid "Bad device-uri \"%s\"."
-msgstr ""
+msgstr "Неверное значение device-uri \"%s\"."
 
 #, c-format
 msgid "Bad device-uri scheme \"%s\"."
-msgstr ""
+msgstr "Неверная схема device-uri \"%s\"."
 
 #, c-format
 msgid "Bad document-format \"%s\"."
-msgstr ""
+msgstr "Неверное значение document-format \"%s\"."
 
 #, c-format
 msgid "Bad document-format-default \"%s\"."
-msgstr ""
+msgstr "Неверное значение document-format-default \"%s\"."
 
 msgid "Bad filename buffer"
 msgstr "Ошибка в буфере filename"
 
-msgid "Bad job-name value: Bad UTF-8 sequence."
-msgstr ""
+msgid "Bad hostname/address in URI"
+msgstr "Неверный hostname/address в URI"
 
-msgid "Bad job-name value: Name too long."
-msgstr ""
+#, c-format
+msgid "Bad job-name value: %s"
+msgstr "Неверное значение job-name: %s"
 
 msgid "Bad job-name value: Wrong type or count."
-msgstr ""
+msgstr "Неверное значение job-name: Wrong type or count."
 
 msgid "Bad job-priority value."
-msgstr ""
+msgstr "Неверное значение job-priority."
 
 #, c-format
 msgid "Bad job-sheets value \"%s\"."
-msgstr ""
+msgstr "Неверное значение job-sheets \"%s\"."
 
 msgid "Bad job-sheets value type."
-msgstr ""
+msgstr "Неверный тип значения job-sheets."
 
 msgid "Bad job-state value."
-msgstr ""
+msgstr "Неверное значение job-state."
 
 #, c-format
 msgid "Bad job-uri \"%s\"."
-msgstr ""
+msgstr "Неверный job-uri \"%s\"."
 
 #, c-format
 msgid "Bad notify-pull-method \"%s\"."
-msgstr ""
+msgstr "Неверное значение notify-pull-method \"%s\"."
 
 #, c-format
 msgid "Bad notify-recipient-uri \"%s\"."
-msgstr ""
+msgstr "Неверный notify-recipient-uri \"%s\"."
 
 #, c-format
 msgid "Bad number-up value %d."
@@ -2156,37 +2827,52 @@ msgstr "Неверное значение number-up %d."
 
 #, c-format
 msgid "Bad option + choice on line %d."
-msgstr ""
+msgstr "Неверный параметр + выбор в строке %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 ""
-
-msgid "Bad printer URI."
-msgstr ""
+msgstr "Неверное значение port-monitor \"%s\"."
 
 #, c-format
 msgid "Bad printer-state value %d."
-msgstr ""
+msgstr "Неверное значение printer-state %d."
+
+msgid "Bad printer-uri."
+msgstr "Неверное значение printer-uri"
 
 #, c-format
 msgid "Bad request ID %d."
-msgstr ""
+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 subscription ID"
 msgstr "Неверный ID подписки"
 
+msgid "Bad username in URI"
+msgstr "Неверное имя пользователя в URI"
+
 msgid "Bad value string"
 msgstr "Неверная строка значений"
 
+msgid "Bad/empty URI"
+msgstr "Неверный или пустой URI"
+
 msgid "Banners"
 msgstr "Баннеры"
 
@@ -2195,10 +2881,10 @@ msgstr "Документная бумага"
 
 #, c-format
 msgid "Boolean expected for waiteof option \"%s\"."
-msgstr ""
+msgstr "Параметр waiteof \"%s\" должен иметь двоичное значение"
 
 msgid "Buffer overflow detected, aborting."
-msgstr ""
+msgstr "Обнаружено переполнение буфера, прерывание."
 
 msgid "CMYK"
 msgstr "CMYK"
@@ -2206,33 +2892,36 @@ msgstr "CMYK"
 msgid "CPCL Label Printer"
 msgstr "Принтер для печати этикеток CPCL"
 
+msgid "Cancel Jobs"
+msgstr "Отменить задания"
+
 msgid "Cancel RSS Subscription"
 msgstr "Отменить подписку на RSS"
 
 msgid "Canceling print job."
-msgstr ""
+msgstr "Отмена задания печати."
 
 msgid "Cannot share a remote Kerberized printer."
 msgstr ""
 
 msgid "Cassette"
-msgstr ""
+msgstr "Лоток"
 
 msgid "Change Settings"
 msgstr "Изменить настройки"
 
 #, c-format
 msgid "Character set \"%s\" not supported."
-msgstr ""
+msgstr "Набор символов \"%s\" не поддерживается."
 
 msgid "Classes"
-msgstr "Ð\9aлаÑ\81Ñ\81ы"
+msgstr "Ð\93Ñ\80Ñ\83ппы"
 
 msgid "Clean Print Heads"
 msgstr "Очистить головки принтера"
 
 msgid "Close-Job doesn't support the job-uri attribute."
-msgstr ""
+msgstr "Close-Job не подерживает атрибут job-uri"
 
 msgid "Color"
 msgstr "Цвет"
@@ -2245,15 +2934,18 @@ msgid ""
 "\n"
 "exit    help    quit    status  ?"
 msgstr ""
+"Команды могут быть сокращены.  Команды:\n"
+"\n"
+"exit    help    quit    status  ?"
 
 msgid "Community name uses indefinite length"
 msgstr "Для имени сообщества длина не установлена"
 
 msgid "Connected to printer."
-msgstr ""
+msgstr "Подключен к принтеру."
 
 msgid "Connecting to printer."
-msgstr ""
+msgstr "Подключение к принтеру"
 
 msgid "Continue"
 msgstr "Продолжить"
@@ -2262,10 +2954,10 @@ msgid "Continuous"
 msgstr "Непрерывно"
 
 msgid "Control file sent successfully."
-msgstr ""
+msgstr "Контрольный файл успешно отправлен."
 
 msgid "Copying print data."
-msgstr ""
+msgstr "Копирование данных печати."
 
 msgid "Created"
 msgstr "Создано"
@@ -2292,10 +2984,10 @@ msgid "Darkness"
 msgstr "Затемненность"
 
 msgid "Data file sent successfully."
-msgstr ""
+msgstr "Файл данных успешно отправлен."
 
 msgid "Delete Class"
-msgstr "УдалиÑ\82Ñ\8c ÐºÐ»Ð°Ñ\81Ñ\81"
+msgstr "УдалиÑ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\83"
 
 msgid "Delete Printer"
 msgstr "Удалить принтер"
@@ -2318,34 +3010,34 @@ msgid ""
 msgstr ""
 
 msgid "Direct Thermal Media"
-msgstr "Носитель для прямой термопечати"
+msgstr "Носитель для термопечати"
 
 #, c-format
 msgid "Directory \"%s\" contains a relative path."
-msgstr ""
+msgstr "Каталог \"%s\" содержит относительный путь."
 
 #, c-format
 msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
-msgstr ""
+msgstr "Каталог \"%s\" имеет небезопасные права доступа (0%o/uid=%d/gid=%d)."
 
 #, c-format
 msgid "Directory \"%s\" is a file."
-msgstr ""
+msgstr "Каталог \"%s\" это файл."
 
 #, c-format
 msgid "Directory \"%s\" not available: %s"
-msgstr ""
+msgstr "Каталог \"%s\" недоступен: %s"
 
 #, c-format
 msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
-msgstr ""
+msgstr "Каталог \"%s\" доступ OK (0%o/uid=%d/gid=%d)."
 
 msgid "Disabled"
 msgstr "Отключено"
 
 #, c-format
 msgid "Document #%d does not exist in job #%d."
-msgstr ""
+msgstr "Документ #%d не существует в задании #%d."
 
 msgid "Duplexer"
 msgstr "Дуплексер"
@@ -2363,7 +3055,10 @@ msgid "Edit Configuration File"
 msgstr "Редактировать файл конфигурации"
 
 msgid "Empty PPD file."
-msgstr ""
+msgstr "Пустой PPD файл."
+
+msgid "Encryption is not supported."
+msgstr "Шифрование не поддерживается."
 
 #. TRANSLATORS: Banner/cover sheet after the print job.
 msgid "Ending Banner"
@@ -2372,15 +3067,6 @@ msgstr "Конечный баннер"
 msgid "English"
 msgstr "Russian"
 
-msgid "Enter old password:"
-msgstr "Введите старый пароль:"
-
-msgid "Enter password again:"
-msgstr "Введите пароль снова:"
-
-msgid "Enter password:"
-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 "
@@ -2549,17 +3235,23 @@ msgstr ""
 msgid "Envelope You4 Long Edge"
 msgstr ""
 
+msgid "Environment Variables:"
+msgstr ""
+
 msgid "Epson"
 msgstr "Epson"
 
 msgid "Error Policy"
 msgstr "Политика ошибок"
 
-msgid "Error sending raster data."
+msgid "Error reading raster data."
 msgstr ""
 
+msgid "Error sending raster data."
+msgstr "Ошибка отправки данных растра."
+
 msgid "Error: need hostname after \"-h\" option."
-msgstr ""
+msgstr "ERROR: Требуется имя хоста после параметра \"-h\""
 
 msgid "Every 10 Labels"
 msgstr "Каждые 10 этикеток"
@@ -2592,7 +3284,7 @@ msgid "Every Label"
 msgstr "Каждая этикетка"
 
 msgid "Executive"
-msgstr ""
+msgstr "Executive"
 
 msgid "Expectation Failed"
 msgstr "Сбой ожидания"
@@ -2600,8 +3292,11 @@ msgstr "Сбой ожидания"
 msgid "Export Printers to Samba"
 msgstr "Экспортировать принтеры в Samba"
 
+msgid "Expressions:"
+msgstr "Выражение:"
+
 msgid "FAIL"
-msgstr ""
+msgstr "FAIL"
 
 msgid "FanFold German"
 msgstr ""
@@ -2614,36 +3309,38 @@ msgstr ""
 
 #, c-format
 msgid "File \"%s\" contains a relative path."
-msgstr ""
+msgstr "Файл \"%s\" содержит относительный путь."
 
 #, c-format
 msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."
-msgstr ""
+msgstr "Файл \"%s\" имеет небезопасные права доступа  (0%o/uid=%d/gid=%d)."
 
 #, c-format
 msgid "File \"%s\" is a directory."
-msgstr ""
+msgstr "Файл \"%s\" является каталогом."
 
 #, c-format
 msgid "File \"%s\" not available: %s"
-msgstr ""
+msgstr "Файл \"%s\" недоступен: %s"
 
 #, c-format
 msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)."
-msgstr ""
+msgstr "Файл \"%s\" права доступа OK (0%o/uid=%d/gid=%d)."
 
 msgid "File Folder "
-msgstr ""
+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 ""
+msgstr "Последняя страница %d."
 
 msgid "Folio"
 msgstr "Фолио"
@@ -2664,7 +3361,7 @@ msgid "Glossy Paper"
 msgstr "Глянцевая бумага"
 
 msgid "Got a printer-uri attribute but no job-id."
-msgstr ""
+msgstr "Получен атрибут printer-uri, но не job-id"
 
 msgid "Grayscale"
 msgstr "Оттенки серого"
@@ -2676,70 +3373,76 @@ msgid "Hanging Folder"
 msgstr "Папка подвесного хранения"
 
 msgid "Help file not in index."
-msgstr ""
+msgstr "Файл справки не проиндексирован."
 
 msgid "IPP 1setOf attribute with incompatible value tags."
-msgstr ""
+msgstr "IPP атрибут 1setOf с недопустимым значением."
 
 msgid "IPP attribute has no name."
-msgstr ""
+msgstr "IPP атрибут не имеет имени."
 
 msgid "IPP attribute is not a member of the message."
-msgstr ""
+msgstr "IPP атрибут не входит в состав сообщения."
 
 msgid "IPP begCollection value not 0 bytes."
-msgstr ""
+msgstr "IPP значение begCollection не 0 байт."
 
 msgid "IPP boolean value not 1 byte."
-msgstr ""
+msgstr "IPP двоичное значение не 1 байт."
 
 msgid "IPP date value not 11 bytes."
-msgstr ""
+msgstr "IPP длина даты не 11 байтов."
 
 msgid "IPP endCollection value not 0 bytes."
-msgstr ""
+msgstr "IPP значение endCollection не 0 байт."
 
 msgid "IPP enum value not 4 bytes."
-msgstr ""
+msgstr "IPP значение enum не 4 байта."
 
 msgid "IPP extension tag larger than 0x7FFFFFFF."
-msgstr ""
+msgstr "IPP extension tag больше чем 0x7FFFFFFF."
 
 msgid "IPP integer value not 4 bytes."
-msgstr ""
+msgstr "IPP тип integer не 4 байта"
 
 msgid "IPP language length overflows value."
-msgstr ""
+msgstr "IPP переполнение значения language length"
+
+msgid "IPP language length too large."
+msgstr "IPP language length слишком длинное."
 
 msgid "IPP member name is not empty."
-msgstr ""
+msgstr "IPP member name не пустое."
 
 msgid "IPP memberName value is empty."
-msgstr ""
+msgstr "IPP memberName пустое значение."
 
 msgid "IPP memberName with no attribute."
-msgstr ""
+msgstr "IPP memberName без атрибута."
 
 msgid "IPP name larger than 32767 bytes."
-msgstr ""
+msgstr "IPP имя больше чем 32767 байт."
 
 msgid "IPP nameWithLanguage value less than minimum 4 bytes."
-msgstr ""
+msgstr "IPP значение nameWithLanguage меньше минимума 4 байт."
+
+msgid "IPP octetString length too large."
+msgstr "IPP octetString слишком длинное."
 
 msgid "IPP rangeOfInteger value not 8 bytes."
-msgstr ""
+msgstr "IPP rangeOfInteger значение не 8 байт."
 
 msgid "IPP resolution value not 9 bytes."
-msgstr ""
+msgstr "IPP resolution значение не 9 байт."
 
 msgid "IPP string length overflows value."
-msgstr ""
+msgstr "IPP переполнение значения string length."
 
 msgid "IPP textWithLanguage value less than minimum 4 bytes."
-msgstr ""
+msgstr "IPP textWithLanguage меньше минимума 4 байт."
 
 msgid "IPP value larger than 32767 bytes."
-msgstr ""
+msgstr "IPP значение больше чем 32767 байт."
 
 msgid "ISOLatin1"
 msgstr "UTF-8"
@@ -2786,12 +3489,15 @@ msgstr "Наклейки Internet Postage 3-Part"
 msgid "Internet Printing Protocol"
 msgstr "Протокол интернет-печати"
 
+msgid "Invalid media name arguments."
+msgstr "Неверные аргументы имени бумаги."
+
 msgid "Invalid media size."
-msgstr ""
+msgstr "Неверный размер бумаги."
 
 #, c-format
 msgid "Invalid printer command \"%s\"."
-msgstr ""
+msgstr "Неверная команда принтера \"%s\"."
 
 msgid "JCL"
 msgstr "JCL"
@@ -2840,11 +3546,11 @@ msgstr ""
 
 #, c-format
 msgid "Job #%d cannot be restarted - no files."
-msgstr ""
+msgstr "Задание #%d не может быть перезапущено - отсутствуют файлы."
 
 #, c-format
 msgid "Job #%d does not exist."
-msgstr ""
+msgstr "Задание #%d не существует."
 
 #, c-format
 msgid "Job #%d is already aborted - can't cancel."
@@ -2860,19 +3566,19 @@ msgstr "Задание #%d уже завершено – не удается о
 
 #, c-format
 msgid "Job #%d is finished and cannot be altered."
-msgstr ""
+msgstr "Задание #%d завершено и не может быть изменено."
 
 #, c-format
 msgid "Job #%d is not complete."
-msgstr ""
+msgstr "Задание #%d не завершено."
 
 #, c-format
 msgid "Job #%d is not held for authentication."
-msgstr ""
+msgstr "Задание #%d не задержано для идентификации."
 
 #, c-format
 msgid "Job #%d is not held."
-msgstr ""
+msgstr "Задание #%d не задержано."
 
 msgid "Job Completed"
 msgstr "Задание завершено"
@@ -2890,13 +3596,13 @@ msgid "Job is completed and cannot be changed."
 msgstr "Задание завершено и не может быть изменено."
 
 msgid "Job operation failed"
-msgstr ""
+msgstr "Сбой операции задания."
 
 msgid "Job state cannot be changed."
 msgstr "Состояние задания не может быть изменено."
 
 msgid "Job subscriptions cannot be renewed."
-msgstr ""
+msgstr "Подписки на задание не могут быть обновлены."
 
 msgid "Jobs"
 msgstr "Задания"
@@ -2912,7 +3618,7 @@ msgstr "Верхний край этикетки"
 
 #, c-format
 msgid "Language \"%s\" not supported."
-msgstr ""
+msgstr "Язык \"%s\" не поддерживается."
 
 msgid "Large Address"
 msgstr "Полный адрес"
@@ -2935,10 +3641,13 @@ msgstr "Строка длиннее разрешенного предела (255
 msgid "List Available Printers"
 msgstr "Список доступных принтеров"
 
+msgid "Load paper."
+msgstr "Загрузка бумаги."
+
 msgid "Long-Edge (Portrait)"
 msgstr "По длинной стороне (книжная)"
 
-msgid "Looking for printer."
+msgid "Looking for printer..."
 msgstr ""
 
 msgid "Manual Feed"
@@ -2960,10 +3669,10 @@ msgid "Medium"
 msgstr "Средний"
 
 msgid "Memory allocation error"
-msgstr "Ошибка распределения памяти"
+msgstr "Ошибка выделения памяти"
 
 msgid "Missing CloseGroup"
-msgstr ""
+msgstr "Пропущен CloseGroup"
 
 msgid "Missing PPD-Adobe-4.x header"
 msgstr "Отсутствует заголовок PPD-Adobe-4.x"
@@ -2972,48 +3681,54 @@ msgid "Missing asterisk in column 1"
 msgstr "Отсутствует звездочка в колонке 1"
 
 msgid "Missing document-number attribute."
-msgstr ""
+msgstr "Отсутствует атрибут document-number"
 
 #, c-format
 msgid "Missing double quote on line %d."
-msgstr ""
+msgstr "Отсутствует двойная кавычка в строке %d"
 
 msgid "Missing form variable"
 msgstr "Отсутствует переменная формы"
 
 msgid "Missing last-document attribute in request."
-msgstr ""
+msgstr "Отсутствует атрибут last-document в запросе."
 
 msgid "Missing media or media-col."
-msgstr ""
+msgstr "Отсутствует media или media-col."
 
 msgid "Missing media-size in media-col."
-msgstr ""
+msgstr "Отсутствует media-size в media-col."
 
 msgid "Missing notify-subscription-ids attribute."
-msgstr ""
+msgstr "Отсутствует атрибут notify-subscription-ids"
 
 msgid "Missing option keyword"
 msgstr "Отсутствует ключевое слово параметра"
 
 msgid "Missing requesting-user-name attribute."
-msgstr ""
+msgstr "Отсутствует атрибут requesting-user-name."
 
 msgid "Missing required attributes."
-msgstr ""
+msgstr "Отсутствуют обязательные атрибуты."
+
+msgid "Missing resource in URI"
+msgstr "Отсутствует resource в URI"
+
+msgid "Missing scheme in URI"
+msgstr "Отсутствует scheme в URI"
 
 #, c-format
 msgid "Missing value on line %d."
-msgstr ""
+msgstr "Отсутствует значение в строке %d."
 
 msgid "Missing value string"
 msgstr "Отсутствует строка значения"
 
 msgid "Missing x-dimension in media-size."
-msgstr ""
+msgstr "Отсутствует x-dimension в media-size."
 
 msgid "Missing y-dimension in media-size."
-msgstr ""
+msgstr "Отсутствует y-dimension в media-size."
 
 #, c-format
 msgid ""
@@ -3022,9 +3737,16 @@ msgid ""
 "        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 "Ð\98змениÑ\82Ñ\8c ÐºÐ»Ð°Ñ\81Ñ\81"
+msgstr "Ð\98змениÑ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\83"
 
 msgid "Modify Printer"
 msgstr "Изменить принтер"
@@ -3045,22 +3767,16 @@ msgid "Name OID uses indefinite length"
 msgstr "Для имени OID длина не установлена"
 
 msgid "Nested classes are not allowed."
-msgstr ""
+msgstr "Вложенные группы не допускаются."
 
 msgid "Never"
 msgstr "Никогда"
 
-msgid "New Stylus Color Series"
-msgstr "Серия Stylus Color нового поколения"
-
-msgid "New Stylus Photo Series"
-msgstr "Серия Stylus Photo нового поколения"
-
 msgid "No"
 msgstr "Нет"
 
 msgid "No Content"
-msgstr "Нет контента"
+msgstr "Нет содержимого"
 
 msgid "No PPD name"
 msgstr "Нет имени PPD"
@@ -3069,32 +3785,36 @@ msgid "No VarBind SEQUENCE"
 msgstr "Нет последовательности VarBind"
 
 msgid "No Windows printer drivers are installed."
-msgstr ""
+msgstr "Нет установленных драйверов принтера Windows."
 
 msgid "No active connection"
 msgstr "Нет рабочего подключения"
 
+msgid "No active connection."
+msgstr "Нет рабочего подключения."
+
 #, c-format
 msgid "No active jobs on %s."
-msgstr ""
+msgstr "Нет активных заданий на %s"
 
 msgid "No attributes in request."
-msgstr ""
+msgstr "Нет атрибутов в запросе."
 
 msgid "No authentication information provided."
-msgstr ""
+msgstr "Нет информации для проверки подлинности."
 
 msgid "No community name"
 msgstr "Нет имени сообщества"
 
 msgid "No default printer."
-msgstr ""
+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"
@@ -3103,7 +3823,7 @@ msgid "No error-status"
 msgstr "Нет значения error-status"
 
 msgid "No file in print request."
-msgstr ""
+msgstr "Нет файла в запросе на печать."
 
 msgid "No modification time"
 msgstr "Не указано время изменения"
@@ -3112,7 +3832,7 @@ msgid "No name OID"
 msgstr "Нет имени OID"
 
 msgid "No pages were found."
-msgstr ""
+msgstr "Страницы не были найдены."
 
 msgid "No printer name"
 msgstr "Нет имени принтера"
@@ -3121,16 +3841,25 @@ msgid "No printer-uri found"
 msgstr "Не указан адрес printer-uri"
 
 msgid "No printer-uri found for class"
-msgstr "Ð\9dе Ñ\83казан Ð°Ð´Ñ\80еÑ\81 printer-uri Ð´Ð»Ñ\8f ÐºÐ»Ð°Ñ\81Ñ\81а"
+msgstr "Ð\9dе Ñ\83казан Ð°Ð´Ñ\80еÑ\81 printer-uri Ð´Ð»Ñ\8f Ð³Ñ\80Ñ\83ппÑ\8b"
 
 msgid "No printer-uri in request."
-msgstr ""
+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 subscription attributes in request."
-msgstr ""
+msgstr "Нет атрибутов подписки в запросе."
 
 msgid "No subscriptions found."
 msgstr "Подписки не найдены."
@@ -3142,16 +3871,16 @@ msgid "No version number"
 msgstr "Нет номера версии"
 
 msgid "Non-continuous (Mark sensing)"
-msgstr "С прерыванием (опознавание маркеров)"
+msgstr "С прерыванием (Mark sensing)"
 
 msgid "Non-continuous (Web sensing)"
-msgstr "С прерыванием (опознавание сети)"
+msgstr "С прерыванием (Web sensing)"
 
 msgid "Normal"
 msgstr "Нормальный"
 
 msgid "Not Found"
-msgstr "Не найдено"
+msgstr "Не найден"
 
 msgid "Not Implemented"
 msgstr "Не реализовано"
@@ -3175,18 +3904,20 @@ msgid ""
 "Note: this program only validates the DSC comments, not the PostScript "
 "itself."
 msgstr ""
+"Примечание: данная программа проверяет только комментарии DSC, а не сам "
+"PostScript."
 
 msgid "OK"
 msgstr "ОК"
 
 msgid "Off (1-Sided)"
-msgstr "Выкл. (односторонняя печать)"
+msgstr "Выкл. (1-сторонняя печать)"
 
 msgid "Oki"
 msgstr "Oki"
 
 msgid "Online Help"
-msgstr "Ð\98нÑ\82еÑ\80акÑ\82ивнаÑ\8f справка"
+msgstr "Ð\98нÑ\82еÑ\80неÑ\82 справка"
 
 #, c-format
 msgid "Open of %s failed: %s"
@@ -3203,41 +3934,34 @@ msgstr "Политика операций"
 
 #, c-format
 msgid "Option \"%s\" cannot be included via %%%%IncludeFeature."
-msgstr ""
+msgstr "Параметр \"%s\" не может быть добавлен через %%%%IncludeFeature."
 
 msgid "Options Installed"
-msgstr "Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b Ñ\83Ñ\81Ñ\82ановленÑ\8b"
+msgstr "Ð\94оп.Ñ\83Ñ\81Ñ\82Ñ\80ойÑ\81Ñ\82ва"
 
 msgid "Options:"
-msgstr ""
+msgstr "Параметры:"
 
 msgid "Out of date PPD cache file."
-msgstr ""
+msgstr "Устаревший файл кеша PPD"
 
 msgid "Out of memory."
-msgstr ""
+msgstr "Недостаточно памяти."
 
 msgid "Output Mode"
 msgstr "Режим вывода"
 
-#, c-format
-msgid "Output for printer %s is sent to %s"
-msgstr ""
-
-#, c-format
-msgid "Output for printer %s is sent to remote printer %s on %s"
-msgstr ""
+msgid "Output bin is almost full."
+msgstr "Лоток вывода почти заполнен."
 
-#, c-format
-msgid "Output for printer %s/%s is sent to %s"
-msgstr ""
+msgid "Output bin is full."
+msgstr "Лоток вывода заполнен."
 
-#, c-format
-msgid "Output for printer %s/%s is sent to remote printer %s on %s"
-msgstr ""
+msgid "Output bin is missing."
+msgstr "Отсутствует лоток вывода."
 
 msgid "PASS"
-msgstr ""
+msgstr "PASS"
 
 msgid "PCL Laser Printer"
 msgstr "Лазерный принтер PCL"
@@ -3266,6 +3990,18 @@ msgstr "В пакете нет Get-Response-PDU"
 msgid "Packet does not start with SEQUENCE"
 msgstr "Нет индикатора SEQUENCE в начале пакета"
 
+msgid "Paper jam."
+msgstr "Замятие бумаги."
+
+msgid "Paper tray is almost empty."
+msgstr "Лоток с бумагой почти пуст."
+
+msgid "Paper tray is empty."
+msgstr "Лоток с бумагой пуст."
+
+msgid "Paper tray is missing."
+msgstr "Лоток с бумагой отсутствует."
+
 msgid "ParamCustominCutInterval"
 msgstr "ParamCustominCutInterval"
 
@@ -3281,7 +4017,7 @@ msgid "Password for %s required to access %s via SAMBA: "
 msgstr "Для доступа к %s через SAMBA требуется пароль для %s: "
 
 msgid "Pause Class"
-msgstr "Ð\9fÑ\80иоÑ\81Ñ\82ановиÑ\82Ñ\8c ÐºÐ»Ð°Ñ\81Ñ\81"
+msgstr "Ð\9fÑ\80иоÑ\81Ñ\82ановиÑ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\83"
 
 msgid "Pause Printer"
 msgstr "Приостановить принтер"
@@ -3311,13 +4047,16 @@ msgid "Postcard"
 msgstr "Открытка"
 
 msgid "Postcard Double "
-msgstr ""
+msgstr "Открытка двойная"
 
 msgid "Postcard Double Long Edge"
-msgstr ""
+msgstr "Открытка двойная Long Edge"
 
 msgid "Postcard Long Edge"
-msgstr ""
+msgstr "Открытка Long Edge"
+
+msgid "Preparing to print."
+msgstr "Подготовка к печати."
 
 msgid "Print Density"
 msgstr "Плотность печати"
@@ -3346,24 +4085,17 @@ msgstr "Напечатать и обрезать"
 msgid "Print and Tear"
 msgstr "Напечатать и оборвать"
 
-#, c-format
-msgid "Print file accepted - job ID %d."
-msgstr ""
-
-msgid "Print file accepted - job ID unknown."
-msgstr ""
-
 msgid "Print file sent."
-msgstr ""
-
-msgid "Print file was not accepted."
-msgstr ""
+msgstr "Файл печати отправлен."
 
 msgid "Print job canceled at printer."
-msgstr ""
+msgstr "Задание отменено на принтере."
 
 msgid "Print job too large."
-msgstr ""
+msgstr "Задание слишком большое."
+
+msgid "Print job was not accepted."
+msgstr "Задание не принято."
 
 msgid "Printer Added"
 msgstr "Принтер добавлен"
@@ -3384,7 +4116,10 @@ msgid "Printer Settings"
 msgstr "Параметры принтера"
 
 msgid "Printer cannot print supplied content."
-msgstr ""
+msgstr "Принтер не может распечатать содержимое."
+
+msgid "Printer cannot print with supplied options."
+msgstr "Принтер не может печатать с данными параметрами."
 
 msgid "Printer:"
 msgstr "Принтер:"
@@ -3393,11 +4128,8 @@ msgid "Printers"
 msgstr "Принтеры"
 
 #, c-format
-msgid "Printing page %d, %d%% complete."
-msgstr ""
-
-msgid "Purge Jobs"
-msgstr "Удалить задания"
+msgid "Printing page %d, %u%% complete."
+msgstr "Печать страницы %d, %u%% завершена."
 
 msgid "Quarto"
 msgstr "Кватро"
@@ -3407,22 +4139,18 @@ msgstr "Предел квоты достигнут."
 
 msgid "Rank    Owner   Job     File(s)                         Total Size"
 msgstr ""
-
-#. TRANSLATORS: Pri is job priority.
-msgid ""
-"Rank   Owner      Pri  Job        Files                       Total Size"
-msgstr ""
+"Ранг    Владелец   Задание     Файл(ы)                     Общий размер"
 
 msgid "Reject Jobs"
 msgstr "Отклонить задания"
 
 #, c-format
 msgid "Remote host did not accept control file (%d)."
-msgstr ""
+msgstr "Удаленный хост не принял контрольный файл (%d)."
 
 #, c-format
 msgid "Remote host did not accept data file (%d)."
-msgstr ""
+msgstr "Удаленный хост не принял файл данных (%d)."
 
 msgid "Reprint After Error"
 msgstr "Повторить печать после ошибки"
@@ -3434,7 +4162,7 @@ msgid "Resolution"
 msgstr "Разрешение"
 
 msgid "Resume Class"
-msgstr "Ð\92озобновиÑ\82Ñ\8c Ñ\80абоÑ\82Ñ\83 ÐºÐ»Ð°Ñ\81Ñ\81а"
+msgstr "Ð\92озобновиÑ\82Ñ\8c Ñ\80абоÑ\82Ñ\83 Ð³Ñ\80Ñ\83ппÑ\8b"
 
 msgid "Resume Printer"
 msgstr "Возобновить работу принтера"
@@ -3447,19 +4175,19 @@ msgstr "Вернуться в начало"
 
 #, c-format
 msgid "Running command: %s %s -N -A %s -c '%s'"
-msgstr ""
+msgstr "Запущенная команда: %s %s -N -A %s -c '%s'"
 
 msgid "SEQUENCE uses indefinite length"
 msgstr "Для SEQUENCE длина не установлена"
 
 msgid "SSL/TLS Negotiation Error"
-msgstr ""
+msgstr "SSL/TLS Negotiation Error"
 
 msgid "See Other"
 msgstr "Посмотреть другие"
 
 msgid "Sending data to printer."
-msgstr ""
+msgstr "Отправка данных на принтер."
 
 msgid "Server Restarted"
 msgstr "Сервер перезагружен"
@@ -3473,6 +4201,9 @@ msgstr "Сервер загружен"
 msgid "Server Stopped"
 msgstr "Сервер остановлен"
 
+msgid "Server credentials not set."
+msgstr "Учетные данные сервера не заданы."
+
 msgid "Service Unavailable"
 msgstr "Служба недоступна"
 
@@ -3483,7 +4214,7 @@ msgid "Set As Server Default"
 msgstr "Использовать данный сервер по умолчанию"
 
 msgid "Set Class Options"
-msgstr "Ð\9dаÑ\81Ñ\82Ñ\80оиÑ\82Ñ\8c Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\8b ÐºÐ»Ð°Ñ\81Ñ\81а"
+msgstr "Ð\9dаÑ\81Ñ\82Ñ\80оиÑ\82Ñ\8c Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\8b Ð³Ñ\80Ñ\83ппÑ\8b"
 
 msgid "Set Printer Options"
 msgstr "Настроить параметры принтера"
@@ -3502,31 +4233,28 @@ msgstr "Особая бумага"
 
 #, c-format
 msgid "Spooling job, %.0f%% complete."
-msgstr ""
+msgstr "Постановка в очередь, %.0f%% завершено."
 
 msgid "Standard"
 msgstr "Стандартный"
 
 #. TRANSLATORS: Banner/cover sheet before the print job.
 msgid "Starting Banner"
-msgstr "Ð\97апÑ\83Ñ\81к Ð±Ð°Ð½Ð½ÐµÑ\80а"
+msgstr "СÑ\82аÑ\80Ñ\82овÑ\8bй Ð±Ð°Ð½Ð½ÐµÑ\80"
 
 #, c-format
 msgid "Starting page %d."
-msgstr ""
+msgstr "Главная страница %d."
 
 msgid "Statement"
 msgstr "Оператор"
 
-msgid "Stylus Color Series"
-msgstr "Серия Stylus Color"
-
-msgid "Stylus Photo Series"
-msgstr "Серия Stylus Photo"
-
 #, c-format
 msgid "Subscription #%d does not exist."
-msgstr ""
+msgstr "Подписка #%d не существует."
+
+msgid "Substitutions:"
+msgstr "Замещения:"
 
 msgid "Super A"
 msgstr "Super A"
@@ -3559,49 +4287,52 @@ 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 ""
+msgstr "Атрибут %s не может быть использован с job-ids."
 
 #, c-format
 msgid ""
-"The '%s' Job Description attribute cannot be supplied in a job creation "
-"request."
+"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 ""
+msgstr "Атрибут '%s' не может быть подставлен в запрос Create-Job"
 
 #, c-format
 msgid "The PPD file \"%s\" could not be found."
-msgstr "Не удается найти PPD-файл «%s»."
+msgstr "Не удается найти PPD-файл \"%s\"."
 
 #, c-format
 msgid "The PPD file \"%s\" could not be opened: %s"
-msgstr "Не удалось открыть PPD-файл «%s»: %s"
+msgstr "Не удалось открыть PPD-файл \"%s\": %s"
 
 msgid "The PPD file could not be opened."
-msgstr ""
+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 ""
-"Ð\98мÑ\8f ÐºÐ»Ð°Ñ\81Ñ\81а может содержать максимально 127 печатных символов и не может "
-"содержать пробелы, дроби (/) или знак «решетки» (#)."
+"Ð\98мÑ\8f Ð³Ñ\80Ñ\83ппÑ\8b может содержать максимально 127 печатных символов и не может "
+"содержать пробелы, дроби (/) или знак \"решетки\" (#)."
 
 msgid "The developer unit needs to be replaced."
-msgstr "Блок разработки должен быть перемещен"
+msgstr "Developer unit нуждается в замене."
 
 msgid "The developer unit will need to be replaced soon."
-msgstr "Необходимо переместить блок разработки"
+msgstr "Developer unit нуждается в замене в ближайшее время."
 
 msgid "The fuser's temperature is high."
-msgstr "Высокая температура термофиксатора!"
+msgstr "Высокая температура термофиксатора."
 
 msgid "The fuser's temperature is low."
-msgstr "Низкая температура термофиксатора!"
+msgstr "Низкая температура термофиксатора."
 
 msgid ""
 "The notify-lease-duration attribute cannot be used with job subscriptions."
@@ -3611,93 +4342,68 @@ msgstr ""
 
 #, c-format
 msgid "The notify-user-data value is too large (%d > 63 octets)."
-msgstr ""
+msgstr "Значение notify-user-data слишком большое(%d > 63 октета)"
 
 msgid "The optical photoconductor needs to be replaced."
-msgstr "Ð\9eпÑ\82иÑ\87еÑ\81кий Ñ\84оÑ\82оÑ\80егиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80 Ð´Ð¾Ð»Ð¶ÐµÐ½ Ð±Ñ\8bÑ\82Ñ\8c Ð¿ÐµÑ\80емеÑ\89ен."
+msgstr "Ð\9eпÑ\82иÑ\87еÑ\81кий Ñ\84оÑ\82оÑ\80егиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80 Ð½Ñ\83ждаеÑ\82Ñ\81Ñ\8f Ð² Ð·Ð°Ð¼ÐµÐ½Ðµ."
 
 msgid "The optical photoconductor will need to be replaced soon."
-msgstr "Необходимо переместить оптический фоторегистратор."
-
-msgid "The output bin is almost full."
-msgstr "Лоток вывода почти заполнен."
-
-msgid "The output bin is full."
-msgstr "Лоток вывода заполнен."
-
-msgid "The output bin is missing."
-msgstr "Отсутствует лоток вывода."
-
-msgid "The paper tray is almost empty."
-msgstr "Лоток с бумагой почти пуст."
-
-msgid "The paper tray is empty."
-msgstr "Лоток с бумагой пуст."
-
-msgid "The paper tray is missing."
-msgstr "Лоток с бумагой отсутствует."
-
-msgid "The paper tray needs to be filled."
-msgstr "Необходимо наполнить лоток с бумагой."
+msgstr "Оптический фоторегистратор нуждается в замене в ближайшее время."
 
-msgid "The printer URI is incorrect or no longer exists."
-msgstr ""
+msgid "The printer configuration is incorrect or the printer no longer exists."
+msgstr "Неправильная конфигурация принтера, или принтер больше не доступен."
 
 msgid "The printer did not respond."
-msgstr ""
-
-#, c-format
-msgid "The printer does not support IPP/%d.%d, trying IPP/%s."
-msgstr ""
+msgstr "Принтер не отвечает."
 
 msgid "The printer is in use."
-msgstr ""
+msgstr "Принтер используется."
+
+msgid "The printer is low on ink."
+msgstr "Заканчиваются чернила."
+
+msgid "The printer is low on toner."
+msgstr "Заканчивается тонер."
 
 msgid "The printer is not connected."
-msgstr ""
+msgstr "Принтер не подключен."
 
 msgid "The printer is not responding."
-msgstr ""
+msgstr "Принтер не отвечает."
 
 msgid "The printer is now connected."
-msgstr ""
+msgstr "Принтер подключен."
 
 msgid "The printer is now online."
-msgstr ""
+msgstr "Принтер подключен."
 
 msgid "The printer is offline."
 msgstr "Принтер выключен."
 
-msgid "The printer is running low on ink."
-msgstr ""
-
-msgid "The printer is running low on toner."
-msgstr ""
-
 msgid "The printer is unreachable at this time."
-msgstr ""
+msgstr "В настоящее время принтер недоступен."
 
 msgid "The printer may be out of ink."
-msgstr ""
+msgstr "Возможно в принтере закончились чернила."
 
 msgid "The printer may be out of toner."
-msgstr ""
+msgstr "Возможно в принтере закончился тонер."
 
 msgid "The printer may not exist or is unavailable at this time."
-msgstr ""
+msgstr "Возможно принтер недоступен в настоящее время."
 
 msgid ""
 "The printer name may only contain up to 127 printable characters and may not "
 "contain spaces, slashes (/), or the pound sign (#)."
 msgstr ""
 "Имя принтера может содержать максимально 127 печатных символов и не может "
-"содержать пробелы, дроби (/) или знак «решетки» (#)."
+"содержать пробелы, дроби (/) или знак \"решетки\" (#)."
 
 msgid "The printer or class does not exist."
-msgstr ""
+msgstr "Принтер или группа не существует."
 
 msgid "The printer or class is not shared."
-msgstr ""
+msgstr "Принтер или группа без совместного доступа."
 
 msgid "The printer's cover is open."
 msgstr "Крышка принтера открыта."
@@ -3716,10 +4422,10 @@ msgstr "Отсек для мусора заполнен."
 
 #, c-format
 msgid "The printer-uri \"%s\" contains invalid characters."
-msgstr "printer-uri «%s» содержит недопустимые символы."
+msgstr "printer-uri \"%s\" содержит недопустимые символы."
 
 msgid "The printer-uri attribute is required."
-msgstr ""
+msgstr "Для printer-uri требуется атрибут."
 
 msgid ""
 "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
@@ -3734,25 +4440,24 @@ msgid ""
 "(?), or the pound sign (#)."
 msgstr ""
 "Имя подписки не может содержать пробелы, дроби (/), вопросительные знаки (?) "
-"или знак «решетки» (#)."
+"или знак \"решетки\" (#)."
 
 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 ""
+msgstr "Значение \"%s\" для which-jobs не поддерживается."
 
 msgid "There are too many subscriptions."
 msgstr "Слишком много подписок."
 
-msgid "There is a paper jam."
-msgstr "Зажевало бумагу."
-
 msgid "There was an unrecoverable USB error."
-msgstr ""
+msgstr "Обнаружена ошибка USB."
 
 msgid "Thermal Transfer Media"
 msgstr "Носитель для печати методом термопереноса"
@@ -3762,11 +4467,11 @@ msgstr "Слишком много активных заданий."
 
 #, c-format
 msgid "Too many job-sheets values (%d > 2)."
-msgstr ""
+msgstr "Слишком много значений job-sheets (%d>2)"
 
 #, c-format
 msgid "Too many printer-state-reasons values (%d > %d)."
-msgstr ""
+msgstr "Слишком много значений printer-state-reasons (%d > %d)"
 
 msgid "Transparency"
 msgstr "Прозрачность"
@@ -3789,6 +4494,9 @@ msgstr "Лоток 4"
 msgid "URI Too Long"
 msgstr "Слишком длинный адрес URI"
 
+msgid "URI too large"
+msgstr "Слишком большой адрес URI"
+
 msgid "US Ledger"
 msgstr "US Ledger"
 
@@ -3814,108 +4522,119 @@ msgid "US Letter Small"
 msgstr ""
 
 msgid "Unable to access cupsd.conf file"
-msgstr ""
+msgstr "Не удается получить доступ к файлу \"cupsd.conf\""
 
 msgid "Unable to access help file."
-msgstr ""
+msgstr "Не удается получить доступ к файлу помощи."
 
 msgid "Unable to add RSS subscription"
-msgstr ""
+msgstr "Не удается добавить подписку RSS."
 
 msgid "Unable to add class"
-msgstr ""
+msgstr "Не удается добавить группу"
 
 msgid "Unable to add document to print job."
-msgstr ""
+msgstr "Не удается добавить документ в задание печати."
 
 #, c-format
 msgid "Unable to add job for destination \"%s\"."
-msgstr ""
+msgstr "Не удается добавить задание для назначения \"%s\""
 
 msgid "Unable to add printer"
-msgstr ""
+msgstr "Не удается добавить принтер"
 
 msgid "Unable to allocate memory for file types."
-msgstr ""
+msgstr "Не удается выделить память для типов файлов."
 
 msgid "Unable to allocate memory for page info"
-msgstr ""
+msgstr "Не удается выделить память для страницы информации"
 
 msgid "Unable to allocate memory for pages array"
-msgstr ""
+msgstr "Не удается выделить память для страниц"
 
 msgid "Unable to cancel RSS subscription"
-msgstr ""
+msgstr "Не удается отменить подписку RSS"
 
 msgid "Unable to cancel print job."
-msgstr ""
+msgstr "Не удается отменить задание печати."
 
 msgid "Unable to change printer"
-msgstr ""
+msgstr "Не удается изменить принтер"
 
 msgid "Unable to change printer-is-shared attribute"
-msgstr ""
+msgstr "Не удается изменить атрибут printer-is-shared"
 
 msgid "Unable to change server settings"
-msgstr ""
+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 ""
+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 64-bit CUPS printer driver files (%d)."
-msgstr ""
+msgstr "Не удается копировать 64-битовые файлы драйвера принтера CUPS (%d)."
 
 #, c-format
 msgid "Unable to copy 64-bit Windows printer driver files (%d)."
 msgstr ""
+"Не удается копировать 64-битовые файлы драйвера принтера для Windows (%d)."
 
 #, c-format
 msgid "Unable to copy CUPS printer driver files (%d)."
-msgstr ""
+msgstr "Не удается копировать файлы драйвера принтера CUPS (%d)"
 
 #, c-format
 msgid "Unable to copy PPD file - %s"
 msgstr "Не удается копировать PPD-файл - %s"
 
 msgid "Unable to copy PPD file."
-msgstr ""
+msgstr "Не удается копировать PPD-файл."
 
 #, c-format
 msgid "Unable to copy Windows 2000 printer driver files (%d)."
-msgstr ""
+msgstr "Не удается копировать файлы драйвера принтера Windows 2000 (%d)"
 
 #, c-format
 msgid "Unable to copy Windows 9x printer driver files (%d)."
-msgstr ""
+msgstr "Не удается копировать файлы драйвера принтера Windows 9x (%d)"
 
 #, c-format
 msgid "Unable to copy interface script - %s"
 msgstr "Не удается копировать скрипт интерфейса - %s"
 
-msgid "Unable to create compressed print file"
-msgstr ""
-
 msgid "Unable to create printer-uri"
 msgstr "Не удается создать printer-uri"
 
+msgid "Unable to create server credentials."
+msgstr "Не удается создать учетные данные сервера."
+
 msgid "Unable to create temporary file"
-msgstr ""
+msgstr "Не удается создать временный файл"
 
 msgid "Unable to delete class"
-msgstr ""
+msgstr "Не удается удалить группу"
 
 msgid "Unable to delete printer"
-msgstr ""
+msgstr "Не удается удалить принтер"
 
 msgid "Unable to do maintenance command"
-msgstr ""
+msgstr "Не удается выполнить команду обслуживания"
 
 msgid "Unable to edit cupsd.conf files larger than 1MB"
 msgstr "Невозможно редактировать файлы cupsd.conf больше 1 МБ"
@@ -3923,89 +4642,96 @@ msgstr "Невозможно редактировать файлы cupsd.conf б
 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 ""
+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 ""
+msgstr "Не удается установить защищенное соединение (ненадежный сертификат)."
 
 msgid "Unable to establish a secure connection to host."
-msgstr ""
+msgstr "Не удается установить защищенное соединение."
 
 msgid "Unable to find destination for job"
 msgstr "Не удается найти назначение для задания"
 
 msgid "Unable to find printer."
-msgstr ""
+msgstr "Не удается найти принтер."
 
-msgid "Unable to generate compressed print file"
-msgstr ""
+msgid "Unable to find server credentials."
+msgstr "Не удается найти учетные данные сервера."
 
 msgid "Unable to get backend exit status."
-msgstr ""
+msgstr "Не удается получить код завершения от backend."
 
 msgid "Unable to get class list"
-msgstr ""
+msgstr "Не удается получить список групп"
 
 msgid "Unable to get class status"
-msgstr ""
+msgstr "Не удается получить статус групп"
 
 msgid "Unable to get list of printer drivers"
-msgstr ""
+msgstr "Не удается получить список драйверов принтера"
 
 msgid "Unable to get printer attributes"
-msgstr ""
+msgstr "Не удается получить атрибуты принтера"
 
 msgid "Unable to get printer list"
-msgstr ""
+msgstr "Не удается получить список принтеров"
 
 msgid "Unable to get printer status"
-msgstr ""
+msgstr "Не удается получить статус принтера"
 
 msgid "Unable to get printer status."
-msgstr ""
+msgstr "Не удается получить статус принтера."
 
 #, c-format
 msgid "Unable to install Windows 2000 printer driver files (%d)."
-msgstr ""
+msgstr "Не удается установить файлы драйвера принтера Windows 2000 (%d)"
 
 #, c-format
 msgid "Unable to install Windows 9x printer driver files (%d)."
-msgstr ""
+msgstr "Не удается установить файлы драйвера принтера Windows 9x (%d)"
 
 msgid "Unable to load help index."
-msgstr ""
+msgstr "Не удается загрузить содержание справки."
 
 #, c-format
 msgid "Unable to locate printer \"%s\"."
-msgstr ""
+msgstr "Принтер \"%s\" не найден"
 
 msgid "Unable to locate printer."
-msgstr ""
+msgstr "Принтер не найден"
 
 msgid "Unable to modify class"
-msgstr ""
+msgstr "Не удается изменить группу"
 
 msgid "Unable to modify printer"
-msgstr ""
+msgstr "Не удается изменить принтер"
 
 msgid "Unable to move job"
 msgstr "Не удается переместить задание"
@@ -4016,78 +4742,78 @@ msgstr "Не удается переместить задания"
 msgid "Unable to open PPD file"
 msgstr "Не удается открыть PPD-файл"
 
-msgid "Unable to open compressed print file"
-msgstr ""
-
 msgid "Unable to open cupsd.conf file:"
-msgstr "Не удается открыть файл «cupsd.conf»:"
+msgstr "Не удается открыть файл cupsd.conf:"
 
 msgid "Unable to open device file"
-msgstr ""
+msgstr "Не удается открыть файл устройства"
 
 #, c-format
 msgid "Unable to open document #%d in job #%d."
-msgstr ""
+msgstr "Не удается открыть документ #%d в задании #%d."
 
 msgid "Unable to open help file."
-msgstr ""
+msgstr "Не удается открыть файл справки."
 
 msgid "Unable to open print file"
-msgstr ""
+msgstr "Не удается открыть файл печати"
 
 msgid "Unable to open raster file"
-msgstr ""
+msgstr "Не удается открыть растровый файл"
 
 msgid "Unable to print test page"
-msgstr ""
+msgstr "Не удается напечатать пробную страницу"
 
 msgid "Unable to read print data."
-msgstr ""
+msgstr "Не удается считать данные печати."
 
-msgid "Unable to resolve printer URI."
+msgid "Unable to rename job document file."
 msgstr ""
 
+msgid "Unable to resolve printer-uri."
+msgstr "Не удается определить printer-uri"
+
 #, c-format
 msgid "Unable to run \"%s\": %s"
-msgstr ""
+msgstr "Не удается запустить \"%s\": %s"
 
 msgid "Unable to see in file"
-msgstr ""
+msgstr "Не удается увидеть в файле"
 
 msgid "Unable to send command to printer driver"
 msgstr "Не удается отправить команду драйверу принтера"
 
 msgid "Unable to send data to printer."
-msgstr ""
+msgstr "Не удается отправить данные на принтер."
 
 #, c-format
 msgid "Unable to set Windows printer driver (%d)."
-msgstr ""
+msgstr "Не удается настроить драйвер принтера Windows (%d)."
 
 msgid "Unable to set options"
-msgstr ""
+msgstr "Не удается настроить параметры"
 
 msgid "Unable to set server default"
-msgstr ""
+msgstr "Не удается назначить сервер используемым по умолчанию"
 
 msgid "Unable to start backend process."
-msgstr ""
+msgstr "Не удается запустить фоновый процесс"
 
 msgid "Unable to upload cupsd.conf file"
-msgstr ""
+msgstr "Не удается загрузить файл cupsd.conf"
 
 msgid "Unable to use legacy USB class driver."
-msgstr ""
+msgstr "Не удается использовать устаревший драйвер USB."
 
 msgid "Unable to write print data"
-msgstr ""
+msgstr "Не удается записать данные печати"
 
 #, c-format
 msgid "Unable to write uncompressed print data: %s"
-msgstr ""
+msgstr "Не удается записать несжатые данные печати: %s"
 
 msgid "Unauthorized"
-msgstr "Ð\9dе Ñ\81анкÑ\86иониÑ\80овано"
+msgstr "Ð\92 Ð´Ð¾Ñ\81Ñ\82Ñ\83пе Ð¾Ñ\82казано"
 
 msgid "Units"
 msgstr "Единицы"
@@ -4097,101 +4823,115 @@ msgstr "Неизвестный"
 
 #, c-format
 msgid "Unknown choice \"%s\" for option \"%s\"."
-msgstr ""
+msgstr "Неизвестный выбор \"%s\" для параметра \"%s\"."
 
 #, c-format
 msgid "Unknown encryption option value: \"%s\"."
-msgstr ""
+msgstr "Неизвестное значение \"%s\" параметра шифрования."
 
 #, c-format
 msgid "Unknown file order: \"%s\"."
-msgstr ""
+msgstr "Неизвестный порядок файлов \"%s\"."
 
 #, c-format
 msgid "Unknown format character: \"%c\"."
-msgstr ""
+msgstr "Символ неизвестного формата \"%c\"."
 
 msgid "Unknown media size name."
-msgstr ""
+msgstr "Неизвестное имя размера бумаги."
 
 #, c-format
 msgid "Unknown option \"%s\" with value \"%s\"."
-msgstr ""
+msgstr "Неизвестный параметр \"%s\" со значением \"%s\"."
 
 #, c-format
 msgid "Unknown option \"%s\"."
-msgstr ""
+msgstr "Неизвестный параметр \"%s\"."
 
 #, c-format
 msgid "Unknown print mode: \"%s\"."
-msgstr ""
+msgstr "Неизвестный режим печати: \"%s\"."
 
 #, c-format
 msgid "Unknown printer-error-policy \"%s\"."
-msgstr "Неизвестная политика printer-error-policy «%s»."
+msgstr "Неизвестная политика printer-error-policy \"%s\"."
 
 #, c-format
 msgid "Unknown printer-op-policy \"%s\"."
-msgstr "Неизвестная политика 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 ""
+msgstr "Неизвестное имя сервиса."
 
 #, c-format
 msgid "Unknown version option value: \"%s\"."
-msgstr ""
+msgstr "Неизвестное значение параметра версии \"%s\"."
 
 #, c-format
 msgid "Unsupported 'compression' value \"%s\"."
-msgstr ""
+msgstr "Неподдерживаемое значение 'compression' \"%s\"."
 
 #, c-format
 msgid "Unsupported 'document-format' value \"%s\"."
-msgstr ""
+msgstr "Неподдерживаемое значение'document-format' \"%s\"."
 
 msgid "Unsupported 'job-name' value."
-msgstr ""
+msgstr "Неподдерживаемое значение 'job-name'."
 
 #, c-format
 msgid "Unsupported character set \"%s\"."
-msgstr ""
+msgstr "Неподдерживаемый набор символов \"%s\"."
 
 #, c-format
 msgid "Unsupported compression \"%s\"."
-msgstr ""
+msgstr "Неподдерживаемое сжатие \"%s\"."
 
 #, c-format
 msgid "Unsupported document-format \"%s\"."
-msgstr ""
+msgstr "Неподдерживаемый document-format \"%s\"."
 
 #, c-format
 msgid "Unsupported document-format \"%s/%s\"."
-msgstr ""
+msgstr "Неподдерживаемый document-format \"%s/%s\"."
 
 #, c-format
 msgid "Unsupported format \"%s\"."
-msgstr ""
+msgstr "Неподдерживаемый формат \"%s\"."
 
 msgid "Unsupported margins."
-msgstr ""
+msgstr "Неподдерживаемые поля."
 
 msgid "Unsupported media value."
-msgstr ""
+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 ""
+msgstr "Неподдерживаемые данные растра."
 
 msgid "Unsupported value type"
 msgstr "Неподдерживаемый тип значения"
@@ -4209,6 +4949,15 @@ msgid ""
 "                       [-P ppd-file] [-o name=value]\n"
 "                       [-u allow:user,user] [-u deny:user,user]"
 msgstr ""
+"Использование:\n"
+"\n"
+"    lpadmin [-h server] -d destination\n"
+"    lpadmin [-h server] -x destination\n"
+"    lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n"
+"                       [-r remove-class] [-v device] [-D description]\n"
+"                       [-P ppd-file] [-o name=value]\n"
+"                       [-u allow:user,user] [-u deny:user,user]\n"
+"\n"
 
 #, c-format
 msgid "Usage: %s job-id user title copies options [file]"
@@ -4223,7 +4972,7 @@ msgstr ""
 msgid "Usage: cupsd [options]"
 msgstr ""
 
-msgid "Usage: cupsfilter [ options ] filename"
+msgid "Usage: cupsfilter [ options ] [ -- ] filename"
 msgstr ""
 
 msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]"
@@ -4233,6 +4982,30 @@ msgid ""
 "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"
 msgstr ""
 
+msgid ""
+"Usage: ippdiscover [options] -a\n"
+"       ippdiscover [options] \"service name\"\n"
+"\n"
+"Options:"
+msgstr ""
+"Использование:\n"
+"       ippdiscover [options] -a\n"
+"       ippdiscover [options] \"service name\"\n"
+"\n"
+"Параметры:"
+
+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 ""
 
@@ -4245,15 +5018,11 @@ msgid ""
 "       lpoptions [-h server] [-E] -p printer -o option[=value] ...\n"
 "       lpoptions [-h server] [-E] -x printer"
 msgstr ""
-
-msgid "Usage: lppasswd [-g groupname]"
-msgstr ""
-
-msgid ""
-"Usage: lppasswd [-g groupname] [username]\n"
-"       lppasswd [-g groupname] -a [username]\n"
-"       lppasswd [-g groupname] -x [username]"
-msgstr ""
+"Использование:\n"
+"       lpoptions [-h server] [-E] -d printer\n"
+"       lpoptions [-h server] [-E] [-p printer] -l\n"
+"       lpoptions [-h server] [-E] -p printer -o option[=value] ...\n"
+"       lpoptions [-h server] [-E] -x printer"
 
 msgid ""
 "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"
@@ -4288,19 +5057,19 @@ msgid "Version uses indefinite length"
 msgstr "Для Version длина не установлена"
 
 msgid "Waiting for job to complete."
-msgstr ""
+msgstr "Ожидание выполнения задания."
 
 msgid "Waiting for printer to become available."
-msgstr ""
+msgstr "Ожидание доступа к принтеру."
 
 msgid "Waiting for printer to finish."
-msgstr ""
+msgstr "Ожидание окончания работы принтера."
 
 msgid "Warning, no Windows 2000 printer drivers are installed."
-msgstr ""
+msgstr "Внимание, драйверы принтера Windows 2000 не установлены"
 
 msgid "Web Interface is Disabled"
-msgstr ""
+msgstr "Web интерфейс отключен"
 
 msgid "Yes"
 msgstr "Да"
@@ -4313,11 +5082,6 @@ msgstr ""
 "Вы должны получить доступ к этой странице с помощью URL <A HREF=«https://%s:"
 "%d%s»>https://%s:%d%s</A>."
 
-msgid ""
-"Your password must be at least 6 characters long, cannot contain your "
-"username, and must contain at least one letter and number."
-msgstr ""
-
 msgid "ZPL Label Printer"
 msgstr "Принтер для печати этикеток ZPL"
 
@@ -4325,7 +5089,7 @@ msgid "Zebra"
 msgstr "Zebra"
 
 msgid "aborted"
-msgstr "оÑ\82менено"
+msgstr "пÑ\80еÑ\80вано"
 
 msgid "canceled"
 msgstr "отменено"
@@ -4341,77 +5105,79 @@ msgstr "Не удалось выполнить cups-driverd."
 
 #, c-format
 msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s"
-msgstr ""
+msgstr "cupsaddsmb: Нет PPD-файла для принтера \"%s\" - %s"
 
 msgid "cupsctl: Cannot set Listen or Port directly."
-msgstr ""
+msgstr "cupsctl: Не удается задать Listen или Port."
 
 #, c-format
 msgid "cupsctl: Unable to connect to server: %s"
-msgstr ""
+msgstr "cupsctl: Не удается подключиться к серверу: %s"
 
 #, c-format
 msgid "cupsctl: Unknown option \"%s\""
-msgstr ""
+msgstr "cupsctl: Неизвестный параметр \"%s\""
 
 #, c-format
 msgid "cupsctl: Unknown option \"-%c\""
-msgstr ""
+msgstr "cupsctl: Неизвестный параметр \"-%c\""
 
 msgid "cupsd: Expected config filename after \"-c\" option."
-msgstr ""
+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 ""
+msgstr "cupsd: Не удается определить текущий каталог"
 
 msgid "cupsd: Unable to get path to cups-files.conf file."
-msgstr ""
+msgstr "cupsd: Не удается определить путь до cups-files.conf"
 
 #, c-format
 msgid "cupsd: Unknown argument \"%s\" - aborting."
-msgstr ""
+msgstr "cupsd: Неизвестный аргумент \"%s\" - прерывание."
 
 #, c-format
 msgid "cupsd: Unknown option \"%c\" - aborting."
-msgstr ""
-
-msgid "cupsd: launchd(8) support not compiled in, running in normal mode."
-msgstr ""
+msgstr "cupsd: Неизвестный параметр \"%c\" - прерывание."
 
 #, c-format
 msgid "cupsfilter: Invalid document number %d."
-msgstr ""
+msgstr "cupsfilter: Недопустимый номер документа %d."
 
 #, c-format
 msgid "cupsfilter: Invalid job ID %d."
-msgstr ""
+msgstr "cupsfilter: Недопустимый ID задания %d."
 
 msgid "cupsfilter: Only one filename can be specified."
-msgstr ""
+msgstr "cupsfilter: Может быть указано только одно имя файла."
 
 #, c-format
 msgid "cupsfilter: Unable to get job file - %s"
-msgstr ""
+msgstr "cupsfilter: Не удается получить файл задания - %s"
 
 msgid "cupstestppd: The -q option is incompatible with the -v option."
-msgstr ""
+msgstr "cupstestppd: Параметр -q несовместим с параметром -v"
 
 msgid "cupstestppd: The -v option is incompatible with the -q option."
-msgstr ""
+msgstr "cupstestppd: Параметр -v несовместим с параметром -q"
 
 #, c-format
 msgid "device for %s/%s: %s"
-msgstr ""
+msgstr "устройство для %s/%s: %s"
 
 #, c-format
 msgid "device for %s: %s"
-msgstr ""
+msgstr "устройство для %s: %s"
 
 msgid "error-index uses indefinite length"
 msgstr "Для error-index длина не установлена"
@@ -4423,744 +5189,799 @@ msgid "held"
 msgstr "задержано"
 
 msgid "help\t\tGet help on commands."
-msgstr ""
+msgstr "help\t\tПолучить справку по командам."
 
 msgid "idle"
 msgstr "свободен"
 
-msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."
-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 "ipptool: Bad URI - %s."
-msgstr ""
+msgid "ippfind: Expected key name after %s."
+msgstr "ippfind: Ожидается key name после %s."
 
 #, c-format
-msgid "ipptool: Bad version %s for \"-V\"."
-msgstr ""
+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."
+
+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 \"-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 ""
+msgstr "ipptool: Неправильные секунды для \"-i\"."
 
 msgid "ipptool: May only specify a single URI."
-msgstr ""
+msgstr "ipptool: Может быть определен лишь один URI."
 
 msgid "ipptool: Missing count for \"-n\"."
-msgstr ""
+msgstr "ipptool: Отсутствует count для \"-n\"."
 
 msgid "ipptool: Missing filename for \"-f\"."
-msgstr ""
+msgstr "ipptool: Отсутствует имя файла для \"-f\"."
 
 msgid "ipptool: Missing name=value for \"-d\"."
-msgstr ""
+msgstr "ipptool: Отсутствует name=value для \"-d\"."
 
 msgid "ipptool: Missing seconds for \"-i\"."
-msgstr ""
-
-msgid "ipptool: Missing timeout for \"-T\"."
-msgstr ""
-
-msgid "ipptool: Missing version for \"-V\"."
-msgstr ""
+msgstr "ipptool: Отсутствуют секунды для \"-i\"."
 
 msgid "ipptool: URI required before test file."
-msgstr ""
+msgstr "ipptool: Необходим URI перед указанием тест-файла."
 
 #, c-format
 msgid "ipptool: Unknown option \"-%c\"."
-msgstr ""
+msgstr "ipptool: Неизвестный параметр \"-%c\"."
 
 msgid "job-printer-uri attribute missing."
-msgstr ""
+msgstr "Атрибут job-printer-uri отсутствует."
 
 msgid "lpadmin: Class name can only contain printable characters."
-msgstr ""
+msgstr "lpadmin: Имя группы может содержать только печатаемые символы."
 
 msgid "lpadmin: Expected PPD after \"-P\" option."
-msgstr ""
+msgstr "lpadmin: После параметра '-P' должен быть указан PPD"
 
 msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option."
-msgstr ""
+msgstr "lpadmin: После параметра '-u' должен быть указан allow/deny:userlist."
 
 msgid "lpadmin: Expected class after \"-r\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-r\" должно быть указано имя группы."
 
 msgid "lpadmin: Expected class name after \"-c\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-c\" должно быть указано имя группы."
 
 msgid "lpadmin: Expected description after \"-D\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-D\" должно быть указано описание."
 
 msgid "lpadmin: Expected device URI after \"-v\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-v\" должен быть указан URI"
 
 msgid "lpadmin: Expected file type(s) after \"-I\" option."
-msgstr ""
+msgstr "После параметра \"-I\" должен(-ны) быть указан(-ы) тип(-ы) файла(-ов)."
 
 msgid "lpadmin: Expected hostname after \"-h\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-h\" должно быть указано имя хоста."
 
 msgid "lpadmin: Expected interface after \"-i\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-i\" должен быть указан интерфейс."
 
 msgid "lpadmin: Expected location after \"-L\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-L\" должно быть указано местоположение."
 
 msgid "lpadmin: Expected model after \"-m\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-m\" должна быть указана модель."
 
 msgid "lpadmin: Expected name after \"-R\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-R\" должно быть указано имя."
 
 msgid "lpadmin: Expected name=value after \"-o\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-o\" должно быть указано name=value"
 
 msgid "lpadmin: Expected printer after \"-p\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-p\" должен быть указан принтер."
 
 msgid "lpadmin: Expected printer name after \"-d\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-d\" должно быть указано имя принтера."
 
 msgid "lpadmin: Expected printer or class after \"-x\" option."
-msgstr ""
+msgstr "lpadmin: После параметра \"-x\" должен быть указан принтер или группа."
 
 msgid "lpadmin: No member names were seen."
-msgstr ""
+msgstr "lpadmin: Имена пользователей не были найдены."
 
 #, c-format
 msgid "lpadmin: Printer %s is already a member of class %s."
-msgstr ""
+msgstr "lpadmin: Принтер %s уже находится в группе %s."
 
 #, c-format
 msgid "lpadmin: Printer %s is not a member of class %s."
-msgstr ""
+msgstr "lpadmin: Принтер %s не находится в группе %s."
 
 msgid "lpadmin: Printer name can only contain printable characters."
-msgstr ""
+msgstr "lpadmin: Имя принтера может содержать только печатаемые символы."
 
 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 ""
+msgstr "lpadmin: Не удается подключиться к серверу: %s"
 
 msgid "lpadmin: Unable to create temporary file"
-msgstr ""
+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 file \"%s\" - %s"
+msgid "lpadmin: Unable to open PPD \"%s\": %s on line %d."
 msgstr ""
 
+#, c-format
+msgid "lpadmin: Unable to open PPD file \"%s\" - %s"
+msgstr "lpadmin: Не удается открыть PPD-файл \"%s\" - %s"
+
 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 ""
+msgstr "lpadmin: Неизвестный параметр allow/deny \"%s\"."
 
 #, c-format
 msgid "lpadmin: Unknown argument \"%s\"."
-msgstr ""
+msgstr "lpadmin: Неизвестный аргумент \"%s\"."
 
 #, c-format
 msgid "lpadmin: Unknown option \"%c\"."
-msgstr ""
+msgstr "lpadmin: Неизвестный параметр \"%c\"."
 
 msgid "lpadmin: Warning - content type list ignored."
-msgstr ""
+msgstr "lpadmin: Внимание - список типов содержимого пропущен."
 
 msgid "lpc> "
 msgstr "lpc> "
 
 msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"."
-msgstr ""
+msgstr "lpinfo: После \"--device-id\" должна идти строка ID устройства 1284"
 
 msgid "lpinfo: Expected language after \"--language\"."
-msgstr ""
+msgstr "lpinfo: После \"--language\" необходимо указать язык."
 
 msgid "lpinfo: Expected make and model after \"--make-and-model\"."
-msgstr ""
+msgstr "lpinfo: После \"--make-and-model\" должна быть указана марка и модель."
 
 msgid "lpinfo: Expected product string after \"--product\"."
-msgstr ""
+msgstr "lpinfo: После \"--product\" должна идти строка продукта."
 
 msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"."
-msgstr ""
+msgstr "lpinfo: После \"--exclude-schemes\" должен идти список схем."
 
 msgid "lpinfo: Expected scheme list after \"--include-schemes\"."
-msgstr ""
+msgstr "lpinfo: После \"--include-schemes\" должен идти список схем."
 
 msgid "lpinfo: Expected timeout after \"--timeout\"."
-msgstr ""
+msgstr "lpinfo: После \"--timeout\" должно быть указано время ожидания"
 
 #, c-format
 msgid "lpinfo: Unknown argument \"%s\"."
-msgstr ""
+msgstr "lpinfo: Неизвестный аргумент \"%s\"."
 
 #, c-format
 msgid "lpinfo: Unknown option \"%c\"."
-msgstr ""
+msgstr "lpinfo: Неизвестный параметр \"%c\"."
 
 #, c-format
 msgid "lpinfo: Unknown option \"%s\"."
-msgstr ""
+msgstr "lpinfo: Неизвестный параметр \"%s\"."
 
 #, c-format
 msgid "lpmove: Unable to connect to server: %s"
-msgstr ""
+msgstr "lpmove: Не удается подключиться к серверу: %s"
 
 #, c-format
 msgid "lpmove: Unknown argument \"%s\"."
-msgstr ""
+msgstr "lpmove: Неизвестный аргумент \"%s\"."
 
 #, c-format
 msgid "lpmove: Unknown option \"%c\"."
-msgstr ""
+msgstr "lpmove: Неизвестный параметр \"%c\"."
 
 msgid "lpoptions: No printers."
-msgstr ""
+msgstr "lpoptions: Нет принтеров."
 
 #, c-format
 msgid "lpoptions: Unable to add printer or instance: %s"
-msgstr ""
+msgstr "lpoptions: Не удается добавить принтер или представителя класса: %s"
 
 #, c-format
 msgid "lpoptions: Unable to get PPD file for %s: %s"
-msgstr ""
+msgstr "lpoptions: Не удается получить PPD-файл для %s: %s"
 
 #, c-format
 msgid "lpoptions: Unable to open PPD file for %s."
-msgstr ""
+msgstr "lpoptions: Не удается открыть PPD файл для %s"
 
 msgid "lpoptions: Unknown printer or class."
-msgstr ""
-
-msgid "lppasswd: Only root can add or delete passwords."
-msgstr ""
-
-msgid "lppasswd: Password file busy."
-msgstr ""
-
-msgid "lppasswd: Password file not updated."
-msgstr ""
-
-msgid "lppasswd: Sorry, password doesn't match."
-msgstr ""
-
-msgid "lppasswd: Sorry, password rejected."
-msgstr ""
-
-msgid "lppasswd: Sorry, passwords don't match."
-msgstr ""
-
-#, c-format
-msgid "lppasswd: Unable to copy password string: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: Unable to open password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: Unable to write to password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: failed to backup old password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: failed to rename password file: %s"
-msgstr ""
-
-#, c-format
-msgid "lppasswd: user \"%s\" and group \"%s\" do not exist."
-msgstr ""
+msgstr "lpoptions: Неизвестный принтер или группа"
 
 #, c-format
 msgid ""
 "lpstat: error - %s environment variable names non-existent destination \"%s"
 "\"."
 msgstr ""
+"lpstat: ошибка - %s переменная окружения указывает  несуществующее "
+"назначение \"%s\"\n"
 
 #, c-format
 msgid "members of class %s:"
-msgstr ""
+msgstr "члены группы %s:"
 
 msgid "no entries"
-msgstr ""
+msgstr "нет записей"
 
 msgid "no system default destination"
-msgstr ""
+msgstr "Нет назначение системы по умолчанию"
 
 msgid "notify-events not specified."
-msgstr ""
+msgstr "notify-events не указаны."
 
 #, c-format
 msgid "notify-recipient-uri URI \"%s\" is already used."
-msgstr ""
+msgstr "notify-recipient-uri URI \"%s\" уже используется."
 
 #, c-format
 msgid "notify-recipient-uri URI \"%s\" uses unknown scheme."
-msgstr ""
+msgstr "notify-recipient-uri URI \"%s\" использует неизвестную схему."
 
 msgid "pending"
 msgstr "задержка"
 
 #, c-format
 msgid "ppdc: Adding include directory \"%s\"."
-msgstr ""
+msgstr "ppdc: Добавление каталога \"%s\"."
 
 #, c-format
 msgid "ppdc: Adding/updating UI text from %s."
-msgstr ""
+msgstr "ppdc: Добавление/обновление текста интерфейса из %s."
 
 #, c-format
 msgid "ppdc: Bad boolean value (%s) on line %d of %s."
-msgstr ""
+msgstr "ppdc: Недопустимое двоичное значение (%s) в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Bad font attribute: %s"
-msgstr ""
+msgstr "ppdc: Недопустимый атрибут шрифта: %s"
 
 #, c-format
 msgid "ppdc: Bad resolution name \"%s\" on line %d of %s."
-msgstr ""
+msgstr "ppdc: Недопустимое имя разрешения \"%s\" в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Bad status keyword %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: Недопустимое ключевое слово статуса %s в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Bad variable substitution ($%c) on line %d of %s."
-msgstr ""
+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 ""
+msgstr "ppdc: Дубликат #po для региона %s в строке %d из %s"
 
 #, c-format
 msgid "ppdc: Expected a filter definition on line %d of %s."
-msgstr ""
+msgstr "ppdc: В строке %d из %s должно быть определение фильтра."
 
 #, c-format
 msgid "ppdc: Expected a program name on line %d of %s."
-msgstr ""
+msgstr "ppdc: В строке %d из %s должно быть имя программы."
 
 #, c-format
 msgid "ppdc: Expected boolean value on line %d of %s."
-msgstr ""
+msgstr "ppdc: В строке %d из %s должно быть двоичное значение."
 
 #, c-format
 msgid "ppdc: Expected charset after Font on line %d of %s."
-msgstr ""
+msgstr "ppdc: После Font в строке %d из %s должен быть набор символов."
 
 #, c-format
 msgid "ppdc: Expected choice code on line %d of %s."
-msgstr ""
+msgstr "ppdc: В строке %d из %s должно быть код выбора."
 
 #, c-format
 msgid "ppdc: Expected choice name/text on line %d of %s."
-msgstr ""
+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 ""
+msgstr "ppdc: Для ColorModel в строке %d из %s должно быть указано colorspace."
 
 #, c-format
 msgid "ppdc: Expected compression for ColorModel on line %d of %s."
-msgstr ""
+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 ""
+msgstr "ppdc: После Duplex в строке %d из %s должен быть указан тип дуплекса."
 
 #, c-format
 msgid "ppdc: Expected encoding after Font on line %d of %s."
-msgstr ""
+msgstr "ppdc: После Font в строке %d из %s должна быть указана кодировка."
 
 #, c-format
 msgid "ppdc: Expected filename after #po %s on line %d of %s."
-msgstr ""
+msgstr "После #po %s в строке %d из %s должно быть указано имя файла."
 
 #, c-format
 msgid "ppdc: Expected group name/text on line %d of %s."
-msgstr ""
+msgstr "ppdc: В строке %d из %s должно быть указанно имя группы/текст."
 
 #, c-format
 msgid "ppdc: Expected include filename on line %d of %s."
-msgstr ""
+msgstr "ppdc: В строке %d из %s должно быть указано имя файла."
 
 #, c-format
 msgid "ppdc: Expected integer on line %d of %s."
-msgstr ""
+msgstr "ppdc: В строке %d из %s должно быть целое число."
 
 #, c-format
 msgid "ppdc: Expected locale after #po on line %d of %s."
-msgstr ""
+msgstr "ppdc: После #po в строке %d из %s должен быть указан регион."
 
 #, c-format
 msgid "ppdc: Expected name after %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: После %s в строке %d из %s должно быть указано имя."
 
 #, c-format
 msgid "ppdc: Expected name after FileName on line %d of %s."
-msgstr ""
+msgstr "ppdc: После FileName в строке %d из %s должно быть указано имя."
 
 #, c-format
 msgid "ppdc: Expected name after Font on line %d of %s."
-msgstr ""
+msgstr "ppdc: После Font в строке %d из %s должно быть указано имя."
 
 #, c-format
 msgid "ppdc: Expected name after Manufacturer on line %d of %s."
-msgstr ""
+msgstr "ppdc: После Manufacturer в строке %d из %s должно быть указано имя."
 
 #, c-format
 msgid "ppdc: Expected name after MediaSize on line %d of %s."
-msgstr ""
+msgstr "ppdc: После MediaSize в строке %d из %s должно быть указано имя."
 
 #, c-format
 msgid "ppdc: Expected name after ModelName on line %d of %s."
-msgstr ""
+msgstr "ppdc: После ModelName в строке %d из %s должно быть указано имя."
 
 #, c-format
 msgid "ppdc: Expected name after PCFileName on line %d of %s."
-msgstr ""
+msgstr "ppdc: После PCFileName в строке %d из %s должно быть указано имя."
 
 #, c-format
 msgid "ppdc: Expected name/text after %s on line %d of %s."
-msgstr ""
+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 ""
+msgstr "ppdc: В строке %d из %s должно быть указано имя параметра/текст."
 
 #, c-format
 msgid "ppdc: Expected option section on line %d of %s."
-msgstr ""
+msgstr "ppdc: В строке %d из %s должен быть указан раздел параметров."
 
 #, c-format
 msgid "ppdc: Expected option type on line %d of %s."
-msgstr ""
+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 ""
+msgstr "ppdc: В строке %d из %s должна быть запись в кавычках."
 
 #, c-format
 msgid "ppdc: Expected real number on line %d of %s."
-msgstr ""
+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 ""
+msgstr "ppdc: После %s в строке %d из %s должен быть selector."
 
 #, c-format
 msgid "ppdc: Expected status after Font on line %d of %s."
-msgstr ""
+msgstr "ppdc: После Font в строке %d из %s должен быть указан статус."
 
 #, c-format
 msgid "ppdc: Expected string after Copyright on line %d of %s."
-msgstr ""
+msgstr "ppdc: В строке %d из %s пропущено значение параметра Copyright."
 
 #, c-format
 msgid "ppdc: Expected string after Version on line %d of %s."
-msgstr ""
+msgstr "ppdc: В строке %d из %s пропущено значение параметра Version."
 
 #, c-format
 msgid "ppdc: Expected two option names on line %d of %s."
-msgstr ""
+msgstr "ppdc: В строке %d из %s должны быть два имени параметра."
 
 #, c-format
 msgid "ppdc: Expected value after %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: После %s в строке %d из %s должно быть значение."
 
 #, c-format
 msgid "ppdc: Expected version after Font on line %d of %s."
-msgstr ""
+msgstr "ppdc: После Font в строке %d из %s должна быть указана версия."
 
 #, c-format
 msgid "ppdc: Invalid #include/#po filename \"%s\"."
-msgstr ""
+msgstr "ppdc: Неверное имя файла #include/#po \"%s\"."
 
 #, c-format
 msgid "ppdc: Invalid cost for filter on line %d of %s."
-msgstr ""
+msgstr "ppdc: Затраты на фильтр в строке %d из %s указаны неверно."
 
 #, c-format
 msgid "ppdc: Invalid empty MIME type for filter on line %d of %s."
-msgstr ""
+msgstr "ppdc: Недопустимый пустой MIME-тип для фильтра в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Invalid empty program name for filter on line %d of %s."
-msgstr ""
+msgstr "ppdc: Недопустимое пустое имя программы для фильтра в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Invalid option section \"%s\" on line %d of %s."
-msgstr ""
+msgstr "ppdc: Неверный раздел параметров \"%s\" в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Invalid option type \"%s\" on line %d of %s."
-msgstr ""
+msgstr "ppdc: Неверный тип параметра \"%s\" в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Loading driver information file \"%s\"."
-msgstr ""
+msgstr "ppdc: Загружается файл с информацией о драйвере \"%s\"."
 
 #, c-format
 msgid "ppdc: Loading messages for locale \"%s\"."
-msgstr ""
+msgstr "ppdc: Загружаю сообщения для региона \"%s\"."
 
 #, c-format
 msgid "ppdc: Loading messages from \"%s\"."
-msgstr ""
+msgstr "ppdc: Загружаю сообщения из \"%s\"."
 
 #, c-format
 msgid "ppdc: Missing #endif at end of \"%s\"."
-msgstr ""
+msgstr "ppdc: Отсутствует #endif в конце \"%s\"."
 
 #, c-format
 msgid "ppdc: Missing #if on line %d of %s."
-msgstr ""
+msgstr "ppdc: Отсутствует #if в строке %d из %s."
 
 #, c-format
 msgid ""
 "ppdc: Need a msgid line before any translation strings on line %d of %s."
-msgstr ""
+msgstr "ppdc: Требуется строка msgid перед строкой перевода в строке %d из %s"
 
 #, c-format
 msgid "ppdc: No message catalog provided for locale %s."
-msgstr ""
+msgstr "ppdc: Не указан каталог сообщений для региона %s."
 
 #, c-format
 msgid "ppdc: Option %s defined in two different groups on line %d of %s."
-msgstr ""
+msgstr "ppdc: Параметр %s определен в двух разных группах в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Option %s redefined with a different type on line %d of %s."
-msgstr ""
+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 ""
+msgstr "ppdc: Слишком много вложенных операторов #if в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Unable to create PPD file \"%s\" - %s."
-msgstr ""
+msgstr "ppdc: Не удается создать PPD-файл \"%s\" - %s."
 
 #, c-format
 msgid "ppdc: Unable to create output directory %s: %s"
-msgstr ""
+msgstr "ppdc: Не удается создать каталог для выходных данных %s: %s"
 
 #, c-format
 msgid "ppdc: Unable to create output pipes: %s"
-msgstr ""
+msgstr "ppdc: Не удается создать конвейеры для выходных данных: %s"
 
 #, c-format
 msgid "ppdc: Unable to execute cupstestppd: %s"
-msgstr ""
+msgstr "ppdc: Не удается выполнить cupstestppd: %s"
 
 #, c-format
 msgid "ppdc: Unable to find #po file %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: Не удается найти файл #po %s в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Unable to find include file \"%s\" on line %d of %s."
-msgstr ""
+msgstr "ppdc: Не удается найти файл \"%s\" в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Unable to find localization for \"%s\" - %s"
-msgstr ""
+msgstr "ppdc: Не удается найти перевод для \"%s\" - %s"
 
 #, c-format
 msgid "ppdc: Unable to load localization file \"%s\" - %s"
-msgstr ""
+msgstr "ppdc: Не удается загрузить файл перевода \"%s\" - %s"
 
 #, c-format
 msgid "ppdc: Unable to open %s: %s"
-msgstr ""
+msgstr "ppdc: Не удается открыть %s: %s"
 
 #, c-format
 msgid "ppdc: Undefined variable (%s) on line %d of %s."
-msgstr ""
+msgstr "ppdc: Не определена переменная (%s) в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Unexpected text on line %d of %s."
-msgstr ""
+msgstr "ppdc: Неизвестный текст в %2$s строки %1$d"
 
 #, c-format
 msgid "ppdc: Unknown driver type %s on line %d of %s."
-msgstr ""
+msgstr "ppdc: Неизвестный тип драйвера %s в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s."
-msgstr ""
+msgstr "ppdc: Неизвестный тип дуплекса \"%s\" в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Unknown media size \"%s\" on line %d of %s."
-msgstr ""
+msgstr "ppdc: Неизвестный размер бумаги \"%s\" в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Unknown message catalog format for \"%s\"."
-msgstr ""
+msgstr "ppdc: Неизвестный формат каталога сообщений для \"%s\""
 
 #, c-format
 msgid "ppdc: Unknown token \"%s\" seen on line %d of %s."
-msgstr ""
+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 ""
+msgstr "ppdc: Не завершена строка, начинающаяся с %c в строке %d из %s."
 
 #, c-format
 msgid "ppdc: Warning - overlapping filename \"%s\"."
-msgstr ""
+msgstr "ppdc: Внимание - дублирующееся имя \"%s\"."
 
 #, c-format
 msgid "ppdc: Writing %s."
-msgstr ""
+msgstr "ppdc: Записывается %s."
 
 #, c-format
 msgid "ppdc: Writing PPD files to directory \"%s\"."
-msgstr ""
+msgstr "ppdc: Записываются PPD-файлы в каталог \"%s\"."
 
 #, c-format
 msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s."
-msgstr ""
+msgstr "ppdmerge: Неверное значение LanguageVersion \"%s\" в %s."
 
 #, c-format
 msgid "ppdmerge: Ignoring PPD file %s."
-msgstr ""
+msgstr "ppdmerge: Пропускается PPD-файл %s."
 
 #, c-format
 msgid "ppdmerge: Unable to backup %s to %s - %s"
-msgstr ""
+msgstr "ppdmerge: Не удается создать резервную копию %s на %s- %s"
 
 #, c-format
 msgid "printer %s disabled since %s -"
-msgstr ""
+msgstr "принтер %s отключен с момента %s -"
 
 #, c-format
 msgid "printer %s is idle.  enabled since %s"
-msgstr ""
+msgstr "принтер %s свободен. Включен с момента %s"
 
 #, c-format
 msgid "printer %s now printing %s-%d.  enabled since %s"
-msgstr ""
+msgstr "принтер %s сейчас печатает %s-%d. Включен с момента %s"
 
 #, c-format
 msgid "printer %s/%s disabled since %s -"
-msgstr ""
+msgstr "принтер %s/%s отключен с момента %s -"
 
 #, c-format
 msgid "printer %s/%s is idle.  enabled since %s"
-msgstr ""
+msgstr "принтер %s/%s свободен. Включен с момента %s"
 
 #, c-format
 msgid "printer %s/%s now printing %s-%d.  enabled since %s"
-msgstr ""
+msgstr "принтер %s/%s сейчас печатает %s-%d. Включен с момента %s"
 
 msgid "processing"
 msgstr "обработка"
 
 #, c-format
 msgid "request id is %s-%d (%d file(s))"
-msgstr ""
+msgstr "id запроса %s-%d (%d файл.)"
 
 msgid "request-id uses indefinite length"
 msgstr "Для request-id длина не определена"
 
 msgid "scheduler is not running"
-msgstr ""
+msgstr "планировщик не запущен"
 
 msgid "scheduler is running"
-msgstr ""
+msgstr "планировщик запущен"
 
 #, c-format
 msgid "stat of %s failed: %s"
 msgstr "не удалось установить %s: %s"
 
 msgid "status\t\tShow status of daemon and queue."
-msgstr ""
+msgstr "статус\t\tпоказать статус демона и очереди"
 
 msgid "stopped"
 msgstr "остановлен"
 
 #, c-format
 msgid "system default destination: %s"
-msgstr ""
+msgstr "назначение системы по умолчанию: %s"
 
 #, c-format
 msgid "system default destination: %s/%s"
-msgstr ""
+msgstr "назначение системы по умолчанию: %s/%s"
 
 msgid "unknown"
 msgstr "неизвестный"
@@ -5171,3511 +5992,21 @@ msgstr "новый"
 msgid "variable-bindings uses indefinite length"
 msgstr "Для variable-bindings длина не установлена"
 
-#~ msgid "\t\t(all)\n"
-#~ msgstr "\t\t(все)\n"
-
-#~ msgid "\t\t(none)\n"
-#~ msgstr "\t\t(нет)\n"
-
-#~ msgid "\t%d entries\n"
-#~ msgstr "\tзаписей: %d\n"
-
-#~ msgid "\tAfter fault: continue\n"
-#~ msgstr "\tПосле ошибки: продолжить\n"
-
-#~ msgid "\tAlerts:"
-#~ msgstr "\tПредупреждения:"
-
-#~ msgid "\tBanner required\n"
-#~ msgstr "\tТребуется баннер\n"
-
-#~ msgid "\tCharset sets:\n"
-#~ msgstr "\tНабор символов устанавливает:\n"
-
-#~ msgid "\tConnection: direct\n"
-#~ msgstr "\tПодключение: прямое\n"
-
-#~ msgid "\tConnection: remote\n"
-#~ msgstr "\tПодключение: удаленное\n"
-
-#~ msgid "\tDefault page size:\n"
-#~ msgstr "\tРазмер страницы по умолчанию:\n"
-
-#~ msgid "\tDefault pitch:\n"
-#~ msgstr "\tВысота по умолчанию:\n"
-
-#~ msgid "\tDefault port settings:\n"
-#~ msgstr "\tНастройки порта по умолчанию:\n"
-
-#~ msgid "\tDescription: %s\n"
-#~ msgstr "\tОписание: %s\n"
-
-#~ msgid ""
-#~ "\tForm mounted:\n"
-#~ "\tContent types: any\n"
-#~ "\tPrinter types: unknown\n"
-#~ msgstr ""
-#~ "\tФорма подключения:\n"
-#~ "\tТипы контента: любые\n"
-#~ "\tТипы принтеров: неизвестно\n"
-
-#~ msgid "\tForms allowed:\n"
-#~ msgstr "\tРазрешенные формы:\n"
-
-#~ msgid "\tInterface: %s.ppd\n"
-#~ msgstr "\tИнтерфейс: %s.ppd\n"
-
-#~ msgid "\tInterface: %s/interfaces/%s\n"
-#~ msgstr "\tИнтерфейс: %s/интерфейсы/%s\n"
-
-#~ msgid "\tInterface: %s/ppd/%s.ppd\n"
-#~ msgstr "\tИнтерфейс: %s/ppd/%s.ppd\n"
-
-#~ msgid "\tLocation: %s\n"
-#~ msgstr "\tРасположение: %s\n"
-
-#~ msgid "\tOn fault: no alert\n"
-#~ msgstr "\tПри ошибке: не выводить предупреждение\n"
-
-#~ msgid "\tUsers allowed:\n"
-#~ msgstr "\tРазрешенные пользователи:\n"
-
-#~ msgid "\tUsers denied:\n"
-#~ msgstr "\tЗапрещенные пользователи:\n"
-
-#~ msgid "\tdaemon present\n"
-#~ msgstr "\tдемон присутствует\n"
-
-#~ msgid "\tno entries\n"
-#~ msgstr "\tнет записей\n"
-
-#~ msgid "\tprinter is on device '%s' speed -1\n"
-#~ msgstr "\tпринтер на скорости -1 устройства «%s»\n"
-
-#~ msgid "\tprinting is disabled\n"
-#~ msgstr "\tпечать отключена\n"
-
-#~ msgid "\tprinting is enabled\n"
-#~ msgstr "\tпечать включена\n"
-
-#~ msgid "\tqueued for %s\n"
-#~ msgstr "\tочередь для %s\n"
-
-#~ msgid "\tqueuing is disabled\n"
-#~ msgstr "\tочередь отключена\n"
-
-#~ msgid "\tqueuing is enabled\n"
-#~ msgstr "\tочередь включена\n"
-
-#~ msgid "\treason unknown\n"
-#~ msgstr "\tпричина неизвестна\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "    DETAILED CONFORMANCE TEST RESULTS\n"
-#~ msgstr ""
-#~ "\n"
-#~ "    ПОДРОБНЫЕ РЕЗУЛЬТАТЫ ТЕСТА СООТВЕТСТВИЯ\n"
-
-#~ msgid "                REF: Page 15, section 3.1.\n"
-#~ msgstr "                REF: Стр. 15, раздел 3.1.\n"
-
-#~ msgid "                REF: Page 15, section 3.2.\n"
-#~ msgstr "                REF: Стр. 15, раздел 3.2.\n"
-
-#~ msgid "                REF: Page 19, section 3.3.\n"
-#~ msgstr "                REF: Стр. 19, раздел 3.3.\n"
-
-#~ msgid "                REF: Page 20, section 3.4.\n"
-#~ msgstr "                REF: Стр. 20, раздел 3.4.\n"
-
-#~ msgid "                REF: Page 27, section 3.5.\n"
-#~ msgstr "                REF: Стр. 27, раздел 3.5.\n"
-
-#~ msgid "                REF: Page 42, section 5.2.\n"
-#~ msgstr "                REF: Стр. 42, раздел 5.2.\n"
-
-#~ msgid "                REF: Pages 16-17, section 3.2.\n"
-#~ msgstr "                REF: Стр. 16-17, раздел 3.2.\n"
-
-#~ msgid "                REF: Pages 42-45, section 5.2.\n"
-#~ msgstr "                REF: Стр. 42-45, раздел 5.2.\n"
-
-#~ msgid "                REF: Pages 45-46, section 5.2.\n"
-#~ msgstr "                REF: Стр. 45-46, раздел 5.2.\n"
-
-#~ msgid "                REF: Pages 48-49, section 5.2.\n"
-#~ msgstr "                REF: Стр. 48-49, раздел 5.2.\n"
-
-#~ msgid "                REF: Pages 52-54, section 5.2.\n"
-#~ msgstr "                REF: Стр. 52-54, раздел 5.2.\n"
-
-#~ msgid "        %-39.39s %.0f bytes\n"
-#~ msgstr "        %-39.39s %.0f байт\n"
-
-#~ msgid "        PASS    Default%s\n"
-#~ msgstr "        PASS    Default%s\n"
-
-#~ msgid "        PASS    DefaultImageableArea\n"
-#~ msgstr "        PASS    DefaultImageableArea\n"
-
-#~ msgid "        PASS    DefaultPaperDimension\n"
-#~ msgstr "        PASS    DefaultPaperDimension\n"
-
-#~ msgid "        PASS    FileVersion\n"
-#~ msgstr "        PASS    FileVersion\n"
-
-#~ msgid "        PASS    FormatVersion\n"
-#~ msgstr "        PASS    FormatVersion\n"
-
-#~ msgid "        PASS    LanguageEncoding\n"
-#~ msgstr "        PASS    LanguageEncoding\n"
-
-#~ msgid "        PASS    LanguageVersion\n"
-#~ msgstr "        PASS    LanguageVersion\n"
-
-#~ msgid "        PASS    Manufacturer\n"
-#~ msgstr "        PASS    Manufacturer\n"
-
-#~ msgid "        PASS    ModelName\n"
-#~ msgstr "        PASS    ModelName\n"
-
-#~ msgid "        PASS    NickName\n"
-#~ msgstr "        PASS    NickName\n"
-
-#~ msgid "        PASS    PCFileName\n"
-#~ msgstr "        PASS    PCFileName\n"
-
-#~ msgid "        PASS    PSVersion\n"
-#~ msgstr "        PASS    PSVersion\n"
-
-#~ msgid "        PASS    PageRegion\n"
-#~ msgstr "        PASS    PageRegion\n"
-
-#~ msgid "        PASS    PageSize\n"
-#~ msgstr "        PASS    PageSize\n"
-
-#~ msgid "        PASS    Product\n"
-#~ msgstr "        PASS    Product\n"
-
-#~ msgid "        PASS    ShortNickName\n"
-#~ msgstr "        PASS    ShortNickName\n"
+#~ msgid "      %s  Missing \"%s\" translation string for option %s"
+#~ msgstr "\t%s Перевод \"%s\" отсутствует для параметра %s"
 
 #~ msgid ""
-#~ "        WARN    \"%s %s\" conflicts with \"%s %s\"\n"
-#~ "                (constraint=\"%s %s %s %s\")\n"
+#~ "    Missing %%EndComments comment.\n"
+#~ "        REF: Page 41, %%EndComments"
 #~ msgstr ""
-#~ "        WARN    «%s %s» конфликтует с «%s %s»\n"
-#~ "                (constraint=«%s %s %s %s»)\n"
+#~ "    Комментарий %%EndComments отсутствует.\n"
+#~ "        REF: Стр. 41, %%EndComments"
 
-#~ msgid "        WARN    %s has no corresponding options\n"
-#~ msgstr "\tWARN\t%s не имеет соответствующих параметров\n"
+#~ msgid "Looking for printer."
+#~ msgstr "Поиск принтера."
 
 #~ msgid ""
-#~ "        WARN    %s shares a common prefix with %s\n"
-#~ "                REF: Page 15, section 3.2.\n"
+#~ "The '%s' Job Description attribute cannot be supplied in a job creation "
+#~ "request."
 #~ msgstr ""
-#~ "        WARN    %s использует общий префикс совместно с %s\n"
-#~ "                REF: Стр. 15, раздел 3.2.\n"
-
-#~ msgid "        WARN    Default choices conflicting\n"
-#~ msgstr "\tWARN\tЗначения, используемые по умолчанию, конфликтуют\n"
-
-#~ msgid ""
-#~ "        WARN    Duplex option keyword %s may not work as expected and "
-#~ "should be named Duplex\n"
-#~ "                REF: Page 122, section 5.17\n"
-#~ msgstr ""
-#~ "\tWARN\tКлючевое слово параметра дуплекса %s может привести к "
-#~ "некорректным результатам. Используйте имя 'Duplex'\n"
-#~ "\t\tREF: Стр. 122, раздел 5.17\n"
-
-#~ msgid ""
-#~ "        WARN    File contains a mix of CR, LF, and CR LF line endings\n"
-#~ msgstr "\tWARN\tФайл содержит комбинацию окончаний строки CR, LF, CR LF \n"
-
-#~ msgid ""
-#~ "        WARN    LanguageEncoding required by PPD 4.3 spec.\n"
-#~ "                REF: Pages 56-57, section 5.3.\n"
-#~ msgstr ""
-#~ "        WARN    LanguageEncoding требуется спецификацией PPD 4.3.\n"
-#~ "                REF: Стр. 56-57, раздел 5.3.\n"
-
-#~ msgid "        WARN    Line %d only contains whitespace\n"
-#~ msgstr "\tWARN\tСтрока %d содержит только пробелы\n"
-
-#~ msgid ""
-#~ "        WARN    Manufacturer required by PPD 4.3 spec.\n"
-#~ "                REF: Pages 58-59, section 5.3.\n"
-#~ msgstr ""
-#~ "        WARN    Manufacturer требуется спецификацией PPD 4.3.\n"
-#~ "                REF: Стр. 58-59, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "        WARN    Non-Windows PPD files should use lines ending with only "
-#~ "LF, not CR LF\n"
-#~ msgstr ""
-#~ "\tWARN\tPPD-файлы не из Windows должны использовать строки только с "
-#~ "окончанием LF, а не с CR LF\n"
-
-#~ msgid ""
-#~ "        WARN    Obsolete PPD version %.1f\n"
-#~ "                REF: Page 42, section 5.2.\n"
-#~ msgstr ""
-#~ "\tWARN\tУстаревшая версия PPD %.1f\n"
-#~ "\t\tREF: Стр. 42, раздел 5.2. \n"
-
-#~ msgid ""
-#~ "        WARN    PCFileName longer than 8.3 in violation of PPD spec.\n"
-#~ "                REF: Pages 61-62, section 5.3.\n"
-#~ msgstr ""
-#~ "        WARN    PCFileName длиннее чем 8.3 нарушает спецификацию PPD.\n"
-#~ "                REF: Стр. 61-62, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "        WARN    PCFileName should contain a unique filename.\n"
-#~ "                REF: Pages 61-62, section 5.3.\n"
-#~ msgstr ""
-#~ "\tWARN\tPCFilename должен содержать уникальное название\n"
-#~ "\t\tREF: Стр. 61-62, раздел 5.3. \n"
-
-#~ msgid ""
-#~ "        WARN    Protocols contains PJL but JCL attributes are not set.\n"
-#~ "                REF: Pages 78-79, section 5.7.\n"
-#~ msgstr ""
-#~ "        WARN    Protocols содержит PJL, но атрибуты JCL не настроены.\n"
-#~ "                REF: Стр. 78-79, раздел 5.7.\n"
-
-#~ msgid ""
-#~ "        WARN    Protocols contains both PJL and BCP; expected TBCP.\n"
-#~ "                REF: Pages 78-79, section 5.7.\n"
-#~ msgstr ""
-#~ "\tWARN\tProtocols содержит PJL и BCP;\n"
-#~ "\t\tREF: Стр. 78-79, раздел 5.7.\n"
-
-#~ msgid ""
-#~ "        WARN    ShortNickName required by PPD 4.3 spec.\n"
-#~ "                REF: Pages 64-65, section 5.3.\n"
-#~ msgstr ""
-#~ "        WARN    ShortNickName требуется спецификацией PPD 4.3.\n"
-#~ "                REF: Стр. 64-65, раздел 5.3.\n"
-
-#~ msgid "      %s  %s %s does not exist\n"
-#~ msgstr "\t%s %s %s не существует\n"
-
-#~ msgid "      %s  %s file \"%s\" has the wrong capitalization\n"
-#~ msgstr "      %s  %s файл \"%s\" имеет неверный регистр\n"
-
-#~ msgid ""
-#~ "      %s  Bad %s choice %s\n"
-#~ "                REF: Page 122, section 5.17\n"
-#~ msgstr ""
-#~ "      %s  Неверный %s выбор %s!\n"
-#~ "                REF: Стр. 122, раздел 5.17\n"
-
-#~ msgid "      %s  Bad UTF-8 \"%s\" translation string for option %s\n"
-#~ msgstr "\t%s Неверный перевод UTF-8 \"%s\" для параметра %s\n"
-
-#~ msgid ""
-#~ "      %s  Bad UTF-8 \"%s\" translation string for option %s, choice %s\n"
-#~ msgstr "\t%s Неверный перевод UTF-8 \"%s\" для параметра %s, выбора %s\n"
-
-#~ msgid "      %s  Bad cupsFilter value \"%s\"\n"
-#~ msgstr "\t%s Неверное значение cupsFilter \"%s\"\n"
-
-#~ msgid "      %s  Bad cupsICCProfile %s\n"
-#~ msgstr "\t%s Неверный cupsICCProfile %s\n"
-
-#~ msgid "      %s  Bad cupsPreFilter value \"%s\"\n"
-#~ msgstr "\t%s Неверное значение cupsPreFilter \"%s\"\n"
-
-#~ msgid "      %s  Bad cupsUIConstraints %s: \"%s\"\n"
-#~ msgstr "\t%s Неверное значение cupsUIConstraints %s: \"%s\"\n"
-
-#~ msgid "      %s  Bad language \"%s\"\n"
-#~ msgstr "\t%s Неверный язык \"%s\"\n"
-
-#~ msgid "      %s  Bad permissions on APDialogExtension file \"%s\"\n"
-#~ msgstr "      %s Неверные права для файла APDialogExtension \"%s\"\n"
-
-#~ msgid "      %s  Bad permissions on APPrinterIconPath file \"%s\"\n"
-#~ msgstr "      %s Неверные права для файла APPrinterIconPath \"%s\"\n"
-
-#~ msgid "      %s  Bad permissions on APPrinterLowInkTool file \"%s\"\n"
-#~ msgstr "      %s Неверные права для файла APPrinterLowInkTool \"%s\"\n"
-
-#~ msgid "      %s  Bad permissions on APPrinterUtilityPath file \"%s\"\n"
-#~ msgstr "      %s Неверные права для файла APPrinterUtilityPath \"%s\"\n"
-
-#~ msgid "      %s  Bad permissions on APScanAppPath file \"%s\"\n"
-#~ msgstr "      %s Неверные права для файла APScanAppPath \"%s\"\n"
-
-#~ msgid "      %s  Bad permissions on cupsFilter file \"%s\"\n"
-#~ msgstr "      %s Неверные права для файла cupsFilter \"%s\"\n"
-
-#~ msgid "      %s  Bad permissions on cupsICCProfile file \"%s\"\n"
-#~ msgstr "      %s Неверные права для файла cupsICCProfile \"%s\"\n"
-
-#~ msgid "      %s  Bad permissions on cupsPreFilter file \"%s\"\n"
-#~ msgstr "      %s Неверные права для файла cupsPreFilter \"%s\"\n"
-
-#~ msgid "      %s  Bad spelling of %s - should be %s\n"
-#~ msgstr "      %s Ошибки в %s - должно быть %s.\n"
-
-#~ msgid "      %s  Cannot provide both APScanAppPath and APScanAppBundleID\n"
-#~ msgstr ""
-#~ "      %s Невозможно предоставить APScanAppPath и APScanAppBundleID "
-#~ "вместе.\n"
-
-#~ msgid "      %s  Empty cupsUIConstraints %s\n"
-#~ msgstr "      %s Пустой cupsUIConstraints %s\n"
-
-#~ msgid "      %s  Missing \"%s\" translation string for option %s\n"
-#~ msgstr "\t%s Перевод \"%s\" отсутствует для параметра %s\n"
-
-#~ msgid ""
-#~ "      %s  Missing \"%s\" translation string for option %s, choice %s\n"
-#~ msgstr "\t%s Перевод \"%s\" отсутствует для параметра %s, выбора %s\n"
-
-#~ msgid "      %s  Missing APDialogExtension file \"%s\"\n"
-#~ msgstr "\t%s Файл APDialogExtention отсутствует \"%s\"\n"
-
-#~ msgid "      %s  Missing APPrinterIconPath file \"%s\"\n"
-#~ msgstr "\t%s Файл APPrinterIconPath отсутствует \"%s\"\n"
-
-#~ msgid "      %s  Missing APPrinterLowInkTool file \"%s\"\n"
-#~ msgstr "\t%s Файл APPrinterLowInkTool отсутствует \"%s\"\n"
-
-#~ msgid "      %s  Missing APPrinterUtilityPath file \"%s\"\n"
-#~ msgstr "\t%s Файл APPrinterUtilityPath отсутствует \"%s\"\n"
-
-#~ msgid "      %s  Missing APScanAppPath file \"%s\"\n"
-#~ msgstr "\t%s Файл APScanAppPath отсутствует \"%s\"\n"
-
-#~ msgid ""
-#~ "      %s  Missing REQUIRED PageRegion option\n"
-#~ "                REF: Page 100, section 5.14.\n"
-#~ msgstr ""
-#~ "\t%s Обязательный параметр PageRegion отсутствует.\n"
-#~ "\t\t REF: Стр. 100, раздел 5.14.\n"
-
-#~ msgid ""
-#~ "      %s  Missing REQUIRED PageSize option\n"
-#~ "                REF: Page 99, section 5.14.\n"
-#~ msgstr ""
-#~ "\t%s Обязательный параметр PageSize отсутствует.\n"
-#~ "\t\t REF: Стр. 99, раздел 5.14.\n"
-
-#~ msgid "      %s  Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"\n"
-#~ msgstr ""
-#~ "      %s Выбор *%s %s отсутствует в UIConstraints \"*%s %s *%s %s\"\n"
-
-#~ msgid "      %s  Missing choice *%s %s in cupsUIConstraints %s: \"%s\"\n"
-#~ msgstr "      %s Выбор *%s %s отсутствует в cupsUIConstraints %s: \"%s\"\n"
-
-#~ msgid "      %s  Missing cupsFilter file \"%s\"\n"
-#~ msgstr "      %s  Файл cupsFilter отсутствует «%s»\n"
-
-#~ msgid "      %s  Missing cupsICCProfile file \"%s\"\n"
-#~ msgstr "\t%s Файл cupsICCProfile отсутствует \"%s\"\n"
-
-#~ msgid "      %s  Missing cupsPreFilter file \"%s\"\n"
-#~ msgstr "      %s  Файл cupsFilter «%s» отсутствует\n"
-
-#~ msgid "      %s  Missing cupsUIResolver %s\n"
-#~ msgstr "\t%s cupsUIResolver отсутствует %s\n"
-
-#~ msgid "      %s  Missing option %s in UIConstraints \"*%s %s *%s %s\"\n"
-#~ msgstr "\t%s Отсутствует параметр %s у UIConstraints \"*%s %s *%s %s\"\n"
-
-#~ msgid "      %s  Missing option %s in cupsUIConstraints %s: \"%s\"\n"
-#~ msgstr "\t%s Отсутствует параметр %s у cupsUIConstraints %s: \"%s\"\n"
-
-#~ msgid "      %s  No base translation \"%s\" is included in file\n"
-#~ msgstr "\t%s Основной перевод \"%s\" не включен в файл\n"
-
-#~ msgid ""
-#~ "      %s  Non-standard size name \"%s\"\n"
-#~ "                REF: Page 187, section B.2.\n"
-#~ msgstr ""
-#~ "\t%s Не стандартный размер названия \"%s\"\n"
-#~ "\t\tREF: Стр. 187, раздел B.2.\n"
-
-#~ msgid ""
-#~ "      %s  REQUIRED %s does not define choice None\n"
-#~ "                REF: Page 122, section 5.17\n"
-#~ msgstr ""
-#~ "\t ТРЕБУЕТСЯ %s: %s не определяет выбор \"Нет\"\n"
-#~ "\t\tREF: Стр. 122, раздел 5.17\n"
-
-#~ msgid "      %s  Size \"%s\" defined for %s but not for %s\n"
-#~ msgstr "\t%s Размер \"%s\" определен для %s, но не определен для %s\n"
-
-#~ msgid "      %s  Size \"%s\" has unexpected dimensions (%gx%g)\n"
-#~ msgstr "\t%s  Размер \"%s\"  имеет неверное значение (%gx%g)\n"
-
-#~ msgid "      %s  cupsICCProfile %s hash value collides with %s\n"
-#~ msgstr "\tХеш-значение %s cupsICCProfile %s конфликтует с %s\n"
-
-#~ msgid "      %s  cupsUIResolver %s causes a loop\n"
-#~ msgstr "\t%s cupsUIResolver %s создает цикл\n"
-
-#~ msgid ""
-#~ "      %s  cupsUIResolver %s does not list at least two different options\n"
-#~ msgstr "\t%s В cupsUIResolver %s не перечислено как минимум два параметра\n"
-
-#~ msgid "      **FAIL**  %s choice names %s and %s differ only by case\n"
-#~ msgstr ""
-#~ "\t**FAIL** Для выбора %s имена %s и %s различаются только регистром "
-#~ "символов\n"
-
-#~ msgid ""
-#~ "      **FAIL**  %s must be 1284DeviceID\n"
-#~ "                REF: Page 72, section 5.5\n"
-#~ msgstr ""
-#~ "\t**FAIL** %s должно соответствовать 1284DeviceID\n"
-#~ "\t\tREF: Стр. 72, раздел 5.5\n"
-
-#~ msgid ""
-#~ "      **FAIL**  BAD Default%s %s\n"
-#~ "                REF: Page 40, section 4.5.\n"
-#~ msgstr ""
-#~ "      **FAIL**  НЕВЕРНЫЙ Default%s %s\n"
-#~ "                REF: Стр. 40, раздел 4.5.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  BAD DefaultImageableArea %s\n"
-#~ "                REF: Page 102, section 5.15.\n"
-#~ msgstr ""
-#~ "\t**FAIL** Неверный DefaultImageableArea %s\n"
-#~ "\t\tREF: Стр. 102, раздел 5.15.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  BAD DefaultPaperDimension %s\n"
-#~ "                REF: Page 103, section 5.15.\n"
-#~ msgstr ""
-#~ "\t**FAIL** Неверный DefaultPaperDimension %s\n"
-#~ "\t\tREF: Стр. 103, раздел 5.15.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  BAD JobPatchFile attribute in file\n"
-#~ "                REF: Page 24, section 3.4.\n"
-#~ msgstr ""
-#~ "      **FAIL**  НЕВЕРНЫЙ JobPatchFile атрибут в файле\n"
-#~ "                REF: Стр. 24, раздел 3.4.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  BAD Manufacturer (should be \"HP\")\n"
-#~ "                REF: Page 211, table D.1.\n"
-#~ msgstr ""
-#~ "      **FAIL**  НЕВЕРНЫЙ Manufacturer (должен быть «HP»)\n"
-#~ "                REF: Стр. 211, таблица D.1.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  BAD Manufacturer (should be \"Oki\")\n"
-#~ "                REF: Page 211, table D.1.\n"
-#~ msgstr ""
-#~ "      **FAIL**  НЕВЕРНЫЙ Manufacturer (должен быть «Oki»)\n"
-#~ "                REF: Стр. 211, таблица D.1.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  BAD ModelName - \"%c\" not allowed in string.\n"
-#~ "                REF: Pages 59-60, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  НЕВЕРНОЕ ModelName – «%c» не разрешено в строке.\n"
-#~ "                REF: Стр. 59-60, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  BAD PSVersion - not \"(string) int\".\n"
-#~ "                REF: Pages 62-64, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  НЕВЕРНАЯ PSVersion – не «(string) int».\n"
-#~ "                REF: Стр. 62-64, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  BAD Product - not \"(string)\".\n"
-#~ "                REF: Page 62, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  НЕВЕРНЫЙ Product – не «(string)».\n"
-#~ "                REF: Стр. 62, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  BAD ShortNickName - longer than 31 chars.\n"
-#~ "                REF: Pages 64-65, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  НЕВЕРНЫЙ ShortNickName – длиннее чем 31 симв.\n"
-#~ "                REF: Стр. 64-65, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  Bad %s choice %s\n"
-#~ "                REF: Page 84, section 5.9\n"
-#~ msgstr ""
-#~ "\t**FAIL** Неверный %s выбор %s\n"
-#~ "\t\t REF: Стр. 84, раздел 5.9\n"
-
-#~ msgid ""
-#~ "      **FAIL**  Bad FileVersion \"%s\"\n"
-#~ "                REF: Page 56, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  Неверная FileVersion \"%s\"\n"
-#~ "                REF: Стр. 56, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  Bad FormatVersion \"%s\"\n"
-#~ "                REF: Page 56, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  Неверная FormatVersion \"%s\"\n"
-#~ "                REF: Стр. 56, раздел 5.3.\n"
-
-#~ msgid "      **FAIL**  Bad LanguageEncoding %s - must be ISOLatin1\n"
-#~ msgstr "\t**FAIL**  Неверный LanguageEncoding %s - должен быть ISOLatin1\n"
-
-#~ msgid "      **FAIL**  Bad LanguageVersion %s - must be English\n"
-#~ msgstr "\t**FAIL** Неверный LanguageVersion %s - должен быть английский\n"
-
-#~ msgid "      **FAIL**  Default option code cannot be interpreted: %s\n"
-#~ msgstr ""
-#~ "      **FAIL**  Не удается интерпретировать код параметра по умолчанию: "
-#~ "%s\n"
-
-#~ msgid ""
-#~ "      **FAIL**  Default translation string for option %s choice %s "
-#~ "contains 8-bit characters\n"
-#~ msgstr ""
-#~ "\t**FAIL** Стандартный перевод для параметра %s выбора %s содержит 8-"
-#~ "битовые символы\n"
-
-#~ msgid ""
-#~ "      **FAIL**  Default translation string for option %s contains 8-bit "
-#~ "characters\n"
-#~ msgstr ""
-#~ "\t**FAIL** Стандартный перевод для параметра %s содержит 8-"
-#~ "битовыесимволы\n"
-
-#~ msgid "      **FAIL**  Group names %s and %s differ only by case\n"
-#~ msgstr ""
-#~ "\t**FAIL** Имена групп %s и %s отличаются только регистром символов\n"
-
-#~ msgid "      **FAIL**  Multiple occurrences of %s choice name %s\n"
-#~ msgstr "\t**FAIL** Для выбора %s имя %s  встречается несколько раз\n"
-
-#~ msgid "      **FAIL**  Option names %s and %s differ only by case\n"
-#~ msgstr ""
-#~ "\t**FAIL** Названия параметров %s и %s отличаются лишь регистром "
-#~ "символов\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED Default%s\n"
-#~ "                REF: Page 40, section 4.5.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ Default%s\n"
-#~ "                REF: Стр. 40, раздел 4.5.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED DefaultImageableArea\n"
-#~ "                REF: Page 102, section 5.15.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ DefaultImageableArea\n"
-#~ "                REF: Стр. 102, раздел 5.15.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED DefaultPaperDimension\n"
-#~ "                REF: Page 103, section 5.15.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ DefaultPaperDimension\n"
-#~ "                REF: Стр. 103, раздел 5.15.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED FileVersion\n"
-#~ "                REF: Page 56, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ FileVersion\n"
-#~ "                REF: Стр. 56, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED FormatVersion\n"
-#~ "                REF: Page 56, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ FormatVersion\n"
-#~ "                REF: Стр. 56, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED ImageableArea for PageSize %s\n"
-#~ "                REF: Page 41, section 5.\n"
-#~ "                REF: Page 102, section 5.15.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ ImageableArea для PageSize %s\n"
-#~ "                REF: Стр. 41, раздел 5.\n"
-#~ "                REF: Стр. 102, раздел 5.15.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED LanguageEncoding\n"
-#~ "                REF: Pages 56-57, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ LanguageEncoding\n"
-#~ "                REF: Стр. 56-57, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED LanguageVersion\n"
-#~ "                REF: Pages 57-58, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ LanguageVersion\n"
-#~ "                REF: Стр. 57-58, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED Manufacturer\n"
-#~ "                REF: Pages 58-59, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ Manufacturer\n"
-#~ "                REF: Стр. 58-59, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED ModelName\n"
-#~ "                REF: Pages 59-60, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ ModelName\n"
-#~ "                REF: Стр. 59-60, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED NickName\n"
-#~ "                REF: Page 60, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ NickName\n"
-#~ "                REF: Стр. 60, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED PCFileName\n"
-#~ "                REF: Pages 61-62, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ PCFileName\n"
-#~ "                REF: Стр. 61-62, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED PSVersion\n"
-#~ "                REF: Pages 62-64, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ PSVersion\n"
-#~ "                REF: Стр. 62-64, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED PageRegion\n"
-#~ "                REF: Page 100, section 5.14.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ PageRegion\n"
-#~ "                REF: Стр. 100, раздел 5.14.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED PageSize\n"
-#~ "                REF: Page 41, section 5.\n"
-#~ "                REF: Page 99, section 5.14.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ PageSize\n"
-#~ "                REF: Стр. 41, раздел 5.\n"
-#~ "                REF: Стр. 99, раздел 5.14.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED PageSize\n"
-#~ "                REF: Pages 99-100, section 5.14.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ PageSize\n"
-#~ "                REF: Стр. 99-100, раздел 5.14.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED PaperDimension for PageSize %s\n"
-#~ "                REF: Page 41, section 5.\n"
-#~ "                REF: Page 103, section 5.15.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ PaperDimension для PageSize %s\n"
-#~ "                REF: Стр. 41, раздел 5.\n"
-#~ "                REF: Стр. 103, раздел 5.15.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED Product\n"
-#~ "                REF: Page 62, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ Product\n"
-#~ "                REF: Стр. 62, раздел 5.3.\n"
-
-#~ msgid ""
-#~ "      **FAIL**  REQUIRED ShortNickName\n"
-#~ "                REF: Page 64-65, section 5.3.\n"
-#~ msgstr ""
-#~ "      **FAIL**  ТРЕБУЕТСЯ ShortNickName\n"
-#~ "                REF: Стр. 64-65, раздел 5.3.\n"
-
-#~ msgid "    %d ERRORS FOUND\n"
-#~ msgstr "    ОБНАРУЖЕНО ОШИБОК: %d\n"
-
-#~ msgid ""
-#~ "    Bad %%%%BoundingBox: on line %d\n"
-#~ "        REF: Page 39, %%%%BoundingBox:\n"
-#~ msgstr ""
-#~ "    Неверный %%%%BoundingBox: в строке %d\n"
-#~ "\t REF: Стр. 39, %%%%BoundingBox:\n"
-
-#~ msgid ""
-#~ "    Bad %%%%Page: on line %d\n"
-#~ "        REF: Page 53, %%%%Page:\n"
-#~ msgstr ""
-#~ "    Неверная %%%%Page: в строке %d\n"
-#~ "\t REF: Стр. 53, %%%%Page:\n"
-
-#~ msgid ""
-#~ "    Bad %%%%Pages: on line %d\n"
-#~ "        REF: Page 43, %%%%Pages:\n"
-#~ msgstr ""
-#~ "    Неверные %%%%Pages: в строке %d\n"
-#~ "\t REF: Стр. 43, %%%%Pages:\n"
-
-#~ msgid ""
-#~ "    Line %d is longer than 255 characters (%d)\n"
-#~ "        REF: Page 25, Line Length\n"
-#~ msgstr ""
-#~ "\tДлина строки %d больше 255 символов (%d)\n"
-#~ "\t REF: Стр. 25, Длина строки \n"
-
-#~ msgid ""
-#~ "    Missing %!PS-Adobe-3.0 on first line\n"
-#~ "        REF: Page 17, 3.1 Conforming Documents\n"
-#~ msgstr ""
-#~ "    %!PS-Adobe-3.0 отсутствует в первой строке\n"
-#~ "\t REF: Стр. 17, 3.1 Соответствующие документы\n"
-
-#~ msgid ""
-#~ "    Missing %%EndComments comment\n"
-#~ "        REF: Page 41, %%EndComments\n"
-#~ msgstr ""
-#~ "    Комментарий %%EndComments отсутствует\n"
-#~ "\t REF: Стр. 41, %%EndComments\n"
-
-#~ msgid ""
-#~ "    Missing or bad %%BoundingBox: comment\n"
-#~ "        REF: Page 39, %%BoundingBox:\n"
-#~ msgstr ""
-#~ "    Отсутствует или неверный %%BoundingBox: комментарий\n"
-#~ "\t REF: Стр. 39, %%BoundingBox:\n"
-
-#~ msgid ""
-#~ "    Missing or bad %%Page: comments\n"
-#~ "        REF: Page 53, %%Page:\n"
-#~ msgstr ""
-#~ "    Отсутствует или неверная %%Page: комментарий\n"
-#~ "\t REF: Стр. 53, %%Page:\n"
-
-#~ msgid ""
-#~ "    Missing or bad %%Pages: comment\n"
-#~ "        REF: Page 43, %%Pages:\n"
-#~ msgstr ""
-#~ "    Отсутствуют или неверные %%Pages:  комментарий\n"
-#~ "\t REF: Стр. 43, %%Pages:\n"
-
-#~ msgid "    NO ERRORS FOUND\n"
-#~ msgstr "    ОШИБОК НЕ ОБНАРУЖЕНО\n"
-
-#~ msgid "    Saw %d lines that exceeded 255 characters\n"
-#~ msgstr "\tНайдено %d строк, длина которых превышает 255 символов\n"
-
-#~ msgid "    Too many %%BeginDocument comments\n"
-#~ msgstr "   Слишком много комментариев %%BeginDocument\n"
-
-#~ msgid "    Too many %%EndDocument comments\n"
-#~ msgstr "   Слишком много комментариев %%EndDocument\n"
-
-#~ msgid "    Warning: file contains binary data\n"
-#~ msgstr "    WARNING: файл содержит бинарные данные\n"
-
-#~ msgid "    Warning: no %%EndComments comment in file\n"
-#~ msgstr "    WARNING: нет комментария %%EndComments в файле\n"
-
-#~ msgid "    Warning: obsolete DSC version %.1f in file\n"
-#~ msgstr "    WARNING: устаревшая версия DSC %.1f в файле\n"
-
-#~ msgid " FAIL\n"
-#~ msgstr " FAIL\n"
-
-#~ msgid ""
-#~ " FAIL\n"
-#~ "      **FAIL**  Unable to open PPD file - %s\n"
-#~ msgstr ""
-#~ " FAIL\n"
-#~ "      **FAIL**  Не удается открыть PPD-файл – %s\n"
-
-#~ msgid ""
-#~ " FAIL\n"
-#~ "      **FAIL**  Unable to open PPD file - %s on line %d.\n"
-#~ msgstr ""
-#~ " FAIL\n"
-#~ "      **FAIL**  Не удается открыть PPD-файл – %s в строке %d.\n"
-
-#~ msgid " PASS\n"
-#~ msgstr " PASS\n"
-
-#~ msgid "#10 Envelope"
-#~ msgstr "#10 Envelope"
-
-#~ msgid "#11 Envelope"
-#~ msgstr "#11 Envelope"
-
-#~ msgid "#12 Envelope"
-#~ msgstr "#12 Envelope"
-
-#~ msgid "#14 Envelope"
-#~ msgstr "#14 Envelope"
-
-#~ msgid "#9 Envelope"
-#~ msgstr "#9 Envelope"
-
-#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n"
-#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f байт\n"
-
-#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n"
-#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f байт\n"
-
-#~ msgid "%.0f x %.0f millimeters"
-#~ msgstr "%.0f x %.0f мм"
-
-#~ msgid "%.0f x %.0f to %.0f x %.0f millimeters"
-#~ msgstr "%.0f x %.0f — %.0f x %.0f мм"
-
-#~ msgid "%.2f x %.2f inches"
-#~ msgstr "%.2f x %.2f дюймов"
-
-#~ msgid "%.2f x %.2f to %.2f x %.2f inches"
-#~ msgstr "%.2f x %.2f-%.2f x %.2f дюймов"
-
-#~ msgid "%s accepting requests since %s\n"
-#~ msgstr "%s принимает запросы с момента %s\n"
-
-#~ msgid "%s is not implemented by the CUPS version of lpc.\n"
-#~ msgstr "%s не выполнено версией CUPS для lpc.\n"
-
-#~ msgid "%s is not ready\n"
-#~ msgstr "%s не готов\n"
-
-#~ msgid "%s is ready\n"
-#~ msgstr "%s готов\n"
-
-#~ msgid "%s is ready and printing\n"
-#~ msgstr "%s готов и печатает\n"
-
-#~ msgid ""
-#~ "%s not accepting requests since %s -\n"
-#~ "\t%s\n"
-#~ msgstr ""
-#~ "%s не принимает запросы с момента %s -\n"
-#~ "\t%s\n"
-
-#~ msgid "%s not supported"
-#~ msgstr "%s не поддерживается"
-
-#~ msgid "%s/%s accepting requests since %s\n"
-#~ msgstr "%s/%s принимает запросы с момента %s\n"
-
-#~ msgid ""
-#~ "%s/%s not accepting requests since %s -\n"
-#~ "\t%s\n"
-#~ msgstr ""
-#~ "%s/%s не принимает запросы с момента %s -\n"
-#~ "\t%s\n"
-
-#~ msgid "%s: %-33.33s [job %d localhost]\n"
-#~ msgstr "%s: %-33.33s [задание %d localhost]\n"
-
-#~ msgid "%s: %s failed: %s\n"
-#~ msgstr "%s: ошибка %s: %s\n"
-
-#~ msgid "%s: Don't know what to do\n"
-#~ msgstr "%s: Дальнейшие действия неизвестны\n"
-
-#~ msgid ""
-#~ "%s: Error - %s environment variable names non-existent destination \"%s"
-#~ "\"\n"
-#~ msgstr ""
-#~ "%s: Ошибка - %s переменная окружения указывает на несуществующее "
-#~ "назначение \"%s\"\n"
-
-#~ msgid "%s: Error - bad job ID\n"
-#~ msgstr "%s: Ошибка - неверный ID задания\n"
-
-#~ msgid "%s: Error - cannot print files and alter jobs simultaneously\n"
-#~ msgstr ""
-#~ "%s: Ошибка - невозможно печатать файлы и редактировать задания "
-#~ "одновременно\n"
-
-#~ msgid ""
-#~ "%s: Error - cannot print from stdin if files or a job ID are provided\n"
-#~ msgstr ""
-#~ "%s: Ошибка - не удается печать из stdin, если предоставлены файлы или ID "
-#~ "задания\n"
-
-#~ msgid "%s: Error - expected character set after '-S' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-S' должен идти набор символов\n"
-
-#~ msgid "%s: Error - expected content type after '-T' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-T' должен быть указан тип контента\n"
-
-#~ msgid "%s: Error - expected copies after '-n' option\n"
-#~ msgstr ""
-#~ "%s: Ошибка - после параметра '-n' должно быть указано количество копий\n"
-
-#~ msgid "%s: Error - expected copy count after '-#' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-#' должен быть указан номер копии\n"
-
-#~ msgid "%s: Error - expected destination after '-P' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-P' должно быть указано назначение\n"
-
-#~ msgid "%s: Error - expected destination after '-b' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-b' должно быть указано назначение\n"
-
-#~ msgid "%s: Error - expected destination after '-d' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-d' должно быть указано назначение\n"
-
-#~ msgid "%s: Error - expected form after '-f' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-f' должна быть указана форма\n"
-
-#~ msgid "%s: Error - expected hold name after '-H' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-H' должно быть указано имя хоста\n"
-
-#~ msgid "%s: Error - expected hostname after '-H' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-H' должно быть указано имя хоста\n"
-
-#~ msgid "%s: Error - expected hostname after '-h' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-h' должно быть указано имя хоста\n"
-
-#~ msgid "%s: Error - expected mode list after '-y' option\n"
-#~ msgstr ""
-#~ "%s: Ошибка - после параметра '-y' должен быть указан список режимов\n"
-
-#~ msgid "%s: Error - expected name after '-%c' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-%c' должно быть указано имя\n"
-
-#~ msgid "%s: Error - expected option string after '-o' option\n"
-#~ msgstr ""
-#~ "%s: Ошибка - после параметра '-o' должна быть указана строка параметра\n"
-
-#~ msgid "%s: Error - expected page list after '-P' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-H' должно быть указано имя хоста\n"
-
-#~ msgid "%s: Error - expected priority after '-%c' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-%c' должен быть указан приоритет\n"
-
-#~ msgid "%s: Error - expected reason text after '-r' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-r' должен идти текст причины\n"
-
-#~ msgid "%s: Error - expected title after '-t' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-t' должен быть указан заголовок\n"
-
-#~ msgid "%s: Error - expected username after '-U' option\n"
-#~ msgstr ""
-#~ "%s: Ошибка - после параметра '-U'должно быть указано имя пользователя\n"
-
-#~ msgid "%s: Error - expected username after '-U' option!n"
-#~ msgstr ""
-#~ "%s: Ошибка - после параметра '-U'должно быть указано имя пользователя\n"
-
-#~ msgid "%s: Error - expected username after '-u' option\n"
-#~ msgstr ""
-#~ "%s: Ошибка - после параметра '-u'должно быть указано имя пользователя\n"
-
-#~ msgid "%s: Error - expected value after '-%c' option\n"
-#~ msgstr "%s: Ошибка - после параметра '-%c'должно быть указано значение\n"
-
-#~ msgid ""
-#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' "
-#~ "option\n"
-#~ msgstr ""
-#~ "%s: Ошибка - требуется \"завершено\",\"не завершено\" или \"все\" после "
-#~ "параметра '-W'\n"
-
-#~ msgid "%s: Error - no default destination available.\n"
-#~ msgstr "%s: Ошибка – нет доступного назначения по умолчанию.\n"
-
-#~ msgid "%s: Error - priority must be between 1 and 100.\n"
-#~ msgstr "%s: Ошибка – приоритет должен быть от 1 до 100.\n"
-
-#~ msgid "%s: Error - scheduler not responding\n"
-#~ msgstr "%s: Ошибка - планировщик не отвечает\n"
-
-#~ msgid "%s: Error - too many files - \"%s\"\n"
-#~ msgstr "%s: Ошибка – слишком много файлов – «%s»\n"
-
-#~ msgid "%s: Error - unable to access \"%s\" - %s\n"
-#~ msgstr "%s: Ошибка – не удается получить доступ к «%s» – %s\n"
-
-#~ msgid "%s: Error - unable to queue from stdin - %s\n"
-#~ msgstr "%s: Ошибка – не удается поставить в очередь из stdin - %s\n"
-
-#~ msgid "%s: Error - unknown destination \"%s\"\n"
-#~ msgstr "%s: Ошибка - неизвестное назначение \"%s\"\n"
-
-#~ msgid "%s: Error - unknown destination \"%s/%s\"\n"
-#~ msgstr "%s: ошибка - неизвестное назначение \"%s/%s\"\n"
-
-#~ msgid "%s: Error - unknown option '%c'\n"
-#~ msgstr "%s: Ошибка - неизвестный параметр '%c'\n"
-
-#~ msgid "%s: Error - unknown option '%s'\n"
-#~ msgstr "%s: Ошибка - неизвестный параметр '%s'\n"
-
-#~ msgid "%s: Expected job ID after '-i' option\n"
-#~ msgstr "%s: Ожидается ID задания после параметра '-i'\n"
-
-#~ msgid "%s: Filter \"%s\" not available: %s\n"
-#~ msgstr "%s: Фильтр «%s» недоступен: %s\n"
-
-#~ msgid "%s: Invalid destination name in list \"%s\"\n"
-#~ msgstr "%s: Недопустимое имя назначения в списке \"%s\"\n"
-
-#~ msgid "%s: Invalid filter string \"%s\"\n"
-#~ msgstr "%s: Неверная строка фильтра «%s»\n"
-
-#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'\n"
-#~ msgstr "%s: Необходимо указать ID задания ('-i jobid') перед '-H restart'\n"
-
-#~ msgid "%s: No filter to convert from %s/%s to %s/%s\n"
-#~ msgstr ""
-#~ "%s: Отсутствует фильтр, необходимый для преобразования из %s/%s в %s/%s\n"
-
-#~ msgid "%s: Operation failed: %s\n"
-#~ msgstr "%s: Операция не удалась: %s\n"
-
-#~ msgid "%s: Sorry, no encryption support compiled in\n"
-#~ msgstr "%s:  Нет скомпилированной поддержки шифрования\n"
-
-#~ msgid "%s: Unable to connect to server\n"
-#~ msgstr "%s: Не удается подключиться к серверу\n"
-
-#~ msgid "%s: Unable to contact server\n"
-#~ msgstr "%s: Не удается установить связь с сервером\n"
-
-#~ msgid "%s: Unable to determine MIME type of \"%s\"\n"
-#~ msgstr "%s: Не удается определить тип MIME \"%s\"\n"
-
-#~ msgid "%s: Unable to open %s: %s\n"
-#~ msgstr "%s: Не удается открыть %s: %s\n"
-
-#~ msgid "%s: Unable to open PPD file: %s on line %d\n"
-#~ msgstr "%s: Не удается открыть PPD-файл: %s в строке %d.\n"
-
-#~ msgid "%s: Unable to open PPD file: %s on line %d.\n"
-#~ msgstr "%s: Не удается открыть PPD файл: %s в строке %d.\n"
-
-#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"\n"
-#~ msgstr "%s: Не удается прочитать базу данных MIME из \"%s\" или \"%s\"\n"
-
-#~ msgid "%s: Unknown destination \"%s\"\n"
-#~ msgstr "%s: Неизвестное назначение \"%s\"\n"
-
-#~ msgid "%s: Unknown destination MIME type %s/%s\n"
-#~ msgstr "%s: Неизвестный MIME-тип назначения %s/%s\n"
-
-#~ msgid "%s: Unknown option '%c'\n"
-#~ msgstr "%s: Неизвестный параметр '%c'\n"
-
-#~ msgid "%s: Unknown source MIME type %s/%s\n"
-#~ msgstr "%s: Неизвестный MIME-тип источника %s/%s\n"
-
-#~ msgid ""
-#~ "%s: Warning - '%c' format modifier not supported - output may not be "
-#~ "correct\n"
-#~ msgstr ""
-#~ "%s: Внимание - модификатор формата '%c' не поддерживается - вывод может "
-#~ "быть неправильным\n"
-
-#~ msgid "%s: Warning - character set option ignored\n"
-#~ msgstr "%s: Внимание - параметр набора символов пропущен\n"
-
-#~ msgid "%s: Warning - content type option ignored\n"
-#~ msgstr "%s: Внимание - параметр типа контента пропущен\n"
-
-#~ msgid "%s: Warning - form option ignored\n"
-#~ msgstr "%s: Внимание - параметр формы пропущен\n"
-
-#~ msgid "%s: Warning - mode option ignored\n"
-#~ msgstr "%s: Внимание - параметр режима пропущен\n"
-
-#~ msgid ""
-#~ "%s: error - %s environment variable names non-existent destination \"%s"
-#~ "\"\n"
-#~ msgstr ""
-#~ "%s: ошибка - переменная окружения %s указывает на несуществующее значение "
-#~ "\"%s\"\n"
-
-#~ msgid "%s: error - expected option=value after '-o' option\n"
-#~ msgstr ""
-#~ "%s: ошибка - после параметра '-o' должна идти запись вида option=value\n"
-
-#~ msgid "%s: error - no default destination available.\n"
-#~ msgstr "%s: ошибка – нет доступного назначения по умолчанию.\n"
-
-#~ 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 "12 x 11\""
-#~ msgstr "12 x 11\""
-
-#~ msgid "15 x 11\""
-#~ msgstr "15 x 11\""
-
-#~ msgid "3.5\" Disk - 2 1/8 x 2 3/4\""
-#~ msgstr "Диск 3.5\" - 2 1/8 x 2 3/4\""
-
-#~ msgid "60x720dpi"
-#~ msgstr "60x720dpi"
-
-#~ msgid "7 x 9\""
-#~ msgstr "7 x 9\""
-
-#~ msgid "8 x 10\""
-#~ msgstr "8 x 10\""
-
-#~ msgid "9 x 11\""
-#~ msgstr "9 x 11\""
-
-#~ msgid "9 x 12\""
-#~ msgstr "9 x 12\""
-
-#~ msgid "?Invalid help command unknown\n"
-#~ msgstr "?Неверная команда справки неизвестна\n"
-
-#~ msgid "A class named \"%s\" already exists"
-#~ msgstr "Класс с именем \"%s\" уже существует"
-
-#~ msgid "A printer named \"%s\" already exists"
-#~ msgstr "Принтер с именем \"%s\" уже существует"
-
-#~ msgid "A3 (Oversize)"
-#~ msgstr "A3 (расширенный)"
-
-#~ msgid "A4 (Oversize)"
-#~ msgstr "A4 (расширенный)"
-
-#~ msgid "A4 (Small)"
-#~ msgstr "A4 (уменьшенный)"
-
-#~ msgid "A5 (Oversize)"
-#~ msgstr "A5 (расширенный)"
-
-#~ msgid "ARCH A"
-#~ msgstr "ARCH A"
-
-#~ msgid "ARCH B"
-#~ msgstr "ARCH B"
-
-#~ msgid "Address - 1 1/8 x 3 1/2\""
-#~ msgstr "Адрес - 1 1/8 x 3 1/2\""
-
-#~ msgid "Attempt to set %s printer-state to bad value %d"
-#~ msgstr "Попытка установить %s printer-state на неверное значение %d"
-
-#~ msgid "Attribute groups are out of order (%x < %x)"
-#~ msgstr "Группы атрибутов не действуют (%x < %x)"
-
-#~ msgid "Bad device URI \"%s\"\n"
-#~ msgstr "Неверный URI устройства \"%s\"\n"
-
-#~ msgid "Bad device-uri \"%s\""
-#~ msgstr "Неверное значение device-uri \"%s\""
-
-#~ msgid "Bad device-uri scheme \"%s\""
-#~ msgstr "Неверная схема device-uri \"%s\""
-
-#~ msgid "Bad document-format \"%s\""
-#~ msgstr "Неверное значение document-format \"%s\""
-
-#~ msgid "Bad font attribute: %s\n"
-#~ msgstr "Неверный атрибут шрифта: %s\n"
-
-#~ msgid "Bad job-priority value"
-#~ msgstr "Неверное значение job-priority"
-
-#~ 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"
-
-#~ msgid "Bad job-uri attribute \"%s\""
-#~ msgstr "Неверный атрибут job-uri \"%s\""
-
-#~ msgid "Bad notify-pull-method \"%s\""
-#~ msgstr "Неверное значение notify-pull-method \"%s\""
-
-#~ msgid "Bad notify-recipient-uri URI \"%s\""
-#~ msgstr "Неверный URI notify-recipient-uri \"%s\""
-
-#~ msgid "Bad option + choice on line %d"
-#~ msgstr "Неверный параметр + выбор в строке %d"
-
-#~ msgid "Bad port-monitor \"%s\""
-#~ msgstr "Неверное значение port-monitor \"%s\""
-
-#~ msgid "Bad printer-state value %d"
-#~ msgstr "Неверное значение printer-state %d"
-
-#~ msgid "Bad request ID %d"
-#~ msgstr "Неверный ID запроса %d"
-
-#~ msgid "Bad request version number %d.%d"
-#~ msgstr "Неверный номер версии запроса %d.%d"
-
-#~ msgid "Billing Information: "
-#~ msgstr "Реквизиты для выставления счета: "
-
-#~ msgid "C0 Envelope"
-#~ msgstr "Конверт C0"
-
-#~ msgid "C1 Envelope"
-#~ msgstr "Конверт C1"
-
-#~ msgid "C2 Envelope"
-#~ msgstr "Конверт C2"
-
-#~ msgid "C3 Envelope"
-#~ msgstr "Конверт C3"
-
-#~ msgid "C4"
-#~ msgstr "C4"
-
-#~ msgid "C4 Envelope"
-#~ msgstr "Конверт C4"
-
-#~ msgid "C5"
-#~ msgstr "C5"
-
-#~ msgid "C5 Envelope"
-#~ msgstr "Конверт C5"
-
-#~ msgid "C6"
-#~ msgstr "C6"
-
-#~ msgid "C6 Envelope"
-#~ msgstr "Конверт C6"
-
-#~ msgid "C65 Envelope"
-#~ msgstr "Конверт C65"
-
-#~ msgid "C7 Envelope"
-#~ msgstr "Конверт C7"
-
-#~ msgid "Character set \"%s\" not supported"
-#~ msgstr "Набор символов \"%s\" не поддерживается"
-
-#~ msgid "Chou3 Envelope"
-#~ msgstr "Конверт Chou3"
-
-#~ msgid "Chou4 Envelope"
-#~ msgstr "Конверт Chou4"
-
-#~ msgid ""
-#~ "Commands may be abbreviated.  Commands are:\n"
-#~ "\n"
-#~ "exit    help    quit    status  ?\n"
-#~ msgstr ""
-#~ "Команды могут быть сокращены.  Команды:\n"
-#~ "\n"
-#~ "exit    help    quit    status  ?\n"
-
-#~ msgid "Could not scan type \"%s\""
-#~ msgstr "Не удалось сканировать тип \"%s\""
-
-#~ msgid "Created On: "
-#~ msgstr "Дата создания: "
-
-#~ msgid "DL"
-#~ msgstr "DL"
-
-#~ msgid "DL Envelope"
-#~ msgstr "Конверт DL"
-
-#~ msgid "Description: "
-#~ msgstr "Описание: "
-
-#~ msgid ""
-#~ "Device: uri = %s\n"
-#~ "        class = %s\n"
-#~ "        info = %s\n"
-#~ "        make-and-model = %s\n"
-#~ "        device-id = %s\n"
-#~ "        location = %s\n"
-#~ msgstr ""
-#~ "Устройство: uri = %s\n"
-#~ "        class = %s\n"
-#~ "        info = %s\n"
-#~ "        make-and-model = %s\n"
-#~ "        device-id = %s\n"
-#~ "        location = %s\n"
-
-#~ msgid "Document %d not found in job %d."
-#~ msgstr "Документ %d в задании %d не найден."
-
-#~ msgid "Double Postcard"
-#~ msgstr "Двойная открытка"
-
-#~ msgid "Driver Name: "
-#~ msgstr "Имя драйвера: "
-
-#~ msgid "Driver Version: "
-#~ msgstr "Версия драйвера: "
-
-#~ msgid "EMERG: Unable to allocate memory for page info: %s\n"
-#~ msgstr "EMERG: Не удается выделить память для информации страницы: %s\n"
-
-#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n"
-#~ msgstr "EMERG: Не удается выделить память для массива страниц: %s\n"
-
-#~ msgid "ERROR: %s job-id user title copies options [file]\n"
-#~ msgstr "ERROR: %s задание пользователь название копий параметры [файл]\n"
-
-#~ msgid "ERROR: Bad %%BoundingBox: comment seen\n"
-#~ msgstr "ERROR: Неверный %%BoundingBox: комментарий просмотрен\n"
-
-#~ msgid "ERROR: Bad %%IncludeFeature: comment\n"
-#~ msgstr "ERROR: Неверный %%IncludeFeature: комментарий\n"
-
-#~ msgid "ERROR: Bad %%Page: comment in file\n"
-#~ msgstr "ERROR: Неверный %%Page: комментарий в файле\n"
-
-#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file\n"
-#~ msgstr "ERROR: Неверный %%PageBoundingBox: комментарий в файле\n"
-
-#~ msgid "ERROR: Bad charset file %s\n"
-#~ msgstr "ERROR: Неверный файл набора символов %s\n"
-
-#~ msgid "ERROR: Bad charset type %s\n"
-#~ msgstr "ERROR: Неверный тип набора символов %s\n"
-
-#~ msgid "ERROR: Bad columns value %d\n"
-#~ msgstr "ERROR: Неверное значение количества столбцов %d\n"
-
-#~ msgid "ERROR: Bad cpi value %f\n"
-#~ msgstr "ERROR: Неверное значение cpi %f\n"
-
-#~ msgid "ERROR: Bad font description line: %s\n"
-#~ msgstr "ERROR: Неверная строка описания шрифта: %s\n"
-
-#~ msgid "ERROR: Bad lpi value %f\n"
-#~ msgstr "ERROR: Неверное значение lpi %f\n"
-
-#~ msgid "ERROR: Bad page setup\n"
-#~ msgstr "ERROR: Неверные параметры страницы\n"
-
-#~ msgid "ERROR: Bad text direction %s\n"
-#~ msgstr "ERROR: Неверное направление текста %s\n"
-
-#~ msgid "ERROR: Bad text width %s\n"
-#~ msgstr "ERROR: Неверная ширина текста %s\n"
-
-#~ msgid "ERROR: Destination printer does not exist\n"
-#~ msgstr "ERROR: Целевой принтер не существует\n"
-
-#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen\n"
-#~ msgstr "ERROR: Дубликат %%BoundingBox: комментарий просмотрен\n"
-
-#~ msgid "ERROR: Duplicate %%Pages: comment seen\n"
-#~ msgstr "ERROR: Дубликат %%Pages: комментарий просмотрен\n"
-
-#~ msgid "ERROR: Empty print file\n"
-#~ msgstr "ERROR: Пустой файл печати\n"
-
-#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n"
-#~ msgstr "ERROR: Ошибка %d при отправке запроса PAPSendData: %s\n"
-
-#~ msgid "ERROR: Expected quoted string on line %d of %s\n"
-#~ msgstr "ERROR: В строке %d из %s должна быть запись в ковычках\n"
-
-#~ msgid "ERROR: Fatal USB error\n"
-#~ msgstr "ERROR: Критический сбой USB\n"
-
-#~ msgid "ERROR: Missing %%EndProlog\n"
-#~ msgstr "ERROR: Отсутствует %%endProlog\n"
-
-#~ msgid "ERROR: Missing %%EndSetup\n"
-#~ msgstr "ERROR: Отсутствует %%EndSetup\n"
-
-#~ msgid "ERROR: Missing value on line %d of banner file\n"
-#~ msgstr "ERROR: Отсутствует значение в строке %d в файле баннера.\n"
-
-#~ msgid ""
-#~ "ERROR: Need a msgid line before any translation strings on line %d of %s\n"
-#~ msgstr ""
-#~ "ERROR: Требуется строка msgid перед строкой перевода в строке %d из %s\n"
-
-#~ msgid "ERROR: No %%BoundingBox: comment in header\n"
-#~ msgstr "ERROR: Нет %%BoundingBox: комментарий в заголовке\n"
-
-#~ msgid "ERROR: No %%Pages: comment in header\n"
-#~ msgstr "ERROR: Нет %%Pages: комментарий в заголовке\n"
-
-#~ msgid ""
-#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment "
-#~ "variable\n"
-#~ msgstr ""
-#~ "ERROR: Не обнаружено URI устройства в argv[0] или переменной окружения "
-#~ "DEVICE_URI\n"
-
-#~ msgid "ERROR: No fonts in charset file %s\n"
-#~ msgstr "ERROR: Отсутствуют шрифты в файле набора символов %s\n"
-
-#~ msgid "ERROR: No pages found\n"
-#~ msgstr "ERROR: Страницы не найдены\n"
-
-#~ msgid "ERROR: Out of paper\n"
-#~ msgstr "ERROR: Не хватает бумаги\n"
-
-#~ msgid "ERROR: PRINTER environment variable not defined\n"
-#~ msgstr "ERROR: Переменная окружения PRINTER не указана\n"
-
-#~ msgid "ERROR: Print file was not accepted (%s)\n"
-#~ msgstr "ERROR: Файл печати не был принят (%s)\n"
-
-#~ msgid "ERROR: Printer not responding\n"
-#~ msgstr "ERROR: Принтер не отвечает\n"
-
-#~ msgid "ERROR: Printer sent unexpected EOF\n"
-#~ msgstr "ERROR: Принтер преждевременно передал индикатор EOF\n"
-
-#~ msgid "ERROR: Remote host did not accept control file (%d)\n"
-#~ msgstr "ERROR: Удаленный хост не принял контрольный файл (%d)\n"
-
-#~ msgid "ERROR: Remote host did not accept data file (%d)\n"
-#~ msgstr "ERROR: Удаленный хост не принял файл данных (%d)\n"
-
-#~ msgid "ERROR: There was a timeout error while sending data to the printer\n"
-#~ msgstr ""
-#~ "ERROR: Сбой, связанный со временем ожидания при отправке данных на "
-#~ "принтер\n"
-
-#~ msgid "ERROR: Unable to add file %d to job: %s\n"
-#~ msgstr "ERROR: Не удается добавить файл %d к заданию: %s\n"
-
-#~ msgid "ERROR: Unable to cancel job %d: %s\n"
-#~ msgstr "ERROR: Не удается отменить задание %d: %s\n"
-
-#~ msgid "ERROR: Unable to connect to printer; will retry in 30 seconds...\n"
-#~ msgstr ""
-#~ "ERROR: Не удается подключиться к принтеру; повторная попытка через 30 "
-#~ "секунд...\n"
-
-#~ msgid "ERROR: Unable to copy PDF file"
-#~ msgstr "ERROR: Не удается копировать файл PDF"
-
-#~ msgid "ERROR: Unable to create pipe"
-#~ msgstr "ERROR: Не удается создать конвейер"
-
-#~ msgid "ERROR: Unable to create socket"
-#~ msgstr "ERROR: Не удается создать сокет"
-
-#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n"
-#~ msgstr "ERROR: Не удается создать временный сжатый файл печати: %s\n"
-
-#~ msgid "ERROR: Unable to create temporary file"
-#~ msgstr "ERROR: Не удается создать временный файл"
-
-#~ msgid "ERROR: Unable to exec pictwpstops: %s\n"
-#~ msgstr "ERROR: Не удается выполнить pictwpstops: %s\n"
-
-#~ msgid "ERROR: Unable to execute gs program"
-#~ msgstr "ERROR: Не удается запустить программу gs"
-
-#~ msgid "ERROR: Unable to execute pdftops program"
-#~ msgstr "ERROR: Не удается запустить программу pdftops"
-
-#~ msgid "ERROR: Unable to execute pstops program"
-#~ msgstr "ERROR: Не удается выполнить pstops"
-
-#~ msgid "ERROR: Unable to fork pictwpstops: %s\n"
-#~ msgstr "ERROR: Не удается разветвить pictwpstops: %s\n"
-
-#~ msgid "ERROR: Unable to get PAP request"
-#~ msgstr "ERROR: Не удается получить запрос PAP"
-
-#~ msgid "ERROR: Unable to get PAP response"
-#~ msgstr "ERROR: Не удается получить ответ PAP"
-
-#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n"
-#~ msgstr "ERROR: Не удается получить PPD-файл для принтера «%s» – %s.\n"
-
-#~ msgid "ERROR: Unable to get default AppleTalk zone"
-#~ msgstr "ERROR: Не удается определить стандартную зону AppleTalk"
-
-#~ msgid "ERROR: Unable to get job %d attributes (%s)\n"
-#~ msgstr "ERROR: Не удается получить список параметров (%s) задания %d \n"
-
-#~ msgid "ERROR: Unable to get printer status (%s)\n"
-#~ msgstr "ERROR: Не удается получить статус (%s) принтера\n"
-
-#~ msgid "ERROR: Unable to locate printer '%s'\n"
-#~ msgstr "ERROR: Принтер '%s' не найден\n"
-
-#~ msgid "ERROR: Unable to look for PAP response"
-#~ msgstr "ERROR: Не удается провести поиск ответа PAP"
-
-#~ msgid "ERROR: Unable to lookup AppleTalk printers"
-#~ msgstr "ERROR: Не удается провести поиск принтеров AppleTalk"
-
-#~ msgid "ERROR: Unable to make AppleTalk address"
-#~ msgstr "ERROR: Не удается ставить адрес AppleTalk"
-
-#~ msgid "ERROR: Unable to open \"%s\" - %s\n"
-#~ msgstr "ERROR: Не удается открыть «%s» – %s\n"
-
-#~ msgid "ERROR: Unable to open %s: %s\n"
-#~ msgstr "ERROR: Не удается открыть %s: %s\n"
-
-#~ msgid "ERROR: Unable to open PPD file\n"
-#~ msgstr "ERROR: Не удается открыть PPD файл\n"
-
-#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n"
-#~ msgstr "ERROR: Не удается открыть файл баннера «%s» – %s\n"
-
-#~ msgid "ERROR: Unable to open device file \"%s\": %s\n"
-#~ msgstr "ERROR: Не удается открыть файл устройства «%s»: %s\n"
-
-#~ msgid "ERROR: Unable to open file \"%s\" - %s\n"
-#~ msgstr "ERROR: Не удается открыть файл «%s» – %s\n"
-
-#~ msgid "ERROR: Unable to open file \"%s\": %s\n"
-#~ msgstr "ERROR: Не удается открыть файл «%s»: %s\n"
-
-#~ msgid "ERROR: Unable to open image file for printing\n"
-#~ msgstr "ERROR: Не удается открыть изображение для печати\n"
-
-#~ msgid "ERROR: Unable to open print file \"%s\": %s\n"
-#~ msgstr "ERROR: Не удается открыть файл печати «%s»: %s\n"
-
-#~ msgid "ERROR: Unable to open print file %s - %s\n"
-#~ msgstr "ERROR: Не удается открыть файл печати %s – %s\n"
-
-#~ msgid "ERROR: Unable to open print file %s: %s\n"
-#~ msgstr "ERROR: Не удается открыть файл печати %s: %s\n"
-
-#~ msgid "ERROR: Unable to open raster file - %s\n"
-#~ msgstr "ERROR: Не удается открыть растровый файл - %s\n"
-
-#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n"
-#~ msgstr "ERROR: Не удается открыть временный сжатый файл печати: %s\n"
-
-#~ msgid "ERROR: Unable to print %d text columns\n"
-#~ msgstr "ERROR: Не удается напечатать столбцы с текстом %d\n"
-
-#~ msgid "ERROR: Unable to print %dx%d text page\n"
-#~ msgstr "ERROR: Не удается напечатать страницу с текстом %dx%d\n"
-
-#~ msgid "ERROR: Unable to read print data"
-#~ msgstr "ERROR: Не удается считать данные печати"
-
-#~ msgid "ERROR: Unable to read print data\n"
-#~ msgstr "ERROR: Не удается прочитать данные для печати\n"
-
-#~ msgid "ERROR: Unable to reserve port"
-#~ msgstr "ERROR: Не удается зарезервировать порт"
-
-#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n"
-#~ msgstr "ERROR: Не удается перейти к смещению %ld в файле – %s\n"
-
-#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n"
-#~ msgstr "ERROR: Не удается перейти к смещению %lld в файле – %s\n"
-
-#~ msgid "ERROR: Unable to send LPD command"
-#~ msgstr "ERROR: Не удается отправить команду LPD"
-
-#~ msgid "ERROR: Unable to send PAP tickle request"
-#~ msgstr "ERROR: Не удается отправить контрольный запрос PAP"
-
-#~ msgid "ERROR: Unable to send initial PAP send data request"
-#~ msgstr "ERROR: Не удается отправить исходный запрос PAP на отправку данных"
-
-#~ msgid "ERROR: Unable to send print data\n"
-#~ msgstr "ERROR: Не удается отправить данные для печати\n"
-
-#~ msgid "ERROR: Unable to send print file to printer"
-#~ msgstr "ERROR: Не удается отправить файл печати на принтер"
-
-#~ msgid "ERROR: Unable to send trailing nul to printer"
-#~ msgstr "ERROR: Не удается отправить конечное нулевое значение на принтер"
-
-#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n"
-#~ msgstr "ERROR: Не удается подождать pictwpstops: %s\n"
-
-#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n"
-#~ msgstr "ERROR: Не удается записать %d байт на «%s»: %s\n"
-
-#~ msgid "ERROR: Unable to write %d bytes to printer\n"
-#~ msgstr "ERROR: Не удается записать %d байт на принтер\n"
-
-#~ msgid "ERROR: Unable to write control file"
-#~ msgstr "ERROR: Не удается записать контрольный файл"
-
-#~ msgid "ERROR: Unable to write print data"
-#~ msgstr "ERROR: Не удается записать данные печати"
-
-#~ msgid "ERROR: Unable to write print data: %s\n"
-#~ msgstr "ERROR: Не удается записать данные печати: %s\n"
-
-#~ msgid "ERROR: Unable to write raster data to driver\n"
-#~ msgstr "Не удается записать растровые данные на принтер\n"
-
-#~ msgid "ERROR: Unable to write uncompressed document data: %s\n"
-#~ msgstr "ERROR: Не удается записать несжатые данные документа: %s\n"
-
-#~ msgid "ERROR: Unexpected text on line %d of %s\n"
-#~ msgstr "ERROR: Неизвестный текст в %s строки %d\n"
-
-#~ msgid "ERROR: Unknown encryption option value \"%s\"\n"
-#~ msgstr "ERROR: Неизвестное значение \"%s\" параметра шифрования\n"
-
-#~ msgid "ERROR: Unknown file order \"%s\"\n"
-#~ msgstr "ERROR: Неизвестный порядок файлов «%s»\n"
-
-#~ msgid "ERROR: Unknown format character \"%c\"\n"
-#~ msgstr "ERROR: Символ неизвестного формата «%c»\n"
-
-#~ msgid "ERROR: Unknown message catalog format for \"%s\"\n"
-#~ msgstr "ERROR: Неизвестный формат каталога сообщений для \"%s\"\n"
-
-#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"\n"
-#~ msgstr "ERROR: Неизвестный параметр \"%s\" со значением \"%s\"\n"
-
-#~ msgid "ERROR: Unknown print mode \"%s\"\n"
-#~ msgstr "ERROR: Неизвестный режим печати «%s»\n"
-
-#~ msgid "ERROR: Unknown version option value \"%s\"\n"
-#~ msgstr "ERROR: Неизвестное значение параметра версии \"%s\"\n"
-
-#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100\n"
-#~ msgstr ""
-#~ "ERROR: Неподдерживаемое значение яркости %s, используется значение "
-#~ "brightness=100\n"
-
-#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000\n"
-#~ msgstr ""
-#~ "ERROR: Неподдерживаемое значение гаммы %s, используется значение "
-#~ "gamma=1000\n"
-
-#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1\n"
-#~ msgstr ""
-#~ "ERROR: Неподдерживаемое значение number-up %d, используется значение "
-#~ "number-up=1\n"
-
-#~ msgid ""
-#~ "ERROR: Unsupported number-up-layout value %s, using number-up-"
-#~ "layout=lrtb\n"
-#~ msgstr ""
-#~ "ERROR: Неподдерживаемое значение number-up-layout %s, используется "
-#~ "значение number-up-layout=lrtb\n"
-
-#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none\n"
-#~ msgstr ""
-#~ "ERROR: Неподдерживаемое значение page-border %s, используется значение "
-#~ "page-border=none\n"
-
-#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting\n"
-#~ msgstr "ERROR: Обнаружено переполнение doc_printf (%d байт). Прервать.\n"
-
-#~ msgid "ERROR: pictwpstops exited on signal %d\n"
-#~ msgstr "ERROR: pictwpstops завершился по сигналу %d\n"
-
-#~ msgid "ERROR: pictwpstops exited with status %d\n"
-#~ msgstr "ERROR: pitwpstops завершился со статусом %d\n"
-
-#~ msgid "ERROR: select() failed"
-#~ msgstr "ERROR: Сбой оператора select()"
-
-#~ msgid "ERROR: unable to stat print file"
-#~ msgstr "ERROR: Не удается установить файл печати"
-
-#~ msgid "Empty PPD file"
-#~ msgstr "Пустой PPD файл"
-
-#~ msgid "Error: need hostname after '-h' option\n"
-#~ msgstr "ERROR: Требуется имя хоста после параметра '-h'\n"
-
-#~ msgid "FAIL\n"
-#~ msgstr "FAIL\n"
-
-#~ msgid "File Folder"
-#~ msgstr "Каталог файла"
-
-#~ msgid "File Folder - 9/16 x 3 7/16\""
-#~ msgstr "Каталог файла - 9 16/8 x 3 7/16\""
-
-#~ msgid ""
-#~ "File device URIs have been disabled! To enable, see the FileDevice "
-#~ "directive in \"%s/cupsd.conf\"."
-#~ msgstr ""
-#~ "URI-адреса файлового устройства отключены! Чтобы включить их, используйте "
-#~ "директиву FileDevice в «%s/cupsd.conf»."
-
-#~ msgid "German FanFold"
-#~ msgstr "German FanFold"
-
-#~ msgid "German FanFold Legal"
-#~ msgstr "German FanFold Legal"
-
-#~ msgid "Got a printer-uri attribute but no job-id"
-#~ msgstr "Получен атрибут printer-uri, но не job-id"
-
-#~ msgid "Hanging Folder - 9/16 x 2\""
-#~ msgstr "Папка подвесного хранения - 9/16 x 2\""
-
-#~ msgid "INFO: AppleTalk disabled in System Preferences\n"
-#~ msgstr "INFO: AppleTalk отключен в Системных настройках\n"
-
-#~ msgid "INFO: AppleTalk disabled in System Preferences.\n"
-#~ msgstr "INFO: AppleTalk отключен в Системных настройках.\n"
-
-#~ msgid "INFO: Canceling print job...\n"
-#~ msgstr "INFO: Отмена задания печати…\n"
-
-#~ msgid "INFO: Connected to printer...\n"
-#~ msgstr "INFO: Подключен к принтеру…\n"
-
-#~ msgid "INFO: Connecting to printer...\n"
-#~ msgstr "INFO: Подключение к принтеру…\n"
-
-#~ msgid "INFO: Control file sent successfully\n"
-#~ msgstr "INFO: Контрольный файл успешно отправлен\n"
-
-#~ msgid "INFO: Copying print data...\n"
-#~ msgstr "INFO: Копирование данных печати...\n"
-
-#~ msgid "INFO: Data file sent successfully\n"
-#~ msgstr "INFO: Файл данных успешно отправлен\n"
-
-#~ msgid "INFO: Finished page %d...\n"
-#~ msgstr "INFO: Последняя страница %d...\n"
-
-#~ msgid "INFO: Formatting page %d...\n"
-#~ msgstr "INFO: Форматирование страницы %d…\n"
-
-#~ msgid "INFO: Loading image file...\n"
-#~ msgstr "INFO: Загрузка файла изображения…\n"
-
-#~ msgid "INFO: Looking for printer...\n"
-#~ msgstr "INFO: Поиск принтера...\n"
-
-#~ msgid "INFO: Opening connection\n"
-#~ msgstr "INFO: Установка соединения\n"
-
-#~ msgid "INFO: Print file sent, waiting for printer to finish...\n"
-#~ msgstr "INFO: Файл печати отправлен, ожидание окончания работы принтера…\n"
-
-#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n"
-#~ msgstr "INFO: Принтер занят; попытка будет повторена через 10 секунд…\n"
-
-#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n"
-#~ msgstr "INFO: Принтер занят; попытка будет повторена через 30 секунд…\n"
-
-#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n"
-#~ msgstr "INFO: Принтер занят; попытка будет повторена через 5 секунд…\n"
-
-#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n"
-#~ msgstr ""
-#~ "INFO: Принтер не поддерживает IPP/%d.%d; попытка использовать IPP/1.0…\n"
-
-#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n"
-#~ msgstr "INFO: Принтер занят; попытка будет повторена через 5 секунд…\n"
-
-#~ msgid "INFO: Printer is currently off-line.\n"
-#~ msgstr "INFO: В данный момент принтер не подключен к сети.\n"
-
-#~ msgid "INFO: Printer is currently offline.\n"
-#~ msgstr "INFO: В данный момент принтер не подключен к сети.\n"
-
-#~ msgid "INFO: Printer is now online.\n"
-#~ msgstr "INFO: Принтер подключен к сети.\n"
-
-#~ msgid "INFO: Printer is offline.\n"
-#~ msgstr "INFO: Принтер не подключен к сети.\n"
-
-#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n"
-#~ msgstr ""
-#~ "INFO: Принтер не подключен; попытка будет повторена через 30 секунд…\n"
-
-#~ msgid "INFO: Printing page %d, %d%% complete...\n"
-#~ msgstr "INFO: Печать страницы %d, %d%% завершена…\n"
-
-#~ msgid "INFO: Printing page %d...\n"
-#~ msgstr "INFO: Печать страницы %d…\n"
-
-#~ msgid "INFO: Ready to print.\n"
-#~ msgstr "INFO: Готов к печати.\n"
-
-#~ msgid "INFO: Sending control file (%lu bytes)\n"
-#~ msgstr "INFO: Отправка контрольного файла (%lu байт)\n"
-
-#~ msgid "INFO: Sending control file (%u bytes)\n"
-#~ msgstr "INFO: Отправка контрольного файла (%u байт)\n"
-
-#~ msgid "INFO: Sending data\n"
-#~ msgstr "INFO: Отправка данных\n"
-
-#~ msgid "INFO: Sending data file (%ld bytes)\n"
-#~ msgstr "INFO: Отправка файла данных (%ld байт)\n"
-
-#~ msgid "INFO: Sending data file (%lld bytes)\n"
-#~ msgstr "INFO: Отправка файла данных (%lld байт)\n"
-
-#~ msgid "INFO: Sending print data...\n"
-#~ msgstr "INFO: Отправка данных печати…\n"
-
-#~ msgid "INFO: Sent print file, %ld bytes...\n"
-#~ msgstr "INFO: Отправлен файл печати, %ld байт…\n"
-
-#~ msgid "INFO: Sent print file, %lld bytes...\n"
-#~ msgstr "INFO: Отправлен файл печати, %lld байт…\n"
-
-#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n"
-#~ msgstr "INFO: Спулинг задания LPR, %.0f%% выполнено…\n"
-
-#~ msgid "INFO: Starting page %d...\n"
-#~ msgstr "INFO: Главная страница %d...\n"
-
-#~ msgid ""
-#~ "INFO: Unable to contact printer, queuing on next printer in class...\n"
-#~ msgstr ""
-#~ "INFO: Не удается установить связь с принтером, постановка в очередь на "
-#~ "следующем принтере в классе…\n"
-
-#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n"
-#~ msgstr "INFO: Используется стандартная зона AppleTalk «%s»\n"
-
-#~ msgid "INFO: Waiting for job to complete...\n"
-#~ msgstr "INFO: Ожидание окончания выполнения задания…\n"
-
-#~ msgid "INFO: Waiting for printer to become available...\n"
-#~ msgstr "INFO: Ожидание доступа к принтеру...\n"
-
-#~ msgid "ISO B0"
-#~ msgstr "ISO B0"
-
-#~ msgid "ISO B1"
-#~ msgstr "ISO B1"
-
-#~ msgid "ISO B10"
-#~ msgstr "ISO B10"
-
-#~ msgid "ISO B2"
-#~ msgstr "ISO B2"
-
-#~ msgid "ISO B3"
-#~ msgstr "ISO B3"
-
-#~ msgid "ISO B4"
-#~ msgstr "ISO B4"
-
-#~ msgid "ISO B4 Envelope"
-#~ msgstr "Конверт ISO B4"
-
-#~ msgid "ISO B5"
-#~ msgstr "ISO B5"
-
-#~ msgid "ISO B5 (Oversize)"
-#~ msgstr "ISO B5 (расширенный)"
-
-#~ msgid "ISO B5 Envelope"
-#~ msgstr "Конверт ISO B5"
-
-#~ msgid "ISO B6"
-#~ msgstr "ISO B6"
-
-#~ msgid "ISO B6 Envelope"
-#~ msgstr "Конверт ISO B6"
-
-#~ msgid "ISO B7"
-#~ msgstr "ISO B7"
-
-#~ msgid "ISO B8"
-#~ msgstr "ISO B8"
-
-#~ msgid "ISO B9"
-#~ msgstr "ISO B9"
-
-#~ msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\""
-#~ msgstr "Наклейки Internet Postage 2-Part - 2 1/4 x 7 1/2\""
-
-#~ msgid "Internet Postage 3-Part - 2 1/4 x 7\""
-#~ msgstr "Наклейки Internet Postage 3-Part - 2 1/4 x 7\""
-
-#~ msgid "Invite Envelope"
-#~ msgstr "Конверт Invite Envelope"
-
-#~ msgid "Italian Envelope"
-#~ msgstr "Конверт Italian Envelope"
-
-#~ msgid "Job #%d cannot be restarted - no files"
-#~ msgstr "Задание #%d не может быть перезапущено - отсутствуют файлы"
-
-#~ msgid "Job #%d does not exist"
-#~ msgstr "Задание #%d не существует"
-
-#~ msgid "Job #%d is finished and cannot be altered"
-#~ msgstr "Задание #%d завершено и не может быть изменено"
-
-#~ msgid "Job #%d is not complete"
-#~ msgstr "Задание #%d не завершено"
-
-#~ msgid "Job #%d is not held"
-#~ msgstr "Задание #%d не задержано"
-
-#~ msgid "Job #%d is not held for authentication"
-#~ msgstr "Задание #%d не задержано для идентификации"
-
-#~ msgid "Job #%s does not exist"
-#~ msgstr "Задание #%d не существует"
-
-#~ msgid "Job %d not found"
-#~ msgstr "Задание %d не найдено"
-
-#~ msgid "Job ID: "
-#~ msgstr "ID задания: "
-
-#~ msgid "Job UUID: "
-#~ msgstr "UUID задания: "
-
-#~ msgid "Job operation failed:"
-#~ msgstr "Сбой операции задания:"
-
-#~ msgid "Job subscriptions cannot be renewed"
-#~ msgstr "Подписки на задание не могут быть обновлены"
-
-#~ msgid "Kaku2 Envelope"
-#~ msgstr "Конверт Kaku2"
-
-#~ msgid "Kaku3 Envelope"
-#~ msgstr "Конверт Kaku3"
-
-#~ msgid "Language \"%s\" not supported"
-#~ msgstr "Язык \"%s\" не поддерживается"
-
-#~ msgid "Large Address - 1 4/10 x 3 1/2\""
-#~ msgstr "Полный адрес - 1 4/10 x 3 1/2\""
-
-#~ msgid "Location: "
-#~ msgstr "Местоположение: "
-
-#~ msgid "Make and Model: "
-#~ msgstr "Марка и модель: "
-
-#~ msgid "Media Dimensions: "
-#~ msgstr "Размеры бумаги: "
-
-#~ msgid "Media Limits: "
-#~ msgstr "Ограничения бумаги: "
-
-#~ msgid "Media Name: "
-#~ msgstr "Название бумаги: "
-
-#~ msgid "Missing document-number attribute"
-#~ msgstr "Отсутствует атрибут document-number"
-
-#~ msgid "Missing double quote on line %d"
-#~ msgstr "Отсутствует двойная кавычка в строке %d"
-
-#~ msgid "Missing notify-subscription-ids attribute"
-#~ msgstr "Отсутствует атрибут notify-subscription-ids"
-
-#~ msgid "Missing requesting-user-name attribute"
-#~ msgstr "Отсутствует атрибут requesting-user-name"
-
-#~ msgid "Missing required attributes"
-#~ msgstr "Отсутствуют обязательные атрибуты"
-
-#~ msgid "Missing value on line %d"
-#~ msgstr "Отсутствует значение в строке %d"
-
-#~ msgid ""
-#~ "Model:  name = %s\n"
-#~ "        natural_language = %s\n"
-#~ "        make-and-model = %s\n"
-#~ "        device-id = %s\n"
-#~ msgstr ""
-#~ "Model:  name = %s\n"
-#~ "        natural_language = %s\n"
-#~ "        make-and-model = %s\n"
-#~ "        device-id = %s\n"
-
-#~ msgid "Monarch"
-#~ msgstr "Monarch"
-
-#~ msgid "Monarch Envelope"
-#~ msgstr "Конверт Monarch"
-
-#~ msgid "NOTICE: Print file accepted - job ID %d.\n"
-#~ msgstr "NOTICE: Файл печати принят – ID задания %d.\n"
-
-#~ msgid "NOTICE: Print file accepted - job ID unknown.\n"
-#~ msgstr "NOTICE: Файл печати принят – ID задания неизвестен.\n"
-
-#~ msgid "Nested classes are not allowed"
-#~ msgstr "Вложенные группы не допускаются"
-
-#~ msgid "No Windows printer drivers are installed"
-#~ msgstr "Нет установленных драйверов принтера Windows"
-
-#~ msgid "No active jobs on %s"
-#~ msgstr "Нет активных заданий на %s"
-
-#~ msgid "No attributes in request"
-#~ msgstr "Нет атрибутов в запросе"
-
-#~ msgid "No authentication information provided"
-#~ msgstr "Нет информации для проверки подлинности"
-
-#~ msgid "No default printer"
-#~ msgstr "Нет принтера по умолчанию"
-
-#~ msgid "No file!?"
-#~ msgstr "Нет файла!?"
-
-#~ msgid "No printer-uri in request"
-#~ msgstr "Нет адреса printer-uri в запросе"
-
-#~ msgid "No subscription attributes in request"
-#~ msgstr "Нет атрибутов подписки в запросе"
-
-#~ msgid "Options: "
-#~ msgstr "Параметры: "
-
-#~ msgid "Output for printer %s is sent to %s\n"
-#~ msgstr "Вывод для принтера %s отправлен на %s\n"
-
-#~ msgid "Output for printer %s is sent to remote printer %s on %s\n"
-#~ msgstr "Вывод для принтера %s отправлен на удаленный принтер %s на %s\n"
-
-#~ msgid "Output for printer %s/%s is sent to %s\n"
-#~ msgstr "Вывод для принтера %s/%s отправлен на %s\n"
-
-#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n"
-#~ msgstr "Вывод для принтера %s/%s отправлен на удаленный принтер %s на %s\n"
-
-#~ msgid "PASS\n"
-#~ msgstr "PASS\n"
-
-#~ msgid "PRC1 Envelope"
-#~ msgstr "Конверт PRC1"
-
-#~ msgid "PRC10 Envelope"
-#~ msgstr "Конверт PRC10"
-
-#~ msgid "PRC2 Envelope"
-#~ msgstr "Конверт PRC2"
-
-#~ msgid "PRC3 Envelope"
-#~ msgstr "Конверт PRC3"
-
-#~ msgid "PRC32K (Oversize)"
-#~ msgstr "PRC32K (расширенный)"
-
-#~ msgid "PRC4 Envelope"
-#~ msgstr "Конверт PRC4"
-
-#~ msgid "PRC5 Envelope"
-#~ msgstr "Конверт PRC5"
-
-#~ msgid "PRC6 Envelope"
-#~ msgstr "Конверт PRC6"
-
-#~ msgid "PRC7 Envelope"
-#~ msgstr "Конверт PRC7"
-
-#~ msgid "PRC8 Envelope"
-#~ msgstr "Конверт PRC8"
-
-#~ msgid "PRC9 Envelope"
-#~ msgstr "Конверт PRC9"
-
-#~ msgid "Personal Envelope"
-#~ msgstr "Индивидуальный конверт"
-
-#~ msgid "Printed For: "
-#~ msgstr "Напечатано для: "
-
-#~ msgid "Printed From: "
-#~ msgstr "Напечатано из: "
-
-#~ msgid "Printed On: "
-#~ msgstr "Дата печати: "
-
-#~ msgid "Printer Name: "
-#~ msgstr "Имя принтера: "
-
-#~ msgid "Rank    Owner   Job     File(s)                         Total Size\n"
-#~ msgstr ""
-#~ "Ранг    Владелец   Задание     Файл(ы)                         Общий "
-#~ "размер\n"
-
-#~ msgid ""
-#~ "Rank   Owner      Pri  Job        Files                       Total Size\n"
-#~ msgstr ""
-#~ "Ранг    Владелец   Задание печати     Файл(ы)                         "
-#~ "Общий размер\n"
-
-#~ msgid "Return Address - 3/4 x 2\""
-#~ msgstr "Обратный адрес - 3/4 x 2\""
-
-#~ msgid "Running command: %s %s -N -A %s -c '%s'\n"
-#~ msgstr "Запущенная команда: %s %s -N -A %s -c «%s»\n"
-
-#~ msgid "Serial Port #%d"
-#~ msgstr "Последовательный порт #%d"
-
-#~ msgid "Shipping Address - 2 5/16 x 4\""
-#~ msgstr "Адрес доставки - 2 5/16 x 4\""
-
-#~ msgid "Tabloid (Oversize)"
-#~ msgstr "Tabloid (расширенный)"
-
-#~ msgid "The notify-user-data value is too large (%d > 63 octets)"
-#~ msgstr "Значение notify-user-data слишком большое(%d > 63 октета)"
-
-#~ msgid "The printer is almost out of ink."
-#~ msgstr "Заканчиваются чернила."
-
-#~ msgid "The printer is low on toner."
-#~ msgstr "Заканчивается тонер."
-
-#~ msgid "The printer is out of ink."
-#~ msgstr "Чернила закончились."
-
-#~ msgid "The printer is out of toner."
-#~ msgstr "Тонер закончился."
-
-#~ msgid "The printer or class is not shared"
-#~ msgstr "Нет общего доступа к принтеру или классу."
-
-#~ msgid "The printer or class was not found."
-#~ msgstr "Принтер или класс не найден."
-
-#~ msgid "The printer-uri attribute is required"
-#~ msgstr "Требуется атрибут printer-uri"
-
-#~ msgid "Title: "
-#~ msgstr "Заголовок: "
-
-#~ msgid "Too many job-sheets values (%d > 2)"
-#~ msgstr "Слишком много значений job-sheets (%d>2)"
-
-#~ msgid "Too many printer-state-reasons values (%d > %d)"
-#~ msgstr "Слишком много значений printer-state-reasons (%d > %d)"
-
-#~ msgid "US Executive"
-#~ msgstr "US Executive"
-
-#~ msgid "US Fanfold"
-#~ msgstr "US Fanfold"
-
-#~ msgid "US Legal (Oversize)"
-#~ msgstr "US Legal (расширенный)"
-
-#~ msgid "US Letter (Oversize)"
-#~ msgstr "US Letter (расширенный)"
-
-#~ msgid "US Letter (Small)"
-#~ msgstr "US Letter (уменьшенный)"
-
-#~ msgid "USB Serial Port #%d"
-#~ msgstr "Последовательный порт USB #%d"
-
-#~ msgid "Unable to access cupsd.conf file:"
-#~ msgstr "Не удается получить доступ к файлу «cupsd.conf»:"
-
-#~ msgid "Unable to add RSS subscription:"
-#~ msgstr "Не удается добавить подписку RSS:"
-
-#~ msgid "Unable to add class:"
-#~ msgstr "Не удается добавить класс:"
-
-#~ 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 cancel RSS subscription:"
-#~ msgstr "Не удается отменить подписку RSS:"
-
-#~ msgid "Unable to change printer-is-shared attribute:"
-#~ msgstr "Не удается изменить атрибут printer-is-shared:"
-
-#~ msgid "Unable to change printer:"
-#~ msgstr "Не удается изменить принтер:"
-
-#~ msgid "Unable to change server settings:"
-#~ msgstr "Не удается изменить настройки сервера:"
-
-#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)"
-#~ msgstr "Не удается копировать 64-битовые файлы драйвера принтера CUPS (%d)"
-
-#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)"
-#~ msgstr ""
-#~ "Не удается копировать 64-битовые файлы драйвера принтера для Windows (%d)"
-
-#~ msgid "Unable to copy CUPS printer driver files (%d)"
-#~ msgstr "Не удается копировать файлы драйвера принтера CUPS (%d)"
-
-#~ msgid "Unable to copy PPD file"
-#~ msgstr "Не удается копировать PPD-файл"
-
-#~ msgid "Unable to copy Windows 2000 printer driver files (%d)"
-#~ msgstr "Не удается копировать файлы драйвера принтера Windows 2000 (%d)"
-
-#~ msgid "Unable to copy Windows 9x printer driver files (%d)"
-#~ msgstr "Не удается копировать файлы драйвера принтера Windows 9x (%d)"
-
-#~ 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 find printer\n"
-#~ msgstr "Не удается найти принтер\n"
-
-#~ 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 install Windows 2000 printer driver files (%d)"
-#~ msgstr "Не удается установить файлы драйвера принтера Windows 2000 (%d)"
-
-#~ msgid "Unable to install Windows 9x printer driver files (%d)"
-#~ msgstr "Не удается установить файлы драйвера принтера Windows 9x (%d)"
-
-#~ msgid "Unable to modify class:"
-#~ msgstr "Не удается изменить класс:"
-
-#~ msgid "Unable to modify printer:"
-#~ msgstr "Не удается изменить принтер:"
-
-#~ msgid "Unable to open PPD file:"
-#~ msgstr "Не удается открыть PPD-файл:"
-
-#~ msgid "Unable to open document %d in job %d"
-#~ msgstr "Не удается открыть документ %d в задании %d"
-
-#~ msgid "Unable to print test page:"
-#~ msgstr "Не удается напечатать пробную страницу:"
-
-#~ msgid "Unable to run \"%s\": %s\n"
-#~ msgstr "Не удается запустить «%s»: %s\n"
-
-#~ msgid "Unable to set Windows printer driver (%d)"
-#~ msgstr "Не удается настроить драйвер принтера Windows (%d)"
-
-#~ msgid "Unable to set options:"
-#~ msgstr "Не удается настроить параметры:"
-
-#~ msgid "Unable to set server default:"
-#~ msgstr "Не удается назначить сервер используемым по умолчанию:"
-
-#~ msgid "Unable to upload cupsd.conf file:"
-#~ msgstr "Не удается загрузить файл «cupsd.conf»:"
-
-#~ msgid "Unable to use legacy USB class driver\n"
-#~ msgstr "Не удается использовать устаревший драйвер класса USB \n"
-
-#~ msgid "Unsupported character set \"%s\""
-#~ msgstr "Неподдерживаемый набор символов \"%s\""
-
-#~ msgid "Unsupported compression \"%s\""
-#~ msgstr "Неподдерживаемое сжатие \"%s\""
-
-#~ msgid "Unsupported compression attribute %s"
-#~ msgstr "Неподдерживаемый атрибут сжатия %s"
-
-#~ msgid "Unsupported format \"%s\""
-#~ msgstr "Неподдерживаемый формат \"%s\""
-
-#~ msgid "Unsupported format '%s'"
-#~ msgstr "Неподдерживаемый формат '%s'"
-
-#~ msgid "Unsupported format '%s/%s'"
-#~ msgstr "Неподдерживаемый формат '%s/%s'"
-
-#~ msgid ""
-#~ "Usage:\n"
-#~ "\n"
-#~ "    lpadmin [-h server] -d destination\n"
-#~ "    lpadmin [-h server] -x destination\n"
-#~ "    lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m "
-#~ "model]\n"
-#~ "                       [-r remove-class] [-v device] [-D description]\n"
-#~ "                       [-P ppd-file] [-o name=value]\n"
-#~ "                       [-u allow:user,user] [-u deny:user,user]\n"
-#~ "\n"
-#~ msgstr ""
-#~ "Синтаксис:\n"
-#~ "\n"
-#~ "    lpadmin [-h server] -d destination\n"
-#~ "    lpadmin [-h server] -x destination\n"
-#~ "    lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m "
-#~ "model]\n"
-#~ "                       [-r remove-class] [-v device] [-D description]\n"
-#~ "                       [-P ppd-file] [-o name=value]\n"
-#~ "                       [-u allow:user,user] [-u deny:user,user]\n"
-#~ "\n"
-
-#~ msgid "Usage: %s job user title copies options [filename]\n"
-#~ msgstr "Синтаксис: %s job user title copies options [filename]\n"
-
-#~ msgid "Usage: %s job-id user title copies options [file]\n"
-#~ msgstr "Синтаксис: %s job-id user title copies options [file]\n"
-
-#~ msgid "Usage: %s job-id user title copies options file\n"
-#~ msgstr "Синтаксис: %s job-id user title copies options file\n"
-
-#~ msgid ""
-#~ "Usage: convert [ options ]\n"
-#~ "\n"
-#~ "Options:\n"
-#~ "\n"
-#~ "  -e                   Use every filter from the PPD file\n"
-#~ "  -f filename          Set file to be converted (otherwise stdin)\n"
-#~ "  -o filename          Set file to be generated (otherwise stdout)\n"
-#~ "  -i mime/type         Set input MIME type (otherwise auto-typed)\n"
-#~ "  -j mime/type         Set output MIME type (otherwise application/pdf)\n"
-#~ "  -P filename.ppd      Set PPD file\n"
-#~ "  -a 'name=value ...'  Set option(s)\n"
-#~ "  -U username          Set username for job\n"
-#~ "  -J title             Set title\n"
-#~ "  -c copies            Set number of copies\n"
-#~ "  -u                   Remove the PPD file when finished\n"
-#~ "  -D                   Remove the input file when finished\n"
-#~ msgstr ""
-#~ "Синтаксис: convert [ options ]\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "\n"
-#~ "  -f filename          Указывается конвертируемый файл (в противном "
-#~ "случае stdin)\n"
-#~ "  -o filename          Указывается создаваемый файл (в противном случае "
-#~ "stdout)\n"
-#~ "  -i mime/type         Указывается MIME-тип данных на входе (в противном "
-#~ "случае auto-typed)\n"
-#~ "  -j mime/type         Указывается MIME-тип данных на выходе (в противном "
-#~ "случае application/pdf)\n"
-#~ "  -P filename.ppd      Указывается PPD-файл\n"
-#~ "  -a 'name=value ...'  Указываются параметры\n"
-#~ "  -U username          Указывается имя пользователя для задания\n"
-#~ "  -J title             Указывается заголовок\n"
-#~ "  -c copies            Указывается количество копий\n"
-#~ "  -u                   PPD-файл удаляется после выполнения команды\n"
-#~ "  -D                   Файл, поступивший на вход, удаляется после "
-#~ "выполнения команды\n"
-
-#~ msgid ""
-#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n"
-#~ "       cupsaddsmb [options] -a\n"
-#~ "\n"
-#~ "Options:\n"
-#~ "  -E               Encrypt the connection to the server\n"
-#~ "  -H samba-server  Use the named SAMBA server\n"
-#~ "  -U samba-user    Authenticate using the named SAMBA user\n"
-#~ "  -a               Export all printers\n"
-#~ "  -h cups-server   Use the named CUPS server\n"
-#~ "  -v               Be verbose (show commands)\n"
-#~ msgstr ""
-#~ "Синтаксис: cupsaddsmb [options] printer1 ... printerN\n"
-#~ "       cupsaddsmb [options] -a\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "  -E               Подключение к серверу шифруется\n"
-#~ "  -H samba-server  Используется названный сервер SAMBA\n"
-#~ "  -U samba-user    Выполняется проверка подлинности с использованием "
-#~ "указанного пользователя SAMBA\n"
-#~ "  -a               Экспортируются все принтеры\n"
-#~ "  -h cups-server   Используется названный сервер CUPS\n"
-#~ "  -v               Подробное отображение (показать команды)\n"
-
-#~ msgid ""
-#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n"
-#~ "\n"
-#~ "Options:\n"
-#~ "\n"
-#~ "    -E                      Enable encryption\n"
-#~ "    -U username             Specify username\n"
-#~ "    -h server[:port]        Specify server address\n"
-#~ "\n"
-#~ "    --[no-]debug-logging    Turn debug logging on/off\n"
-#~ "    --[no-]remote-admin     Turn remote administration on/off\n"
-#~ "    --[no-]remote-any       Allow/prevent access from the Internet\n"
-#~ "    --[no-]remote-printers  Show/hide remote printers\n"
-#~ "    --[no-]share-printers   Turn printer sharing on/off\n"
-#~ "    --[no-]user-cancel-any  Allow/prevent users to cancel any job\n"
-#~ msgstr ""
-#~ "Синтаксис: cupsctl [options] [param=value ... paramN=valueN]\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "\n"
-#~ "    -E                      Включается шифрование\n"
-#~ "    -U username             Указывается имя пользователя\n"
-#~ "    -h server[:port]        Указывается адрес сервера\n"
-#~ "\n"
-#~ "    --[no-]debug-logging    Включается/отключается ведение журнала "
-#~ "отладки\n"
-#~ "    --[no-]remote-admin     Включается/отключается удаленное "
-#~ "администрирование\n"
-#~ "    --[no-]remote-any       Разрешается/запрещается доступ из Интернета\n"
-#~ "    --[no-]remote-printers  Отображаются/скрываются удаленные принтеры\n"
-#~ "    --[no-]share-printers   Включается/отключается совместное "
-#~ "использование принтеров\n"
-#~ "    --[no-]user-cancel-any  Пользователям разрешается/запрещается "
-#~ "отменять задания\n"
-
-#~ msgid ""
-#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n"
-#~ "\n"
-#~ "-c config-file      Load alternate configuration file\n"
-#~ "-f                  Run in the foreground\n"
-#~ "-F                  Run in the foreground but detach\n"
-#~ "-h                  Show this usage message\n"
-#~ "-l                  Run cupsd from launchd(8)\n"
-#~ msgstr ""
-#~ "Синтаксис: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n"
-#~ "\n"
-#~ "-c config-file      Загружается альтернативный файл конфигурации\n"
-#~ "-f                  Задание имеет высокий приоритет\n"
-#~ "-F                  Задание имеет высокий приоритет и выделяется\n"
-#~ "-h                  Отображается данное сообщение\n"
-#~ "-l                  cupsd запускается из launchd(8)\n"
-
-#~ msgid ""
-#~ "Usage: cupsfilter -m mime/type [ options ] filename\n"
-#~ "\n"
-#~ "Options:\n"
-#~ "\n"
-#~ "  -c cupsd.conf    Set cupsd.conf file to use\n"
-#~ "  -e               Use every filter from the PPD file\n"
-#~ "  -j job-id[,N]    Filter file N from the specified job (default is file "
-#~ "1)\n"
-#~ "  -n copies        Set number of copies\n"
-#~ "  -o name=value    Set option(s)\n"
-#~ "  -p filename.ppd  Set PPD file\n"
-#~ "  -t title         Set title\n"
-#~ msgstr ""
-#~ "Синтаксис: cupsfilter -m mime/type [ options ] filename\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "\n"
-#~ "  -c cupsd.conf    Используется файл cupsd.conf\n"
-#~ "  -j job-id[,N]    Из указанного задания выбирается файл N (по умолчанию "
-#~ "файл 1)\n"
-#~ "  -n copies        Задается количество копий\n"
-#~ "  -o name=value    Задаются параметры\n"
-#~ "  -p filename.ppd  Задается PPD-файл\n"
-#~ "  -t title         Задается заголовок\n"
-
-#~ msgid ""
-#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n"
-#~ "       cupstestdsc [options] -\n"
-#~ "\n"
-#~ "Options:\n"
-#~ "\n"
-#~ "    -h       Show program usage\n"
-#~ "\n"
-#~ "    Note: this program only validates the DSC comments, not the "
-#~ "PostScript itself.\n"
-#~ msgstr ""
-#~ "Синтаксис: cupstestdsc [options] filename.ps [... filename.ps]\n"
-#~ "       cupstestdsc [options] -\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "\n"
-#~ "    -h       Отображается справка по использованию программы\n"
-#~ "\n"
-#~ "    Примечание: данная программа проверяет только комментарии DSC, а не "
-#~ "сам PostScript.\n"
-
-#~ msgid ""
-#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n"
-#~ "       program | cupstestppd [options] -\n"
-#~ "\n"
-#~ "Options:\n"
-#~ "\n"
-#~ "    -I {filename,filters,none,profiles}\n"
-#~ "                         Ignore specific warnings\n"
-#~ "    -R root-directory    Set alternate root\n"
-#~ "    -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,"
-#~ "translations}\n"
-#~ "                         Issue warnings instead of errors\n"
-#~ "    -q                   Run silently\n"
-#~ "    -r                   Use 'relaxed' open mode\n"
-#~ "    -v                   Be slightly verbose\n"
-#~ "    -vv                  Be very verbose\n"
-#~ msgstr ""
-#~ "Синтаксис: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[."
-#~ "gz]]\n"
-#~ "       program | cupstestppd [options] -\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "\n"
-#~ "    -R root-directory    Задается альтернативный корневой каталог\n"
-#~ "    -W {all,none,constraints,defaults,duplex,filters,translations}\n"
-#~ "                         Вместо ошибок выдаются предупреждения\n"
-#~ "    -q                   Команда выполняется в «тихом» режиме\n"
-#~ "    -r                   Используется открытый режим\n"
-#~ "    -v                   Режим более подробного отображения\n"
-#~ "    -vv                  Режим максимально подробного отображения\n"
-
-#~ msgid ""
-#~ "Usage: ipptest [options] URI filename.test [ ... filenameN.test ]\n"
-#~ "\n"
-#~ "Options:\n"
-#~ "\n"
-#~ "-E             Test with encryption.\n"
-#~ "-V version     Set default IPP version.\n"
-#~ "-X             Produce XML instead of plain text.\n"
-#~ "-c             Send requests using chunking (default)\n"
-#~ "-d name=value  Define variable.\n"
-#~ "-f filename    Set default test file.\n"
-#~ "-i seconds     Repeat the last test file with the given interval.\n"
-#~ "-l             Send requests using content-length\n"
-#~ "-v             Show all attributes sent and received.\n"
-#~ msgstr ""
-#~ "Синтаксис: ipptest [options] URI filename.test [ ... filenameN.test ]\n"
-#~ "\n"
-#~ "Параметры:\n"
-#~ "\n"
-#~ "-E\t\tТест с шифрованием.\n"
-#~ "-V version\tЗадается стандартная версия IPP.\n"
-#~ "-X\t\tСоздание XML вместо обычного текста.\n"
-#~ "-c\t\tПередача запроса с использованием chunking (по умолчанию)-d "
-#~ "name=value\tОпределение переменной.\n"
-#~ "-f filename\tСоздание стандартного тест-файла.\n"
-#~ "-i seconds\tПовторение последнего тест-файла с заданным интервалом.\n"
-#~ "-l\t\tПередача запроса с использованием content-length.\n"
-#~ "-v\t\tПоказать все атрибуты отправленных и полученных.\n"
-
-#~ msgid "Usage: lpmove job/src dest\n"
-#~ msgstr "Синтаксис: lpmove job/src dest\n"
-
-#~ msgid ""
-#~ "Usage: lpoptions [-h server] [-E] -d printer\n"
-#~ "       lpoptions [-h server] [-E] [-p printer] -l\n"
-#~ "       lpoptions [-h server] [-E] -p printer -o option[=value] ...\n"
-#~ "       lpoptions [-h server] [-E] -x printer\n"
-#~ msgstr ""
-#~ "Usage: lpoptions [-h server] [-E] -d printer\n"
-#~ "       lpoptions [-h server] [-E] [-p printer] -l\n"
-#~ "       lpoptions [-h server] [-E] -p printer -o option[=value] ...\n"
-#~ "       lpoptions [-h server] [-E] -x printer\n"
-
-#~ msgid "Usage: lppasswd [-g groupname]\n"
-#~ msgstr "Синтаксис: lppasswd [-g groupname]\n"
-
-#~ msgid ""
-#~ "Usage: lppasswd [-g groupname] [username]\n"
-#~ "       lppasswd [-g groupname] -a [username]\n"
-#~ "       lppasswd [-g groupname] -x [username]\n"
-#~ msgstr ""
-#~ "{>Синтаксис: lppasswd [-g groupname] [username]\n"
-#~ "       lppasswd [-g groupname] -a [username]\n"
-#~ "       lppasswd [-g groupname] -x [username]\n"
-
-#~ msgid ""
-#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
-#~ msgstr ""
-#~ "Синтаксис: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] "
-#~ "[+interval]\n"
-
-#~ msgid ""
-#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n"
-#~ "Options:\n"
-#~ "  -D name=value        Set named variable to value.\n"
-#~ "  -I include-dir       Add include directory to search path.\n"
-#~ "  -c catalog.po        Load the specified message catalog.\n"
-#~ "  -d output-dir        Specify the output directory.\n"
-#~ "  -l lang[,lang,...]   Specify the output language(s) (locale).\n"
-#~ "  -m                   Use the ModelName value as the filename.\n"
-#~ "  -t                   Test PPDs instead of generating them.\n"
-#~ "  -v                   Be verbose (more v's for more verbosity).\n"
-#~ "  -z                   Compress PPD files using GNU zip.\n"
-#~ "  --cr                 End lines with CR (Mac OS 9).\n"
-#~ "  --crlf               End lines with CR + LF (Windows).\n"
-#~ "  --lf                 End lines with LF (UNIX/Linux/Mac OS X).\n"
-#~ msgstr ""
-#~ "Синтаксис: ppdc [options] filename.drv [ ... filenameN.drv ]\n"
-#~ "Параметры:\n"
-#~ "  -D name=value        Указанной переменной присваивается значение.\n"
-#~ "  -I include-dir       Добавляется каталог в путь поиска.\n"
-#~ "  -c catalog.po        Загружается указанный каталог сообщений.\n"
-#~ "  -d output-dir        Указывается каталог для выходных данных.\n"
-#~ "  -l lang[,lang,...]   Указывается язык (регион) для выходных данных.\n"
-#~ "  -m                   В качестве имени файла используется значение "
-#~ "ModelName.\n"
-#~ "  -t                   Вместо создания PPD-файлов выполняется их "
-#~ "проверка.\n"
-#~ "  -v                   Режим подробного отображения (чем больше букв v, "
-#~ "тем выше уровень детализации).\n"
-#~ "  -z                   Файлы PPD сжимаются с использованием GNU zip.\n"
-#~ "  --cr                 Строки заканчиваются на CR (Mac OS 9).\n"
-#~ "  --crlf               Строки заканчиваются на CR + LF (Windows).\n"
-#~ "  --lf                 Строки заканчиваются на LF (UNIX/Linux/Mac OS X).\n"
-
-#~ msgid ""
-#~ "Usage: ppdhtml [options] filename.drv >filename.html\n"
-#~ "  -D name=value        Set named variable to value.\n"
-#~ "Options:\n"
-#~ "  -I include-dir    Add include directory to search path.\n"
-#~ msgstr ""
-#~ "Синтаксис: ppdhtml [options] filename.drv >filename.html\n"
-#~ "  -D name=value        Указанной переменной присваивается значение.\n"
-#~ "Параметры:\n"
-#~ "  -I include-dir    Добавляется каталог в путь поиска.\n"
-
-#~ msgid ""
-#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n"
-#~ "Options:\n"
-#~ "  -I include-dir\n"
-#~ "  -o filename.drv\n"
-#~ msgstr ""
-#~ "Синтаксис: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n"
-#~ "Параметры:\n"
-#~ "  -I include-dir\n"
-#~ "  -o filename.drv\n"
-
-#~ msgid ""
-#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n"
-#~ "Options:\n"
-#~ "  -o filename.ppd[.gz]\n"
-#~ msgstr ""
-#~ "Синтаксис: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n"
-#~ "Параметры:\n"
-#~ "  -o filename.ppd[.gz]\n"
-
-#~ msgid ""
-#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n"
-#~ "Options:\n"
-#~ "  -D name=value        Set named variable to value.\n"
-#~ "  -I include-dir    Add include directory to search path.\n"
-#~ "  -v                Be verbose (more v's for more verbosity).\n"
-#~ msgstr ""
-#~ "Синтаксис: ppdpo [options] -o filename.po filename.drv [ ... filenameN."
-#~ "drv ]\n"
-#~ "Параметры:\n"
-#~ "  -D name=value        Указанной переменной присваивается значение.\n"
-#~ "  -I include-dir    Добавляется каталог в путь поиска.\n"
-#~ "  -v                Подробный режим (чем больше букв v, тем выше уровень "
-#~ "детализации).\n"
-
-#~ msgid "Usage: snmp [host-or-ip-address]\n"
-#~ msgstr "Синтаксис: snmp [host-or-ip-address]\n"
-
-#~ msgid "WARNING: Adding only the first %d printers found"
-#~ msgstr "WARNING: Будут добавлены только первые найденные принтеры (%d)"
-
-#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n"
-#~ msgstr "WARNING: Параметр waiteof «%s» должен иметь булево значение\n"
-
-#~ msgid "WARNING: Network host '%s' is busy; will retry in %d seconds...\n"
-#~ msgstr ""
-#~ "WARNING: Сетевой узел '%s' занят; повторить попытку через %d секунд...\n"
-
-#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature\n"
-#~ msgstr ""
-#~ "WARNING: Параметр \"%s\" не может быть добавлен через IncludeFeature\n"
-
-#~ msgid "WARNING: Printer not responding\n"
-#~ msgstr "WARNING: Принтер не отвечает\n"
-
-#~ msgid "WARNING: Printer sent unexpected EOF\n"
-#~ msgstr "WARNING: Принтер преждевременно передал индикатор EOF\n"
-
-#~ msgid ""
-#~ "WARNING: Remote host did not respond with command status byte after %d "
-#~ "seconds\n"
-#~ msgstr ""
-#~ "WARNING: Удаленный хост не отвечает на команду в течение %d секунд\n"
-
-#~ msgid ""
-#~ "WARNING: Remote host did not respond with control status byte after %d "
-#~ "seconds\n"
-#~ msgstr ""
-#~ "WARNING: Удаленный хост не отвечает на управляющую последовательность в "
-#~ "течение %d секунд\n"
-
-#~ msgid ""
-#~ "WARNING: Remote host did not respond with data status byte after %d "
-#~ "seconds\n"
-#~ msgstr ""
-#~ "WARNING: Удаленный хост не отвечает при передачи данных в течение %d "
-#~ "секунд\n"
-
-#~ msgid ""
-#~ "WARNING: This document does not conform to the Adobe Document Structuring "
-#~ "Conventions and may not print correctly\n"
-#~ msgstr ""
-#~ "WARNING: Этот документ не соответствует Adobe Document Structuring "
-#~ "Conventions и может быть напечатан неправильно\n"
-
-#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n"
-#~ msgstr "WARNING: Не удается открыть «%s:%s»: %s\n"
-
-#~ msgid "WARNING: Unable to send PAP status request"
-#~ msgstr "WARNING: Не удается отправить запрос статуса PAP"
-
-#~ msgid "WARNING: Unexpected PAP packet of type %d\n"
-#~ msgstr "WARNING: Непредвиденный PAP-пакет типа %d\n"
-
-#~ msgid "WARNING: Unknown PAP packet of type %d\n"
-#~ msgstr "WARNING: Неизвестный PAP-пакет типа %d\n"
-
-#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"\n"
-#~ msgstr "WARNING: Неизвестный выбор \"%s\" для параметра \"%s\"\n"
-
-#~ msgid "WARNING: Unknown option \"%s\"\n"
-#~ msgstr "WARNING: Неизвестный параметр \"%s\"\n"
-
-#~ msgid "WARNING: Unsupported baud rate %s\n"
-#~ msgstr "WARNING: Неподдерживаемая скорость передачи данных в бодах %s\n"
-
-#~ msgid "WARNING: number expected for status option \"%s\"\n"
-#~ msgstr "WARNING: Параметр статуса «%s» должен иметь числовое значение\n"
-
-#~ msgid "Warning, no Windows 2000 printer drivers are installed"
-#~ msgstr "WARNING: Драйверы принтера Windows 2000 не установлены"
-
-#~ msgid "You4 Envelope"
-#~ msgstr "Конверт You4"
-
-#~ msgid "convert: Use the -f option to specify a file to convert.\n"
-#~ msgstr ""
-#~ "convert: Используйте параметр -f для указания конвертируемого файла.\n"
-
-#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n"
-#~ msgstr "cupsaddsmb: Нет PPD-файла для принтера «%s» – %s\n"
-
-#~ msgid "cupsctl: Unable to connect to server: %s\n"
-#~ msgstr "cupsctl: Не удается подключиться к серверу: %s\n"
-
-#~ msgid "cupsctl: Unknown option \"%s\"\n"
-#~ msgstr "cupsctl: Неизвестный параметр \"%s\"\n"
-
-#~ msgid "cupsctl: Unknown option \"-%c\"\n"
-#~ msgstr "cupsctl: Неизвестный параметр \"-%c\"\n"
-
-#~ msgid "cupsd: Expected config filename after \"-c\" option\n"
-#~ msgstr "cupsd: Ожидаемое имя файла конфигурации после параметра \"-с\"\n"
-
-#~ msgid "cupsd: Unable to get current directory\n"
-#~ msgstr "cupsd: Не удается определить текущий каталог\n"
-
-#~ msgid "cupsd: Unknown argument \"%s\" - aborting\n"
-#~ msgstr "cupsd: Неизвестный аргумент \"%s\" - отмена\n"
-
-#~ msgid "cupsd: Unknown option \"%c\" - aborting\n"
-#~ msgstr "cupsd: Неизвестный параметр \"%c\" - отмена\n"
-
-#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n"
-#~ msgstr ""
-#~ "cupsd: Поддержка launchd(8) не скомпилирована, работа в нормальном "
-#~ "режиме.\n"
-
-#~ msgid "cupsfilter: Invalid document number %d\n"
-#~ msgstr "cupsfilter: Недопустимый номер документа %d\n"
-
-#~ msgid "cupsfilter: Invalid job ID %d\n"
-#~ msgstr "cupsfilter: Недопустимый ID задания %d\n"
-
-#~ msgid "cupsfilter: Only one filename can be specified\n"
-#~ msgstr "cupsfilter: Может быть указано только одно имя файла\n"
-
-#~ msgid "cupsfilter: Unable to get job file - %s\n"
-#~ msgstr "cupsfilter: Не удается получить файл задания - %s\n"
-
-#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n"
-#~ msgstr "cupstestppd: Параметр «-q» несовместим с параметром «-v».\n"
-
-#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n"
-#~ msgstr "cupstestppd: Параметр «-v» несовместим с параметром «-q».\n"
-
-#~ msgid "device for %s/%s: %s\n"
-#~ msgstr "устройство для %s/%s: %s\n"
-
-#~ msgid "device for %s: %s\n"
-#~ msgstr "устройство для %s: %s\n"
-
-#~ msgid "help\t\tget help on commands\n"
-#~ msgstr "справка\t\tполучить справку о командах\n"
-
-#~ msgid "ipptest: \"-i\" is incompatible with \"-x\".\n"
-#~ msgstr "ipptest: \"-i\" несовместимо с \"-x\".\n"
-
-#~ msgid "ipptest: Bad URI - %s.\n"
-#~ msgstr "ipptest: Неверный URI - %s.\n"
-
-#~ msgid "ipptest: Bad version %s for \"-V\".\n"
-#~ msgstr "ipptest: Неверная версия %s для \"-V\".\n"
-
-#~ msgid "ipptest: May only specify a single URI.\n"
-#~ msgstr "ipptest: Может быть определен лишь один URI.\n"
-
-#~ msgid "ipptest: Missing filename for \"-f\".\n"
-#~ msgstr "ipptest: Не определено имя файла для \"-f\".\n"
-
-#~ msgid "ipptest: Missing name=value for \"-d\".\n"
-#~ msgstr "ipptest: Не определено name=value для \"-d\".\n"
-
-#~ msgid "ipptest: Missing seconds for \"-i\".\n"
-#~ msgstr "ipptest: Не указаны секунды для \"-i\".\n"
-
-#~ msgid "ipptest: Missing version for \"-V\".\n"
-#~ msgstr "ipptest: Не определена версия для \"-V\".\n"
-
-#~ msgid "ipptest: Only http, https, and ipp URIs are supported."
-#~ msgstr "ipptest: Поддерживаются только http, https и ipp URI."
-
-#~ msgid "ipptest: URI required before test file."
-#~ msgstr "ipptest: Необходим URI перед указанием тест-файла."
-
-#~ msgid "ipptest: Unknown option \"-%c\".\n"
-#~ msgstr "ipptest: Неизвестный параметр \"-%c\".\n"
-
-#~ msgid "job-printer-uri attribute missing"
-#~ msgstr "Атрибут job-printer-uri отсутствует."
-
-#~ msgid "lpadmin: Class name can only contain printable characters\n"
-#~ msgstr "lpadmin: Имя класса может содержать только печатные символы\n"
-
-#~ msgid "lpadmin: Expected PPD after '-P' option\n"
-#~ msgstr "lpadmin: После параметра '-P' должен быть указан PPD\n"
-
-#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option\n"
-#~ msgstr ""
-#~ "lpadmin: После параметра '-u' должен быть указан allow/deny:userlist.\n"
-
-#~ msgid "lpadmin: Expected class after '-r' option\n"
-#~ msgstr "lpadmin: После параметра '-r' должно быть указано имя класса\n"
-
-#~ msgid "lpadmin: Expected class name after '-c' option\n"
-#~ msgstr "lpadmin: После параметра '-c' должно быть указано имя группы\n"
-
-#~ msgid "lpadmin: Expected description after '-D' option\n"
-#~ msgstr "lpadmin: После параметра '-D' должно быть указано описание\n"
-
-#~ msgid "lpadmin: Expected device URI after '-v' option\n"
-#~ msgstr "lpadmin: После параметра '-v' должно быть указано URI\n"
-
-#~ msgid "lpadmin: Expected file type(s) after '-I' option\n"
-#~ msgstr ""
-#~ "lpadmin: После параметра '-I' должен(-ны) быть указан(-ы) тип(-ы) файла(-"
-#~ "ов)\n"
-
-#~ msgid "lpadmin: Expected hostname after '-h' option\n"
-#~ msgstr "lpadmin: После параметра '-h' должно быть указано имя хоста\n"
-
-#~ msgid "lpadmin: Expected interface after '-i' option\n"
-#~ msgstr "lpadmin: После параметра '-i' должен быть указан интерфейс.\n"
-
-#~ msgid "lpadmin: Expected location after '-L' option\n"
-#~ msgstr "lpadmin: После параметра '-L' должно быть указано местоположение\n"
-
-#~ msgid "lpadmin: Expected model after '-m' option\n"
-#~ msgstr "lpadmin: После параметра '-m'должна быть указана модель\n"
-
-#~ msgid "lpadmin: Expected name=value after '-o' option\n"
-#~ msgstr "lpadmin: После параметра '-o' должно быть указано name=value\n"
-
-#~ msgid "lpadmin: Expected printer after '-p' option\n"
-#~ msgstr "lpadmin: После параметра '-p' должен быть указан принтер\n"
-
-#~ msgid "lpadmin: Expected printer name after '-d' option\n"
-#~ msgstr "lpadmin: После параметра '-d' должно быть указано имя принтера\n"
-
-#~ msgid "lpadmin: Expected printer or class after '-x' option\n"
-#~ msgstr ""
-#~ "lpadmin: После параметра '-x' должен быть указан принтер или класс\n"
-
-#~ msgid "lpadmin: No member names were seen\n"
-#~ msgstr "lpadmin: Имена пользователей не были найдены\n"
-
-#~ msgid "lpadmin: Printer %s is already a member of class %s.\n"
-#~ msgstr "lpadmin: Принтер %s уже является членом класса %s.\n"
-
-#~ msgid "lpadmin: Printer %s is not a member of class %s.\n"
-#~ msgstr "lpadmin: Принтер %s не является членом класса %s.\n"
-
-#~ msgid "lpadmin: Printer name can only contain printable characters\n"
-#~ msgstr "lpadmin: Имя принтера может содержать только печатные принтеры\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to add a printer to the class:\n"
-#~ "         You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Не удается добавить принтер в класс:\n"
-#~ "\t  Необходимо сначала указать имя принтера\n"
-
-#~ msgid "lpadmin: Unable to connect to server: %s\n"
-#~ msgstr "lpadmin: Не удается подключиться к серверу: %s\n"
-
-#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n"
-#~ msgstr "lpadmin: Не удается открыть PPD-файл «%s» – %s\n"
-
-#~ msgid "lpadmin: Unable to open file \"%s\": %s\n"
-#~ msgstr "lpadmin: Не удается открыть файл «%s»: %s\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to remove a printer from the class:\n"
-#~ "         You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Не удается удалить принтер из класса:\n"
-#~ "\t  Необходимо сначала указать имя принтера\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the PPD file:\n"
-#~ "         You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Не удается настроить PPD-файл:\n"
-#~ "\t  Необходимо сначала указать имя принтера\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the device URI:\n"
-#~ "         You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: не удается настроить URI устройства:\n"
-#~ "\t  Необходимо сначала указать имя принтера\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the interface script or PPD file:\n"
-#~ "         You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Не удается настроить скрипт интерфейса или PPD-файл:\n"
-#~ "\t  Необходимо сначала указать имя принтера\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the interface script:\n"
-#~ "         You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: не удается настроить скрипт интерфейса:\n"
-#~ "\t  Необходимо сначала указать имя принтера\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the printer description:\n"
-#~ "         You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Не удается настроить описание принтера:\n"
-#~ "\t  Необходимо сначала указать имя принтера\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the printer location:\n"
-#~ "         You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Не удается настроить размещение принтера:\n"
-#~ "\t  Необходимо сначала указать имя принтера\n"
-
-#~ msgid ""
-#~ "lpadmin: Unable to set the printer options:\n"
-#~ "         You must specify a printer name first\n"
-#~ msgstr ""
-#~ "lpadmin: Не удается настроить параметры принтера:\n"
-#~ "\t  Необходимо сначала указать имя принтера\n"
-
-#~ msgid "lpadmin: Unknown allow/deny option \"%s\"\n"
-#~ msgstr "lpadmin: Неизвестный параметр allow/deny \"%s\"\n"
-
-#~ msgid "lpadmin: Unknown argument '%s'\n"
-#~ msgstr "lpadmin: Неизвестный аргумент '%s'\n"
-
-#~ msgid "lpadmin: Unknown option '%c'\n"
-#~ msgstr "lpadmin: Неизвестный параметр '%c'\n"
-
-#~ msgid "lpadmin: Warning - content type list ignored\n"
-#~ msgstr "lpadmin: Warning - список типов контента пропущен\n"
-
-#~ msgid "lpinfo: Expected 1284 device ID string after --device-id\n"
-#~ msgstr "lpinfo: После --device-id должна идти строка ID устройства 1284\n"
-
-#~ msgid "lpinfo: Expected language after --language\n"
-#~ msgstr "lpinfo: После --language необходимо указать язык\n"
-
-#~ msgid "lpinfo: Expected make and model after --make-and-model\n"
-#~ msgstr "lpinfo: После --make-and-model должна быть указана марка и модель\n"
-
-#~ msgid "lpinfo: Expected product string after --product\n"
-#~ msgstr "lpinfo: После --product должна идти строка продукта\n"
-
-#~ msgid "lpinfo: Expected scheme list after --exclude-schemes\n"
-#~ msgstr "lpinfo: После --exclude-schemes должен идти список схем\n"
-
-#~ msgid "lpinfo: Expected scheme list after --include-schemes\n"
-#~ msgstr "lpinfo: После --include-schemes должен идти список схем\n"
-
-#~ msgid "lpinfo: Expected timeout after --timeout\n"
-#~ msgstr "lpinfo: После --timeout должно быть указано время ожидания\n"
-
-#~ msgid "lpinfo: Unknown argument '%s'\n"
-#~ msgstr "lpinfo: Неизвестный аргумент '%s'\n"
-
-#~ msgid "lpinfo: Unknown option '%c'\n"
-#~ msgstr "lpinfo: Неизвестный параметр '%c'\n"
-
-#~ msgid "lpinfo: Unknown option '%s'\n"
-#~ msgstr "lpinfo: Неизвестный параметр '%s'\n"
-
-#~ msgid "lpmove: Unable to connect to server: %s\n"
-#~ msgstr "lpmove: Не удается подключиться к серверу: %s\n"
-
-#~ msgid "lpmove: Unknown argument '%s'\n"
-#~ msgstr "lpmove: Неизвестный аргумент '%s'\n"
-
-#~ msgid "lpmove: Unknown option '%c'\n"
-#~ msgstr "lpmove: Неизвестный параметр '%c'\n"
-
-#~ msgid "lpoptions: No printers\n"
-#~ msgstr "lpoptions: Нет принтеров?!\n"
-
-#~ msgid "lpoptions: Unable to add printer or instance: %s\n"
-#~ msgstr ""
-#~ "lpoptions: Не удается добавить принтер или представителя класса: %s\n"
-
-#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n"
-#~ msgstr "lpoptions: Не удается получить PPD-файл для %s: %s\n"
-
-#~ msgid "lpoptions: Unable to open PPD file for %s\n"
-#~ msgstr "lpoptions: Не удается открыть PPD файл для %s\n"
-
-#~ msgid "lpoptions: Unknown printer or class\n"
-#~ msgstr "lpoptions: Неизвестный принтер или класс\n"
-
-#~ msgid "lppasswd: Only root can add or delete passwords\n"
-#~ msgstr ""
-#~ "lppasswd: Только пользователь root может добавлять или удалять пароли\n"
-
-#~ msgid "lppasswd: Password file busy\n"
-#~ msgstr "lppasswd: Файл пароля занят\n"
-
-#~ msgid "lppasswd: Password file not updated\n"
-#~ msgstr "lppasswd: Файл пароля не обновлен"
-
-#~ msgid "lppasswd: Sorry, password doesn't match\n"
-#~ msgstr "lppasswd: Пароль не встретился\n"
-
-#~ msgid ""
-#~ "lppasswd: Sorry, password rejected.\n"
-#~ "Your password must be at least 6 characters long, cannot contain\n"
-#~ "your username, and must contain at least one letter and number.\n"
-#~ msgstr ""
-#~ "lppasswd: Пароль отклонен.\n"
-#~ "Пароль должен состоять как минимум из 6 символов, не может содержать\n"
-#~ "Ваше имя пользователя и должен содержать по крайней мере одну букву и "
-#~ "цифру.\n"
-
-#~ msgid "lppasswd: Sorry, passwords don't match\n"
-#~ msgstr "lppasswd: Пароль не встретился\n"
-
-#~ msgid "lppasswd: Unable to copy password string: %s\n"
-#~ msgstr "lppasswd: Не удается копировать строку пароля: %s\n"
-
-#~ msgid "lppasswd: Unable to open password file: %s\n"
-#~ msgstr "lppasswd: Не удается открыть файл пароля: %s\n"
-
-#~ msgid "lppasswd: Unable to write to password file: %s\n"
-#~ msgstr "lppasswd: Не удается записать файл пароля: %s\n"
-
-#~ msgid "lppasswd: failed to backup old password file: %s\n"
-#~ msgstr "lppasswd: Не удалось создать рез. копию старого файла пароля: %s\n"
-
-#~ msgid "lppasswd: failed to rename password file: %s\n"
-#~ msgstr "lppasswd: Не удалось переименовать файл пароля: %s\n"
-
-#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n"
-#~ msgstr "lppasswd: Пользователь «%s» и группа «%s» не существуют.\n"
-
-#~ msgid ""
-#~ "lpstat: error - %s environment variable names non-existent destination "
-#~ "\"%s\"\n"
-#~ msgstr ""
-#~ "lpstat: ошибка - %s переменная окружения указывает несуществующее "
-#~ "назначение \"%s\"\n"
-
-#~ msgid "members of class %s:\n"
-#~ msgstr "члены класса %s:\n"
-
-#~ msgid "no entries\n"
-#~ msgstr "нет записей\n"
-
-#~ msgid "no system default destination\n"
-#~ msgstr "нет назначения системы по умолчанию\n"
-
-#~ msgid "notify-events not specified"
-#~ msgstr "notify-events не указаны"
-
-#~ msgid "notify-recipient-uri URI \"%s\" is already used"
-#~ msgstr "notify-recipient-uri URI \"%s\" уже используется"
-
-#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme"
-#~ msgstr "notify-recipient-uri URI \"%s\" использует неизвестную схему"
-
-#~ msgid "notify-subscription-id %d no good"
-#~ msgstr "Неверный notify-subscription-id %d"
-
-#~ msgid "ppdc: Adding include directory \"%s\"...\n"
-#~ msgstr "ppdc: Добавляю каталог «%s»...\n"
-
-#~ msgid "ppdc: Adding/updating UI text from %s...\n"
-#~ msgstr "ppdc: Добавляю/обновляю текст интерфейса из %s...\n"
-
-#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n"
-#~ msgstr "ppdc: Недопустимое булево значение (%s) в строке %d из %s.\n"
-
-#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s\n"
-#~ msgstr "ppdc: Недопустимое имя разрешения \"%s\" в строке %d bp %s.\n"
-
-#~ msgid "ppdc: Bad status keyword %s on line %d of %s\n"
-#~ msgstr "ppdc: Недопустимое ключевое слово статуса %s в строке %d из %s.\n"
-
-#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n"
-#~ msgstr "ppdc: Недопустимая замена переменной ($%c) в строке %d из %s.\n"
-
-#~ msgid "ppdc: Choice found on line %d of %s with no Option\n"
-#~ msgstr ""
-#~ "ppdc: В строке %d из %s обнаружено значение, не привязанное к параметру\n"
-
-#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s\n"
-#~ msgstr "ppdc: Дубликат #po для региона %s в строке %d из %s\n"
-
-#~ msgid "ppdc: Expected a filter definition on line %d of %s\n"
-#~ msgstr "ppdc: В строке %d из %s должно быть определение фильтра\n"
-
-#~ msgid "ppdc: Expected a program name on line %d of %s\n"
-#~ msgstr "ppdc: В строке %d из %s должно быть имя программы\n"
-
-#~ msgid "ppdc: Expected boolean value on line %d of %s.\n"
-#~ msgstr "ppdc: В строке %d из %s должно быть булево значение.\n"
-
-#~ msgid "ppdc: Expected charset after Font on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: После Font в строке %d из %s должен быть указан набор символов.\n"
-
-#~ msgid "ppdc: Expected choice code on line %d of %s.\n"
-#~ msgstr "ppdc: В строке %d из %s должен быть код выбора.\n"
-
-#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n"
-#~ msgstr "ppdc: В строке %d из %s должно быть имя/текст выбора.\n"
-
-#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: После ColorModel в строке %d из %s должна быть указана цветовая "
-#~ "схема\n"
-
-#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: Для ColorModel в строке %d из %s должно быть указано пространство "
-#~ "цветов.\n"
-
-#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: Для ColorModel в строке %d из %s должно быть указано сжатие.\n"
-
-#~ msgid ""
-#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: Для UIConstraints в строке %d из %s должна быть указана строка "
-#~ "ограничений\n"
-
-#~ msgid ""
-#~ "ppdc: Expected driver type keyword following DriverType on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: После DriverType в строке %d из %s должно быть указано ключевое "
-#~ "слово типа драйвера.\n"
-
-#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: После Duplex в строке %d из %s должен быть указан тип дуплекса.\n"
-
-#~ msgid "ppdc: Expected encoding after Font on line %d of %s\n"
-#~ msgstr "ppdc: После Font в строке %d из %s должна быть указана кодировка.\n"
-
-#~ msgid "ppdc: Expected filename after #po %s on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: После #po %s в строке %d из %s должно быть указано имя файла.\n"
-
-#~ msgid "ppdc: Expected group name/text on line %d of %s\n"
-#~ msgstr "ppdc: В строке %d из %s должно быть указанно имя группы/текст.\n"
-
-#~ msgid "ppdc: Expected include filename on line %d of %s\n"
-#~ msgstr "ppdc: В строке %d из %s должно быть указано имя файла.\n"
-
-#~ msgid "ppdc: Expected integer on line %d of %s\n"
-#~ msgstr "ppdc: В строке %d из %s должно быть целое число.\n"
-
-#~ msgid "ppdc: Expected locale after #po on line %d of %s\n"
-#~ msgstr "ppdc: После #po в строке %d из %s должен быть указан регион.\n"
-
-#~ msgid "ppdc: Expected name after %s on line %d of %s\n"
-#~ msgstr "ppdc: После %s в строке %d из %s должно быть указано имя.\n"
-
-#~ msgid "ppdc: Expected name after FileName on line %d of %s\n"
-#~ msgstr "ppdc: После FileName в строке %d из %s должно быть указано имя.\n"
-
-#~ msgid "ppdc: Expected name after Font on line %d of %s\n"
-#~ msgstr "ppdc: После Font в строке %d из %s должно быть указано имя.\n"
-
-#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: После Manufacturer в строке %d из %s должно быть указано имя.\n"
-
-#~ msgid "ppdc: Expected name after MediaSize on line %d of %s\n"
-#~ msgstr "ppdc: После MediaSize в строке %d из %s должно быть указано имя.\n"
-
-#~ msgid "ppdc: Expected name after ModelName on line %d of %s\n"
-#~ msgstr "ppdc: После ModelName в строке %d из %s должно быть указано имя.\n"
-
-#~ msgid "ppdc: Expected name after PCFileName on line %d of %s\n"
-#~ msgstr "ppdc: После PCFileName в строке %d из %s должно быть указано имя.\n"
-
-#~ msgid "ppdc: Expected name/text after %s on line %d of %s\n"
-#~ msgstr "ppdc: После %s в строке %d из %s должно быть указано имя/текст.\n"
-
-#~ msgid "ppdc: Expected name/text after Installable on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: После Installable в строке %d из %s должно быть указано имя/текст.\n"
-
-#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: После Resolution в строке %d из %s должно быть указано имя/текст.\n"
-
-#~ msgid ""
-#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: После ColorModel в строке %d из %s должно быть указано имя/текст.\n"
-
-#~ msgid "ppdc: Expected option name/text on line %d of %s\n"
-#~ msgstr "ppdc: В строке %d из %s должно быть указано имя параметра/текст.\n"
-
-#~ msgid "ppdc: Expected option section on line %d of %s\n"
-#~ msgstr "ppdc: В строке %d из %s должен быть указан раздел параметров.\n"
-
-#~ msgid "ppdc: Expected option type on line %d of %s\n"
-#~ msgstr "ppdc: В строке %d из %s должен быть указан тип параметра.\n"
-
-#~ msgid "ppdc: Expected override field after Resolution on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: После Resolution в строке %d из %s должно быть поле "
-#~ "переопределения.\n"
-
-#~ msgid "ppdc: Expected real number on line %d of %s\n"
-#~ msgstr "ppdc: В строке %d из %s должно быть действительное число.\n"
-
-#~ msgid ""
-#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of "
-#~ "%s\n"
-#~ msgstr ""
-#~ "ppdc: После ColorProfile в строке %d из %s должно быть указано разрешение/"
-#~ "тип носителя.\n"
-
-#~ msgid ""
-#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line "
-#~ "%d of %s\n"
-#~ msgstr ""
-#~ "ppdc: После SimpleColorProfile в строке %d из %s должно быть указано "
-#~ "разрешение/тип носителя.\n"
-
-#~ msgid "ppdc: Expected selector after %s on line %d of %s\n"
-#~ msgstr "ppdc: После %s в строке %d из %s должен быть селектор.\n"
-
-#~ msgid "ppdc: Expected status after Font on line %d of %s\n"
-#~ msgstr "ppdc: После Font в строке %d из %s должен быть указан статус.\n"
-
-#~ msgid "ppdc: Expected string after Copyright on line %d of %s\n"
-#~ msgstr "ppdc: В строке %d из %s пропущено значение параметра Copyright.\n"
-
-#~ msgid "ppdc: Expected string after Version on line %d of %s\n"
-#~ msgstr "ppdc: В строке %d из %s пропущено значение параметра Version.\n"
-
-#~ msgid "ppdc: Expected two option names on line %d of %s\n"
-#~ msgstr "ppdc: В строке %d из %s должны быть два имени параметра.\n"
-
-#~ msgid "ppdc: Expected value after %s on line %d of %s\n"
-#~ msgstr "ppdc: После %s в строке %d из %s должно быть значение.\n"
-
-#~ msgid "ppdc: Expected version after Font on line %d of %s\n"
-#~ msgstr "ppdc: после Font в строке %d из %s должна быть указана версия.\n"
-
-#~ msgid "ppdc: Invalid #include/#po filename \"%s\"\n"
-#~ msgstr "ppdc: Неверное имя файла #include/#po \"%s\"\n"
-
-#~ msgid "ppdc: Invalid cost for filter on line %d of %s\n"
-#~ msgstr "ppdc: Затраты на фильтр в строке %d из %s указаны неверно.\n"
-
-#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s\n"
-#~ msgstr "ppdc: Недопустимый пустой MIME-тип для фильтра в строке %d из %s.\n"
-
-#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: Недопустимое пустое имя программы для фильтра в строке %d из %s.\n"
-
-#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s\n"
-#~ msgstr "ppdc: Неверный раздел параметров \"%s\" в строке %d из %s.\n"
-
-#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s\n"
-#~ msgstr "ppdc: Неверный тип параметра \"%s\" в строке %d из %s.\n"
-
-#~ msgid "ppdc: Loading driver information file \"%s\"...\n"
-#~ msgstr "ppdc: Загружаю файл с информацией о драйвере «%s»...\n"
-
-#~ msgid "ppdc: Loading messages for locale \"%s\"...\n"
-#~ msgstr "ppdc: Загружаю сообщения для региона «%s»...\n"
-
-#~ msgid "ppdc: Loading messages from \"%s\"...\n"
-#~ msgstr "ppdc: Загружаю сообщения из «%s»...\n"
-
-#~ msgid "ppdc: Missing #endif at end of \"%s\"\n"
-#~ msgstr "ppdc: Отсутствует #endif в конце \"%s\".\n"
-
-#~ msgid "ppdc: Missing #if on line %d of %s\n"
-#~ msgstr "ppdc: Отсутствует #if в строке %d из %s.\n"
-
-#~ msgid "ppdc: No message catalog provided for locale %s\n"
-#~ msgstr "ppdc: Не указан каталог сообщений для региона %s.\n"
-
-#~ msgid "ppdc: Option %s defined in two different groups on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: Параметр %s определен в двух разных группах в строке %d из %s.\n"
-
-#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s\n"
-#~ msgstr "ppdc: Для параметра %s определен другой тип в строке %d из %s.\n"
-
-#~ msgid "ppdc: Option constraint must *name on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: Для ограничения параметра должно быть указано *name в строке %d из "
-#~ "%s.\n"
-
-#~ msgid "ppdc: Too many nested #if's on line %d of %s\n"
-#~ msgstr "ppdc: Слишком много вложенных операторов #if в строке %d из %s.\n"
-
-#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n"
-#~ msgstr "lpadmin: Не удается создать PPD-файл «%s» – %s\n"
-
-#~ msgid "ppdc: Unable to create output directory %s: %s\n"
-#~ msgstr "ppdc: Не удается создать каталог для выходных данных %s: %s\n"
-
-#~ msgid "ppdc: Unable to create output pipes: %s\n"
-#~ msgstr "ppdc: Не удается создать конвейеры для выходных данных: %s\n"
-
-#~ msgid "ppdc: Unable to execute cupstestppd: %s\n"
-#~ msgstr "ppdc: Не удается выполнить cupstestppd: %s\n"
-
-#~ msgid "ppdc: Unable to find #po file %s on line %d of %s\n"
-#~ msgstr "ppdc: Не удается найти файл #po %s в строке %d из %s.\n"
-
-#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s\n"
-#~ msgstr "ppdc: Не удается найти файл \"%s\" в строке %d из %s.\n"
-
-#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n"
-#~ msgstr "ppdc: Не удается найти локализацию для «%s» - %s\n"
-
-#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n"
-#~ msgstr "ppdc: Не удается загрузить файл локализации «%s» - %s\n"
-
-#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n"
-#~ msgstr "ppdc: Не определена переменная (%s) в строке %d из %s.\n"
-
-#~ msgid "ppdc: Unknown driver type %s on line %d of %s\n"
-#~ msgstr "ppdc: Неизвестный тип драйвера %s в строке %d из %s.\n"
-
-#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s\n"
-#~ msgstr "ppdc: Неизвестный тип дуплекса \"%s\" в строке %d из %s.\n"
-
-#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s\n"
-#~ msgstr "ppdc: Неизвестный размер носителя \"%s\" в строке %d из %s.\n"
-
-#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s\n"
-#~ msgstr "ppdc: Неизвестный маркер  \"%s\" в строке %d из %s.\n"
-
-#~ msgid ""
-#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s\n"
-#~ msgstr ""
-#~ "ppdc: Неизвестные конечные символы в вещественном числе \"%s\" в строке "
-#~ "%d из %s.\n"
-
-#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s\n"
-#~ msgstr "ppdc: Не завершена строка, начинающаяся с %c в строке %d из %s.\n"
-
-#~ msgid "ppdc: Warning - overlapping filename \"%s\".\n"
-#~ msgstr "ppdc: Внимание - дублирующееся имя \"%s\".\n"
-
-#~ msgid "ppdc: Writing %s...\n"
-#~ msgstr "ppdc: Записываю %s...\n"
-
-#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n"
-#~ msgstr "ppdc: Записываю PPD-файлы в каталог «%s»...\n"
-
-#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s\n"
-#~ msgstr "ppdmerge: Неверное значение LanguageVersion \"%s\" в %s\n"
-
-#~ msgid "ppdmerge: Ignoring PPD file %s...\n"
-#~ msgstr "ppdmerge: Пропускаю PPD-файл %s...\n"
-
-#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n"
-#~ msgstr "ppdmerge: Не удается создать резервную копию %s на %s- %s\n"
-
-#~ msgid "printer %s disabled since %s -\n"
-#~ msgstr "принтер %s отключен с момента %s -\n"
-
-#~ msgid "printer %s is idle.  enabled since %s\n"
-#~ msgstr "принтер %s свободен. Включен с момента %s\n"
-
-#~ msgid "printer %s now printing %s-%d.  enabled since %s\n"
-#~ msgstr "принтер %s сейчас печатает %s-%d. Включен с момента %s\n"
-
-#~ msgid "printer %s/%s disabled since %s -\n"
-#~ msgstr "принтер %s/%s отключен с момента %s -\n"
-
-#~ msgid "printer %s/%s is idle.  enabled since %s\n"
-#~ msgstr "принтер %s/%s свободен. Включен с момента %s\n"
-
-#~ msgid "printer %s/%s now printing %s-%d.  enabled since %s\n"
-#~ msgstr "принтер %s/%s сейчас печатает %s-%d. Включен с момента %s\n"
-
-#~ msgid "request id is %s-%d (%d file(s))\n"
-#~ msgstr "id запроса %s-%d (%d файл.)\n"
-
-#~ msgid "scheduler is not running\n"
-#~ msgstr "планировщик не запущен\n"
-
-#~ msgid "scheduler is running\n"
-#~ msgstr "планировщик запущен\n"
-
-#~ msgid "status\t\tshow status of daemon and queue\n"
-#~ msgstr "статус\t\tпоказать статус демона и очереди\n"
-
-#~ msgid "system default destination: %s\n"
-#~ msgstr "назначение системы по умолчанию: %s\n"
-
-#~ msgid "system default destination: %s/%s\n"
-#~ msgstr "назначение системы по умолчанию: %s/%s\n"
+#~ "Атрибут '%s' Job Description не может быть подставлен при созданиизадания"
index 22dd494..0bedd97 100644 (file)
@@ -1,15 +1,15 @@
 /*
- * "$Id: po2strings.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: po2strings.c 12794 2015-07-20 18:26:20Z msweet $"
  *
- *   Convert a GNU gettext .po file to an Apple .strings file.
+ * Convert a GNU gettext .po file to an Apple .strings file.
  *
- *   Copyright 2007-2012 by Apple Inc.
+ * Copyright 2007-2015 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
  * Usage:
  *
  * Compile with:
  *
  *   gcc -o po2strings po2strings.c `cups-config --libs`
- *
- * Contents:
- *
- *   main() - Convert .po file to .strings.
  */
 
 #include <cups/cups-private.h>
@@ -53,6 +49,9 @@
  * 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.
  */
@@ -70,8 +69,9 @@ main(int  argc,                               /* I - Number of command-line args */
                        *ptr,           /* Pointer into buffer */
                        *temp,          /* New string */
                        *msgid,         /* msgid string */
-                       *msgstr;        /* msgstr string */
-  int                  length;         /* Length of combined strings */
+                       *msgstr,        /* msgstr string */
+                       normalized[8192];/* Normalized msgid string */
+  size_t               length;         /* Length of combined strings */
   int                  use_msgid;      /* Use msgid strings for msgstr? */
 
 
@@ -194,8 +194,7 @@ main(int  argc,                             /* I - Number of command-line args */
         if (msgid && msgstr)
        {
          if (*msgid)
-            cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid,
-                          (use_msgid || !*msgstr) ? msgid : msgstr);
+            cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid, normalize_string((use_msgid || !*msgstr) ? msgid : msgstr, normalized, sizeof(normalized)));
        }
 
        if (msgid)
@@ -213,10 +212,12 @@ main(int  argc,                           /* I - Number of command-line args */
        * Append to current string...
        */
 
-       length = (int)strlen(msgstr ? msgstr : msgid);
+        size_t ptrlen = strlen(ptr);   /* Length of string */
+
+       length = strlen(msgstr ? msgstr : msgid);
 
        if ((temp = realloc(msgstr ? msgstr : msgid,
-                           length + strlen(ptr) + 1)) == NULL)
+                           length + ptrlen + 1)) == NULL)
        {
          free(msgid);
          if (msgstr)
@@ -235,7 +236,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
          msgstr = temp;
 
-         strcpy(msgstr + length, ptr);
+         memcpy(msgstr + length, ptr, ptrlen + 1);
        }
        else
        {
@@ -247,7 +248,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
          msgid = temp;
 
-         strcpy(msgid + length, ptr);
+         memcpy(msgid + length, ptr, ptrlen + 1);
        }
       }
       else if (!strncmp(s, "msgstr", 6) && msgid)
@@ -272,8 +273,7 @@ main(int  argc,                             /* I - Number of command-line args */
   if (msgid && msgstr)
   {
     if (*msgid)
-      cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid,
-                    (use_msgid || !*msgstr) ? msgid : msgstr);
+      cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid, normalize_string((use_msgid || !*msgstr) ? msgid : msgstr, normalized, sizeof(normalized)));
   }
 
   if (msgid)
@@ -290,5 +290,79 @@ main(int  argc,                            /* I - Number of command-line args */
 
 
 /*
- * End of "$Id: po2strings.c 11173 2013-07-23 12:31:34Z msweet $".
+ * '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, "<A ", 3))
+      html = 1;
+    else if (html && *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] == '\"' && (quote || strchr(idstr + 2, '\"') != NULL))
+    {
+      if (quote)
+      {
+       /*
+        * Convert \" to Unicode right (curley) double quote.
+        */
+
+       *bufptr++ = (char)0xE2;
+       *bufptr++ = (char)0x80;
+       *bufptr++ = (char)0x9D;
+      }
+      else
+      {
+       /*
+        * Convert \" to Unicode left (curley) double quote.
+        */
+
+       *bufptr++ = (char)0xE2;
+       *bufptr++ = (char)0x80;
+       *bufptr++ = (char)0x9C;
+      }
+
+      quote = !quote;
+      idstr ++;
+    }
+    else
+      *bufptr++ = *idstr;
+
+    idstr ++;
+  }
+
+  *bufptr = '\0';
+
+  return (buffer);
+}
+
+
+/*
+ * End of "$Id: po2strings.c 12794 2015-07-20 18:26:20Z msweet $".
  */
index fb20804..6c2864c 100644 (file)
@@ -1,8 +1,16 @@
 /*
- * "$Id: strings2po.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: strings2po.c 11558 2014-02-06 18:33:34Z msweet $"
  *
  * Convert Apple .strings file (UTF-16 BE text file) to GNU gettext .po files.
  *
+ * Copyright 2007-2014 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
  * Usage:
  *
  *   strings2po filename.strings filename.po
  * Compile with:
  *
  *   gcc -o strings2po strings2po.c
- *
- * Contents:
- *
- *   main()         - Convert .strings file to .po.
- *   read_strings() - Read a line from a .strings file.
- *   write_po()     - Write a line to the .po file.
  */
 
 #include <stdio.h>
@@ -116,7 +118,7 @@ read_strings(FILE   *strings,               /* I - .strings file */
   char *bufptr;                        /* Pointer into buffer */
 
 
-  while (fgets(buffer, bufsize, strings))
+  while (fgets(buffer, (int)bufsize, strings))
   {
     if (buffer[0] != '\"')
       continue;
@@ -171,5 +173,5 @@ write_po(FILE       *po,            /* I - .po file */
 
 
 /*
- * End of "$Id: strings2po.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: strings2po.c 11558 2014-02-06 18:33:34Z msweet $".
  */
diff --git a/locale/translate.c b/locale/translate.c
deleted file mode 100644 (file)
index 8004825..0000000
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * "$Id: translate.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- *   HTTP-based translation program for CUPS.
- *
- *   This program uses Google to translate the CUPS template (cups.pot) to
- *   several different languages.  The translation isn't perfect, but it's
- *   a start (better than working from scratch.)
- *
- *   Copyright 2007-2010 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()               - Main entry.
- *   save_messages()      - Save messages to a .po file.
- *   translate_messages() - Translate messages using Google.
- *   write_string()       - Write a quoted string to a file.
- */
-
-/*
- * Include necessary headers...
- */
-
-#include <cups/cups-private.h>
-#include <unistd.h>
-
-
-/*
- * Local functions...
- */
-
-int    save_messages(cups_array_t *cat, const char *filename);
-int    translate_messages(cups_array_t *cat, const char *lang);
-int    write_string(cups_file_t *fp, const char *s);
-
-
-/*
- * 'main()' - Main entry.
- */
-
-int                                    /* O - Exit status */
-main(int  argc,                                /* I - Number of command-line arguments */
-     char *argv[])                     /* I - Command-line arguments */
-{
-  cups_array_t *cat;                   /* Message catalog */
-
-
-  if (argc != 3)
-  {
-    fputs("Usage: translate cups_language.po language\n", stderr);
-    return (1);
-  }
-
-  if (access(argv[1], 0))
-    cat = _cupsMessageLoad("cups.pot", 1);
-  else
-    cat = _cupsMessageLoad(argv[1], 1);
-
-  if (!cat)
-  {
-    puts("Unable to load message catalog.");
-    return (1);
-  }
-
-  if (!translate_messages(cat, argv[2]))
-  {
-    puts("Unable to translate message catalog.");
-    return (1);
-  }
-
-  if (!save_messages(cat, argv[1]))
-  {
-    puts("Unable to save message catalog.");
-    return (1);
-  }
-
-  return (0);
-}
-
-
-/*
- * 'save_messages()' - Save messages to a .po file.
- */
-
-int                                    /* O - 1 on success, 0 on error */
-save_messages(cups_array_t *cat,       /* I - Message catalog */
-              const char   *filename)  /* I - File to save to */
-{
-  _cups_message_t *m;                  /* Current message */
-  cups_file_t  *fp;                    /* File pointer */
-
-
- /*
-  * Open the message catalog...
-  */
-
-  if ((fp = cupsFileOpen(filename, "w")) == NULL)
-    return (0);
-
- /*
-  * Save the messages to a file...
-  */
-
-  for (m = (_cups_message_t *)cupsArrayFirst(cat);
-       m;
-       m = (_cups_message_t *)cupsArrayNext(cat))
-  {
-    if (cupsFilePuts(fp, "msgid \"") < 0)
-      break;
-
-    if (!write_string(fp, m->id))
-      break;
-
-    if (cupsFilePuts(fp, "\"\nmsgstr \"") < 0)
-      break;
-
-    if (m->str)
-    {
-      if (!write_string(fp, m->str))
-       break;
-    }
-
-    if (cupsFilePuts(fp, "\"\n") < 0)
-      break;
-  }
-
-  cupsFileClose(fp);
-
-  return (!m);
-}
-
-
-/*
- * 'translate_messages()' - Translate messages using Google.
- */
-
-int                                    /* O - 1 on success, 0 on error */
-translate_messages(cups_array_t *cat,  /* I - Message catalog */
-                   const char *lang)   /* I - Output language... */
-{
- /*
-  * Google provides a simple translation/language tool for translating
-  * from one language to another.  It is far from perfect, however it
-  * can be used to get a basic translation done or update an existing
-  * translation when no other resources are available.
-  *
-  * Translation requests are sent as HTTP POSTs to
-  * "http://translate.google.com/translate_t" with the following form
-  * variables:
-  *
-  *   Name      Description                         Value
-  *   --------  ----------------------------------  ----------------
-  *   hl        Help language?                      "en"
-  *   ie        Input encoding                      "UTF8"
-  *   langpair  Language pair                       "en|" + language
-  *   oe        Output encoding                     "UTF8"
-  *   text      Text to translate                   translation string
-  */
-
-  int          ret;                    /* Return value */
-  _cups_message_t *m;                  /* Current message */
-  int          tries;                  /* Number of tries... */
-  http_t       *http;                  /* HTTP connection */
-  http_status_t        status;                 /* Status of POST request */
-  char         *idptr,                 /* Pointer into msgid */
-               buffer[65536],          /* Input/output buffer */
-               *bufptr,                /* Pointer into buffer */
-               *bufend,                /* Pointer to end of buffer */
-               length[16];             /* Content length */
-  int          bytes;                  /* Number of bytes read */
-
-
- /*
-  * Connect to translate.google.com...
-  */
-
-  puts("Connecting to translate.google.com...");
-
-  if ((http = httpConnect("translate.google.com", 80)) == NULL)
-  {
-    perror("Unable to connect to translate.google.com");
-    return (0);
-  }
-
- /*
-  * Scan the current messages, requesting a translation of any untranslated
-  * messages...
-  */
-
-  for (m = (_cups_message_t *)cupsArrayFirst(cat), ret = 1;
-       m;
-       m = (_cups_message_t *)cupsArrayNext(cat))
-  {
-   /*
-    * Skip messages that are already translated...
-    */
-
-    if (m->str && m->str[0])
-      continue;
-
-   /*
-    * Encode the form data into the buffer...
-    */
-
-    snprintf(buffer, sizeof(buffer),
-             "hl=en&ie=UTF8&langpair=en|%s&oe=UTF8&text=", lang);
-    bufptr = buffer + strlen(buffer);
-    bufend = buffer + sizeof(buffer) - 5;
-
-    for (idptr = m->id; *idptr && bufptr < bufend; idptr ++)
-      if (*idptr == ' ')
-        *bufptr++ = '+';
-      else if (*idptr < ' ' || *idptr == '%')
-      {
-        sprintf(bufptr, "%%%02X", *idptr & 255);
-       bufptr += 3;
-      }
-      else if (*idptr != '&')
-        *bufptr++ = *idptr;
-
-    *bufptr++ = '&';
-    *bufptr = '\0';
-
-    sprintf(length, "%d", (int)(bufptr - buffer));
-
-   /*
-    * Send the request...
-    */
-
-    printf("\"%s\" = ", m->id);
-    fflush(stdout);
-
-    tries = 0;
-
-    do
-    {
-      httpClearFields(http);
-      httpSetField(http, HTTP_FIELD_CONTENT_TYPE,
-                   "application/x-www-form-urlencoded");
-      httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, length);
-
-      if (httpPost(http, "/translate_t"))
-      {
-       httpReconnect(http);
-       httpPost(http, "/translate_t");
-      }
-
-      httpWrite2(http, buffer, bufptr - buffer);
-
-      while ((status = httpUpdate(http)) == HTTP_CONTINUE);
-
-      if (status != HTTP_OK && status != HTTP_ERROR)
-        httpFlush(http);
-
-      tries ++;
-    }
-    while (status == HTTP_ERROR && tries < 10);
-
-    if (status == HTTP_OK)
-    {
-     /*
-      * OK, read the translation back...
-      */
-
-      bufptr = buffer;
-      bufend = buffer + sizeof(buffer) - 1;
-
-      while ((bytes = httpRead2(http, bufptr, bufend - bufptr)) > 0)
-        bufptr += bytes;
-
-      if (bytes < 0)
-      {
-       /*
-        * Read error, abort!
-       */
-
-        puts("READ ERROR!");
-       ret = 0;
-       break;
-      }
-
-      *bufptr = '\0';
-
-     /*
-      * Find the div containing translation
-      */
-
-      if ((bufptr = strstr(buffer, "<div id=result_box")) == NULL)
-      {
-       /*
-        * No textarea, abort!
-       */
-
-        puts("NO div id=result_box!");
-       ret = 0;
-       break;
-      }
-
-      if ((bufptr = strchr(bufptr, '>')) == NULL)
-      {
-       /*
-        * textarea doesn't end, abort!
-       */
-
-        puts("DIV SHORT DATA!");
-       ret = 0;
-       break;
-      }
-
-      bufptr ++;
-
-      if ((bufend = strstr(bufptr, "</div>")) == NULL)
-      {
-       /*
-        * textarea doesn't close, abort!
-       */
-
-        puts("/DIV SHORT DATA!");
-       ret = 0;
-       break;
-      }
-
-      *bufend = '\0';
-
-     /*
-      * Copy the translation...
-      */
-
-      m->str = strdup(bufptr);
-
-     /*
-      * Convert character entities to regular chars...
-      */
-
-      for (bufptr = strchr(m->str, '&');
-           bufptr;
-          bufptr = strchr(bufptr + 1, '&'))
-      {
-        if (!strncmp(bufptr, "&lt;", 4))
-       {
-         *bufptr = '<';
-         _cups_strcpy(bufptr + 1, bufptr + 4);
-       }
-        else if (!strncmp(bufptr, "&gt;", 4))
-       {
-         *bufptr = '>';
-         _cups_strcpy(bufptr + 1, bufptr + 4);
-       }
-        else if (!strncmp(bufptr, "&amp;", 5))
-         _cups_strcpy(bufptr + 1, bufptr + 5);
-      }
-
-      printf("\"%s\"\n", m->str);
-    }
-    else if (status == HTTP_ERROR)
-    {
-      printf("NETWORK ERROR (%s)!\n", strerror(httpError(http)));
-      ret = 0;
-      break;
-    }
-    else
-    {
-      printf("HTTP ERROR %d!\n", status);
-      ret = 0;
-      break;
-    }
-  }
-
-  httpClose(http);
-
-  return (ret);
-}
-
-
-/*
- * 'write_string()' - Write a quoted string to a file.
- */
-
-int                                    /* O - 1 on success, 0 on failure */
-write_string(cups_file_t *fp,          /* I - File to write to */
-             const char  *s)           /* I - String */
-{
-  while (*s)
-  {
-    switch (*s)
-    {
-      case '\n' :
-          if (cupsFilePuts(fp, "\\n") < 0)
-           return (0);
-         break;
-
-      case '\r' :
-          if (cupsFilePuts(fp, "\\r") < 0)
-           return (0);
-         break;
-
-      case '\t' :
-          if (cupsFilePuts(fp, "\\t") < 0)
-           return (0);
-         break;
-
-      case '\\' :
-          if (cupsFilePuts(fp, "\\\\") < 0)
-           return (0);
-         break;
-
-      case '\"' :
-          if (cupsFilePuts(fp, "\\\"") < 0)
-           return (0);
-         break;
-
-      default :
-          if ((*s & 255) < ' ')
-         {
-            if (cupsFilePrintf(fp, "\\%o", *s) < 0)
-             return (0);
-         }
-         else if (cupsFilePutChar(fp, *s) < 0)
-           return (0);
-         break;
-    }
-
-    s ++;
-  }
-
-  return (1);
-}
-
-
-/*
- * End of "$Id: translate.c 11173 2013-07-23 12:31:34Z msweet $".
- */
index c5d68a5..e01cf58 100644 (file)
@@ -1,16 +1,16 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12814 2015-07-30 15:03:33Z msweet $"
 #
-#   Man page makefile for CUPS.
+# Man page makefile for CUPS.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 1993-2006 by Easy Software Products.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 1993-2006 by Easy Software Products.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 include ../Makedefs
@@ -21,13 +21,14 @@ include ../Makedefs
 #
 
 MAN1   =       cancel.$(MAN1EXT) \
+               cups.$(MAN1EXT) \
                cups-config.$(MAN1EXT) \
                cupstestdsc.$(MAN1EXT) \
                cupstestppd.$(MAN1EXT) \
+               $(IPPFIND_MAN) \
                ipptool.$(MAN1EXT) \
                lp.$(MAN1EXT) \
                lpoptions.$(MAN1EXT) \
-               lppasswd.$(MAN1EXT) \
                lpq.$(MAN1EXT) \
                lprm.$(MAN1EXT) \
                lpr.$(MAN1EXT) \
@@ -42,6 +43,7 @@ MAN5  =       classes.conf.$(MAN5EXT) \
                cups-files.conf.$(MAN5EXT) \
                cups-snmp.conf.$(MAN5EXT) \
                cupsd.conf.$(MAN5EXT) \
+               cupsd-logs.$(MAN5EXT) \
                ipptoolfile.$(MAN5EXT) \
                mailto.conf.$(MAN5EXT) \
                mime.convs.$(MAN5EXT) \
@@ -56,11 +58,10 @@ MAN8        =       cupsaccept.$(MAN8EXT) \
                cupsaddsmb.$(MAN8EXT) \
                cupsctl.$(MAN8EXT) \
                cupsfilter.$(MAN8EXT) \
-               cups-deviced.$(MAN8EXT) \
-               cups-driverd.$(MAN8EXT) \
                cups-lpd.$(MAN8EXT) \
                cups-snmp.$(MAN8EXT) \
                cupsd.$(MAN8EXT) \
+               cupsd-helper.$(MAN8EXT) \
                cupsenable.$(MAN8EXT) \
                lpadmin.$(MAN8EXT) \
                lpinfo.$(MAN8EXT) \
@@ -96,22 +97,6 @@ unittests:
 clean:
        $(RM) mantohtml mantohtml.o
        $(RM) $(MAN1) $(MAN5) $(MAN7) $(MAN8)
-       for file in $(MAN1); do \
-               if test $$file != ipptool.$(MAN1EXT); then \
-                       $(RM) ../doc/help/man-`basename $$file .$(MAN1EXT)`.html; \
-               fi \
-       done
-       for file in $(MAN5); do \
-               if test $$file != ipptoolfile.$(MAN5EXT); then \
-                       $(RM) ../doc/help/man-`basename $$file .$(MAN5EXT)`.html; \
-               fi \
-       done
-       for file in $(MAN7); do \
-               $(RM) ../doc/help/man-`basename $$file .$(MAN7EXT)`.html; \
-       done
-       for file in $(MAN8); do \
-               $(RM) ../doc/help/man-`basename $$file .$(MAN8EXT)`.html; \
-       done
 
 
 #
@@ -159,6 +144,10 @@ install-data: all
        done
        $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT)
        $(LN) cupsenable.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT)
+       for file in cups-deviced cups-driverd cups-exec; do \
+               $(RM) $(AMANDIR)/man$(MAN8DIR)/$$file.$(MAN8EXT); \
+               $(LN) cupsd-helper.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/$$file.$(MAN8EXT); \
+       done
 
 
 #
@@ -232,10 +221,12 @@ html:     $(MAN1) $(MAN5) $(MAN7) $(MAN8) mantohtml
                ./mantohtml `basename $$file .$(MAN8EXT)`.man >../doc/help/man-`basename $$file .$(MAN8EXT)`.html; \
        done
 
-mantohtml:     mantohtml.o
-       $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ mantohtml.o
+mantohtml:     mantohtml.o ../cups/$(LIBCUPSSTATIC)
+       $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ mantohtml.o \
+               ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) \
+               $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12814 2015-07-30 15:03:33Z msweet $".
 #
index b97ab4a..c744b11 100644 (file)
 .\"
-.\" "$Id: backend.man 7810 2008-07-29 01:11:15Z mike $"
+.\" "$Id: backend.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   Backend man page for CUPS.
+.\" Backend man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH backend 7 "CUPS" "23 April 2012" "Apple Inc."
-
+.TH backend 7 "CUPS" "4 April 2014" "Apple Inc."
 .SH NAME
 backend \- cups backend transmission interfaces
 .SH SYNOPSIS
 .B backend
 .br
 .B backend
-job user title num-copies options [
+.I job
+.I user
+.I title
+.I num-copies
+.I options
+[
 .I filename
 ]
+.nf
+
+\fB#include <cups/cups.h>\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 \fIfilter(7)\fR which is used to send print data
-to and discover different devices on the system.
+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.
+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 (argv[0]) is set to the device URI of the destination printer.
-Starting with CUPS 1.1.22, any 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 CUPS API includes a
-\fIcupsBackendDeviceURI\fR function for retrieving the correct device URI.
+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 by writing to file descriptor 3. The CUPS API includes
-the \fIcupsBackChannelWrite\fR function for this purpose.
-.SH WARNING
-CUPS backends are not generally design 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 OS X) 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.
+Back-channel data from the device should be relayed to the job filters using the \fIcupsBackChannelWrite\fR function.
 .LP
-Unless you are a developer and know what you are doing, please do not run
-backends directly. Instead, use the \fIlp(1)\fR or \fIlpr(1)\fR programs to send
-a print job or \fIlpinfo(8)\fR program to query for available printers using the
-backend. The one exception is the SNMP backend - see \fIsnmpbackend(8)\fR for
-more information.
-.SH DEVICE DISCOVERY
-When run with no arguments, the backend should list the devices and schemes it
-supports or is advertising to stdout. The output consists of zero or more lines
-consisting of any of the following forms:
-
+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 \fIdevice-class\fR field is one of the following values:
+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
-direct
-.br
-The device-uri refers to a specific direct-access device with no options, such
-as a parallel, USB, or SCSI device.
+.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
-file
-.br
+.B file
 The device-uri refers to a file on disk.
 .TP 5
-network
-.br
+.B network
 The device-uri refers to a networked device and conforms to the general form for
 network URIs.
 .TP 5
-serial
-.br
-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.
+.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 \fIscheme\fR 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 \fIdevice-uri\fR field specifies the full URI to use when
-communicating with the device.
+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 \fIdevice-make-and-model\fR 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
+.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 \fIdevice-info\fR 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
+.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 \fIdevice-id\fR field specifies the IEEE-1284 device ID string for
-the device, which is used to select a matching driver.
+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 \fIdevice-location\fR field specifies the physical location of
-the device, which is often used to pre-populate the printer-location attribute
-when adding a printer.
-.SH PERMISSIONS
-Backends without world execute permissions are run as the root user. Otherwise,
-the backend is run using an unprivileged user account, typically "lp".
-.SH EXIT CODES
-The following exit codes are defined for backends; C API constants defined in
-the <cups/backend.h> header file are defined in parenthesis:
+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
-0 (CUPS_BACKEND_OK)
-.br
+.B CUPS_BACKEND_OK
 The print file was successfully transmitted to the device or remote server.
 .TP 5
-1 (CUPS_BACKEND_FAILED)
+.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 error-policy attribute.
-.TP 5
-2 (CUPS_BACKEND_AUTH_REQUIRED)
-.br
-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"
+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
-3 (CUPS_BACKEND_HOLD)
-.br
-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.
+.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
-4 (CUPS_BACKEND_STOP)
-.br
-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.
+.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
-5 (CUPS_BACKEND_CANCEL)
-.br
-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.
+.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
-6 (CUPS_BACKEND_RETRY)
-.br
-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.
+.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
-7 (CUPS_BACKEND_RETRY_CURRENT)
-.br
-The print file was not successfully transmitted because of a temporary issue.
-The scheduler will retry the job immediately without allowing intervening jobs.
+.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 design 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 OS X) 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 SEE ALSO
-\fIcups-snmp(8)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, \fIfilter(7)\fR,
-\fIlpinfo(8)\fR,
+.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
-http://localhost:631/help
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: backend.man 7810 2008-07-29 01:11:15Z mike $".
+.\" End of "$Id: backend.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 5134d1f..97c5b72 100644 (file)
@@ -1,75 +1,99 @@
 .\"
-.\" "$Id: cancel.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: cancel.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   cancel man page for CUPS.
+.\" cancel man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cancel 1 "CUPS" "20 March 2006" "Apple Inc."
+.TH cancel 1 "CUPS" "15 April 2014" "Apple Inc."
 .SH NAME
-cancel - cancel jobs
+cancel \- cancel jobs
 .SH SYNOPSIS
 .B cancel
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -a ] [ -h
+] [
+.B \-a
+] [
+.B \-h
 .I hostname[:port]
-] [ -u
+] [
+.B \-u
 .I username
 ] [
+.B \-x
+] [
 .I id
 ] [
 .I destination
 ] [
-.I destination-id
+.I destination\-id
 ]
 .SH DESCRIPTION
-\fIcancel\fR cancels existing print jobs. The \fI-a\fR option will remove
-all jobs from the specified destination.
+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 \fIcancel\fR:
-.TP 5
--E
-.br
-Forces encryption when connecting to the server.
+The following options are recognized by \fBcancel\fR:
 .TP 5
--U username
-.br
-Specifies the username to use when connecting to the server.
-.TP 5
--a
-.br
+.B \-a
 Cancel all jobs on the named destination, or all jobs on all
 destinations if none is provided.
 .TP 5
--h hostname[:port]
-.br
-Chooses an alternate server.
+.B \-E
+Forces encryption when connecting to the server.
+.TP 5
+\fB\-h \fIhostname\fR[\fI:port\fR]
+Specifies an alternate server.
 .TP 5
--u username
-.br
+\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.
-.SH COMPATIBILITY
-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.
+.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 \fIcupsd.conf(5)\fR.
+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
-\fIlp(1)\fR, \fIlpmove(8)\fR, \fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.BR cupsd.conf (5),
+.BR lp (1),
+.BR lpmove (8),
+.BR lpstat (1),
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cancel.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: cancel.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 8149d15..9e4a113 100644 (file)
 .\"
-.\" "$Id: classes.conf.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: classes.conf.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   classes.conf man page for CUPS.
+.\" classes.conf man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH classes.conf 5 "CUPS" "29 April 2009" "Apple Inc."
+.TH classes.conf 5 "CUPS" "15 April 2014" "Apple Inc."
 .SH NAME
 classes.conf \- class configuration file for cups
 .SH DESCRIPTION
-The \fIclasses.conf\fR file defines the local printer classes that are
-available. It is normally located in the \fI/etc/cups\fR directory and
-is generated automatically by the \fIcupsd(8)\fR program when printer
-classes are added or deleted.
-.LP
-Each line in the file can be a configuration directive, a blank line,
-or a comment. Comment lines start with the # character.
-.SH DIRECTIVES
-.TP 5
-<Class name> ... </Class>
-.br
-Defines a specific printer class.
-.TP 5
-<DefaultClass name> ... </Class>
-.br
-Defines a default printer class.
-.TP 5
-Accepting Yes
-.TP 5
-Accepting No
-.br
-Specifies whether the printer is accepting new jobs.
-.TP 5
-AllowUser [ user @group ... ]
-.br
-Allows specific users and groups to print to the printer.
-.TP 5
-DenyUser [ user @group ... ]
-.br
-Prevents specific users and groups from printing to the printer.
-.TP 5
-Info text
-.br
-Specifies human-readable text describing the printer.
-.TP 5
-JobSheets banner banner
-.br
-Specifies the banner pages to use for the printer.
-.TP 5
-KLimit number
-.br
-Specifies the job-k-limit value for the printer.
-.TP 5
-Location text
-.br
-Specifies human-readable text describing the location of the printer.
-.TP 5
-OpPolicy name
-.br
-Specifies the operation policy for the printer.
-.TP 5
-PageLimit number
-.br
-Specifies the job-page-limit value for the printer.
-.TP 5
-Printer
-.br
-Specifies a printer that is a member of the printer class.
-.TP 5
-QuotaPeriod seconds
-.br
-Specifies the job-quota-period value for the printer.
-.TP 5
-Shared Yes
-.TP 5
-Shared No
-.br
-Specifies whether the printer is shared.
-.TP 5
-State idle
-.TP 5
-State stopped
-.br
-Specifies the initial state of the printer (Idle or Stopped)
-.TP 5
-StateMessage text
-.br
-Specifies the message associated with the state.
-.TP 5
-StateTime seconds
-.br
-Specifies the date/time associated with the state.
+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
-\fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, \fImime.convs(5)\fR,
-\fImime.types(5)\fR, \fIprinters.conf(5)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: classes.conf.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: classes.conf.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 36b70d5..ae6cdb0 100644 (file)
@@ -1,65 +1,86 @@
 .\"
-.\" "$Id: client.conf.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: client.conf.man.in 12645 2015-05-20 01:20:52Z msweet $"
 .\"
-.\"   client.conf man page for CUPS.
+.\" client.conf man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 2006 by Easy Software Products.
+.\" Copyright 2007-2015 by Apple Inc.
+.\" Copyright 2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH client.conf 5 "CUPS" "25 June 2013" "Apple Inc."
+.TH client.conf 5 "CUPS" "19 May 2015" "Apple Inc."
 .SH NAME
-client.conf \- client configuration file for cups
+client.conf \- client configuration file for cups (deprecated)
 .SH DESCRIPTION
-The \fIclient.conf\fR file configures the CUPS client and is
-normally located in the \fI@CUPS_SERVERROOT@\fR or \fI~/.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.
-.SH DIRECTIVES
-The following directives are understood by the client. Consult the
-on-line help for detailed descriptions:
-.TP 5
-Encryption IfRequested
-.TP 5
-Encryption Never
-.TP 5
-Encryption Required
-.br
-Specifies the level of encryption that is required for a particular
-location.
-.TP 5
-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
-"@CUPS_DEFAULT_GSSSERVICENAME@".
-.TP 5
-ServerName hostname-or-ip-address[:port]
-.TP 5
-ServerName /domain/socket
-.br
-Specifies the address and optionally the port to use when connecting to the
-server. \fBNote: Not supported on OS X 10.7 or later.\fR
-.TP 5
-ServerName hostname-or-ip-address[:port]/version=1.1
-.br
-Specifies the address and optionally the port to use when connecting to a
-server running CUPS 1.3.12 and earlier. \fBNote: Not supported on OS X 10.7 or
-later.\fR
-.TP 5
-User name
-.br
+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 OS X 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 OS X at all.
+.SS DIRECTIVES
+The following directives are understood by the client. Consult the online help for detailed descriptions:
+.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".
+.TP 5
+\fBAllowExpiredCerts Yes\fR
+.TP 5
+\fBAllowExpiredCerts No\fR
+Specifies whether to allow TLS with expired certificates.
+The default is "Yes".
+.TP 5
+\fBEncryption IfRequested\fR
+.TP 5
+\fBEncryption Never\fR
+.TP 5
+\fBEncryption Required\fR
+Specifies the level of encryption that should be used.
+.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".
+.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 it not supported on OS X 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.
+.TP 5
+\fBSSLOptions \fR[\fIAllowDH\fR] [\fIAllowRC4\fR] [\fIAllowSSL3\fR] [\fIDenyTLS1.0\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.
+The \fIAllowDH\fR option enables cipher suites using plain Diffie-Hellman key negotiation.
+The \fIAllowRC4\fR option enables the 128-bit RC4 cipher suites, which are required for some older clients that do not implement newer ones.
+The \fIAllowSSL3\fR option enables SSL v3.0, which is required for some older clients that do not support TLS v1.0.
+The \fIDenyTLS1.0\fR option disables TLS v1.0 support - this sets the minimum protocol version to TLS v1.1.
+.TP 5
+\fBUser \fIname\fR
 Specifies the default user name to use for requests.
+.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 and will no longer be supported in a future version of CUPS.
 .SH SEE ALSO
-http://localhost:631/help
+.BR cups (1),
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: client.conf.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: client.conf.man.in 12645 2015-05-20 01:20:52Z msweet $".
 .\"
index c13e935..0cd37a6 100644 (file)
 .\"
-.\" "$Id: cups-config.man 7646 2008-06-16 17:26:20Z mike $"
+.\" "$Id: cups-config.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   cups-config man page for CUPS.
+.\" cups-config man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cups-config 1 "CUPS" "23 October 2008" "Apple Inc."
+.TH cups-config 1 "CUPS" "15 April 2014" "Apple Inc."
 .SH NAME
-cups-config \- get cups api, compiler, directory, and link information.
+cups\-config \- get cups api, compiler, directory, and link information.
 .SH SYNOPSIS
-.B cups-config
---api-version
+.B cups\-config
+.I \-\-api\-version
 .br
-.B cups-config
---build
+.B cups\-config
+.I \-\-build
 .br
-.B cups-config
---cflags
+.B cups\-config
+.I \-\-cflags
 .br
-.B cups-config
---datadir
+.B cups\-config
+.I \-\-datadir
 .br
-.B cups-config
---help
+.B cups\-config
+.I \-\-help
 .br
-.B cups-config
---ldflags
+.B cups\-config
+.I \-\-ldflags
 .br
-.B cups-config
+.B cups\-config
 [
-.I --image
+.I \-\-image
 ] [
-.I --static
-] --libs
+.I \-\-static
+]
+.I \-\-libs
 .br
-.B cups-config
---serverbin
+.B cups\-config
+.I \-\-serverbin
 .br
-.B cups-config
---serverroot
+.B cups\-config
+.I \-\-serverroot
 .br
 .B cups-config
---version
+.I \-\-version
 .br
 .SH DESCRIPTION
-\fBcups-config\fR is the CUPS program configuration utility. It should be
-used by application developers to determine the necessary command-line
-options for the compiler and linker, as well as determining installation
-directories for filters, configuration files, and drivers.
+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
---api-version
-.br
-Displays the current API version (major.minor).
+.B \-\-api-version
+Reports the current API version (major.minor).
 .TP 5
---build
-.br
-Displays a system-specific build number.
+.B \-\-build
+Reports a system-specific build number.
 .TP 5
---cflags
-.br
-Displays the necessary compiler options.
+.B \-\-cflags
+Reports the necessary compiler options.
 .TP 5
---datadir
-.br
-Displays the default CUPS data directory.
+.B \-\-datadir
+Reports the default CUPS data directory.
 .TP 5
---help
-.br
-Displays the program usage message.
+.B \-\-help
+Reports the program usage message.
 .TP 5
---image
-.br
-When used with \fI--libs\fR, adds the CUPS imaging library to the
-list of displayed libraries.
+.B \-\-image
+When used with \fI\-\-libs\fR, adds the CUPS imaging library to the
+list of libraries.
 .TP 5
---ldflags
-.br
-Displays the necessary linker options.
+.B \-\-ldflags
+Reports the necessary linker options.
 .TP 5
---libs
-.br
-Displays the necessary librarys to link to.
+.B \-\-libs
+Reports the necessary libraries to link to.
 .TP 5
---serverbin
-.br
-Displays the default CUPS binary directory,
-where filters and backends are stored.
+.B \-\-serverbin
+Reports the default CUPS binary directory, where filters and backends are stored.
 .TP 5
---serverroot
-.br
-Displays the default CUPS configuration file directory.
+.B \-\-serverroot
+Reports the default CUPS configuration file directory.
 .TP 5
---static
-.br
-When used with \fI--libs\fR, shows the static libraries instead
-of the default (shared) libraries.
+.B \-\-static
+When used with \fI\-\-libs\fR, reports the static libraries instead of the default (shared) libraries.
 .TP 5
---version
-.br
-Displays the full version number of the CUPS installation
-(major.minor.patch).
+.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 SEE ALSO
-http://localhost:631/help
+.BR cups (1),
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cups-config.man 7646 2008-06-16 17:26:20Z mike $".
+.\" End of "$Id: cups-config.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
diff --git a/man/cups-deviced.man.in b/man/cups-deviced.man.in
deleted file mode 100644 (file)
index 8961882..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-.\"
-.\" "$Id: cups-deviced.man.in 11173 2013-07-23 12:31:34Z msweet $"
-.\"
-.\"   cups-deviced man page for CUPS.
-.\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
-.\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
-.\"
-.TH cups-deviced 8 "CUPS" "16 June 2008" "Apple Inc."
-.SH NAME
-cups-deviced \- cups device daemon
-.SH SYNOPSIS
-.B cups-deviced
-.I request-id limit user-id options
-.SH DESCRIPTION
-\fIcups-deviced\fR polls the backends in
-\fI@CUPS_SERVERBIN@/backend\fR for a list of available devices.
-It is run by \fIcupsd(8)\fR in response to a
-\fICUPS-Get-Devices\fR request. The output format is an IPP
-response message. The \fIrequest-id\fR argument is the request ID
-from the original IPP request, typically 1. The \fIlimit\fR
-argument is the limit value from the original IPP request - 0
-means no limit. The \fIuser-id\fR argument is the
-requesting-user-name value from the original IPP request.
-Finally, the \fIoptions\fR argument is a space-delimited list of
-attributes ("name=value name=value \...") that were passed in
-with the request. Currently \fIcups-deviced\fR looks for the
-\fIrequested-attributes\fR attribute and tailors the output
-accordingly.
-.SH SEE ALSO
-backend(7), cupsd(8), cupsd.conf(5),
-.br
-http://localhost:631/help
-.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
-.\"
-.\" End of "$Id: cups-deviced.man.in 11173 2013-07-23 12:31:34Z msweet $".
-.\"
diff --git a/man/cups-driverd.man.in b/man/cups-driverd.man.in
deleted file mode 100644 (file)
index d40fa54..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-.\"
-.\" "$Id: cups-driverd.man.in 11173 2013-07-23 12:31:34Z msweet $"
-.\"
-.\"   cups-driverd man page for CUPS.
-.\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
-.\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
-.\"
-.TH cups-driverd 8 "CUPS" "6 January 2011" "Apple Inc."
-.SH NAME
-cups-driverd \- cups driver daemon
-.SH SYNOPSIS
-.B cups-driverd
-cat
-.I ppd-name
-.br
-.B cups-driverd
-list
-.I request_id limit options
-.SH DESCRIPTION
-\fIcups-driverd\fR shows or lists PPD files. It is run in
-response to CUPS-Add-Modify-Printer or CUPS-Get-Devices requests.
-The first form ("cups-driverd cat ppd-name") writes the named PPD
-file to stdout. The output format is an uncompressed PPD file.
-.LP
-The second form lists the available manufacturers or PPD files to
-stdout as indicated by the \fIoptions\fR argument. The output
-format is an IPP response message. The \fIrequest_id\fR argument
-is the request ID from the original IPP request, typically 1. The
-\fIlimit\fR argument is the limit value from the original IPP
-request - 0 means no limit. Finally, the \fIoptions\fR argument
-is a space-delimited list of attributes ("name=value name=value
-\&...") that were passed in with the request. Currently
-\fIcups-driverd\fR looks for the \fIppd-make\fR and
-\fIrequested-attributes\fR attributes and tailors the output
-accordingly.
-.SH DRIVERS
-Drivers can be static PPD files under the
-\fI@CUPS_DATADIR@/model\fR directory or programs under the
-\fI@CUPS_SERVERBIN@/driver\fR directory. Static PPD files must
-conform to the Adobe PPD File Format Specification version 4.3
-and may be compressed using the \fIgzip(1)\fR program. Driver
-programs must implement the command-line interface shown in the
-next section.
-.SS DRIVER PROGRAMS
-Driver programs provide a  interface to dynamically-generated PPD
-files. The following arguments are currently defined:
-.TP 5
-drivername list
-.br
-Lists the supported PPD files to stdout.
-.TP 5
-drivername cat ppdname
-.br
-Writes the named PPD file to stdout.
-.PP
-Driver programs MUST NOT query hardware or make other long-term operations that
-would delay the return of a driver list. See the NOTES section below for
-specific recommendations.
-.SS LISTING FILES (drivername list)
-When run with the single argument "list", the program must list
-the available PPD files it can generate to stdout using the
-following format:
-.nf
-    "drivername:ppdname" language "make" "make and model"
-    "drivername:ppdname" language "make" "make and model" "1284 device id"
-    "drivername:ppdname" language "make" "make and model" "1284 device id" "(PPD product)"
-    "drivername:ppdname" language "make" "make and model" "1284 device id" "(PPD product)" "PostScript version"
-    "drivername:ppdname" language "make" "make and model" "1284 device id" "(PPD product)" "PostScript version" "type"
-.fi
-.LP
-\fIDrivername\fR is the name of the driver program. \fIPpdname\fR
-is the name used to select the given driver. \fILanguage\fR is
-the locale associated with the default language of the PPD file,
-typically "en". \fIMake\fR is the Manufacturer name from the PPD
-file. \fIMake and model\fR is the NickName name from the PPD
-file. \fI1284 device id\fR is the 1284DeviceId from the PPD file,
-if any. \fI(PPD product)\fR is the Product string as it would appear in the PPD
-file or from a PostScript query. \fIPostScript version\fR is the PSVersion
-string as it would appear in the PPD file or from a PostScript query. \fIType\fR
-is "postscript" for PostScript printers, "pdf" for PDF printers, "raster" for
-raster printers, or "fax" for facsimile devices.
-.SS WRITING FILES (drivername cat ppdname)
-When the driver program is run with the "cat ppdname" arguments,
-it must write the named PPD file to stdout, uncompressed. If the
-named PPD file does not exist, the driver program must not write
-any output to stdout and report the error to stderr instead.
-.SS DRIVER ERROR MESSAGES
-Error messages can be relayed back to \fIcupsd\fR by writing them
-to stderr. The following prefixes are recognized:
-.TP 5
-DEBUG: [drivername]
-.br
-Debugging messages
-.TP 5
-ERROR: [drivername]
-.br
-Error messages
-.TP 5
-INFO: [drivername]
-.br
-Informational messages
-.SH NOTES
-Due to performance considerations, driver programs have been officially
-deprecated and should not be used for new development. Currently only the
-CUPS web interface and \fIlpinfo(8)\fR command will request lists from all
-driver programs.
-.SH SEE ALSO
-cupsd(8), cupsd.conf(5), cupstestppd(1), lpinfo(8),
-.br
-http://localhost:631/help
-.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
-.\"
-.\" End of "$Id: cups-driverd.man.in 11173 2013-07-23 12:31:34Z msweet $".
-.\"
index 559ea45..8603754 100644 (file)
 .\"
-.\" "$Id: cups-files.conf.man.in 11221 2013-08-06 16:16:01Z msweet $"
+.\" "$Id: cups-files.conf.man.in 12699 2015-06-08 18:16:30Z msweet $"
 .\"
-.\"   cupsd.conf man page for CUPS.
+.\" cups-files.conf man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2015 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cups-files.conf 5 "CUPS" "26 July 2013" "Apple Inc."
+.TH cups-files.conf 5 "CUPS" "3 June 2015" "Apple Inc."
 .SH NAME
-cups-files.conf \- file and directory configuration file for cups
+cups\-files.conf \- file and directory configuration file for cups
 .SH DESCRIPTION
-The \fIcups-files.conf\fR file configures the files and directories used by the
-CUPS scheduler, \fIcupsd(8)\fR.  It is normally located in the
-\fI@CUPS_SERVERROOT@\fR directory.
+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. Comment lines start with the # character.
-.SH DIRECTIVES
-The following directives are understood by \fIcupsd(8)\fR. Consult the
-on-line help for detailed descriptions:
+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
-AccessLog filename
+\fBAccessLog\fR
 .TP 5
-AccessLog syslog
-.br
-Defines the access log filename.
-.TP 5
-ConfigFilePerm mode
-.br
-Specifies the permissions for all configuration files that the scheduler
-writes.
-.TP 5
-DataDir path
-.br
-Specified the directory where data files can be found.
-.TP 5
-DocumentRoot directory
-.br
-Specifies the root directory for the internal web server documents.
-.TP 5
-ErrorLog filename
-.TP 5
-ErrorLog syslog
-.br
-Specifies the error log filename.
-.TP 5
-FatalErrors none
-.TP 5
-FatalErrors all -kind [... -kind]
-.TP 5
-FatalErrors kind [... kind]
-.br
-Specifies which errors are fatal, causing the scheduler to exit. "Kind" is
-"browse", "config", "listen", "log", or "permissions".
-.TP 5
-FileDevice Yes
-.TP 5
-FileDevice No
-.br
-Specifies whether the file pseudo-device can be used for new
-printer queues.
-.TP 5
-FontPath directory[:directory:...]
-.br
-Specifies the search path for fonts.
-.TP 5
-Group group-name-or-number
-.br
-Specifies the group name or ID that will be used when executing
-external programs.
-.TP 5
-LogFilePerm mode
-.br
-Specifies the permissions for all log files that the scheduler writes.
+\fBAccessLog \fIfilename\fR
 .TP 5
-PageLog filename
+\fBAccessLog stderr\fR
 .TP 5
-PageLog syslog
-.br
-Specifies the page log filename.
-.TP 5
-Printcap
-.TP 5
-Printcap filename
-.br
-Specifies the filename for a printcap file that is updated
-automatically with a list of available printers (needed for
-legacy applications); specifying Printcap with no filename
-disables printcap generation.
-.TP 5
-RemoteRoot user-name
-.br
-Specifies the username that is associated with unauthenticated root
-accesses.
-.TP 5
-RequestRoot directory
-.br
-Specifies the directory to store print jobs and other HTTP request
-data.
-.TP 5
-ServerBin directory
-.br
-Specifies the directory where backends, CGIs, daemons, and filters may
-be found.
-.TP 5
-ServerCertificate filename
-.br
-Specifies the encryption certificate to use.
-.TP 5
-ServerKey filename
-.br
-Specifies the encryption key to use.
-.TP 5
-ServerRoot directory
-.br
-Specifies the directory where the server configuration files can be found.
-.TP 5
-SyncOnClose Yes
-.TP 5
-SyncOnClose No
-Specifies whether the scheduler calls \fIfsync(2)\fR after writing configuration
-or state files. The default is No.
-.TP 5
-SystemGroup group-name [group-name ...]
-.br
-Specifies the group(s) to use for System class authentication.
-.TP 5
-TempDir directory
-.br
+\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".
+.\"#ConfigFilePerm
+.TP 5
+\fBConfigFilePerm \fImode\fR
+Specifies the permissions for all configuration files that the scheduler writes.
+The default is "0644" on OS X 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.
+.\"#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
+.\"#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.
+.\"#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".
+.\"#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 OS X.
+.\"#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 OS X and "/etc/cups/ssl" on all other operating systems.
+OS X 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".
+.\"#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 temporary files are stored.
+The default is "/var/spool/cups/tmp".
+.\"#User
 .TP 5
-User user-name
-.br
+\fBUser \fIusername\fR
 Specifies the user name or ID that is used when running external programs.
+The default is "lp".
 .SH SEE ALSO
-\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, \fImime.convs(5)\fR,
-\fImime.types(5)\fR, \fIprinters.conf(5)\fR,
-\fIsubscriptions.conf(5)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cups-files.conf.man.in 11221 2013-08-06 16:16:01Z msweet $".
+.\" End of "$Id: cups-files.conf.man.in 12699 2015-06-08 18:16:30Z msweet $".
 .\"
index e030b61..2b52fa6 100644 (file)
 .\"
-.\" "$Id: cups-lpd.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: cups-lpd.man.in 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   cups-lpd man page for CUPS.
+.\" cups-lpd man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cups-lpd 8 "CUPS" "4 August 2008" "Apple Inc."
+.TH cups-lpd 8 "CUPS" "3 June 2014" "Apple Inc."
 .SH NAME
 cups-lpd \- receive print jobs and report printer status to lpd clients
 .SH SYNOPSIS
 .B cups-lpd
-[ -h
-.I hostname[:port]
-] [ -n ] [ -o
+[
+\fB\-h \fIhostname\fR[\fB:\fIport\fR]
+] [
+.B -n
+] [
+.B -o
 .I option=value
 ]
 .SH DESCRIPTION
-\fIcups-lpd\fR is the CUPS Line Printer Daemon ("LPD")
-mini-server that supports legacy client systems that use the LPD
-protocol. \fIcups-lpd\fR does not act as a standalone network
-daemon but instead operates using the Internet "super-server"
-\fIinetd(8)\fR or \fIxinetd(8)\fR. If you are using \fIinetd\fR,
-add the following line to the \fIinetd.conf\fR file to enable the
-\fIcups-lpd\fR mini-server:
-.br
-.nf
-
-    printer stream tcp nowait lp @CUPS_SERVERBIN@/daemon/cups-lpd cups-lpd \\
-        -o document-format=application/octet-stream
-.fi
-.LP
-.LP
-\fBNote:\fR If you are using Solaris 10 or higher, you must run
-the \fIinetdconv(1m)\fR program to register the changes to the
-inetd.conf file.
-.LP
-If you are using the newer \fIxinetd(8)\fR daemon, create a file
-named \fI/etc/xinetd.d/cups\fR containing the following lines:
-.br
-.nf
-
-    service printer
-    {
-        socket_type = stream
-        protocol = tcp
-        wait = no
-        user = lp
-       group = sys
-       passenv =
-        server = @CUPS_SERVERBIN@/daemon/cups-lpd
-       server_args = -o document-format=application/octet-stream
-    }
-.fi
+.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
--h hostname[:port]
-.br
+\fB-h \fIhostname\fR[\fB:\fIport\fR]
 Sets the CUPS server (and port) to use.
 .TP 5
--n
-.br
-Disables reverse address lookups; normally \fIcups-lpd\fR will
-try to discover the hostname of the client via a reverse DNS
-lookup.
+.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
--o name=value
-.br
-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 examples in the previous section set the
-"document-format" option to "application/octet-stream" which
-forces autodetection of the print file format.
-.SH PERFORMANCE
-\fIcups-lpd\fR 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.
-.SH SECURITY
-\fIcups-lpd\fR 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 \fIcups-lpd\fR on your server will
-allow any computer on your network (and perhaps the entire
+\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
+.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 \fIxinetd\fR has built-in access control support, you
-should use the TCP wrappers package with \fIinetd\fR to limit
-access to only those computers that should be able to print
-through your server.
+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
-\fIcups-lpd\fR is not enabled by the standard CUPS distribution.
-Please consult with your operating system vendor to determine
-whether it is enabled on your system.
-.SH COMPATIBILITY
-\fIcups-lpd\fR 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.
+\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
-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.
+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
-\fIcups(1)\fR, \fIcupsd(8)\fR, \fIinetconv(1m)\fR,
-\fIinetd(8)\fR, \fIxinetd(8)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cups-lpd.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: cups-lpd.man.in 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 608a2b5..07dfcfb 100644 (file)
@@ -1,78 +1,69 @@
 .\"
-.\" "$Id: cups-snmp.conf.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: cups-snmp.conf.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   snmp.conf man page for CUPS.
+.\" snmp.conf man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH snmp.conf 5 "CUPS" "23 April 2012" "Apple Inc."
-
+.TH snmp.conf 5 "CUPS" "10 June 2014" "Apple Inc."
 .SH NAME
 snmp.conf \- snmp configuration file for cups
 .SH DESCRIPTION
-The \fIsnmp.conf\fR 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.
+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 (\fIcups-snmp(8)\fR).
+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. Consult
-the on-line help for detailed descriptions:
+The following directives are understood by the CUPS network backends:
 .TP 5
-Address @IF(\fIname\fR)
+\fBAddress @IF(\fIname\fB)\fR
 .TP 5
-Address @LOCAL
+\fBAddress @LOCAL\fR
 .TP 5
-Address \fIaddress\fR
-.br
-Sends SNMP broadcast queries to the specified address(es). There is no default
-for the broadcast address.
+\fBAddress \fIaddress\fR
+Sends SNMP broadcast queries (for discovery) to the specified address(es).
+There is no default for the broadcast address.
 .TP 5
-Community \fIname\fR
-.br
-Specifies the community name to use. Only a single community name may be
-specified. The default community name is "public".
+\fBCommunity \fIname\fR
+Specifies the community name to use.
+Only a single community name may be specified.
+The default community name is "public".
 .TP 5
-DebugLevel number
-.br
-Specifies the logging level from 0 (none) to 3 (everything). Typically only used
-for debugging (thus the name). The default debug level is 0.
+\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
-DeviceURI "regular expression" device-uri [... device-uri]
-.br
-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.
+\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
-HostNameLookups on
+\fBHostNameLookups on\fR
 .TP 5
-HostNameLookups off
-.br
-Specifies whether the addresses of printers should be converted to hostnames or
-left as numeric IP addresses. The default is "off".
+\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
-MaxRunTime \fIseconds\fR
-.br
+\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).
+network for printers.
+The default is 120 seconds (2 minutes).
 .SH SEE ALSO
-cups-snmp(8),
-.br
-http://localhost:631/help
+.BR cups-snmp (8),
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cups-snmp.conf.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: cups-snmp.conf.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 797a038..1ab3025 100644 (file)
@@ -1,59 +1,61 @@
 .\"
-.\" "$Id: cups-snmp.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: cups-snmp.man.in 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   SNMP backend man page for CUPS.
+.\" SNMP backend man page for CUPS.
 .\"
-.\"   Copyright 2012-2013 by Apple Inc.
+.\" Copyright 2012-2014 by Apple Inc.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cups-snmp 8 "CUPS" "23 April 2012" "Apple Inc."
+.TH cups-snmp 8 "CUPS" "10 June 2014" "Apple Inc."
 .SH NAME
 snmp \- cups snmp backend
 .SH SYNOPSIS
-.B @CUPS_SERVERBIN@/backend/snmp
+.B /usr/lib/cups/backend/snmp
 .I ip-address-or-hostname
 .br
-.B lpinfo -v --include-schemes snmp
+.B /usr/libexec/cups/backend/snmp
+.I ip-address-or-hostname
+.br
+.B lpinfo
+.B \-v
+.B \-\-include-schemes
+snmp
 .SH DESCRIPTION
-The 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.
+The 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.
+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 \fIlpinfo(8)\fR
-command. The output provides all printers detected via SNMP on the configured
-broadcast addresses. \fBNote\fR: no broadcast addresses are configured by
-default.
-.SH MIBS
-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 CONFIGURATION
-The SNMP backend reads the @CUPS_SERVERROOT@/snmp.conf configuration file, if
+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. The configuration file is documented in \fIcups-snmp.conf(5)\fR. The
-DebugLevel value can be overridden using the CUPS_DEBUG_LEVEL environment
-variable and the MaxRunTime value can be overridden using the CUPS_MAX_RUN_TIME
-environment variable.
+level.
+.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
-\fIbackend(7)\fR, \fIcups-snmp.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR,
-\fIfilter(7)\fR, \fIlpinfo(8)\fR,
-.br
-http://localhost:631/help
+.BR backend (7),
+.BR cups-snmp.conf (5),
+.BR cupsd (8),
+.BR lpinfo (8),
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cups-snmp.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: cups-snmp.man.in 12854 2015-08-28 14:08:00Z msweet $".
 .\"
diff --git a/man/cups.man b/man/cups.man
new file mode 100644 (file)
index 0000000..02a9bac
--- /dev/null
@@ -0,0 +1,147 @@
+.\"
+.\" "$Id: cups.man 12854 2015-08-28 14:08:00Z msweet $"
+.\"
+.\" cups (intro) man page for CUPS.
+.\"
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH cups 1 "CUPS" "16 April 2014" "Apple Inc."
+.SH NAME
+cups \- a standards-based, open source printing system
+.SH DESCRIPTION
+.B 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.
+.LP
+Now, since every printer manufacturer does things differently, printing can be very complicated.
+.B 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
+.B CUPS
+can often figure things out on its own.
+.SS HOW DOES IT WORK?
+The first time you print to a printer,
+.B 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.
+.LP
+Every time you print something,
+.B 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
+.B 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.
+.LP
+When the print job is completely printed,
+.B 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.
+.SS 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.
+.LP
+When you are asked for a username and password, enter your login username and password or the "root" username and password.
+.LP
+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.
+.LP
+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.
+.LP
+You can also use the
+.BR lpadmin (8)
+and
+.BR lpinfo (8)
+commands to add printers to
+.BR CUPS .
+Additionally, your operating system may include graphical user interfaces or automatically create printer queues when you connect a printer to your computer.
+.SS HOW DO I GET HELP?
+The
+.B CUPS
+web site (http://www.CUPS.org) provides access to the
+.I cups
+and
+.I 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.
+.SH ENVIRONMENT
+.B 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:
+.TP 5
+.B CUPS_ANYROOT
+Whether to allow any X.509 certificate root (Y or N).
+.TP 5
+.B CUPS_CACHEDIR
+The directory where semi-persistent cache files can be found.
+.TP 5
+.B CUPS_DATADIR
+The directory where data files can be found.
+.TP 5
+.B CUPS_ENCRYPTION
+The default level of encryption (Always, IfRequested, Never, Required).
+.TP 5
+.B CUPS_EXPIREDCERTS
+Whether to allow expired X.509 certificates (Y or N).
+.TP 5
+.B CUPS_GSSSERVICENAME
+The Kerberos service name used for authentication.
+.TP 5
+.B CUPS_SERVER
+The hostname/IP address and port number of the CUPS scheduler (hostname:port or ipaddress:port).
+.TP 5
+.B CUPS_SERVERBIN
+The directory where server helper programs, filters, backend, etc. can be found.
+.TP 5
+.B CUPS_SERVERROOT
+The root directory of the server.
+.TP 5
+.B CUPS_STATEDIR
+The directory where state files can be found.
+.TP 5
+.B CUPS_USER
+Specifies the name of the user for print requests.
+.TP 5
+.B HOME
+Specifies the home directory of the current user.
+.TP 5
+.B IPP_PORT
+Specifies the default port number for IPP requests.
+.TP 5
+.B LOCALEDIR
+Specifies the location of localization files.
+.TP 5
+.B LPDEST
+Specifies the default print queue (System V standard).
+.TP 5
+.B PRINTER
+Specifies the default print queue (Berkeley standard).
+.TP 5
+.B TMPDIR
+Specifies the location of temporary files.
+.SH FILES
+.nf
+.I ~/.cups/client.conf
+.I ~/.cups/lpoptions
+.fi
+.SH CONFORMING TO
+.B CUPS
+conforms to the Internet Printing Protocol version 2.1 and implements the Berkeley and System V UNIX print commands.
+.SH SEE ALSO
+.BR cancel (1),
+.BR client.conf (7),
+.BR cupsctl (8),
+.BR cupsd (8),
+.BR lp (1),
+.BR lpadmin (8),
+.BR lpinfo (8),
+.BR lpoptions (1),
+.BR lpr (1),
+.BR lprm (1),
+.BR lpq (1),
+.BR 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)
+.SH COPYRIGHT
+Copyright \[co] 2007-2015 by Apple Inc.
+.\"
+.\" End of "$Id: cups.man 12854 2015-08-28 14:08:00Z msweet $".
+.\"
index 0c8ba03..70385f8 100644 (file)
@@ -1,79 +1,94 @@
 .\"
-.\" "$Id: cupsaccept.man 7930 2008-09-10 22:25:54Z mike $"
+.\" "$Id: cupsaccept.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   accept/reject man page for CUPS.
+.\" accept/reject man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cupsaccept 8 "CUPS" "12 February 2006" "Apple Inc."
+.TH cupsaccept 8 "CUPS" "10 June 2014" "Apple Inc."
 .SH NAME
 cupsaccept/cupsreject \- accept/reject jobs sent to a destination
 .SH SYNOPSIS
 .B cupsaccept
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
+] [
+.B \-h
 .I hostname[:port]
-] destination(s)
+]
+.I destination(s)
 .br
 .B cupsreject
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
+] [
+.B \-h
 .I hostname[:port]
-] [ -r
+] [
+.B \-r
 .I reason
-] destination(s)
+]
+.I destination(s)
 .SH DESCRIPTION
-\fIcupsaccept\fR instructs the printing system to accept print jobs to the
-specified destinations.
+The
+.B cupsaccept
+command instructs the printing system to accept print jobs to the specified destinations.
 .LP
-\fIcupsreject\fR 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".
+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 \fIcupsaccept\fR and
-\fIcupsreject\fR:
+The following options are supported by both
+.B cupsaccept
+and
+.BR cupsreject :
 .TP 5
--E
-.br
+.B \-E
 Forces encryption when connecting to the server.
 .TP 5
--U username
-.br
+\fB-U \fIusername\fR
 Sets the username that is sent when connecting to the server.
 .TP 5
--h hostname[:port]
-.br
+\fB-h \fIhostname[:port]\fR
 Chooses an alternate server.
 .TP 5
--r "reason"
-.br
-Sets the reason string that is shown for a printer that is
-rejecting jobs.
-.SH COMPATIBILITY
-Unlike the System V printing system, CUPS allows printer names to
-contain any printable character except SPACE, TAB, "/", or "#".
+\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
-The CUPS versions of \fIaccept\fR and \fIreject\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.
+Finally, the CUPS versions may ask the user for an access password depending on the printing system configuration.
 .SH SEE ALSO
-\fIcancel(1)\fR, \fIcupsenable(8)\fR, \fIlp(1)\fR,
-\fIlpadmin(8)\fR, \fIlpstat(1)\fR,
+.BR cancel (1),
+.BR cupsenable (8),
+.BR lp (1),
+.BR lpadmin (8),
+.BR lpstat (1),
 .br
-http://localhost:631/help
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cupsaccept.man 7930 2008-09-10 22:25:54Z mike $".
+.\" End of "$Id: cupsaccept.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 335cf68..355c372 100644 (file)
@@ -1,81 +1,63 @@
 .\"
-.\" "$Id: cupsaddsmb.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: cupsaddsmb.man.in 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   cupsaddsmb man page for CUPS.
+.\" cupsaddsmb man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cupsaddsmb 8 "CUPS" "8 July 2013" "Apple Inc."
+.TH cupsaddsmb 8 "CUPS" "11 June 2014" "Apple Inc."
 .SH NAME
 cupsaddsmb \- export printers to samba for windows clients
 
 .SH SYNOPSIS
 .B cupsaddsmb
-[ -H
+[
+.B \-H
 .I samba-server
-] [ -U
+] [
+.B \-U
 .I samba-user[%samba-password]
-] [ -h
+] [
+.B \-h
 .I cups-server[:port]
-] [ -v ] -a
+] [
+.B \-v
+]
+.B \-a
 .br
 .B cupsaddsmb
-[ -H
+[
+.B \-H
 .I samba-server
-] [ -U
+] [
+.B \-U
 .I samba-user[%samba-password]
-] [ -h
+] [
+.B \-h
 .I cups-server[:port]
-] [ -v ] printer [ ... printer ]
-
+] [
+.B \-v
+]
+.I printer
+[ ...
+.I printer
+]
 .SH DESCRIPTION
-\fIcupsaddsmb\fR exports printers to the SAMBA software (version
-2.2.0 or higher) for use with Windows clients. Depending on the
-SAMBA configuration, you may need to provide a password to
-export the printers. This program requires the Windows printer
-driver files described below.
-
-.SH OPTIONS
-\fIcupsaddsmb\fR supports the following options:
-.TP 5
--H samba-server
-.br
-Specifies the SAMBA server which defaults to the CUPS server.
-.TP 5
--U samba-user[%samba-password]
-.br
-Specifies the SAMBA print admin username which defaults to your
-current username. If the username contains a percent (%)
-character, then the text following the percent is treated as the
-SAMBA password to use.
-.TP 5
--a
-.br
-Exports all known printers. Otherwise only the named printers are
-exported.
-.TP 5
--h cups-server[:port]
-.br
-Specifies a different CUPS server to use.
-.TP 5
--v
-.br
-Specifies that verbose information should be shown. This is
-useful for debugging SAMBA configuration problems.
-
-.SH SAMBA CONFIGURATION
-\fIcupsaddsmb\fR uses the new RPC-based printing support in
-SAMBA 2.2.x to provide printer drivers and PPD files to Windows
-client machines. In order to use this functionality, you must
-first configure the SAMBA \fIsmb.conf(5)\fR file to support
-printing through CUPS and provide a printer driver download
+The \fBcupsaddsmb\fR program exports printers to the SAMBA software (version 2.2.0 or higher) for use with Windows clients.
+Depending on the SAMBA configuration, you may need to provide a password to export the printers.
+This program requires the Windows printer driver files described below.
+.SS SAMBA CONFIGURATION
+\fBcupsaddsmb\fR uses the RPC-based printing support in SAMBA to provide printer drivers and PPD files to Windows client machines.
+In order to use this functionality, you must first configure the SAMBA
+.BR smb.conf (5)
+file to support printing through CUPS and provide a printer driver download
 share, as follows:
 .nf
 
@@ -100,77 +82,50 @@ share, as follows:
        guest ok = no
        read only = yes
        write list = root
-.fi
-.LP
-This configuration assumes a FHS-compliant installation of
-SAMBA; adjust the [printers] and [print$] share paths
-accordingly on your system as needed.
 
-.SH MICROSOFT POSTSCRIPT DRIVERS FOR WINDOWS
-The base driver for Windows 2000 and higher is the Microsoft
-PostScript driver, which is available on any system running
-Windows 2000 or higher in the
-%WINDIR%\\SYSTEM32\\SPOOL\\DRIVERS\\W32X86\\3 folder for 32-bit
-drivers and
-%WINDIR%\\SYSTEM32\\SPOOL\\DRIVERS\\X64\\3 folder for 64-bit
-drivers.
-.LP
-However, currently only Windows 2000 and higher is supported by the Microsoft
-driver, so you will also need to get the Adobe driver to support
-Windows 95, 98, and Me clients. The Adobe and Microsoft drivers
-for Windows 2000 are identical.
+.fi
+This configuration assumes a FHS-compliant installation of SAMBA; adjust the [printers] and [print$] share paths accordingly on your system as needed.
+.SS MICROSOFT POSTSCRIPT DRIVERS FOR WINDOWS
+The base driver for Windows 2000 and higher is the Microsoft PostScript driver, which is available on any system running Windows 2000 or higher in the %WINDIR%\\SYSTEM32\\SPOOL\\DRIVERS\\W32X86\\3 folder for 32-bit drivers and %WINDIR%\\SYSTEM32\\SPOOL\\DRIVERS\\X64\\3 folder for 64-bit drivers.
 .LP
-Once you have extracted the driver files, copy the 32-bit drivers
-to the \fI/usr/share/cups/drivers\fR directory and the 64-bit
-drivers to the \fI/usr/share/cups/drivers/x64\fR directory exactly
-as named below:
+Copy the 32-bit drivers to the \fI/usr/share/cups/drivers\fR directory and the 64-bit drivers to the \fI/usr/share/cups/drivers/x64\fR directory exactly as named below:
 .nf
 
-    [Windows 2000 and higher]
     ps5ui.dll
     pscript.hlp
     pscript.ntf
     pscript5.dll
-.fi
-.LP
-\fBNote:\fR Unlike Windows, case is significant - make sure that
-you use the lowercase filenames shown above, otherwise
-\fIcupsaddsmb\fR will fail to export the drivers.
-
-.SH ADOBE POSTSCRIPT DRIVERS FOR WINDOWS 95, 98, AND ME
-\fIcupsaddsmb\fR can use the Adobe PostScript printer driver for
-Windows 95, 98, and ME, which are available for download from the
-Adobe web site (http://www.adobe.com).
-.LP
-The Adobe driver does not support the page-label, job-billing, or
-job-hold-until options.
-.LP
-Once you have installed the driver on a Windows system, copy the
-following files to the \fI@CUPS_DATADIR@/drivers\fR directory
-exactly as named below:
-.nf
 
-    [Windows 95, 98, and Me]
-    ADFONTS.MFM
-    ADOBEPS4.DRV
-    ADOBEPS4.HLP
-    ICONLIB.DLL
-    PSMON.DLL
 .fi
-.LP
-\fBNote:\fR Unlike Windows, case is significant - make sure that
-you use the UPPERCASE filenames shown above, otherwise
-\fIcupsaddsmb\fR will fail to export the drivers.
-
-.SH KNOWN ISSUES
-Getting the full set of Windows driver files should be easier.
-
+\fBNote:\fR Unlike Windows, case is significant - make sure that you use the lowercase filenames shown above, otherwise \fBcupsaddsmb\fR will fail to export the drivers.
+.SH OPTIONS
+\fBcupsaddsmb\fR supports the following options:
+.TP 5
+\fB\-H \fIsamba-server\fR
+Specifies the SAMBA server which defaults to the CUPS server.
+.TP 5
+\fB\-U \fIsamba-user\fR[\fB%\fIsamba-password\fR]
+Specifies the SAMBA print admin username which defaults to your current username.
+If the username contains a percent (%) character, then the text following the percent is treated as the SAMBA password to use.
+.TP 5
+.B \-a
+Exports all known printers.
+Otherwise only the named printers are exported.
+.TP 5
+\fB\-h \fIcups-server\fR[\fB:\fIport\fR]
+Specifies a different CUPS server to use.
+.TP 5
+.B \-v
+Specifies that verbose information should be shown.
+This is useful for debugging SAMBA configuration problems.
 .SH SEE ALSO
-\fIsmbd(8)\fR, \fIsmb.conf(5)\fR,
-http://localhost:631/help
-
+.BR rpcclient (1),
+.BR smbclient (1),
+.BR smbd (8),
+.BR smb.conf (5),
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cupsaddsmb.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: cupsaddsmb.man.in 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 8dc01b0..47ac9e2 100644 (file)
 .\"
-.\" "$Id: cupsctl.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: cupsctl.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   cupsctl man page for CUPS.
+.\" cupsctl man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 2007 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cupsctl 8 "CUPS" "11 January 2013" "Apple Inc."
+.TH cupsctl 8 "CUPS" "11 June 2014" "Apple Inc."
 .SH NAME
 cupsctl \- configure cupsd.conf options
 .SH SYNOPSIS
 .B cupsctl
-[ -E ] [-U
-.I username
-] [ -h
-.I server[:port]
-] [ --[no-]debug-logging ] [ --[no-]remote-admin ] [ --[no-]remote-any ]
-[ --[no-]share-printers ] [ --[no-]user-cancel-any ]
 [
+.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
-\fIcupsctl\fR updates or queries the \fBcupsd.conf\fR file for a server. When
+\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
--E
-.br
+.B \-E
 Enables encryption on the connection to the scheduler.
 .TP 5
--U \fIusername\fR
-.br
+\fB\-U \fIusername\fR
 Specifies an alternate username to use when authenticating with the scheduler.
 .TP 5
--h \fIserver[:port]\fR
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
 Specifies the server address.
 .TP 5
---[no-]debug-logging
-.br
-Enables or disables debug logging in the \fBerror_log\fR file.
+.B \-\-\fR[\fBno\-\fR]\fBdebug\-logging
+Enables (disables) debug logging to the \fIerror_log\fR file.
 .TP 5
---[no-]remote-admin
-.br
-Enables or disables remote administration.
+.B \-\-\fR[\fBno\-\fR]\fBremote\-admin
+Enables (disables) remote administration.
 .TP 5
---[no-]remote-any
-.br
-Enables or disables printing from any address, e.g. the Internet.
+.B \-\-\fR[\fBno\-\fR]\fBremote\-any
+Enables (disables) printing from any address, e.g., the Internet.
 .TP 5
---[no-]share-printers
-.br
-Enables or disables sharing of local printers with other computers.
+.B \-\-\fR[\fBno\-\fR]\fBshare\-printers
+Enables (disables) sharing of local printers with other computers.
 .TP 5
---[no-]user-cancel-any
-.br
-Allows or prevents users from canceling jobs owned by others.
+.B \-\-\fR[\fBno\-\fR]\fBuser\-cancel\-any
+Allows (prevents) users to cancel jobs owned by others.
 .SH EXAMPLES
 Display the current settings:
 .nf
+
     cupsctl
+
 .fi
-.LP
 Enable debug logging:
 .nf
+
     cupsctl --debug-logging
+
 .fi
-.LP
 Get the current debug logging state:
 .nf
+
     cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'
+
 .fi
-.LP
 Disable printer sharing:
 .nf
+
     cupsctl --no-share-printers
 .fi
 .SH KNOWN ISSUES
-You cannot set the Listen or Port directives using \fIcupsctl\fR.
+You cannot set the Listen or Port directives using \fBcupsctl\fR.
 .SH SEE ALSO
-\fIcupsd.conf(5)\fR, \fIcupsd(8)\fR,
+.BR cupsd.conf (5),
+.BR cupsd (8),
 .br
-http://localhost:631/help
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cupsctl.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: cupsctl.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
diff --git a/man/cupsd-helper.man b/man/cupsd-helper.man
new file mode 100644 (file)
index 0000000..51bdc30
--- /dev/null
@@ -0,0 +1,94 @@
+.\"
+.\" "$Id: cupsd-helper.man 12854 2015-08-28 14:08:00Z msweet $"
+.\"
+.\" cupsd-helper man page for CUPS.
+.\"
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH cupsd-helper 8 "CUPS" "15 April 2014" "Apple Inc."
+.SH NAME
+cupsd\-helper \- cupsd helper programs
+.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 OS X 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 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-2015 by Apple Inc.
+.\"
+.\" End of "$Id: cupsd-helper.man 12854 2015-08-28 14:08:00Z msweet $".
+.\"
diff --git a/man/cupsd-logs.man b/man/cupsd-logs.man
new file mode 100644 (file)
index 0000000..7dbb706
--- /dev/null
@@ -0,0 +1,241 @@
+.\"
+.\" "$Id: cupsd-logs.man 12854 2015-08-28 14:08:00Z msweet $"
+.\"
+.\" cupsd-logs man page for CUPS.
+.\"
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH cupsd-logs 5 "CUPS" "11 June 2014" "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 each page or group of pages that are sent to a printer.
+By default, each line contains the following information:
+.nf
+
+    \fIprinter user job-id date-time page-number num-copies job-billing
+      job-originating-host-name job-name media sides\fR
+
+    \fIprinter user job-id date-time \fBtotal \fInum-impressions job-billing
+      job-originating-host-name job-name media sides\fR
+
+.fi
+For example the entries for a two page job called "myjob" might look like:
+.nf
+
+    DeskJet root 1 [20/May/1999:19:21:05 +0000] 1 1 acme-123
+      localhost myjob na_letter_8.5x11in one-sided
+    DeskJet root 1 [20/May/1999:19:21:05 +0000] 2 1 acme-123
+      localhost myjob na_letter_8.5x11in one-sided
+
+    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 \fIpage-number\fR and \fInum-copies\fR fields contain the page number and number of copies being printed of that page.
+For printers that cannot produce copies on their own, the num-copies field will always be 1.
+.LP
+Lines containing the keyword "total" have a \fInum-impressions\fR field instead which provides the total number of impressions (sides) 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-2015 by Apple Inc.
+.\"
+.\" End of "$Id: cupsd-logs.man 12854 2015-08-28 14:08:00Z msweet $".
+.\"
index c362d09..9d38954 100644 (file)
 .\"
-.\" "$Id: cupsd.conf.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: cupsd.conf.man.in 12767 2015-06-30 15:57:39Z msweet $"
 .\"
-.\"   cupsd.conf man page for CUPS.
+.\" cupsd.conf man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2015 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cupsd.conf 5 "CUPS" "19 November 2012" "Apple Inc."
+.TH cupsd.conf 5 "CUPS" "30 June 2015" "Apple Inc."
 .SH NAME
 cupsd.conf \- server configuration file for cups
 .SH DESCRIPTION
-The \fIcupsd.conf\fR file configures the CUPS scheduler, \fIcupsd(8)\fR.  It
-is normally located in the \fI@CUPS_SERVERROOT@\fR directory. \fBNote:\fR
-File, directory, and user configuration directives that used to be allowed in
-the \fIcupsd.conf\fR file are now stored in the \fIcups-files.conf(5)\fR instead
-in order to prevent certain types of privilege escalation attacks.
+The
+.I cupsd.conf
+file configures the CUPS scheduler,
+.BR cupsd (8).
+It is normally located in the
+.I /etc/cups
+directory.
+\fBNote:\fR 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.
 .LP
-Each line in the file can be a configuration directive, a blank line,
-or a comment. Comment lines start with the # character. The
-configuration directives are intentionally similar to those used by the
-popular Apache web server software and are described below.
-.SH DIRECTIVES
-The following directives are understood by \fIcupsd(8)\fR. Consult the
-on-line help for detailed descriptions:
+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
-AccessLogLevel config
+\fBAccessLogLevel config\fR
 .TP 5
-AccessLogLevel actions
+\fBAccessLogLevel actions\fR
 .TP 5
-AccessLogLevel all
-.br
+\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
-Allow all
+\fBAutoPurgeJobs Yes\fR
 .TP 5
-Allow none
+\fBAutoPurgeJobs No\fR
+.br
+Specifies whether to purge job history data automatically when it is no longer required for quotas.
+The default is "No".
+.\"#BrowseLocalProtocols
 .TP 5
-Allow host.domain.com
+\fBBrowseLocalProtocols all\fR
 .TP 5
-Allow *.domain.com
+\fBBrowseLocalProtocols dnssd\fR
 .TP 5
-Allow ip-address
+\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
-Allow ip-address/netmask
+\fBBrowseWebIF Yes\fR
 .TP 5
-Allow ip-address/mm
+\fBBrowseWebIF No\fR
+.br
+Specifies whether the CUPS web interface is advertised.
+The default is "No".
+.\"#Browsing
 .TP 5
-Allow @IF(name)
+\fBBrowsing Yes\fR
 .TP 5
-Allow @LOCAL
+\fBBrowsing No\fR
 .br
-Allows access from the named hosts or addresses.
+Specifies whether shared printers are advertised.
+The default is "No".
+.\"#Classification
 .TP 5
-AuthType None
+\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
-AuthType Basic
+\fBClassifyOverride Yes\fR
 .TP 5
-AuthType BasicDigest
+\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".
+.\"#DefaultAuthType
 .TP 5
-AuthType Digest
+\fBDefaultAuthType Basic\fR
 .TP 5
-AuthType Negotiate
+\fBDefaultAuthType Negotiate\fR
 .br
-Specifies the authentication type (None, Basic, BasicDigest, Digest, Negotiate)
+Specifies the default type of authentication to use.
+The default is "Basic".
+.\"#DefaultEncryption
 .TP 5
-AutoPurgeJobs Yes
+\fBDefaultEncryption Never\fR
 .TP 5
-AutoPurgeJobs No
-.br
-Specifies whether to purge job history data automatically when
-it is no longer required for quotas.
+\fBDefaultEncryption IfRequested\fR
 .TP 5
-BrowseLocalProtocols [All] [DNSSD]
-.br
-Specifies the protocols to use for local printer sharing.
+\fBDefaultEncryption Required\fR
+Specifies whether encryption will be used for authenticated requests.
+The default is "Required".
+.\"#DefaultLanguage
 .TP 5
-BrowseWebIF Yes
+\fBDefaultLanguage \fIlocale\fR
+Specifies the default language to use for text and web content.
+The default is "en".
+.\"#DefaultPaperSize
 .TP 5
-BrowseWebIF No
-.br
-Specifies whether the CUPS web interface is advertised via DNS-SD.
+\fBDefaultPaperSize Auto\fR
 .TP 5
-Browsing Yes
+\fBDefaultPaperSize None\fR
 .TP 5
-Browsing No
-.br
-Specifies whether or not shared printers should be advertised.
+\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
-Classification banner
-.br
-Specifies the security classification of the server.
+\fBDefaultPolicy \fIpolicy-name\fR
+Specifies the default access policy to use.
+The default access policy is "default".
+.\"#DefaultShared
 .TP 5
-ClassifyOverride Yes
+\fBDefaultShared Yes\fR
 .TP 5
-ClassifyOverride No
-.br
-Specifies whether to allow users to override the classification
-of individual print jobs.
+\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".
+.\"#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-job\fR
+Specifies that a failed print job should be retried at a later time unless otherwise specified for the printer.
+.TP 5
+\fBErrorPolicy retry-this-job\fR
+Specifies that a failed print job should be retried immediately 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.
+.\"#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
-DefaultAuthType Basic
+\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
-DefaultAuthType BasicDigest
+\fBKeepAlive Yes\fR
 .TP 5
-DefaultAuthType Digest
+\fBKeepAlive No\fR
+Specifies whether to support HTTP keep-alive connections.
+The default is "Yes".
+.\"#KeepAliveTimeout
 .TP 5
-DefaultAuthType Negotiate
-.br
-Specifies the default type of authentication to use.
+\fBKeepAliveTimeout \fIseconds\fR
+Specifies how long an idle client connection remains open.
+The default is "30".
+.\"#LimitIPP
 .TP 5
-DefaultEncryption Never
+\fB<Limit \fIoperation \fR...\fB> \fR... \fB</Limit>\fR
+Specifies the IPP operations that are being limited inside a Policy section. IPP operation names are listed below in the section "IPP OPERATIONS".
+.\"#Limit
 .TP 5
-DefaultEncryption IfRequested
+\fB<Limit \fImethod \fR...\fB> \fR... \fB</Limit>\fR
+.\"#LimitExcept
 .TP 5
-DefaultEncryption Required
-.br
-Specifies the type of encryption to use for authenticated requests.
+\fB<LimitExcept \fImethod \fR...\fB> \fR... \fB</LimitExcept>\fR
+Specifies the HTTP methods that are being limited inside a Location section. HTTP method names are listed below in the section "HTTP METHODS".
+.\"#LimitRequestBody
 .TP 5
-DefaultLanguage locale
-.br
-Specifies the default language to use for text and web content.
+\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
-DefaultPaperSize Auto
+\fBListen \fIipv4-address\fB:\fIport\fR
 .TP 5
-DefaultPaperSize None
+\fBListen [\fIipv6-address\fB]:\fIport\fR
 .TP 5
-DefaultPaperSize sizename
-.br
-Specifies the default paper size for new print queues. "Auto" uses a locale-
-specific default, while "None" specifies there is no default paper size.
+\fBListen *:\fIport\fR
 .TP 5
-DefaultPolicy policy-name
-.br
-Specifies the default access policy to use.
+\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
-DefaultShared Yes
+\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
-DefaultShared No
-.br
-Specifies whether local printers are shared by default.
+\fB<Location \fI/path\fB> \fR... \fB</Location>\fR
+Specifies access control for the named location.
+Paths are documented below in the section "LOCATION PATHS".
+.\"#LogDebugHistory
 .TP 5
-Deny all
+\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
-Deny none
+\fBLogLevel \fRnone
 .TP 5
-Deny host.domain.com
+\fBLogLevel \fRemerg
 .TP 5
-Deny *.domain.com
+\fBLogLevel \fRalert
 .TP 5
-Deny ip-address
+\fBLogLevel \fRcrit
 .TP 5
-Deny ip-address/netmask
+\fBLogLevel \fRerror
 .TP 5
-Deny ip-address/mm
+\fBLogLevel \fRwarn
 .TP 5
-Deny @IF(name)
+\fBLogLevel \fRnotice
 .TP 5
-Deny @LOCAL
-.br
-Denies access to the named host or address.
+\fBLogLevel \fRinfo
 .TP 5
-DirtyCleanInterval seconds
-.br
-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.
+\fBLogLevel \fRdebug
 .TP 5
-Encryption IfRequested
+\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
-Encryption Never
+\fBLogTimeFormat \fRstandard
 .TP 5
-Encryption Required
-.br
-Specifies the level of encryption that is required for a particular
-location.
+\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
-FilterLimit limit
-.br
-Specifies the maximum cost of filters that are run concurrently.
+\fBMaxClients \fInumber\fR
+Specifies the maximum number of simultaneous clients that are allowed by the scheduler.
+The default is "100".
+.\"#MaxClientPerHost
 .TP 5
-FilterNice nice-value
-.br
-Specifies the scheduling priority ("nice" value) of filters that
-are run to print a job.
+\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
-GSSServiceName name
-.br
-Specifies the service name when using Kerberos authentication. The default
-service name is "@CUPS_DEFAULT_GSSSERVICENAME@".
+\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 "300" (5 minutes).
+.\"#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.
+.\"#PassEnv
+.TP 5
+\fBPassEnv \fIvariable \fR[ ... \fIvariable \fR]
+Passes the specified environment variable(s) to child processes.
+.\"#Policy
 .TP 5
-HostNameLookups On
+\fB<Policy \fIname\fB> \fR... \fB</Policy>\fR
+Specifies access control for the named policy.
+.\"#Port
 .TP 5
-HostNameLookups Off
+\fBPort \fInumber\fR
+Listens to the specified port number for connections.
+.\"#PreserveJobFiles
 .TP 5
-HostNameLookups Double
-.br
-Specifies whether or not to do reverse lookups on client addresses.
+\fBPreserveJobFiles Yes\fR
 .TP 5
-Include filename
-.br
-Includes the named file.
+\fBPreserveJobFiles No\fR
 .TP 5
-JobKillDelay seconds
-.br
-Specifies the number of seconds to wait before killing the filters and backend
-associated with a canceled or held job.
+\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
-JobPrivateAccess all
+\fBPreserveJobHistory Yes\fR
 .TP 5
-JobPrivateAccess default
+\fBPreserveJobHistory No\fR
 .TP 5
-JobPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM}+
-.br
-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.
+\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
-JobPrivateValues all
+\fBReloadTimeout \fIseconds\fR
+Specifies the amount of time to wait for job completion before restarting the scheduler.
+The default is "30".
+.\"#RIPCache
 .TP 5
-JobPrivateValues default
+\fBRIPCache \fIsize\fR
+Specifies the maximum amount of memory to use when converting documents into bitmaps for a printer.
+The default is "128m".
+.\"#ServerAdmin
 .TP 5
-JobPrivateValues none
+\fBServerAdmin \fIemail-address\fR
+Specifies the email address of the server administrator.
+The default value is "root@ServerName".
+.\"#ServerAlias
 .TP 5
-JobPrivateValues attribute-name-1 [ ... attribute-name-N ]
-Specifies the list of job values to make private. The "default" values are
-"job-name", "job-originating-host-name", and "job-originating-user-name".
+\fBServerAlias \fIhostname \fR[ ... \fIhostname \fR]
 .TP 5
-JobRetryInterval seconds
-.br
-Specifies the interval between retries of jobs in seconds.
+\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
-JobRetryLimit count
-.br
-Specifies the number of retries that are done for jobs.
+\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
-KeepAlive Yes
+\fBServerTokens None\fR
 .TP 5
-KeepAlive No
-.br
-Specifies whether to support HTTP keep-alive connections.
+\fBServerTokens ProductOnly\fR
 .TP 5
-KeepAliveTimeout seconds
-.br
-Specifies the amount of time that connections are kept alive.
+\fBServerTokens Major\fR
 .TP 5
-<Limit operations> ... </Limit>
-.br
-Specifies the IPP operations that are being limited inside a policy.
+\fBServerTokens Minor\fR
 .TP 5
-<Limit methods> ... </Limit>
+\fBServerTokens Minimal\fR
 .TP 5
-<LimitExcept methods> ... </LimitExcept>
-.br
-Specifies the HTTP methods that are being limited inside a location.
+\fBServerTokens OS\fR
 .TP 5
-LimitRequestBody
-.br
-Specifies the maximum size of any print job request.
+\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 2".
+"Minor" reports "CUPS 2.0".
+"Minimal" reports "CUPS 2.0.0".
+"OS" reports "CUPS 2.0.0 (UNAME)" where UNAME is the output of the
+.BR uname (1)
+command.
+"Full" reports "CUPS 2.0.0 (UNAME) IPP/2.0".
+The default is "Minimal".
+.\"#SetEnv
 .TP 5
-Listen ip-address:port
+\fBSetEnv \fIvariable value\fR
+Set the specified environment variable to be passed to child processes.
+.\"#SSLListen
 .TP 5
-Listen *:port
+\fBSSLListen \fIipv4-address\fB:\fIport\fR
 .TP 5
-Listen /path/to/domain/socket
-.br
-Listens to the specified address and port or domain socket path.
+\fBSSLListen [\fIipv6-address\fB]:\fIport\fR
 .TP 5
-<Location /path> ... </Location>
-.br
-Specifies access control for the named location.
+\fBSSLListen *:\fIport\fR
+Listens on the specified address and port for encrypted connections.
+.\"#SSLOptions
 .TP 5
-LogDebugHistory #-messages
-.br
-Specifies the number of debugging messages that are logged when an error
-occurs in a print job.
+\fBSSLOptions \fR[\fIAllowRC4\fR] [\fIAllowSSL3\fR]
 .TP 5
-LogLevel alert
+\fBSSLOptions None\fR
+Sets encryption options.
+By default, CUPS only supports encryption using TLS v1.0 or higher using known secure cipher suites.
+The \fIAllowRC4\fR option enables the 128-bit RC4 cipher suites, which are required for some older clients that do not implement newer ones.
+The \fIAllowSSL3\fR option enables SSL v3.0, which is required for some older clients that do not support TLS v1.0.
+.\"#SSLPort
 .TP 5
-LogLevel crit
+\fBSSLPort \fIport\fR
+Listens on the specified port for encrypted connections.
+.\"#StrictConformance
 .TP 5
-LogLevel debug2
+\fBStrictConformance Yes\fR
 .TP 5
-LogLevel debug
+\fBStrictConformance No\fR
+Specifies whether the scheduler requires clients to strictly adhere to the IPP specifications.
+The default is "No".
+.\"#Timeout
 .TP 5
-LogLevel emerg
+\fBTimeout \fIseconds\fR
+Specifies the HTTP request timeout.
+The default is "300" (5 minutes).
+.\"#WebInterface
 .TP 5
-LogLevel error
+\fBWebInterface yes\fR
 .TP 5
-LogLevel info
+\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
-LogLevel none
+GET
+Used by a client to download icons and other printer resources and to access the CUPS web interface.
 .TP 5
-LogLevel notice
+HEAD
+Used by a client to get the type, size, and modification date of resources.
 .TP 5
-LogLevel warn
-.br
-Specifies the logging level for the ErrorLog file.
+OPTIONS
+Used by a client to establish a secure (SSL/TLS) connection.
 .TP 5
-LogTimeFormat standard
+POST
+Used by a client to submit IPP requests and HTML forms from the CUPS web interface.
 .TP 5
-LogTimeFormat usecs
-.br
-Specifies the format of the date and time in the log files.
+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
-MaxClients number
-.br
-Specifies the maximum number of simultaneous clients to support.
+CUPS\-Accept\-Jobs
+Allows a printer to accept new jobs.
 .TP 5
-MaxClientsPerHost number
-.br
-Specifies the maximum number of simultaneous clients to support from a
-single address.
+CUPS\-Add\-Modify\-Class
+Adds or modifies a printer class.
 .TP 5
-MaxCopies number
-.br
-Specifies the maximum number of copies that a user can print of each job.
+CUPS\-Add\-Modify\-Printer
+Adds or modifies a printer.
 .TP 5
-MaxHoldTime seconds
-.br
-Specifies the maximum time a job may remain in the "indefinite" hold state
-before it is canceled. Set to 0 to disable cancellation of held jobs.
+CUPS\-Authenticate\-Job
+Releases a job that is held for authentication.
 .TP 5
-MaxJobs number
-.br
-Specifies the maximum number of simultaneous jobs to support.
+CUPS\-Delete\-Class
+Deletes a printer class.
 .TP 5
-MaxJobsPerPrinter number
-.br
-Specifies the maximum number of simultaneous jobs per printer to support.
+CUPS\-Delete\-Printer
+Deletes a printer.
 .TP 5
-MaxJobsPerUser number
-.br
-Specifies the maximum number of simultaneous jobs per user to support.
+CUPS\-Get\-Classes
+Gets a list of printer classes.
 .TP 5
-MaxJobTime seconds
-.br
-Specifies the maximum time a job may take to print before it is canceled. The
-default is 10800 seconds (3 hours). Set to 0 to disable cancellation of "stuck"
-jobs.
+CUPS\-Get\-Default
+Gets the server default printer or printer class.
 .TP 5
-MaxLogSize number-bytes
-.br
-Specifies the maximum size of the log files before they are
-rotated (0 to disable rotation)
+CUPS\-Get\-Devices
+Gets a list of devices that are currently available.
 .TP 5
-MaxRequestSize number-bytes
-.br
-Specifies the maximum request/file size in bytes (0 for no limit)
+CUPS\-Get\-Document
+Gets a document file for a job.
 .TP 5
-MultipleOperationTimeout seconds
-.br
-Specifies the maximum amount of time to allow between files in a multiple file
-print job.
+CUPS\-Get\-PPD
+Gets a PPD file.
 .TP 5
-Order allow,deny
+CUPS\-Get\-PPDs
+Gets a list of installed PPD files.
 .TP 5
-Order deny,allow
-.br
-Specifies the order of HTTP access control (allow,deny or deny,allow)
+CUPS\-Get\-Printers
+Gets a list of printers.
 .TP 5
-PageLogFormat format string
-.br
-Specifies the format of page log lines.
+CUPS\-Move\-Job
+Moves a job.
 .TP 5
-PassEnv variable [... variable]
-.br
-Passes the specified environment variable(s) to child processes.
+CUPS\-Reject\-Jobs
+Prevents a printer from accepting new jobs.
 .TP 5
-<Policy name> ... </Policy>
-.br
-Specifies access control for the named policy.
+CUPS\-Set\-Default
+Sets the server default printer or printer class.
 .TP 5
-Port number
-.br
-Specifies a port number to listen to for HTTP requests.
+Cancel\-Job
+Cancels a job.
 .TP 5
-PreserveJobFiles Yes
+Cancel\-Jobs
+Cancels one or more jobs.
 .TP 5
-PreserveJobFiles No
-.br
-Specifies whether or not to preserve job files after they are printed.
+Cancel\-My\-Jobs
+Cancels one or more jobs creates by a user.
 .TP 5
-PreserveJobHistory Yes
+Cancel\-Subscription
+Cancels a subscription.
 .TP 5
-PreserveJobHistory No
-.br
-Specifies whether or not to preserve the job history after they are
-printed.
+Close\-Job
+Closes a job that is waiting for more documents.
 .TP 5
-PrintcapFormat bsd
+Create\-Job
+Creates a new job with no documents.
 .TP 5
-PrintcapFormat plist
+Create\-Job\-Subscriptions
+Creates a subscription for job events.
 .TP 5
-PrintcapFormat solaris
-.br
-Specifies the format of the printcap file.
+Create\-Printer\-Subscriptions
+Creates a subscription for printer events.
 .TP 5
-ReloadTimeout seconds
-.br
-Specifies the amount of time to wait for job completion before
-restarting the scheduler.
+Get\-Job\-Attributes
+Gets information about a job.
 .TP 5
-Require group group-name-list
+Get\-Jobs
+Gets a list of jobs.
 .TP 5
-Require user user-name-list
+Get\-Notifications
+Gets a list of event notifications for a subscription.
 .TP 5
-Require valid-user
-.br
-Specifies that user or group authentication is required.
+Get\-Printer\-Attributes
+Gets information about a printer or printer class.
 .TP 5
-RIPCache bytes
-.br
-Specifies the maximum amount of memory to use when converting images
-and PostScript files to bitmaps for a printer.
+Get\-Subscription\-Attributes
+Gets information about a subscription.
 .TP 5
-Satisfy all
+Get\-Subscriptions
+Gets a list of subscriptions.
 .TP 5
-Satisfy any
-.br
-Specifies whether all or any limits set for a Location must be
-satisfied to allow access.
+Hold\-Job
+Holds a job from printing.
 .TP 5
-ServerAdmin user@domain.com
-.br
-Specifies the email address of the server administrator.
+Hold\-New\-Jobs
+Holds all new jobs from printing.
 .TP 5
-ServerAlias hostname [... hostname]
+Pause\-Printer
+Stops processing of jobs by a printer or printer class.
 .TP 5
-ServerAlias *
-.br
-Specifies an alternate name that the server is known by. The special name "*"
-allows any name to be used.
+Pause\-Printer\-After\-Current\-Job
+Stops processing of jobs by a printer or printer class after the current job is finished.
 .TP 5
-ServerName hostname-or-ip-address
-.br
-Specifies the fully-qualified hostname of the server.
+Print\-Job
+Creates a new job with a single document.
 .TP 5
-ServerTokens Full
+Purge\-Jobs
+Cancels one or more jobs and deletes the job history.
 .TP 5
-ServerTokens Major
+Release\-Held\-New\-Jobs
+Allows previously held jobs to print.
 .TP 5
-ServerTokens Minimal
+Release\-Job
+Allows a job to print.
 .TP 5
-ServerTokens Minor
+Renew\-Subscription
+Renews a subscription.
 .TP 5
-ServerTokens None
+Restart\-Job
+Reprints a job, if possible.
 .TP 5
-ServerTokens OS
+Send\-Document
+Adds a document to a job.
 .TP 5
-ServerTokens ProductOnly
-.br
-Specifies what information is included in the Server header of HTTP
-responses.
+Set\-Job\-Attributes
+Changes job information.
 .TP 5
-SetEnv variable value
-.br
-Set the specified environment variable to be passed to child processes.
+Set\-Printer\-Attributes
+Changes printer or printer class information.
 .TP 5
-SSLListen
-.br
-Listens on the specified address and port for encrypted connections.
+Validate\-Job
+Validates options for a new job.
+.SS LOCATION PATHS
+The following paths are commonly used when configuring
+.BR cupsd (8):
 .TP 5
-SSLOptions None
+/
+The path for all get operations (get-printers, get-jobs, etc.)
 .TP 5
-SSLOptions NoEmptyFragments
-.br
-Sets SSL/TLS protocol options for encrypted connections.
+/admin
+The path for all administration operations (add-printer, delete-printer, start-printer, etc.)
 .TP 5
-SSLPort
-.br
-Listens on the specified port for encrypted connections.
+/admin/conf
+The path for access to the CUPS configuration files (cupsd.conf, client.conf, etc.)
 .TP 5
-StrictConformance Yes
+/admin/log
+The path for access to the CUPS log files (access_log, error_log, page_log)
 .TP 5
-StrictConformance No
-.br
-Specifies whether the scheduler requires clients to strictly adhere to the IPP
-specifications. The default is No.
+/classes
+The path for all printer classes
 .TP 5
-SubscriptionPrivateAccess all
+/classes/name
+The resource for the named printer class
 .TP 5
-SubscriptionPrivateAccess default
+/jobs
+The path for all jobs (hold-job, release-job, etc.)
 .TP 5
-SubscriptionPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM}+
-.br
-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.
+/jobs/id
+The path for the specified job.
 .TP 5
-SubscriptionPrivateValues all
+/printers
+The path for all printers
 .TP 5
-SubscriptionPrivateValues default
+/printers/name
+The path for the named printer
 .TP 5
-SubscriptionPrivateValues none
+/printers/name.png
+The icon file path for the named printer
 .TP 5
-SubscriptionPrivateValues attribute-name-1 [ ... attribute-name-N ]
-Specifies the list of job values to make private. The "default" values are
-"notify-events", "notify-pull-method", "notify-recipient-uri",
-"notify-subscriber-user-name", and "notify-user-data".
+/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
-Timeout seconds
-.br
-Specifies the HTTP request timeout in seconds.
+\fBAllow all\fR
 .TP 5
-WebInterface yes
+\fBAllow none\fR
 .TP 5
-WebInterface no
-Specifies whether the web interface is enabled.
+\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 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 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.
+.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".
+.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
+
+    <Location />
+    Order allow,deny
+    Allow from 10./8
+    AuthType Basic
+    Require valid-user
+    Satisfy any
+    </Location>
+.fi
 .SH SEE ALSO
-\fIclasses.conf(5)\fR, \fIcups-files.conf(5)\fR, \fIcupsd(8)\fR,
-\fImime.convs(5)\fR, \fImime.types(5)\fR, \fIprinters.conf(5)\fR,
-\fIsubscriptions.conf(5)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cupsd.conf.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: cupsd.conf.man.in 12767 2015-06-30 15:57:39Z msweet $".
 .\"
index 69bdc23..5b16c8a 100644 (file)
 .\"
-.\" "$Id: cupsd.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: cupsd.man.in 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   cupsd man page for CUPS.
+.\" cupsd man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cupsd 8 "CUPS" "9 March 2009" "Apple Inc."
+.TH cupsd 8 "CUPS" "8 July 2014" "Apple Inc."
 .SH NAME
 cupsd \- cups scheduler
 .SH SYNOPSIS
 .B cupsd
-[ -c
+[
+.B \-c
 .I config-file
-] [ -f ] [ -F ] [ -h ] [ -l ] [ -t ]
+] [
+.B \-f
+] [
+.B \-F
+] [
+.B \-h
+] [
+.B -l
+] [
+.B -t
+]
 .SH DESCRIPTION
-\fIcupsd\fR is the scheduler for CUPS. It implements a printing system based
-upon the Internet Printing Protocol, version 2.1.  If no options are specified
-on the command-line then the default configuration file
-\fI@CUPS_SERVERROOT@/cupsd.conf\fR will be used.
+.B cupsd
+is the scheduler for CUPS. It implements a printing system based upon the Internet Printing Protocol, version 2.1. 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
--c config-file
-.br
+.BI \-c \ config-file
 Uses the named configuration file.
 .TP 5
--f
-.br
-Run \fIcupsd\fR in the foreground; the default is to run in the
-background as a "daemon".
+.B \-f
+Run
+.B cupsd
+in the foreground; the default is to run in the background as a "daemon".
 .TP 5
--F
-.br
-Run \fIcupsd\fR in the foreground but detach the process from the
-controlling terminal and current directory. This is useful for
-running \fIcupsd\fR from \fIinit(8)\fR.
+.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
--h
-.br
+.B \-h
 Shows the program usage.
 .TP 5
--l
-.br
-This option is passed to \fIcupsd\fR when it is run from
-\fIlaunchd(8)\fR.
+.B \-l
+This option is passed to
+.B cupsd
+when it is run from
+.BR launchd (8)
+or
+.BR systemd (8).
 .TP 5
--t
-.br
+.B \-t
 Test the configuration file for syntax errors.
-.SH COMPATIBILITY
-\fIcupsd\fR implements all of the required IPP/2.1 attributes and
-operations. It also implements several CUPS-specific administration
-operations.
+.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
-\fIbackend(7)\fR, \fIclasses.conf(5)\fR, \fIcups-deviced(8)\fR,
-\fIcups-driverd(8)\fR, \fIcups-lpd(8)\fR, \fIcups-polld(8)\fR,
-\fIcupsd.conf(5)\fR, \fIfilter(7)\fR, \fIlaunchd(8)\fR,
-\fImime.convs(5)\fR, \fImime.types(5)\fR, \fIprinters.conf(5)\fR,
-.br
-http://localhost:631/help
+.BR backend (7),
+.BR classes.conf (5),
+.BR cups (1),
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cupsd.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: cupsd.man.in 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 482a1e3..c81f4fd 100644 (file)
 .\"
-.\" "$Id: cupsenable.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: cupsenable.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   cupsenable/cupsdisable man page for CUPS.
+.\" cupsenable/cupsdisable man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cupsenable 8 "CUPS" "9 October 2008" "Apple Inc."
+.TH cupsenable 8 "CUPS" "11 June 2014" "Apple Inc."
 .SH NAME
 cupsdisable, cupsenable \- stop/start printers and classes
 .SH SYNOPSIS
 .B cupsdisable
-[ -E ] [-U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -c ] [ -h
-.I server[:port]
-] [ -r
+] [
+.B \-c
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-r
 .I reason
-] [ --hold ] destination(s)
+] [
+.B \-\-hold
+]
+.I destination(s)
 .br
 .B cupsenable
-[ -E ] [-U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -c ] [ -h
-.I server[:port]
-] [ --release ] destination(s)
+] [
+.B \-c
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-\-release
+]
+.I destination(s)
 .SH DESCRIPTION
-\fIcupsenable\fR starts the named printers or classes.
-.LP
-\fIcupsdisable\fR stops the named printers or classes.  The
-following options may be used:
+.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
--E
-.br
+.B \-E
 Forces encryption of the connection to the server.
 .TP 5
--U username
-.br
+\fB\-U \fIusername\fR
 Uses the specified username when connecting to the server.
 .TP 5
--c
-.br
+.B \-c
 Cancels all jobs on the named destination.
 .TP 5
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
 Uses the specified server and port.
 .TP 5
---hold
-.br
-Holds remaining jobs on the named printer.  Useful for allowing the current
-job to complete before performing maintenance.
+.B \-\-hold
+Holds remaining jobs on the named printer.
+Useful for allowing the current job to complete before performing maintenance.
 .TP 5
--r "reason"
-.br
-Sets the message associated with the stopped state. If no reason is specified
-then the message is set to "Reason Unknown".
+\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
---release
-.br
-Releases pending jobs for printing. Use after running \fIcupsdisable\fR with
-the \fI--hold\fR option to resume printing.
-.SH COMPATIBILITY
-Unlike the System V printing system, CUPS allows printer names to
-contain any printable character except SPACE, TAB, "/", or "#".
+.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 \fIdisable\fR and
-\fIenable\fR. They have been renamed to avoid conflicts with the
-\fIbash(1)\fR build-in commands of the same name.
+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 \fIdisable\fR and \fIenable\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.
+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
-\fIcupsaccept(8)\fR, \fIcupsreject(8)\fR, \fIcancel(1)\fR, \fIlp(1)\fR,
-\fIlpadmin(8)\fR, \fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 
 .\"
-.\" End of "$Id: cupsenable.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: cupsenable.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 5a67e4d..321d030 100644 (file)
 .\"
-.\" "$Id: cupsfilter.man 7936 2008-09-11 03:12:59Z mike $"
+.\" "$Id: cupsfilter.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   cupsfilter man page for CUPS.
+.\" cupsfilter man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
+.\" Copyright 2007-2014 by Apple Inc.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cupsfilter 8 "CUPS" "20 June 2012" "Apple Inc."
+.TH cupsfilter 8 "CUPS" "11 June 2014" "Apple Inc."
 .SH NAME
 cupsfilter \- convert a file to another format using cups filters
 .SH SYNOPSIS
 .B cupsfilter
-[ -D ] [ -U
+[
+.B \-\-list\-filters
+] [
+.B \-D
+] [
+.B \-U
 .I user
-] [ -c
+] [
+.B \-c
 .I config-file
-] [ -d
+] [
+.B \-d
 .I printer
-] [ -e ] [ -i
+] [
+.B \-e
+] [
+.B \-i
 .I mime/type
-] [ -j
+] [
+.B \-j
 .I job-id[,N]
-] [ -m
+] [
+.B \-m
 .I mime/type
-] [ -n
+] [
+.B \-n
 .I copies
-] [ -o
+] [
+.B \-o
 .I name=value
-] [ -p
+] [
+.B \-p
 .I filename.ppd
-] [ -t
+] [
+.B \-t
 .I title
-] [ -u ]
+] [
+.B \-u
+]
 .I filename
 .SH DESCRIPTION
-\fIcupsfilter\fR 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, \fIcupsfilter\fR generates a PDF file.
+.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
--D
-.br
+.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
--U user
-.br
+\fB\-U \fIuser\fR
 Specifies the username passed to the filters. The default is the name of the current user.
 .TP 5
--c config-file
-.br
-Uses the named cupsd.conf configuration file.
+\fB\-c \fIconfig-file\fR
+Uses the named cups-files.conf configuration file.
 .TP 5
--d printer
+\fB\-d \fIprinter\fR
 Uses information from the named printer.
 .TP 5
--e
-.br
+.B \-e
 Use every filter from the PPD file.
 .TP 5
--i mime/type
-.br
-Specifies the source file type. The default file type is guessed using the
-filename and contents of the file.
+\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
--j job-id[,N]
-.br
-Converts document N from the specified job. If N is omitted, document 1 is
-converted.
+\fB\-j \fIjob-id[,N]\fR
+Converts document N from the specified job. If N is omitted, document 1 is converted.
 .TP 5
--m mime/type
-.br
-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.
+\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
--n copies
-.br
+\fB\-n \fIcopies\fR
 Specifies the number of copies to generate.
 .TP 5
--o name=value
-.br
+\fB\-o \fIname=value\fR
 Specifies options to pass to the CUPS filters.
 .TP 5
--p filename.ppd
-.br
+\fB\-p \fIfilename.ppd\fR
 Specifies the PPD file to use.
 .TP 5
--t title
-.br
+\fB\-t \fItitle\fR
 Specifies the document title.
 .TP 5
--u
-.br
+.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
+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
-\fIcupsd.conf(5)\fR
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cupsfilter.man 7936 2008-09-11 03:12:59Z mike $".
+.\" End of "$Id: cupsfilter.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index ec08797..e6d7c66 100644 (file)
@@ -1,50 +1,51 @@
 .\"
-.\" "$Id: cupstestdsc.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: cupstestdsc.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   cupstestdsc man page for CUPS.
+.\" cupstestdsc man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cupstestdsc 1 "CUPS" "20 March 2006" "Apple Inc."
+.TH cupstestdsc 1 "CUPS" "11 June 2014" "Apple Inc."
 .SH NAME
-cupstestdsc \- test conformance of postscript files
+cupstestdsc \- test conformance of postscript files (deprecated)
 .SH SYNOPSIS
 .B cupstestdsc
-[ -h ] filename.ps [ ...
+[
+.B \-h
+]
+.I filename.ps
+[ ...
 .I filenameN.ps
 ]
 .br
 .B cupstestdsc
-[ -h ] -
+[
+.B \-h
+]
+.B \-
 .SH DESCRIPTION
-\fIcupstestdsc\fR tests the conformance of PostScript files to
-the Adobe PostScript Language Document Structuring Conventions
-Specification version 3.0. The results of testing and any other
-output are sent to the standard output. The second form of the
-command reads PostScript from the standard input.
-.SH LIMITATIONS
-\fIcupstestdsc\fR only validates the DSC comments in a PostScript
-file and does not attempt to validate the PostScript code itself.
-Developers must ensure that the PostScript they generate follows
-the rules defined by Adobe. Specifically, all pages must be
-independent of each other, code outside page descriptions may not
-affect the graphics state (current font, color, transform matrix,
-etc.), and device-specific commands such as setpagedevice should
-not be used.
+\fBcupstestdsc\fR tests the conformance of PostScript files to the Adobe PostScript Language Document Structuring Conventions Specification version 3.0.
+The results of testing and any other output are sent to the standard output.
+The second form of the command reads PostScript from the standard input.
+.SH NOTES
+\fIThis program is deprecated and will be removed in a future release of CUPS.\fR
+.LP
+\fBcupstestdsc\fR only validates the DSC comments in a PostScript file and does not attempt to validate the PostScript code itself.
+Developers must ensure that the PostScript they generate follows the rules defined by Adobe.
+Specifically, all pages must be independent of each other, code outside page descriptions may not affect the graphics state (current font, color, transform matrix, etc.), and device-specific commands such as setpagedevice should not be used.
 .SH SEE ALSO
-http://localhost:631/help
-.br
+CUPS Online Help (http://localhost:631/help),
 Adobe PostScript Language Document Structuring Conventions
 Specification, Version 3.0.
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cupstestdsc.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: cupstestdsc.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 2d66116..cf5f550 100644 (file)
 .\"
-.\" "$Id: cupstestppd.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: cupstestppd.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   cupstestppd man page for CUPS.
+.\" cupstestppd man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cupstestppd 1 "CUPS" "19 November 2009" "Apple Inc."
+.TH cupstestppd 1 "CUPS" "11 June 2014" "Apple Inc."
 .SH NAME
 cupstestppd \- test conformance of ppd files
 .SH SYNOPSIS
 .B cupstestppd
-[ -I
+[
+.B \-I
 .I category
-] [ -R
+] [
+.B \-R
 .I rootdir
-] [ -W
+] [
+.B \-W
 .I category
-] [ -q ] [-r] [ -v[v] ] filename.ppd[.gz] [ ... filenameN.ppd[.gz] ]
+] [
+.B \-q
+] [
+.B \-r
+] [
+\fB\-v\fR[\fBv\fR]
+]
+.I filename.ppd[.gz]
+[ ...
+.I filename.ppd[.gz]
+]
 .br
 .B cupstestppd
-[ -R
+[
+.B \-R
 .I rootdir
-] [ -W
+] [
+.B \-W
 .I category
-] [ -q ] [-r] [ -v[v] ] -
+] [
+.B \-q
+] [
+.B \-r
+] [
+\fB\-v\fR[\fBv\fR]
+]
+.B \-
 .SH DESCRIPTION
-\fIcupstestppd\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.
+\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 \fIcupstestppd\fR tests one or more PPD files
-on the command-line. The second form tests the PPD file provided
-on the standard input.
+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
-\fIcupstestppd\fR supports the following options:
+\fBcupstestppd\fR supports the following options:
 .TP 5
--I filename
-.br
+\fB\-I filename\fR
 Ignores all PCFileName warnings.
 .TP 5
--I filters
-.br
+\fB\-I filters\fR
 Ignores all filter errors.
 .TP 5
--I profiles
-.br
+\fB\-I profiles\fR
 Ignores all profile errors.
 .TP 5
--R rootdir
-.br
-Specifies an alternate root directory for the filter, pre-filter,
-and other support file checks.
+\fB\-R \fIrootdir\fR
+Specifies an alternate root directory for the filter, pre-filter, and other support file checks.
 .TP 5
--W constraints
-.br
+\fB\-W constraints\fR
 Report all UIConstraint errors as warnings.
 .TP 5
--W defaults
-.br
+\fB\-W defaults\fR
 Except for size-related options, report all default option errors as warnings.
 .TP 5
--W filters
-.br
+\fB\-W filters\fR
 Report all filter errors as warnings.
 .TP 5
--W profiles
-.br
+\fB\-W profiles\fR
 Report all profile errors as warnings.
 .TP 5
--W sizes
-.br
+\fB\-W sizes\fR
 Report all media size errors as warnings.
 .TP 5
--W translations
-.br
+\fB\-W translations\fR
 Report all translation errors as warnings.
 .TP 5
--W all
-.br
+\fB\-W all\fR
 Report all of the previous errors as warnings.
 .TP 5
--W none
-.br
+\fB\-W none\fR
 Report all of the previous errors as errors.
 .TP 5
--q
-.br
+.B \-q
 Specifies that no information should be displayed.
 .TP 5
--r
-.br
-Relaxes the PPD conformance requirements so that common
-whitespace, control character, and formatting problems are not
-treated as hard errors.
+.B \-r
+Relaxes the PPD conformance requirements so that common whitespace, control character, and formatting problems are not treated as hard errors.
 .TP 5
--v
-.br
-Specifies that detailed conformance testing results should be
-displayed rather than the concise PASS/FAIL/ERROR status.
+.B \-v
+Specifies that detailed conformance testing results should be displayed rather than the concise PASS/FAIL/ERROR status.
 .TP 5
--vv
-.br
-Specifies that all information in the PPD file should be
-displayed in addition to the detailed conformance testing
-results.
+.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
-\fIcupstestppd\fR returns zero on success and non-zero on error. The
-error codes are as follows:
+\fBcupstestppd\fR returns zero on success and non-zero on error.
+The error codes are as follows:
 .TP 5
 1
-.br
 Bad command-line arguments or missing PPD filename.
 .TP 5
 2
-.br
 Unable to open or read PPD file.
 .TP 5
 3
-.br
 The PPD file contains format errors that cannot be skipped.
 .TP 5
 4
-.br
 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:
+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
+    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:
+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 '{}' \\;
-
+    find . \-name \\*.ppd \\! \-exec cupstestppd \-q '{}' \\; \\
+        \-exec cupstestppd \-v '{}' \\;
 .fi
 .SH SEE ALSO
-\fIlpadmin(8)\fR,
-.br
-http://localhost:631/help
-.br
+.BR lpadmin (8),
+CUPS Online Help (http://localhost:631/help),
 Adobe PostScript Printer Description File Format Specification, Version 4.3.
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: cupstestppd.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: cupstestppd.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 9a79dbd..0d51e99 100644 (file)
 .\"
-.\" "$Id: filter.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: filter.man 12848 2015-08-26 18:51:57Z msweet $"
 .\"
-.\"   filter man page for CUPS.
+.\" filter man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2015 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH filter 7 "CUPS" "18 May 2012" "Apple Inc."
+.TH filter 7 "CUPS" "26 August 2015" "Apple Inc."
 .SH NAME
 filter \- cups file conversion filter interface
 .SH SYNOPSIS
 .B filter
-job user title num-copies options [
+.I job
+.I user
+.I title
+.I num-copies
+.I options
+[
 .I filename
 ]
+.nf
+
+\fB#include <cups/cups.h>\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 <cups/ppd.h>\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 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.
+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\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 (argv[0]) is set to the name of the destination printer but is
-also available in the PRINTER environment variable.
-.SH WARNING
-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 OS X) 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 \fIcupsfilter(8)\fR program to use the
-appropriate filters to do the conversions you need.
+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 passed on the command-line typically do not include the default choices
-the printer's PPD file. In addition, some options may be specified in multiple
-ways - "landscape" is a synonym for "orientation-requested=4", "media" is a
-synonym for "PageSize", "PageRegion", "InputSlot", and "MediaType", and "sides"
-is a synonym for the various "Duplex" options. Non-raster filters \fBmust\fR
-support both explicit and implicit specification of PPD options - use the
-ppdMarkDefaults and cupsMarkOptions functions in the CUPS library to use the
-correct mapping, and ppdFindMarkedChoice to get the user-selected choice.
+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
-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.
+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 stderr are generally logged to
-printer-state-message attribute and the current \fIErrorLog\fR.
+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
-ALERT: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "alert" log level.
+\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
-ATTR: attribute=value [attribute=value]
-.br
-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:
+\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
-CRIT: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "critical" log level.
+\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
-DEBUG: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "debug" log level.
+\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
-DEBUG2: message
+\fBDEBUG2: \fImessage\fR
 .br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "debug2" log level.
+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
-EMERG: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "emergency" log level.
+\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
-ERROR: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "error" log level.
+\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
-INFO: message
-.br
-Sets the printer-state-message attribute. If the current \fILogLevel\fR
-is set to "debug2", also adds the specified message to the
-current \fIErrorLog\fR using the "info" log level.
+\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
-NOTICE: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "notice" log level.
+\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
-PAGE: page-number #-copies
+\fBPAGE:\fI page-number #-copies\fR
 .TP 5
-PAGE: total #-pages
-.br
-Adds an entry to the current \fIPageLog\fR. The first form adds
-#-copies to the job-media-sheets-completed attribute. The second
-form sets the job-media-sheets-completed attribute to #-pages.
+\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
-PPD: Keyword=Value ... KeywordN=Value
-.br
-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.
+\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
-STATE: printer-state-reason [printer-state-reason ...]
+\fBSTATE:\fI printer-state-reason \fR[ \fI... printer-state-reason\fR ]
 .TP 5
-STATE: + printer-state-reason [printer-state-reason ...]
+\fBSTATE: +\fI printer-state-reason \fR[ \fI... printer-state-reason\fR ]
 .TP 5
-STATE: - printer-state-reason [printer-state-reason ...]
-.br
-Sets, adds, or removes printer-state-reason keywords to the
-current queue. Typically this is used to indicate media, ink, and
-toner conditions on a printer.
+\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
-WARNING: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "warning" log level.
+\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
-CHARSET
-.br
-The default text character set, typically utf-8.
+.B CHARSET
+The default text character set, typically "utf-8".
 .TP 5
-CLASS
-.br
-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.
+.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
-CONTENT_TYPE
-.br
-The MIME type associated with the file (e.g.
-application/postscript).
+.B CONTENT_TYPE
+The MIME media type associated with the submitted job file, for example "application/postscript".
 .TP 5
-CUPS_CACHEDIR
-.br
-The directory for semi-persistent cache files can be found.
+.B CUPS_CACHEDIR
+The directory where semi-persistent cache files can be found and stored.
 .TP 5
-CUPS_DATADIR
-.br
+.B CUPS_DATADIR
 The directory where data files can be found.
 .TP 5
-CUPS_FILETYPE
-.br
+.B CUPS_FILETYPE
 The type of file being printed: "job-sheet" for a banner page and "document"
 for a regular print file.
 .TP 5
-CUPS_MAX_MESSAGE
-.br
-The maximum size of a message sent to stderr, including any leading prefix and
-the trailing newline.
+.B CUPS_MAX_MESSAGE
+The maximum size of a message sent to \fIstderr\fR, including any leading prefix and the trailing newline.
 .TP 5
-CUPS_SERVERROOT
-.br
+.B CUPS_SERVERROOT
 The root directory of the server.
 .TP 5
-DEVICE_URI
-.br
-The device-uri associated with the printer.
-.TP 5
-FINAL_CONTENT_TYPE
-.br
-The MIME type associated with the printer (e.g.
-application/vnd.cups-postscript).
+.B FINAL_CONTENT_TYPE
+The MIME media type associated with the output destined for the printer, for example "application/vnd.cups-postscript".
 .TP 5
-LANG
-.br
+.B LANG
 The default language locale (typically C or en).
 .TP 5
-PATH
-.br
-The standard execution path for external programs that may be run by
-the filter.
+.B PATH
+The standard execution path for external programs that may be run by the filter.
 .TP 5
-PPD
-.br
-The full pathname of the PostScript Printer Description (PPD)
-file for this printer.
+.B PPD
+The full pathname of the PostScript Printer Description (PPD) file for this printer.
 .TP 5
-PRINTER
-.br
+.B PRINTER
 The name of the printer.
 .TP 5
-RIP_CACHE
-.br
-The recommended amount of memory to use for Raster Image
-Processors (RIPs).
+.B RIP_CACHE
+The recommended amount of memory to use for Raster Image Processors (RIPs).
 .TP 5
-SOFTWARE
-.br
-The name and version number of the server (typically CUPS/1.2).
+.B SOFTWARE
+The name and version number of the server (typically CUPS/\fImajor.minor\fR).
 .TP 5
-TZ
-.br
+.B TZ
 The timezone of the server.
 .TP 5
-USER
-.br
-The user executing the filter, typically "lp" or "root"; consult the
-\fIcupsd.conf(5)\fR file for the current setting.
-.SH COMPATIBILITY
+.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, it will only work with the System V interface script as the
 only filter.  Typically the interface script will be provided via the
 \fIlpadmin(8)\fR command using the \fI-i\fR option.
+.SH NOTES
+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 OS X) 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
-\fIbackend(7)\fR, \fIcupsd(8)\fR, \fIcupsfilter(8)\fR,
+.BR backend (7),
+.BR cups (1),
+.BR cups-files.conf (5),
+.BR cupsd (8),
+.BR cupsfilter (8),
 .br
-http://localhost:631/help
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: filter.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: filter.man 12848 2015-08-26 18:51:57Z msweet $".
 .\"
diff --git a/man/ippfind.man b/man/ippfind.man
new file mode 100644 (file)
index 0000000..df05050
--- /dev/null
@@ -0,0 +1,261 @@
+.\"
+.\" "$Id: ippfind.man 12854 2015-08-28 14:08:00Z msweet $"
+.\"
+.\" ippfind man page for CUPS.
+.\"
+.\" Copyright 2013-2014 by Apple Inc.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH ippfind 1 "CUPS" "11 June 2014" "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 \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-2015 by Apple Inc.
+.\"
+.\" End of "$Id: ippfind.man 12854 2015-08-28 14:08:00Z msweet $".
+.\"
index 16b1276..6dee72c 100644 (file)
 .\"
-.\" "$Id$"
+.\" "$Id: ipptool.man 12848 2015-08-26 18:51:57Z msweet $"
 .\"
-.\"   ipptool man page for CUPS.
+.\" ipptool man page for CUPS.
 .\"
-.\"   Copyright 2010-2013 by Apple Inc.
+.\" Copyright 2010-2015 by Apple Inc.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH ipptool 1 "CUPS" "9 November 2010" "Apple Inc."
+.TH ipptool 1 "CUPS" "26 August 2015" "Apple Inc."
 .SH NAME
-ipptool - perform internet printing protocol requests
+ipptool \- perform internet printing protocol requests
 .SH SYNOPSIS
 .B ipptool
-[ -4 ] [ -6 ] [ -C ] [ -E ] [ -I ] [ -L ] [ -S ] [ -T
+[
+.B \-\-help
+] [
+.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
-] [ -V
+] [
+.B \-V
 .I version
-] [ -X ] [ -c ] [ -d
+] [
+.B \-X
+] [
+.B \-c
+] [
+.B \-d
 .I name=value
-] [ -f
+] [
+.B \-f
 .I filename
-] [ -i
+] [
+.B \-i
 .I seconds
-] [ -n
+] [
+.B \-n
 .I repeat-count
-] [ -q ] [ -t ] [ -v ]
-.I URI
-.I filename
-[
-.I ... filenameN
+] [
+.B \-q
+] [
+.B \-t
+] [
+.B \-v ]
+.I printer-uri
+.I testfile
+[ ...
+.I testfile
 ]
 .SH DESCRIPTION
-\fIipptool\fR sends IPP requests to the specified URI and tests and/or displays the results. Each named file 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 file format is described in \fIipptoolfile(5)\fR.
+.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 \fIipptool\fR:
+The following options are recognized by
+.B ipptool:
+.TP 5
+.B \-\-help
+Shows program help.
+.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
--4
-Specifies that \fIipptool\fR must connect to the printer or server using IPv4.
+.B \-4
+Specifies that
+.B ipptool
+must connect to the printer or server using IPv4.
 .TP 5
--6
-Specifies that \fIipptool\fR must connect to the printer or server using IPv6.
+.B \-6
+Specifies that
+.B ipptool
+must connect to the printer or server using IPv6.
 .TP 5
--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.
+.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
--E
+.B \-E
 Forces TLS encryption when connecting to the server using the HTTP "Upgrade" header.
 .TP 5
--I
-Specifies that \fIipptool\fR will continue past errors.
+.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
--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.
+.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
--S
-Forces (dedicated) SSL encryption when connecting to the server.
+.B \-S
+Forces (dedicated) TLS encryption when connecting to the server.
 .TP 5
--T seconds
+.BI \-T \ seconds
 Specifies a timeout for IPP requests in seconds.
 .TP 5
--V version
+.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
--X
-Specifies that XML (Apple plist) output is desired instead of the plain text report. This option is incompatible with the \fI-i\fR (interval) and \fI-n\fR (repeat-count) options.
+.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
--c
-Specifies that CSV (comma-separated values) output is desired instead of the plain text output.
+.B \-c
+Specifies that CSV (comma\-separated values) output is desired instead of the plain text output.
 .TP 5
--d name=value
+.BI \-d \ name=value
 Defines the named variable.
 .TP 5
--f filename
+.BI \-f \ filename
 Defines the default request filename for tests.
 .TP 5
--i seconds
-Specifies that the (last) file should be repeated at the specified interval. This option is incompatible with the \fI-X\fR (XML plist output) option.
+.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
--l
+.B \-l
 Specifies that plain text output is desired.
 .TP 5
--n repeat-count
-Specifies that the (last) file should be repeated the specified number of times. This option is incompatible with the \fI-X\fR (XML plist output) option.
+.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
--t
+.B \-t
 Specifies that CUPS test report output is desired instead of the plain text output.
 .TP 5
--v
-Specifies that all request and response attributes should be output in CUPS test mode (\fI-t\fR). This is the default for XML output.
-.SH COMPATIBILITY
-The \fIipptool\fR program is unique to CUPS.
+.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
+
+    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 STANDARD FILES
-The following standard files are available:
-.nf
-    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-printer-attributes.test
-    gray.jpg
-    ipp-1.1.test
-    ipp-2.0.test
-    ipp-2.1.test
-    ipp-2.2.test
-    onepage-a4.pdf
-    onepage-a4.ps
-    onepage-letter.pdf
-    onepage-letter.ps
-    print-job.test
-    testfile.jpg
-    testfile.pdf
-    testfile.ps
-    testfile.txt
+
+    ipptool \-d recipient=mailto:user@example.com \\
+        ipp://localhost/printers/myprinter create\-printer\-subscription.test
 .fi
 .SH SEE ALSO
-\fIipptoolfile(5)\fR,
-.br
-http://localhost:631/help
+.BR ipptoolfile (5),
+CUPS Online Help (http://localhost:631/help),
+IANA IPP Registry (http://www.iana.org/assignments/ipp\-registrations),
+PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)
+RFC 2911 (http://tools.ietf.org/html/rfc2911),
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id$".
+.\" End of "$Id: ipptool.man 12848 2015-08-26 18:51:57Z msweet $".
 .\"
index a82e739..f9c5c41 100644 (file)
 .\"
-.\" "$Id$"
+.\" "$Id: ipptoolfile.man 12487 2015-02-05 15:42:59Z msweet $"
 .\"
-.\"   ipptoolfile man page for CUPS.
+.\" ipptoolfile man page for CUPS.
 .\"
-.\"   Copyright 2010-2013 by Apple Inc.
+.\" Copyright 2010-2014 by Apple Inc.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH ipptoolfile 5 "CUPS" "10 January 2013" "Apple Inc."
+.TH ipptoolfile 5 "CUPS" "4 February 2015" "Apple Inc."
 .SH NAME
 ipptoolfile \- ipptool file format
-
 .SH DESCRIPTION
-The \fIipptool(1)\fR 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:
+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 PostScript Job"
+      NAME "Print PostScript 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
+      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
       FILE testfile.ps
 
       # The response to expect
-      STATUS successful-ok
-      EXPECT attributes-charset OF-TYPE charset
-      EXPECT attributes-natural-language OF-TYPE naturalLanguage
-      EXPECT job-id OF-TYPE integer
-      EXPECT job-uri OF-TYPE uri
+      STATUS successful\-ok
+      EXPECT job\-id OF\-TYPE integer WITH\-VALUE >0
+      EXPECT job\-uri OF\-TYPE uri
     }
     {
       # The name of the test
       NAME "Get Attributes of PostScript Job"
 
       # 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
+      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 attributes-charset OF-TYPE charset
-      EXPECT attributes-natural-language OF-TYPE naturalLanguage
-      EXPECT job-id OF-TYPE integer
-      EXPECT job-uri OF-TYPE uri
-      EXPECT job-state OF-TYPE enum
-      EXPECT job-originating-user-name OF-TYPE name WITH-VALUE "$user"
+      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 3,4,5,6,7,8,9
+      EXPECT job\-originating\-user\-name OF\-TYPE name WITH\-VALUE "$user"
     }
 .fi
-
-.SH TOP-LEVEL DIRECTIVES
-The following directives can be used outside of a test:
+.SS TOP-LEVEL DIRECTIVES
+The following directives can be used outside of a \fItest\fR:
 .TP 5
-{ test }
+\fB{ \fItest \fB}\fR
 Defines a test.
 .TP 5
-DEFINE variable-name value
-Defines the named variable to the given value. This is equivalent to specifying
-"-d variable-name=value" on the \fIipptool\fR command-line.
+\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
-DEFINE-DEFAULT variable-name value
-Defines the named variable to the given value if it does not already have a
-value.
+\fBFILE\-ID "\fIidentifier\fB"\fR
+Specifies an identifier string for the current file.
 .TP 5
-IGNORE-ERRORS yes
+\fBIGNORE\-ERRORS yes\fR
 .TP 5
-IGNORE-ERRORS no
-Specifies whether, by default, \fIipptool\fR will ignore errors and continue with
-subsequent tests.
+\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
-INCLUDE "filename"
+\fBINCLUDE\-IF\-DEFINED \fIname \fB"\fIfilename\fB"\fR
 .TP 5
-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 \fIipptool\fR
+\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
-INCLUDE-IF-DEFINED name "filename"
+\fBINCLUDE\-IF\-NOT\-DEFINED \fIname \fB"\fIfilename\fB"\fR
 .TP 5
-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 \fIipptool\fR include directory.
+\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
-INCLUDE-IF-NOT-DEFINED name "filename"
+\fBSKIP\-IF\-DEFINED \fIvariable-name\fR
 .TP 5
-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 \fIipptool\fR include directory.
+\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
-SKIP-IF-DEFINED variable-name
+\fBSTOP\-AFTER\-INCLUDE\-ERROR no\fR
 .TP 5
-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.
+\fBSTOP\-AFTER\-INCLUDE\-ERROR yes\fR
+Specifies whether tests will be stopped after an error in an included file.
 .TP 5
-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.
+\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
-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
-\fIipptool\fR command-line. Support for chunked requests is required for
-conformance with all versions of IPP.
+\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
-TRANSFER length
-Specifies that tests will, by default, use the HTTP/1.0 "Content-Length:"
-header. This is equivalent to specifying "-l" on the \fIipptool\fR command-line.
-Support for content length requests is required for conformance with all
-versions of IPP.
+\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
-VERSION 1.0
+\fBVERSION 1.0\fR
 .TP 5
-VERSION 1.1
+\fBVERSION 1.1\fR
 .TP 5
-VERSION 2.0
+\fBVERSION 2.0\fR
 .TP 5
-VERSION 2.1
+\fBVERSION 2.1\fR
 .TP 5
-VERSION 2.2
+\fBVERSION 2.2\fR
 Specifies the default IPP version number to use for the tests that follow.
-
-.SH TEST DIRECTIVES
-The following directives are understood in a test:
+.SS TEST DIRECTIVES
+The following directives are understood within a \fItest\fR:
+.TP 5
+\fBATTR \fItag attribute-name value(s)\fR
+Adds an attribute to the test request. Values are separated 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
-ATTR tag attribute-name value(s)
-Adds an attribute to the test request. Values are separated by the comma (",")
-character - escape commas using the "\" character.
+\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
-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.
+\fBCOMPRESSION deflate\fR
 .TP 5
-DELAY seconds
+\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
 Specifies a delay before this test will be run.
 .TP 5
-DISPLAY attribute-name
+\fBDISPLAY \fIattribute-name\fR
 Specifies that value of the named attribute should be output as part of the
 test report.
 .TP 5
-EXPECT attribute-name [ predicate(s) ]
+\fBEXPECT \fIattribute-name \fR[ \fIpredicate(s) \fR]
+.TP 5
+\fBEXPECT ?\fIattribute-name predicate(s)\fR
 .TP 5
-EXPECT ?attribute-name predicate(s)
+\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
-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.
+\fBEXPECT-ALL \fIattribute-name \fR[ \fIpredicate(s) \fR]
 .TP 5
-FILE filename
-Specifies a file to include at the end of the request. This is typically used
-when sending a test print file.
+\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
-GROUP tag
+\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
-IGNORE-ERRORS yes
+\fBIGNORE\-ERRORS yes\fR
 .TP 5
-IGNORE-ERRORS no
-Specifies whether \fIipptool\fR will ignore errors and continue with subsequent
-tests.
+\fBIGNORE\-ERRORS no\fR
+Specifies whether
+.BR ipptool (8)
+will ignore errors and continue with subsequent tests.
 .TP 5
-NAME "literal string"
+\fBNAME "\fIliteral string\fB"\fR
 Specifies the human-readable name of the test.
 .TP 5
-OPERATION operation-code
+\fBOPERATION \fIoperation-code\fR
 Specifies the operation to be performed.
 .TP 5
-REQUEST-ID number
+\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
-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).
+\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
-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 \fIipptool\fR program.
+\fBSKIP\-IF\-DEFINED \fIvariable-name\fR
 .TP 5
-SKIP-IF-DEFINED variable-name
+\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
-SKIP-IF-NOT-DEFINED variable-name
-Specifies that the current test should be skipped when the variable is or is not
-defined.
+\fBSKIP\-PREVIOUS\-ERROR yes\fR
 .TP 5
-SKIP-PREVIOUS-ERROR yes
+\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
-SKIP-PREVIOUS-ERROR no
-Specifies whether \fIipptool\fR will skip the current test if the previous test
-resulted in an error/failure.
+\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
-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.
+\fBTEST\-ID "\fIidentifier\fR"
+Specifies an identifier string for the current test.
 .TP 5
-TRANSFER auto
-Specifies that this test will use "Transfer-Encoding: chunked" if it has an
-attached file or "Content-Length:" otherwise.
+\fBTRANSFER auto\fR
+Specifies that this test will use "Transfer-Encoding: chunked" if it has an attached file or "Content-Length:" otherwise.
 .TP 5
-TRANSFER chunked
-Specifies that this test will use the HTTP/1.1 "Transfer-Encoding: chunked"
-header.
+\fBTRANSFER chunked\fR
+Specifies that this test will use the HTTP/1.1 "Transfer-Encoding: chunked" header.
 .TP 5
-TRANSFER length
+\fBTRANSFER length\fR
 Specifies that this test will use the HTTP/1.0 "Content-Length:" header.
 .TP 5
-VERSION 1.0
+\fBVERSION 1.0\fR
 .TP 5
-VERSION 1.1
+\fBVERSION 1.1\fR
 .TP 5
-VERSION 2.0
+\fBVERSION 2.0\fR
 .TP 5
-VERSION 2.1
+\fBVERSION 2.1\fR
 .TP 5
-VERSION 2.2
+\fBVERSION 2.2\fR
 Specifies the IPP version number to use for this test.
-
-.SH EXPECT PREDICATES
-The following predicates are understood following the EXPECT test directive:
+.SS EXPECT PREDICATES
+The following predicates are understood following the \fBEXPECT\fR test directive:
 .TP 5
-COUNT number
-Requires the EXPECT attribute to have the specified number of values.
+\fBCOUNT \fInumber\fR
+Requires the \fBEXPECT\fR attribute to have the specified number of values.
 .TP 5
-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.
+\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
-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.
+\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
-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.
+\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
-IF-DEFINED variable-name
-Makes the EXPECT conditions apply only if the specified variable is defined.
+\fBIF\-DEFINED \fIvariable-name\fR
+Makes the \fBEXPECT\fR conditions apply only if the specified variable is defined.
 .TP 5
-IF-NOT-DEFINED variable-name
-Makes the EXPECT conditions apply only if the specified variable is not
-defined.
+\fBIF\-NOT\-DEFINED \fIvariable-name\fR
+Makes the \fBEXPECT\fR conditions apply only if the specified variable is not defined.
 .TP 5
-IN-GROUP tag
-Requires the EXPECT attribute to be in the specified group tag.
+\fBIN\-GROUP \fItag\fR
+Requires the \fBEXPECT\fR attribute to be in the specified group tag.
 .TP 5
-OF-TYPE tag[,tag,...]
-Requires the EXPECT attribute to use the specified value tag(s).
+\fBOF\-TYPE \fItag[,tag,...]\fR
+Requires the \fBEXPECT\fR attribute to use one of the specified value tag(s).
 .TP 5
-REPEAT-LIMIT number
+\fBREPEAT\-LIMIT \fInumber\fR
 .br
-Specifies the maximum number of times to repeat. The default value is 1000.
+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
-REPEAT-MATCH
+\fBREPEAT\-MATCH\fR
 .TP 5
-REPEAT-NO-MATCH
-Specifies that the current test should be repeated when the EXPECT condition
-matches or does not match.
+\fBREPEAT\-NO\-MATCH\fR
+Specifies that the current test should be repeated when the \fBEXPECT\fR condition matches or does not match.
 .TP 5
-SAME-COUNT-AS attribute-name
-Requires the EXPECT attribute to have the same number of values as the specified
-parallel attribute.
+\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
-WITH-ALL-VALUES "literal string"
-Requires that all values of the EXPECT attribute match the literal string. Comparisons are case-sensitive.
+\fBWITH\-ALL\-HOSTNAMES "\fIliteral string\fB"\fR
 .TP 5
-WITH-ALL-VALUES <number
+\fBWITH\-ALL\-HOSTNAMES "/\fIregular expression\fB/"\fR
+Requires that all URI values contain a matching hostname.
 .TP 5
-WITH-ALL-VALUES =number
+\fBWITH\-ALL\-RESOURCES "\fIliteral string\fB"\fR
 .TP 5
-WITH-ALL-VALUES >number
+\fBWITH\-ALL\-RESOURCES "/\fIregular expression\fB/"\fR
+Requires that all URI values contain a matching resource (including leading /).
 .TP 5
-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.
+\fBWITH\-ALL\-SCHEMES "\fIliteral string\fB"\fR
 .TP 5
-WITH-ALL-VALUES "false"
+\fBWITH\-ALL-SCHEMES "/\fIregular expression\fB/"\fR
+Requires that all URI values contain a matching scheme.
 .TP 5
-WITH-ALL-VALUES "true"
-Requires that all values of the EXPECT attribute match the boolean value given.
+\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
-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.
+\fBWITH\-ALL\-VALUES <\fInumber\fR
 .TP 5
-WITH-VALUE "literal string"
-Requires that at least one value of the EXPECT attribute matches the literal string. Comparisons are case-sensitive.
+\fBWITH\-ALL\-VALUES =\fInumber\fR
 .TP 5
-WITH-VALUE <number
+\fBWITH\-ALL\-VALUES >\fInumber\fR
 .TP 5
-WITH-VALUE =number
+\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
-WITH-VALUE >number
+\fBWITH\-ALL\-VALUES "false"\fR
 .TP 5
-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.
+\fBWITH\-ALL\-VALUES "true"\fR
+Requires that all values of the \fBEXPECT\fR attribute match the boolean value given.
 .TP 5
-WITH-VALUE "false"
+\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
-WITH-VALUE "true"
-Requires that at least one value of the EXPECT attribute matches the boolean value given.
+\fBWITH\-HOSTNAME "\fIliteral string\fB"\fR
 .TP 5
-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.
-
-.SH STATUS PREDICATES
-The following predicates are understood following the STATUS test directive:
+\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
-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.
+\fBWITH\-VALUE <\fInumber\fR
 .TP 5
-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.
+\fBWITH\-VALUE =\fInumber\fR
 .TP 5
-IF-DEFINED variable-name
-Makes the STATUS apply only if the specified variable is defined.
+\fBWITH\-VALUE >\fInumber\fR
 .TP 5
-IF-NOT-DEFINED variable-name
-Makes the STATUS apply only if the specified variable is not defined.
+\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
-REPEAT-LIMIT number
+\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
-REPEAT-MATCH
+\fBREPEAT\-MATCH\fR
 .TP 5
-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.
-
-.SH OPERATION CODES
-Operation codes correspond to the hexadecimal numbers (0xHHHH) and names from
-RFC 2911 and other IPP extension specifications. Here is a complete list:
+\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 2911 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-Subscription
-    Create-Printer-Subscription
-    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-Notifications
-    Send-URI
-    Set-Job-Attributes
-    Set-Printer-Attributes
-    Shutdown-Printer
-    Startup-Printer
-    Suspend-Current-Job
-    Validate-Document
-    Validate-Job
-.fi
 
-.SH STATUS CODES
-Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC
-2911 and other IPP extension specifications. Here is a complete list:
-.nf
-    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-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
+    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 2911 and other IPP extension specifications. Here is a complete list of the names supported by
+.BR ipptool (8):
+.nf
 
-.SH TAGS
-Value and group tags correspond to the names from RFC 2911 and other IPP
-extension specifications. Here are the group tags:
+    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 2911 and other IPP extension specifications. Here are the group tags:
 .nf
-    event-notification-attributes-tag
-    job-attributes-tag
-    operation-attributes-tag
-    printer-attributes-tag
-    subscription-attributes-tag
-    unsupported-attributes-tag
+
+    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
+
+    admin\-define
     boolean
     charset
     collection
     dateTime
     default
-    delete-attribute
+    delete\-attribute
     enum
     integer
     keyword
@@ -500,8 +543,8 @@ Here are the value tags:
     nameWithLanguage
     nameWithoutLanguage
     naturalLanguage
-    no-value
-    not-settable
+    no\-value
+    not\-settable
     octetString
     rangeOfInteger
     resolution
@@ -512,63 +555,71 @@ Here are the value tags:
     uri
     uriScheme
 .fi
-
-.SH VARIABLES
-The \fIipptool\fR 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:
+.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
-$ENV[name]
-Inserts the value of the named environment variable, or an empty string if the
-environment variable is not defined.
+\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
-$filename
-Inserts the filename provided to \fIipptool\fR with the "-f" option.
+\fB$filename\fR
+Inserts the filename provided to
+.BR ipptool (8)
+with the \fI-f\fR option.
 .TP 5
-$hostname
-Inserts the hostname from the URI provided to \fIipptool\fR.
+\fB$filetype\fR
+Inserts the MIME media type for the filename provided to
+.BR ipptool (8)
+with the \fI-f\fR option.
 .TP 5
-$job-id
-Inserts the last job-id value returned in a test response or 0 if no job-id has
-been seen.
+\fB$hostname\fR
+Inserts the hostname from the URI provided to
+.BR ipptool (8).
 .TP 5
-$job-uri
-Inserts the last job-uri value returned in a test response or an empty string if
-no job-uri has been seen.
+\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
-$scheme
-Inserts the scheme from the URI provided to \fIipptool\fR.
+\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
-$notify-subscription-id
-Inserts the last notify-subscription-id value returned in a test response or 0 if
-no notify-subscription-id has been seen.
+\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
-$port
-Inserts the port number from the URI provided to \fIipptool\fR.
+\fB$port\fR
+Inserts the port number from the URI provided to
+.BR ipptool (8).
 .TP 5
-$resource
-Inserts the resource path from the URI provided to \fIipptool\fR.
+\fB$resource\fR
+Inserts the resource path from the URI provided to
+.BR ipptool (8).
 .TP 5
-$uri
-Inserts the URI provided to \fIipptool\fR.
+\fB$scheme\fR
+Inserts the scheme from the URI provided to
+.BR ipptool (8).
 .TP 5
-$user
-Inserts the current user's login name.
+\fB$uri\fR
+Inserts the URI provided to
+.BR ipptool (8).
 .TP 5
-$username
-Inserts the username from the URI provided to \fIipptool\fR, if any.
-
+\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
-\fIipptool(1)\fR,
-.br
-http://localhost:631/help
-
+.BR ipptool (1),
+CUPS Online Help (http://localhost:631/help),
+IANA IPP Registry (http://www.iana.org/assignments/ipp-registrations),
+PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp),
+RFC 2911 (http://tools.ietf.org/html/rfc3911)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id$".
+.\" End of "$Id: ipptoolfile.man 12487 2015-02-05 15:42:59Z msweet $".
 .\"
index 9846624..cd4237b 100644 (file)
 .\"
-.\" "$Id: lp.man 7889 2008-08-29 22:03:35Z mike $"
+.\" "$Id: lp.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   lp man page for CUPS.
+.\" lp man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH lp 1 "CUPS" "16 July 2012" "Apple Inc."
+.TH lp 1 "CUPS" "11 June 2014" "Apple Inc."
 .SH NAME
-lp - print files
+lp \- print files
 .SH SYNOPSIS
 .B lp
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -c ] [ -d
-.I destination[/instance]
-] [ -h
-.I hostname[:port]
-] [ -m ] [ -n
+] [
+.B \-c
+] [
+\fB\-d \fIdestination\fR[\fB/\fIinstance\fR]
+] [
+\fB\-h \fIhostname\fR[\fB:\fIport\fR]
+] [
+.B \-m
+] [
+.B \-n
 .I num-copies
-] [ -o
-.I option[=value]
-] [ -q
+] [
+\fB\-o \fIoption\fR[\fB=\fIvalue\fR]
+] [
+.B \-q
 .I priority
-] [ -s ] [ -t
+] [
+.B \-s
+] [
+.B \-t
 .I title
-] [ -H
+] [
+.B \-H
 .I handling
-] [ -P
+] [
+.B \-P
 .I page-list
-] [ -- ] [
+] [
+.B \-\-
+] [
 .I file(s)
 ]
 .br
 .B lp
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -c ] [ -h
-.I hostname[:port]
-] [ -i
+] [
+.B \-c
+] [
+\fB\-h \fIhostname\fR[\fB:\fIport\fR]
+] [
+.B \-i
 .I job-id
-] [ -n
+] [
+.B \-n
 .I num-copies
-] [ -o
-.I option[=value]
-] [ -q
+] [
+\fB\-o \fIoption\fR[\fB=\fIvalue\fR]
+] [
+.B \-q
 .I priority
-] [ -t
+] [
+.B \-t
 .I title
-] [ -H
+] [
+.B \-H
 .I handling
-] [ -P
+] [
+.B \-P
 .I page-list
 ]
 .SH DESCRIPTION
-\fIlp\fR submits files for printing or alters a pending job. Use
-a filename of "-" to force printing from the standard input.
-.SH 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 \fIlpoptions(1)\fR command is used,
-followed by the default set using the \fIlpadmin(8)\fR command.
+\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
---
-.br
-Marks the end of options; use this to print a file whose name
-begins with a dash (-).
+.B \-\-
+Marks the end of options; use this to print a file whose name begins with a dash (\-).
 .TP 5
--E
-.br
+.B \-E
 Forces encryption when connecting to the server.
 .TP 5
--U username
-.br
+\fB\-U \fIusername\fR
 Specifies the username to use when connecting to the server.
 .TP 5
--c
-.br
-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.
+.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
--d destination
-.br
+\fB\-d \fIdestination\fR
 Prints files to the named printer.
 .TP 5
--h hostname[:port]
-.br
+\fB\-h \fIhostname\fR[\fB:\fIport\fR]
 Chooses an alternate server.
 .TP 5
--i job-id
-.br
+\fB\-i \fIjob-id\fR
 Specifies an existing job to modify.
 .TP 5
--m
-.br
+.B \-m
 Sends an email when the job is completed.
 .TP 5
--n copies
-.br
-Sets the number of copies to print from 1 to 100.
+\fB\-n \fIcopies\fR
+Sets the number of copies to print.
 .TP 5
--o "name=value [name=value ...]"
-.br
+\fB\-o "\fIname\fB=\fIvalue \fR[ ... \fIname\fB=\fIvalue \fR]\fB"\fR
 Sets one or more job options.
 .TP 5
--q priority
-.br
-Sets the job priority from 1 (lowest) to 100 (highest). The
-default priority is 50.
+\fB\-q \fIpriority\fR
+Sets the job priority from 1 (lowest) to 100 (highest).
+The default priority is 50.
 .TP 5
--s
-.br
+.B \-s
 Do not report the resulting job IDs (silent mode.)
 .TP 5
--t "name"
-.br
+\fB\-t "\fIname\fB"\fR
 Sets the job name.
 .TP 5
--H hh:mm
+\fB\-H \fIhh:mm\fR
 .TP 5
--H hold
+\fB\-H hold\fR
 .TP 5
--H immediate
+\fB-H immediate\fR
 .TP 5
--H restart
+\fB-H restart\fR
 .TP 5
--H resume
-.br
-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
--P page-list
-.br
-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.
-.SH COMMON JOB OPTIONS
-Aside from the printer-specific options reported by the
-\fIlpoptions(1)\fR command, the following generic options are
-available:
+\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
--o media=size
-.br
-Sets the page size to \fIsize\fR. Most printers support at least
-the size names "a4", "letter", and "legal".
+\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
--o landscape
+\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
--o orientation-requested=4
-.br
+\fB\-o orientation\-requested=4\fR
 Prints the job in landscape (rotated 90 degrees).
 .TP 5
--o sides=one-sided
+\fB\-o sides=one\-sided\fR
+Prints on one side of the paper.
 .TP 5
--o sides=two-sided-long-edge
+\fB\-o sides=two\-sided\-long\-edge\fR
+Prints on both sides of the paper for portrait output.
 .TP 5
--o sides=two-sided-short-edge
-.br
-Prints on one or two sides of the paper. The value
-"two-sided-long-edge" is normally used when printing portrait
-(unrotated) pages, while "two-sided-short-edge" is used for
-landscape pages.
+\fB\-o sides=two\-sided\-short\-edge\fR
+Prints on both sides of the paper for landscape output.
 .TP 5
--o fit-to-page
-.br
+\fB\-o fit\-to\-page\fR
 Scales the print file to fit on the page.
 .TP 5
--o number-up=2
-.TP 5
--o number-up=4
-.TP 5
--o number-up=6
-.TP 5
--o number-up=9
-.TP 5
--o number-up=16
-.br
-Prints multiple document pages on each output page.
-.TP 5
--o cpi=N
-.br
-Sets the number of characters per inch to use when printing a
-text file. The default is 10.
-.TP 5
--o lpi=N
-.br
-Sets the number of lines per inch to use when printing a text
-file. The default is 6.
-.TP 5
--o page-bottom=N
-.TP 5
--o page-left=N
-.TP 5
--o page-right=N
-.TP 5
--o page-top=N
-.br
-Sets the page margins when printing text files. The values are in
-points - there are 72 points to the inch.
+\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.
+.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 a double-sided legal document to a printer called "foo":
+Print two copies of a document to the default printer:
 .nf
-    lp -d foo -o media=legal -o sides=two-sided-long-edge filename
+
+    lp -n 2 filename
+
 .fi
-.LP
-Print an image across 4 pages:
+Print a double-sided legal document to a printer called "foo":
 .nf
-    lp -d bar -o scaling=200 filename
+
+    lp -d foo -o media=legal -o sides=two-sided-long-edge filename
+
 .fi
-.LP
-Print a text file with 12 characters per inch, 8 lines per inch, and
-a 1 inch left margin:
+Print a presentation document 2-up to a printer called "foo":
 .nf
-    lp -d bar -o cpi=12 -o lpi=8 -o page-left=72 filename
+
+    lp -d foo -o number-up=2 filename
 .fi
-.SH COMPATIBILITY
-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 "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).
 .SH SEE ALSO
-\fIcancel(1)\fR, \fIlpadmin(8)\fR, \fIlpmove(8)\fR, \fIlpoptions(1)\fR,
-\fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: lp.man 7889 2008-08-29 22:03:35Z mike $".
+.\" End of "$Id: lp.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 0ec81b0..1790022 100644 (file)
 .\"
-.\" "$Id: lpadmin.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: lpadmin.man 12513 2015-02-11 19:45:01Z msweet $"
 .\"
-.\"   lpadmin man page for CUPS.
+.\" lpadmin man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2015 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH lpadmin 8 "CUPS" "16 July 2012" "Apple Inc."
+.TH lpadmin 8 "CUPS" "11 February 2015" "Apple Inc."
 .SH NAME
 lpadmin \- configure cups printers and classes
 .SH SYNOPSIS
 .B lpadmin
-[ -E ] [-U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
-.I server[:port]
-] -d
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+]
+.B \-d
 .I destination
 .br
 .B lpadmin
-[ -E ] [-U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
-.I server[:port]
-] -p
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+]
+.B \-p
 .I destination
-[ -R
+[
+.B \-R
 .I name-default
 ]
 .I option(s)
 .br
 .B lpadmin
-[ -E ] [-U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
-.I server[:port]
-] -x
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+]
+.B \-x
 .I destination
 .SH DESCRIPTION
-\fIlpadmin\fR configures printer and class queues provided by
-CUPS. It can also be used to set the server default printer or
-class.
+\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.
+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 \fIlp(1)\fR or \fIlpr(1)\fR commands will use this
-destination unless the user specifies otherwise with the
-\fIlpoptions(1)\fR command.
+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.
+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 CONFIGURATION OPTIONS
-The following options are recognized when configuring a printer
-queue:
-.TP 5
--c class
-.br
-Adds the named \fIprinter\fR to \fIclass\fR.  If \fIclass\fR does
-not exist it is created automatically.
+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
--i interface
-.br
-Sets a System V style interface script for the printer. This
-option cannot be specified with the \fI-P\fR option (PPD file)
-and is intended for providing support for legacy printer drivers.
+\fB\-c \fIclass\fR
+Adds the named \fIprinter\fR to \fIclass\fR.
+If \fIclass\fR does not exist it is created automatically.
 .TP 5
--m model
-.br
-Sets a standard System V interface script or 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 \fIlpinfo(8)\fR command to get a list of supported models.
+\fB\-i \fIinterface\fR
+Sets a System V style interface script for the printer.
+This option cannot be specified with the \fI-P\fR option (PPD file) and is intended for providing support for legacy printer drivers.
 .TP 5
--o cupsIPPSupplies=true
+\fB\-m \fImodel\fR
+Sets a standard System V interface script or 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 interface script or PPD file and the model "everywhere" queries the printer referred to by the specified IPP \fIdevice-uri\fR.
 .TP 5
--o cupsIPPSupplies=false
-.br
+\fB\-o cupsIPPSupplies=true\fR
+.TP 5
+\fB\-o cupsIPPSupplies=false\fR
 Specifies whether IPP supply level values should be reported.
 .TP 5
--o cupsSNMPSupplies=true
+\fB\-o cupsSNMPSupplies=true\fR
 .TP 5
--o cupsSNMPSupplies=false
-.br
+\fB\-o cupsSNMPSupplies=false\fR
 Specifies whether SNMP supply level (RFC 3805) values should be reported.
 .TP 5
--o job-k-limit=value
-.br
-Sets the kilobyte limit for per-user quotas. The value is an
-integer number of kilobytes; one kilobyte is 1024 bytes.
+\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
--o job-page-limit=value
-.br
-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.
+\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
--o job-quota-period=value
-.br
-Sets the accounting period for per-user quotas. The value is an
-integer number of seconds; 86,400 seconds are in one day.
+\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
--o job-sheets-default=banner
+\fB\-o job\-sheets\-default=\fIbanner\fR
 .TP 5
--o job-sheets-default=banner,banner
-.br
+\fB\-o job\-sheets\-default=\fIbanner\fB,\fIbanner\fR
 Sets the default banner page(s) to use for print jobs.
 .TP 5
--o name=value
-.br
-Sets a PPD option for the printer. PPD options can be listed using the \fI-l\fR
-option with the \fIlpoptions(1)\fR command.
-.TP 5
--o name-default=value
-.br
-Sets a default server-side option for the destination. Any print-time
-option can be defaulted, e.g. "-o cpi-default=17" to set the default
-"cpi" option value to 17.
-.TP 5
--o port-monitor=name
-.br
-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
--o printer-error-policy=name
-.br
-Sets the error policy to be used when the printer backend is
-unable to send the job to the printer. The name must be one of
-"abort-job", "retry-job", "retry-current-job", or "stop-printer". The default
-error policy is "stop-printer" for printers and "retry-current-job" for
+\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 error policy to be used when the printer backend is unable to send the job to the printer.
+The name must be one of "abort-job", "retry-job", "retry-current-job", or "stop-printer".
+The default error policy is "stop-printer" for printers and "retry-current-job" for
 classes.
 .TP 5
--o printer-is-shared=true/false
-.br
+\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
-\fBcupsd.conf\fR, while unshared/unpublished destinations are not
-announced. The default value is "true".
+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
--o printer-op-policy=name
-.br
-Sets the IPP operation policy associated with the destination. The
-name must be defined in the \fBcupsd.conf\fR in a Policy section.
+\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
--R name-default
-.br
+\fB\-R \fIname\fB\-default\fR
 Deletes the named option from \fIprinter\fR.
 .TP 5
--r class
-.br
-Removes the named \fIprinter\fR from \fIclass\fR.  If the
-resulting class becomes empty it is removed.
+\fB\-r \fIclass\fR
+Removes the named \fIprinter\fR from \fIclass\fR.
+If the resulting class becomes empty it is removed.
 .TP 5
--u allow:user,user,@group
+\fB-u allow:\fR{\fIuser\fR|\fB@\fIgroup\fR}{\fB,\fIuser\fR|\fB,@\fIgroup\fR}*
 .TP 5
--u deny:user,user,@group
+\fB-u deny:\fR{\fIuser\fR|\fB@\fIgroup\fR}{\fB,\fIuser\fR|\fB,@\fIgroup\fR}*
 .TP 5
--u allow:all
+\fB\-u allow:all\fR
 .TP 5
--u deny:none
-.br
-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.
+\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.
 .TP 5
--v "device-uri"
-.br
-Sets the \fIdevice-uri\fR attribute of the printer queue. Use the \fI-v\fR
-option with the \fIlpinfo(8)\fR command to get a list of supported device URIs
-and schemes.
+\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
--D "info"
-.br
+\fB\-D "\fIinfo\fB"\fR
 Provides a textual description of the destination.
 .TP 5
--E
-.br
+.B \-E
 Enables the destination and accepts jobs; this is the same as running the
-\fIcupsaccept(8)\fR and \fIcupsenable(8)\fR programs on the destination.
+.BR cupsaccept (8)
+and
+.BR cupsenable (8)
+programs on the destination.
 .TP 5
--L "location"
-.br
+\fB\-L "\fIlocation\fB"\fR
 Provides a textual location of the destination.
 .TP 5
--P ppd-file
-.br
-Specifies a PostScript Printer Description file to use with the
-printer. If specified, this option overrides the \fI-i\fR option
-(interface script).
-.SH COMPATIBILITY
-Unlike the System V printing system, CUPS allows printer names to
-contain any printable character except SPACE, TAB, "/", or "#".
+\fB\-P \fIppd-file\fR
+Specifies a PostScript Printer Description file to use with the printer.
+If specified, this option overrides the \fI-i\fR option (interface script).
+.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.
-Finally, the CUPS version of \fIlpadmin\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 LIMITATIONS
-The CUPS version of \fIlpadmin\fR does not support all of the
-System V or Solaris printing system configuration options.
+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
+The CUPS version of \fBlpadmin\fR does not support all of the System V or Solaris printing system configuration options.
+.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
-\fIcupsaccept(8)\fR, \fIcupsenable(8)\fR, \fIlpinfo(8)\fR,
-\fIlpoptions(1)\fR,
-.br
-http://localhost:631/help
+.BR cupsaccept (8),
+.BR cupsenable (8),
+.BR lpinfo (8),
+.BR lpoptions (1),
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: lpadmin.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: lpadmin.man 12513 2015-02-11 19:45:01Z msweet $".
 .\"
index 8d5245c..4286b01 100644 (file)
@@ -1,18 +1,18 @@
 .\"
-.\" "$Id: lpc.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: lpc.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   lpc man page for CUPS.
+.\" lpc man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH lpc 8 "CUPS" "3 November 2008" "Apple Inc."
+.TH lpc 8 "CUPS" "11 June 2014" "Apple Inc."
 .SH NAME
 lpc \- line printer control program
 .SH SYNOPSIS
@@ -23,49 +23,42 @@ lpc \- line printer control program
 .I parameter(s)
 ] ]
 .SH DESCRIPTION
-\fIlpc\fR provides limited control over printer and class queues
-provided by CUPS. It can also be used to query the state of
-queues.
+\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, \fRlpc\fR will
-display a prompt and accept commands from the standard input.
-.SH COMMANDS
-The \fIlpc\fR program accepts a subset of commands accepted by
-the Berkeley \fIlpc\fR program of the same name:
+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
-exit
-.br
+.B exit
 Exits the command interpreter.
 .TP 5
-help [command]
+\fBhelp \fR[\fIcommand\fR]
 .TP 5
-? [command]
-.br
+\fB? \fR[\fIcommand\fR]
 Displays a short help message.
 .TP 5
-quit
-.br
+.B quit
 Exits the command interpreter.
 .TP 5
-status [queue]
-.br
+\fBstatus \fR[\fIqueue\fR]
 Displays the status of one or more printer or class queues.
-.SH LIMITATIONS
-Since \fIlpc\fR is geared towards the Berkeley printing system,
-it is impossible to use \fIlpc\fR to configure printer or class
-queues provided by CUPS.  To configure printer or class queues
-you must use the \fIlpadmin(8)\fR command or another
-CUPS-compatible client with that functionality.
-.SH COMPATIBILITY
-The CUPS version of \fIlpc\fR does not implement all of the
-standard Berkeley or LPRng commands.
+.SH NOTES
+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
-\fIcancel(1)\fR, \fIcupsaccept(8)\fR, \fIcupsenable(8)\fR,
-\fIlp(1)\fR, \fIlpr(1)\fR, \fIlprm(1)\fR, \fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: lpc.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: lpc.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index e45a7f3..f8dc471 100644 (file)
 .\"
-.\" "$Id: lpinfo.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: lpinfo.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   lpinfo man page for CUPS.
+.\" lpinfo man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH lpinfo 8 "CUPS" "5 December 2008" "Apple Inc."
+.TH lpinfo 8 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
 lpinfo \- show available devices or drivers
 .SH SYNOPSIS
 .B lpinfo
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
-.I server[:port]
-] [ -l ] [ --device-id
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-l
+] [
+.B \-\-device\-id
 .I device-id-string
-] [ --exclude-schemes
+] [
+.B \-\-exclude\-schemes
 .I scheme-list
-] [ --include-schemes
+] [
+.B \-\-include\-schemes
 .I scheme-list
-] [ --language
+] [
+.B \-\-language
 .I locale
-] [ --make-and-model
+] [
+.B \-\-make\-and\-model
 .I name
-] [ --product
+] [
+.B \-\-product
 .I name
-] -m
+]
+.B \-m
 .br
 .B lpinfo
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
-.I server[:port]
-] [ -l ] [ --exclude-schemes
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-l
+] [
+.B \-\-exclude\-schemes
 .I scheme-list
-] [ --include-schemes
+] [
+.B \-\-include\-schemes
 .I scheme-list
-] [ --timeout
+] [
+.B \-\-timeout
 .I seconds
-] -v
+]
+.B \-v
 .SH DESCRIPTION
-\fIlpinfo\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.
+\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
-\fIlpinfo\fR accepts the following options:
+\fBlpinfo\fR accepts the following options:
 .TP 5
--E
-.br
+.B \-E
 Forces encryption when connecting to the server.
 .TP 5
--U username
-.br
+\fB\-U \fIusername\fR
 Sets the username to use when connecting to the server.
 .TP 5
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
 Selects an alternate server.
 .TP 5
--l
-.br
+.B \-l
 Shows a "long" listing of devices or drivers.
 .TP 5
---device-id device-id-string
-.br
-Specifies the IEEE-1284 device ID to match when listing drivers with the
-\fI-m\fR option.
+\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
---exclude-schemes scheme-list
-.br
-Specifies a comma-separated list of device or PPD schemes that should be
-excluded from the results. Static PPD files use the "file" scheme.
+\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
---include-schemes scheme-list
-.br
-Specifies a comma-separated list of device or PPD schemes that should be
-included in the results. Static PPD files use the "file" scheme.
+\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
---language locale
-.br
-Specifies the language to match when listing drivers with the \fI-m\fR option.
+\fB\-\-language \fIlocale\fR
+Specifies the language to match when listing drivers with the \fI\-m\fR option.
 .TP 5
---make-and-model name
-.br
-Specifies the make and model to match when listing drivers with the \fI-m\fR
-option.
+\fB\-\-make\-and\-model \fIname\fR
+Specifies the make and model to match when listing drivers with the \fI\-m\fR option.
 .TP 5
---product name
-.br
-Specifies the product to match when listing drivers with the \fI-m\fR option.
+\fB\-\-product \fIname\fR
+Specifies the product to match when listing drivers with the \fI\-m\fR option.
 .TP 5
---timeout seconds
-.br
-Specifies the timeout when listing devices with the \fI-v\fR option.
-.SH COMPATIBILITY
+\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 SEE ALSO
-\fIlpadmin(8)\fR,
-.br
-http://localhost:631/help
+.BR lpadmin (8),
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: lpinfo.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: lpinfo.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 23ea098..2447410 100644 (file)
@@ -1,66 +1,82 @@
 .\"
-.\" "$Id: lpmove.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: lpmove.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   lpmove man page for CUPS.
+.\" lpmove man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH lpmove 8 "CUPS" "12 February 2006" "Apple Inc."
+.TH lpmove 8 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
 lpmove \- move a job or all jobs to a new destination
 .SH SYNOPSIS
 .B lpmove
-[ -E ] [ -h
-.I server[:port]
-] [ -U
+[
+.B \-E
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-U
 .I username
 ]
-.I job destination
+.I job
+.I destination
 .br
 .B lpmove
-[ -E ] [ -h
-.I server[:port]
-] [ -U
+[
+.B \-E
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-U
 .I username
 ]
-.I source destination
+.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:
-.br
-.nf
-
-     lpmove 123 newprinter
-     lpmove oldprinter-123 newprinter
-.fi
+\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 \fIlpmove\fR command supports the following options:
+The \fBlpmove\fR command supports the following options:
 .TP 5
--E
-.br
+.B \-E
 Forces encryption when connecting to the server.
 .TP 5
--U username
-.br
+\fB\-U \fIusername\fR
 Specifies an alternate username.
 .TP 5
--h server[:port]
-.br
+\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
-\fIcancel(1)\fR, \fIlp(1)\fR,
+.BR cancel (1),
+.BR lp (1),
+.BR lpr (1),
+.BR lprm (1),
 .br
-http://localhost:631/help
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: lpmove.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: lpmove.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 343d20d..c9377c3 100644 (file)
 .\"
-.\" "$Id: lpoptions.man.in 11173 2013-07-23 12:31:34Z msweet $"
+.\" "$Id: lpoptions.man.in 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   lpoptions man page for CUPS.
+.\" lpoptions man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH lpoptions 1 "CUPS" "29 August 2008" "Apple Inc."
+.TH lpoptions 1 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
 lpoptions \- display or set printer options and defaults
 .SH SYNOPSIS
 .B lpoptions
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
-.I server[:port]
-] -d
-.I destination[/instance]
-[ -o
-.I option[=value]
-] ... [ -o
-.I option[=value]
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+]
+\fB\-d \fIdestination\fR[\fB/\fIinstance\fR]
+[
+.B \-l
 ]
 .br
 .B lpoptions
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
-.I server[:port]
-] [ -p
-.I destination[/instance]
-] -l
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+\fB\-p \fIdestination\fR[\fB/\fIinstance\fR]
+]
+\fB\-o \fIoption\fR[\fB=\fIvalue\fR] ...
 .br
 .B lpoptions
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
-.I server[:port]
-] [ -o
-.I option[=value]
-] ... [ -o
-.I option[=value]
-] [ -p
-.I destination[/instance]
-] -r
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+\fB\-p \fIdestination\fR[\fB/\fIinstance\fR]
+]
+.B \-r
 .I option
 .br
 .B lpoptions
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
-.I server[:port]
-] -x
-.I destination[/instance]
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+]
+\fB\-x \fIdestination\fR[\fB/\fIinstance\fR]
 .SH DESCRIPTION
-\fIlpoptions\fR displays or sets printer options and defaults.
-\fIlpoptions\fR shows the default printer options when run with no
-arguments. Other options include:
+\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
--E
-.br
+.B \-E
 Enables encryption when communicating with the CUPS server.
 .TP 5
--U username
-.br
+\fB\-U \fIusername\fR
 Uses an alternate username.
 .TP 5
--d destination[/instance]
-.br
-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.
+\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
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
 Uses an alternate server.
 .TP 5
--l
-.br
+.B \-l
 Lists the printer specific options and their current settings.
 .TP 5
--o option[=value]
-.br
+\fB\-o \fIoption\fR[\fB=\fIvalue\fR]
 Specifies a new option for the named destination.
 .TP 5
--p destination[/instance]
-.br
-Sets the destination and instance, if specified, for any options
-that follow. If the named instance does not exist then it is
-created.
+\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
--r option
-.br
-Removes the specified option for the named destination.
+\fB\-r \fIoption\fR
+Removes the specified option from the named destination.
 .TP 5
--x destination[/instance]
-.br
-Removes the options for the named destination and instance, if
-specified. If the named instance does not exist then this does
-nothing.
-.LP
-If no options are specified using the \fI-o\fR option, then the
-current options for the named printer are reported on the
-standard output.
-.LP
-Options set with the \fIlpoptions\fR command are used by the
-\fIlp(1)\fR and \fIlpr(1)\fR commands when submitting jobs.
-.SH ROOT ACCOUNT OPTIONS
-When run by the root user, \fIlpoptions\fR gets and sets default
-options and instances for \fIall users\fR in the
-@CUPS_SERVERROOT@/lpoptions file.
-.SH COMPATIBILITY
-The \fIlpoptions\fR command is unique to CUPS.
+\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
-~/.cups/lpoptions - user defaults and instances created by non-root
-users.
+\fI~/.cups/lpoptions\fR - user defaults and instances created by non-root users.
 .br
-@CUPS_SERVERROOT@/lpoptions - system-wide defaults and instances
-created by the root user.
+\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
-\fIcancel(1)\fR, \fIlp(1)\fR, \fIlpadmin(8)\fR, \fIlpr(1)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: lpoptions.man.in 11173 2013-07-23 12:31:34Z msweet $".
+.\" End of "$Id: lpoptions.man.in 12854 2015-08-28 14:08:00Z msweet $".
 .\"
diff --git a/man/lppasswd.man b/man/lppasswd.man
deleted file mode 100644 (file)
index 1edb0d8..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-.\"
-.\" "$Id: lppasswd.man 7600 2008-05-20 21:06:23Z mike $"
-.\"
-.\"   lpadmin man page for CUPS.
-.\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
-.\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
-.\"
-.TH lppasswd 1 "CUPS" "22 February 2008" "Apple Inc."
-.SH NAME
-lppasswd \- add, change, or delete digest passwords.
-.SH SYNOPSIS
-.B lppasswd
-[
-.I username
-]
-.br
-.B lppasswd
--a [ -g
-.I groupname
-]
-.I username
-.br
-.B lppasswd
--x
-.I username
-.SH DESCRIPTION
-\fIlppasswd\fR adds, changes, or deletes passwords in the CUPS
-digest password file, \fIpasswd.md5\fR. When run by a normal
-user, \fIlppasswd\fR will prompt for the old and new passwords.
-When run by the super-user, \fIlppasswd\fR can add new accounts
-(\fI-a username\fR), change existing accounts (\fIusername\fR),
-or delete accounts (\fI-x username\fR) in the digest password
-file. Digest usernames do not have to match local UNIX usernames.
-.SH OPTIONS
-\fIlppasswd\fR supports the following options:
-.TP 5
--g groupname
-.br
-Specifies a group other than the default system group.
-.SH SECURITY ISSUES
-By default, the \fIlppasswd\fR program is not installed to allow ordinary
-users to change their passwords. To enable this, the \fIlppasswd\fR command
-must be made setuid to root with the command:
-.br
-.nf
-chmod u+s lppasswd
-.fi
-.PP
-While every attempt has been made to make \fIlppasswd\fR secure against
-exploits that could grant super-user privileges to unprivileged users,
-paranoid system administrators may wish to use Basic authentication with
-accounts managed by PAM instead.
-.SH SEE ALSO
-\fIlp(1)\fR, \fIlpr(1)\fR,
-.br
-http://localhost:631/help
-.SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
-.\"
-.\" End of "$Id: lppasswd.man 7600 2008-05-20 21:06:23Z mike $".
-.\"
index 97630e9..7f71720 100644 (file)
@@ -1,72 +1,72 @@
 .\"
-.\" "$Id: lpq.man 7646 2008-06-16 17:26:20Z mike $"
+.\" "$Id: lpq.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   lpq man page for CUPS.
+.\" lpq man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH lpq 1 "CUPS" "16 June 2008" "Apple Inc."
+.TH lpq 1 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
 lpq \- show printer queue status
 .SH SYNOPSIS
 .B lpq
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
-.I server[:port]
-] [ -P
-.I destination[/instance]
-] [ -a ] [ -l ] [
-.I +interval
+] [
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
+] [
+\fB\-P \fIdestination\fR[\fB/\fIinstance\fR]
+] [
+.B \-a
+] [
+.B \-l
+] [
+.BI + interval
 ]
 .SH DESCRIPTION
-\fIlpq\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.
+\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.
+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
-\fIlpq\fR supports the following options:
+\fBlpq\fR supports the following options:
 .TP 5
--E
-.br
+.B \-E
 Forces encryption when connecting to the server.
 .TP 5
--P destination[/instance]
-.br
+\fB\-P \fIdestination\fR[\fB/\fIinstance\fR]
 Specifies an alternate printer or class name.
 .TP 5
--U username
-.br
+\fB\-U \fIusername\fR
 Specifies an alternate username.
 .TP 5
--a
-.br
+.B \-a
 Reports jobs on all printers.
 .TP 5
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
 Specifies an alternate server.
 .TP 5
--l
-.br
+.B \-l
 Requests a more verbose (long) reporting format.
 .SH SEE ALSO
-\fIcancel(1)\fR, \fIlp(1)\fR, \fIlpr(1)\fR, \fIlprm(1)\fR,
-\fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: lpq.man 7646 2008-06-16 17:26:20Z mike $".
+.\" End of "$Id: lpq.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index c6392c7..ac24e3d 100644 (file)
 .\"
-.\" "$Id: lpr.man 7889 2008-08-29 22:03:35Z mike $"
+.\" "$Id: lpr.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   lpr man page for CUPS.
+.\" lpr man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2013 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH lpr 1 "CUPS" "29 August 2008" "Apple Inc."
+.TH lpr 1 "CUPS" "11 June 2014" "Apple Inc."
 .SH NAME
 lpr \- print files
 .SH SYNOPSIS
 .B lpr
-[ -E ] [ -H
-.I server[:port]
-] [ -U
+[
+.B \-E
+] [
+\fB\-H \fIserver\fR[\fB:\fIport\fR]
+] [
+.B \-U
 .I username
-] [ -P
-.I destination[/instance]
-] [ -#
+] [
+\fB\-P \fIdestination\fR[\fB/\fIinstance\fR]
+] [
+.B \-#
 .I num-copies
-[ -h ] [ -l ] [ -m ] [ -o
-.I option[=value]
-] [ -p] [ -q ] [ -r ] [ -C/J/T
+[
+.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
-\fIlpr\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,
-\fIlpr\fR reads the print file from the standard input.
-.SH 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 \fIlpoptions(1)\fR command is used,
-followed by the default set using the \fIlpadmin(8)\fR command.
+\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
--E
-.br
+.B \-E
 Forces encryption when connecting to the server.
 .TP 5
--H server[:port]
-.br
+\fB\-H \fIserver\fR[\fB:\fIport\fR]
 Specifies an alternate server.
 .TP 5
--C "name"
+\fB\-C "\fIname\fB"\fR
 .TP 5
--J "name"
+\fB\-J "\fIname\fB"\fR
 .TP 5
--T "name"
-.br
-Sets the job name.
+\fB\-T "\fIname\fB"\fR
+Sets the job name/title.
 .TP 5
--P destination[/instance]
-.br
+\fB\-P \fIdestination\fR[\fB/\fIinstance\fR]
 Prints files to the named printer.
 .TP 5
--U username
-.br
+\fB\-U \fIusername\fR
 Specifies an alternate username.
 .TP 5
--# \fIcopies\fR
-.br
-Sets the number of copies to print from 1 to 100.
+\fB\-# \fIcopies\fR
+Sets the number of copies to print.
 .TP 5
--h
-.br
-Disables banner printing. This option is equivalent to "-o
-job-sheets=none".
+.B \-h
+Disables banner printing. This option is equivalent to \fI-o job\-sheets=none\fR.
 .TP 5
--l
-.br
-Specifies that the print file is already formatted for the
-destination and should be sent without filtering. This option is
-equivalent to "-o raw".
+.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
--m
-.br
+.B \-m
 Send an email on job completion.
 .TP 5
--o option[=value]
-.br
+\fB\-o \fIoption\fR[\fB=\fIvalue\fR]
 Sets a job option.
 .TP 5
--p
-.br
-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.
+.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
--q
-.br
+.B \-q
 Hold job for printing.
 .TP 5
--r
-.br
-Specifies that the named print files should be deleted after
-printing them.
-.SH COMPATIBILITY
-The "c", "d", "f", "g", "i", "n", "t", "v", and "w" options
-are not supported by CUPS and produce a warning message if used.
+.B \-r
+Specifies that the named print files should be deleted after submitting them.
+.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
-\fIcancel(1)\fR, \fIlp(1)\fR, \fIlpadmin(8)\fR, \fIlpoptions(1)\fR,
-\fIlpq(1)\fR, \fIlprm(1)\fR, \fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: lpr.man 7889 2008-08-29 22:03:35Z mike $".
+.\" End of "$Id: lpr.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 3d3f30f..c989394 100644 (file)
@@ -1,65 +1,90 @@
 .\"
-.\" "$Id: lprm.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: lprm.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   lprm man page for CUPS.
+.\" lprm man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH lprm 1 "CUPS" "28 August 2009" "Apple Inc."
+.TH lprm 1 "CUPS" "22 May 2014" "Apple Inc."
 .SH NAME
 lprm \- cancel print jobs
 .SH SYNOPSIS
 .B lprm
-[ -E ] [ -U
+[
+.B \-E
+] [
+.B \-U
 .I username
-] [ -h
-.I server[:port]
-] [ -P
-.I destination[/instance]
-] [ - ] [
-.I job ID(s)
+] [
+.B \-h
+.IR server [ :port ]
+] [
+.B \-P
+.IR destination [ /instance ]
+] [
+.B \-
+] [
+.I job-id(s)
 ]
 .SH DESCRIPTION
-\fIlprm\fR cancels print jobs that have been queued for printing.
-If no arguments are supplied, the current job on the default
-destination is cancelled. You can specify one or more job ID
-numbers to cancel those jobs or use the \fI-\fR option to cancel
-all jobs.
+.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 \fIlprm\fR command supports the following options:
+The
+.B lprm
+command supports the following options:
 .TP 5
--E
-.br
+.B \-E
 Forces encryption when connecting to the server.
 .TP 5
--P destination[/instance]
-.br
+\fB\-P \fIdestination\fR[\fI/instance\fR]
 Specifies the destination printer or class.
 .TP 5
--U username
-.br
+\fB\-U \fIusername\fR
 Specifies an alternate username.
 .TP 5
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fI:port\fR]
 Specifies an alternate server.
-.SH COMPATIBILITY
-The CUPS version of \fIlprm\fR is compatible with the standard
-Berkeley \fIlprm\fR command.
+.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
-\fIcancel(1)\fR, \fIlp(1)\fR, \fIlpq(1)\fR, \fIlpr(1)\fR,
-\fIlpstat(1)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: lprm.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: lprm.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 37c39d7..d5d82c5 100644 (file)
 .\"
-.\" "$Id: lpstat.man 7921 2008-09-10 15:42:24Z mike $"
+.\" "$Id: lpstat.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   lpstat man page for CUPS.
+.\" lpstat man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH lpstat 1 "CUPS" "10 September 2008" "Apple Inc."
+.TH lpstat 1 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
 lpstat \- print cups status information
 .SH SYNOPSIS
 .B lpstat
-[ -E ] [ -H ] [ -U
+[
+.B \-E
+] [
+.B \-H
+] [
+.B \-U
 .I username
-] [ -h
-.I hostname[:port]
-] [ -l ] [ -W
+] [
+\fB\-h \fIhostname\fR[\fB:\fIport\fR]
+] [
+.B \-l
+] [
+.B \-W
 .I which-jobs
-] [ -a [
+] [
+.B \-a
+[
 .I destination(s)
-] ] [ -c [
+] ] [
+.B \-c
+[
 .I class(es)
-] ] [ -d ] [ -o [
+] ] [
+.B \-d
+] [
+.B \-o
+[
 .I destination(s)
-] ] [ -p [
+] ] [
+.B \-p
+[
 .I printer(s)
-] ] [ -r ] [ -R ] [ -s ] [ -t ] [ -u [
+] ] [
+.B \-r
+] [
+.B \-R
+] [
+.B \-s
+] [
+.B \-t
+] [
+.B \-u
+[
 .I user(s)
-] ] [ -v [
+] ] [
+.B \-v
+[
 .I printer(s)
 ] ]
 .SH DESCRIPTION
-\fIlpstat\fR displays status information about the current
-classes, jobs, and printers. When run with no arguments,
-\fIlpstat\fR will list jobs queued by the current user.
+\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 \fIlpstat\fR command supports the following options:
+The \fBlpstat\fR command supports the following options:
 .TP 5
--E
-.br
+.B \-E
 Forces encryption when connecting to the server.
 .TP 5
--H
-.br
+.B \-H
 Shows the server hostname and port.
 .TP 5
--R
-.br
+.B \-R
 Shows the ranking of print jobs.
 .TP 5
--U username
-.br
+\fB\-U \fIusername\fR
 Specifies an alternate username.
 .TP 5
--W which-jobs
-.br
-Specifies which jobs to show, \fIcompleted\fR or
-\fInot-completed\fR (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
--a [printer(s)]
-.br
-Shows the accepting state of printer queues. If no printers are
-specified then all printers are listed.
-.TP 5
--c [class(es)]
-.br
+\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
--d
-.br
+.B \-d
 Shows the current default destination.
 .TP 5
--h server[:port]
-.br
+\fB\-h \fIserver\fR[\fB:\fIport\fR]
 Specifies an alternate server.
 .TP 5
--l
-.br
+.B \-l
 Shows a long listing of printers, classes, or jobs.
 .TP 5
--o [destination(s)]
-.br
-Shows the jobs queue on the specified destinations. If no destinations are
-specified all jobs are shown.
+\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
--p [printer(s)]
-.br
-Shows the printers and whether or not they are enabled for printing. If
-no printers are specified then all printers are listed.
+\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
--r
-.br
+.B \-r
 Shows whether the CUPS server is running.
 .TP 5
--s
-.br
-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.
-.TP 5
--t
-.br
-Shows all status information. This is equivalent to using the "-r",
-"-d", "-c", "-v", "-a", "-p", and "-o" options.
-.TP 5
--u [user(s)]
-.br
-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
--v [printer(s)]
-.br
-Shows the printers and what device they are attached to. If no printers
-are specified then all printers are listed.
-.SH COMPATIBILITY
-Unlike the System V printing system, CUPS allows printer names to
-contain any printable character except SPACE, TAB, "/", and "#".
+.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 "-h", "-E", "-U", and "-W" options are unique to CUPS.
+The \fI\-h\fR, \fI\-E\fR, \fI\-U\fR, and \fI\-W\fR options are unique to CUPS.
 .LP
-The Solaris "-f", "-P", and "-S" options are silently ignored.
+The Solaris \fI\-f\fR, \fI\-P\fR, and \fI\-S\fR options are silently ignored.
 .SH SEE ALSO
-\fIcancel(1)\fR, \fIlp(1)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: lpstat.man 7921 2008-09-10 15:42:24Z mike $".
+.\" End of "$Id: lpstat.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index aa60386..c2f3c85 100644 (file)
@@ -1,60 +1,52 @@
 .\"
-.\" "$Id: mailto.conf.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: mailto.conf.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   mailto.conf man page for CUPS.
+.\" mailto.conf man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH mailto.conf 5 "CUPS" "12 July 2006" "Apple Inc."
+.TH mailto.conf 5 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
 mailto.conf \- configuration file for cups email notifier
 .SH DESCRIPTION
-The \fImailto.conf\fR file defines the local mail server and
-email notification preferences for CUPS.
+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. Comment lines start with the # character.
-.SH DIRECTIVES
+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
-Cc \fIcc-address@domain.com\fR
-.br
+\fBCc \fIcc-address@domain.com\fR
 Specifies an additional recipient for all email notifications.
 .TP 5
-From \fIfrom-address@domain.com\fR
-.br
+\fBFrom \fIfrom-address@domain.com\fR
 Specifies the sender of email notifications.
 .TP 5
-Sendmail \fIsendmail command and options\fR
-.br
-Specifies the sendmail command to use when sending email
-notifications. Only one \fISendmail\fR or \fISMTPServer\fR line
-may be present in the \fImailto.conf\fR file. If multiple lines
-are present, only the last one is used.
+\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
-SMTPServer \fIservername\fR
-.br
-Specifies a SMTP server to send email notifications to. Only one
-\fISendmail\fR or \fISMTPServer\fR line may be present in the
-\fImailto.conf\fR file. If multiple lines are present, only the
-last one is used.
+\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
-Subject \fIsubject-prefix\fR
-.br
+\fBSubject \fIsubject-prefix\fR
 Specifies a prefix string for the subject line of an email notification.
 .SH SEE ALSO
-\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR,
-\fImime.convs(5)\fR, \fImime.types(5)\fR, \fIprinters.conf(5)\fR,
-.br
-http://localhost:631/help
+.BR cupsd (8),
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: mailto.conf.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: mailto.conf.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 8974d20..11ae93a 100644 (file)
@@ -1,22 +1,16 @@
 /*
- * "$Id: mantohtml.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: mantohtml.c 12362 2014-12-12 19:50:49Z msweet $"
  *
- *   Man page to HTML conversion program.
+ * Man page to HTML conversion program.
  *
- *   Copyright 2007-2010 by Apple Inc.
- *   Copyright 2004-2006 by Easy Software Products.
+ * Copyright 2007-2010, 2014 by Apple Inc.
+ * Copyright 2004-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()        - Convert a man page to HTML.
- *   putc_entity() - Put a single character, using entities as needed.
- *   strmove()     - Move characters within a string.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
  */
 
 #include <cups/string-private.h>
+#include <cups/array-private.h>
 #include <unistd.h>
 
 
 /*
+ * Local globals...
+ */
+
+static const char                      /* Start/end tags for fonts */
+       * const start_fonts[] = { "", "<b>", "<i>" },
+       * const end_fonts[] = { "", "</b>", "</i>" };
+
+
+/*
  * Local functions...
  */
 
-static void    putc_entity(int ch, FILE *fp);
+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);
 
 
@@ -47,20 +53,19 @@ main(int  argc,                             /* I - Number of command-line args */
                *outfile;               /* Output file */
   char         line[1024],             /* Line from file */
                *lineptr,               /* Pointer into line */
-               *endptr,                /* Pointer to end of current */
-               endchar,                /* End character */
-               *paren,                 /* Pointer to parenthesis */
-               name[1024];             /* Man page name */
-  int          section,                /* Man page section */
-               pre,                    /* Preformatted */
-               font,                   /* Current font */
-               blist,                  /* In a bullet list? */
-               list,                   /* In a list? */
-               linenum;                /* Current line number */
-  const char   *post;                  /* Text to add after the current line */
-  static const char                    /* Start/end tags for fonts */
-       * const start_fonts[] = { "", "<b>", "<i>" },
-       * const end_fonts[] = { "", "</b>", "</i>" };
+               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...
@@ -103,24 +108,22 @@ main(int  argc,                           /* I - Number of command-line args */
   * Read from input and write the output...
   */
 
-  fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" "
-        "\"http://www.w3.org/TR/html4/loose.dtd\">\n"
+  fputs("<!DOCTYPE HTML>\n"
         "<html>\n"
        "<!-- SECTION: Man Pages -->\n"
        "<head>\n"
        "\t<link rel=\"stylesheet\" type=\"text/css\" "
        "href=\"../cups-printable.css\">\n", outfile);
 
-  blist   = 0;
-  font    = 0;
-  list    = 0;
-  linenum = 0;
-  pre     = 0;
-  post    = NULL;
-  section = -1;
+  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] == '.')
@@ -163,247 +166,614 @@ main(int  argc,                         /* I - Number of command-line args */
         int first = 1;
 
        fputs(end_fonts[font], outfile);
-
-        if (blist)
-       {
-         fputs("</li>\n</ul>\n", outfile);
-         blist = 0;
-       }
+       font = 0;
 
         if (list)
        {
-         if (list == 1)
-           fputs("</dt>\n", outfile);
-         else if (list)
-           fputs("</dd>\n", outfile);
-
-         fputs("</dl>\n", outfile);
-         list = 0;
+         fprintf(outfile, "</%s>\n", list);
+         list = NULL;
        }
 
-        line[strlen(line) - 1] = '\0'; /* Strip LF */
-
         if (line[2] == 'H')
          fputs("<h2 class=\"title\"><a name=\"", outfile);
        else
          fputs("<h3><a name=\"", outfile);
 
-        for (lineptr = line + 4; *lineptr; lineptr ++)
-         if (*lineptr == '\"')
-           continue;
-         else if (*lineptr == ' ')
-           putc_entity('_', outfile);
-         else
-           putc_entity(*lineptr, outfile);
+        if (anchor[0])
+        {
+          fputs(anchor, outfile);
+          anchor[0] = '\0';
+        }
+        else
+        {
+         for (lineptr = line + 4; *lineptr; lineptr ++)
+           if (*lineptr  == '\"')
+             continue;
+           else if (isalnum(*lineptr & 255))
+             html_putc(*lineptr, outfile);
+           else
+             html_putc('_', outfile);
+        }
 
        fputs("\">", outfile);
 
         for (lineptr = line + 4; *lineptr; lineptr ++)
+        {
          if (*lineptr == '\"')
            continue;
          else if (*lineptr == ' ')
          {
-           putc_entity(' ', outfile);
+           html_putc(' ', outfile);
 
             first = 1;
          }
          else
          {
            if (first)
-             putc_entity(*lineptr, outfile);
+             html_putc(*lineptr, outfile);
            else
-             putc_entity(tolower(*lineptr), outfile);
+             html_putc(tolower(*lineptr & 255), outfile);
 
             first = 0;
           }
+        }
 
         if (line[2] == 'H')
-         fprintf(outfile, "</a></h2>\n%s", start_fonts[font]);
+         fputs("</a></h2>\n", outfile);
        else
-         fprintf(outfile, "</a></h3>\n%s", start_fonts[font]);
+         fputs("</a></h3>\n", outfile);
       }
-      else if (!strncmp(line, ".LP", 3) || !strncmp(line, ".PP", 3))
+      else if (!strncmp(line, ".", 3))
       {
        /*
-        * New paragraph...
+        * Grab bold text...
        */
 
        fputs(end_fonts[font], outfile);
+       font = 0;
+
+        if (anchor[0])
+          fprintf(outfile, "<a name=\"%s\">", anchor);
 
-        if (blist)
+        html_alternate(line + 3, "b", "b", outfile);
+
+        if (anchor[0])
+        {
+          fputs("</a>", outfile);
+          anchor[0] = '\0';
+        }
+
+       if (post)
        {
-         fputs("</li>\n</ul>\n", outfile);
-         blist = 0;
+         fputs(post, outfile);
+         post = NULL;
        }
+      }
+      else if (!strncmp(line, ".I ", 3))
+      {
+       /*
+        * Grab italic text...
+       */
 
-        if (list)
+       fputs(end_fonts[font], outfile);
+       font = 0;
+
+        if (anchor[0])
+          fprintf(outfile, "<a name=\"%s\">", anchor);
+
+        html_alternate(line + 3, "i", "i", outfile);
+
+        if (anchor[0])
+        {
+          fputs("</a>", outfile);
+          anchor[0] = '\0';
+        }
+
+       if (post)
        {
-         if (list == 1)
-           fputs("</dt>\n", outfile);
-         else if (list)
-           fputs("</dd>\n", outfile);
+         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, "<a name=\"%s\">", anchor);
+
+        html_alternate(line + 4, "b", "i", outfile);
 
-         fputs("</dl>\n", outfile);
-         list = 0;
+        if (anchor[0])
+        {
+          fputs("</a>", outfile);
+          anchor[0] = '\0';
+        }
+
+       if (post)
+       {
+         fputs(post, outfile);
+         post = NULL;
        }
+      }
+      else if (!strncmp(line, ".BR ", 4))
+      {
+       /*
+        * Alternating bold and roman (plain) text...
+        */
 
-       fputs("<p>", outfile);
+       fputs(end_fonts[font], outfile);
        font = 0;
+
+        if (anchor[0])
+          fprintf(outfile, "<a name=\"%s\">", anchor);
+
+        html_alternate(line + 4, "b", NULL, outfile);
+
+        if (anchor[0])
+        {
+          fputs("</a>", outfile);
+          anchor[0] = '\0';
+        }
+
+       if (post)
+       {
+         fputs(post, outfile);
+         post = NULL;
+       }
       }
-      else if (!strncmp(line, ".TP ", 4))
+      else if (!strncmp(line, ".IB ", 4))
       {
        /*
-        * Grab list...
-       */
+        * Alternating italic and bold text...
+        */
 
        fputs(end_fonts[font], outfile);
+       font = 0;
+
+        if (anchor[0])
+          fprintf(outfile, "<a name=\"%s\">", anchor);
 
-        if (blist)
+        html_alternate(line + 4, "i", "b", outfile);
+
+        if (anchor[0])
+        {
+          fputs("</a>", outfile);
+          anchor[0] = '\0';
+        }
+
+       if (post)
        {
-         fputs("</li>\n</ul>\n", outfile);
-         blist = 0;
+         fputs(post, outfile);
+         post = NULL;
        }
+      }
+      else if (!strncmp(line, ".IR ", 4))
+      {
+       /*
+        * Alternating italic and roman (plain) text...
+        */
 
-        if (!list)
-         fputs("<dl>\n", outfile);
-       else if (list == 1)
-         fputs("</dt>\n", outfile);
-       else if (list)
-         fputs("</dd>\n", outfile);
-
-       fputs("<dt>", outfile);
-       list = 1;
+       fputs(end_fonts[font], outfile);
        font = 0;
+
+        if (anchor[0])
+          fprintf(outfile, "<a name=\"%s\">", anchor);
+
+        html_alternate(line + 4, "i", NULL, outfile);
+
+        if (anchor[0])
+        {
+          fputs("</a>", outfile);
+          anchor[0] = '\0';
+        }
+
+       if (post)
+       {
+         fputs(post, outfile);
+         post = NULL;
+       }
       }
-      else if (!strncmp(line, ".br", 3))
+      else if (!strncmp(line, ".RB ", 4))
       {
        /*
-        * Grab line break...
-       */
+        * Alternating roman (plain) and bold text...
+        */
+
+       fputs(end_fonts[font], outfile);
+       font = 0;
+
+        if (anchor[0])
+          fprintf(outfile, "<a name=\"%s\">", anchor);
+
+        html_alternate(line + 4, NULL, "b", outfile);
+
+        if (anchor[0])
+        {
+          fputs("</a>", outfile);
+          anchor[0] = '\0';
+        }
 
-       if (list == 1)
+       if (post)
        {
-         fputs("</dt>\n<dd>", outfile);
-         list = 2;
+         fputs(post, outfile);
+         post = NULL;
        }
-        else if (list)
-         fputs("</dd>\n<dd>", outfile);
-       else
-         fputs("<br>\n", outfile);
       }
-      else if (!strncmp(line, ".de ", 4))
+      else if (!strncmp(line, ".RI ", 4))
       {
        /*
-        * Define macro - ignore...
-       */
+        * Alternating roman (plain) and italic text...
+        */
 
-        while (fgets(line, sizeof(line), infile))
+       fputs(end_fonts[font], outfile);
+       font = 0;
+
+        if (anchor[0])
+          fprintf(outfile, "<a name=\"%s\">", anchor);
+
+        html_alternate(line + 4, NULL, "i", outfile);
+
+        if (anchor[0])
+        {
+          fputs("</a>", outfile);
+          anchor[0] = '\0';
+        }
+
+       if (post)
        {
-         linenum ++;
+         fputs(post, outfile);
+         post = NULL;
+       }
+      }
+      else if (!strncmp(line, ".SB ", 4))
+      {
+       /*
+        * Alternating small and bold text...
+        */
 
-         if (!strncmp(line, "..", 2))
-           break;
+       fputs(end_fonts[font], outfile);
+       font = 0;
+
+        if (anchor[0])
+          fprintf(outfile, "<a name=\"%s\">", anchor);
+
+        html_alternate(line + 4, "small", "b", outfile);
+
+        if (anchor[0])
+        {
+          fputs("</a>", outfile);
+          anchor[0] = '\0';
+        }
+
+       if (post)
+       {
+         fputs(post, outfile);
+         post = NULL;
        }
       }
-      else if (!strncmp(line, ".RS", 3))
+      else if (!strncmp(line, ".SM ", 4))
       {
        /*
-        * Indent...
-       */
+        * Small text...
+        */
 
-        fputs("<div style='margin-left: 3em;'>\n", outfile);
+       fputs(end_fonts[font], outfile);
+       font = 0;
+
+        if (anchor[0])
+          fprintf(outfile, "<a name=\"%s\">", anchor);
+
+        html_alternate(line + 4, "small", "small", outfile);
+
+        if (anchor[0])
+        {
+          fputs("</a>", outfile);
+          anchor[0] = '\0';
+        }
+
+       if (post)
+       {
+         fputs(post, outfile);
+         post = NULL;
+       }
       }
-      else if (!strncmp(line, ".RE", 3))
+      else if (!strcmp(line, ".LP") || !strcmp(line, ".PP") || !strcmp(line, ".P"))
       {
        /*
-        * Unindent...
+        * New paragraph...
        */
 
-        fputs("</div>\n", outfile);
+       fputs(end_fonts[font], outfile);
+       font = 0;
+
+        if (list)
+        {
+          fprintf(outfile, "</%s>\n", list);
+          list = NULL;
+        }
+
+       fputs("<p>", outfile);
+
+        if (anchor[0])
+        {
+          fprintf(outfile, "<a name=\"%s\"></a>", anchor);
+          anchor[0] = '\0';
+        }
       }
-      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))
+      else if (!strcmp(line, ".RS") || !strncmp(line, ".RS ", 4))
       {
        /*
-        * Ignore unused commands...
+        * Indent...
        */
+
+       float amount = 3.0;             /* Indentation */
+
+        if (line[3])
+          amount = 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, "<div style=\"margin-left: %.1fem;\">\n", amount - nested_indent);
       }
-      else if (!strncmp(line, ".Vb", 3) || !strncmp(line, ".nf", 3))
+      else if (!strcmp(line, ".RE"))
       {
        /*
-        * Start preformatted...
+        * Unindent...
        */
 
-        pre = 1;
-       fputs("<pre>\n", outfile);
+       fputs(end_fonts[font], outfile);
+       font = 0;
+
+        fputs("</div>\n", outfile);
+
+        if (nested)
+        {
+          list   = nested;
+          nested = NULL;
+
+          list_indent   = nested_indent;
+          nested_indent = 0.0f;
+        }
       }
-      else if (!strncmp(line, ".Ve", 3) || !strncmp(line, ".fi", 3))
+      else if (!strcmp(line, ".HP") || !strncmp(line, ".HP ", 4))
       {
        /*
-        * End preformatted...
+        * Hanging paragraph...
+        *
+        * .HP i
        */
 
-        if (pre)
-       {
-          pre = 0;
-         fputs("</pre>\n", outfile);
-       }
+       float amount = 3.0;             /* Indentation */
+
+        if (line[3])
+          amount = atof(line + 4);
+
+       fputs(end_fonts[font], outfile);
+       font = 0;
+
+        if (list)
+        {
+          fprintf(outfile, "</%s>\n", list);
+          list = NULL;
+        }
+
+        fprintf(outfile, "<p style=\"margin-left: %.1fem; text-indent: %.1fem\">", amount, -amount);
+
+        if (anchor[0])
+        {
+          fprintf(outfile, "<a name=\"%s\"></a>", anchor);
+          anchor[0] = '\0';
+        }
+
+        if (line[1] == 'T')
+          post = "<br>\n";
       }
-      else if (!strncmp(line, ".IP \\(bu", 8))
+      else if (!strcmp(line, ".TP") || !strncmp(line, ".TP ", 4))
       {
        /*
-        * Bullet list...
+        * Tagged list...
+        *
+        * .TP i
        */
 
-        if (blist)
-         fputs("</li>\n", outfile);
-       else
-       {
-         fputs("<ul>\n", outfile);
-         blist = 1;
-       }
+       float amount = 3.0;             /* Indentation */
+
+        if (line[3])
+          amount = atof(line + 4);
+
+       fputs(end_fonts[font], outfile);
+       font = 0;
+
+        if (list && strcmp(list, "dl"))
+        {
+          fprintf(outfile, "</%s>\n", list);
+          list = NULL;
+        }
+
+        if (!list)
+        {
+          fputs("<dl class=\"man\">\n", outfile);
+          list        = "dl";
+          list_indent = amount;
+        }
+
+        fputs("<dt>", outfile);
+        snprintf(ddpost, sizeof(ddpost), "<dd style=\"margin-left: %.1fem\">", amount);
+       post = ddpost;
 
-       fputs("<li>", outfile);
+        if (anchor[0])
+        {
+          fprintf(outfile, "<a name=\"%s\"></a>", anchor);
+          anchor[0] = '\0';
+        }
       }
       else if (!strncmp(line, ".IP ", 4))
       {
        /*
         * Indented paragraph...
+        *
+        * .IP x i
        */
 
-        if (blist)
+        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))
        {
-         fputs("</li>\n</ul>\n", outfile);
-         blist = 0;
-       }
+        /*
+         * Bullet list...
+         */
 
-       fputs("<p style='margin-left: 3em;'>", outfile);
+          newlist = "ul";
+       }
+       else if (isdigit(*lineptr & 255))
+       {
+        /*
+         * Numbered list...
+         */
 
-        for (lineptr = line + 4; isspace(*lineptr); lineptr ++);
+          newlist = "ol";
+       }
+       else if (islower(*lineptr & 255))
+       {
+        /*
+         * Lowercase alpha list...
+         */
 
-        if (*lineptr == '\"')
+          newlist = "ol";
+          newtype = "a";
+       }
+       else if (isupper(*lineptr & 255))
        {
-         strmove(line, lineptr + 1);
+        /*
+         * Lowercase alpha list...
+         */
+
+          newlist = "ol";
+          newtype = "A";
+       }
 
-         if ((lineptr = strchr(line, '\"')) != NULL)
-           *lineptr = '\0';
+        while (!isspace(*lineptr & 255))
+          lineptr ++;
+        while (isspace(*lineptr & 255))
+          lineptr ++;
+
+        if (isdigit(*lineptr & 255))
+          amount = atof(lineptr);
+
+        if (newlist && list && strcmp(newlist, list))
+        {
+          fprintf(outfile, "</%s>\n", list);
+          list = NULL;
         }
-       else
-       {
-         strmove(line, lineptr);
 
-         if ((lineptr = strchr(line, ' ')) != NULL)
-           *lineptr = '\0';
+        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, "<li style=\"margin-left: %.1fem;\">", amount);
+        else
+          fprintf(outfile, "<p style=\"margin-left: %.1fem;\">", amount);
+
+        if (anchor[0])
+        {
+          fprintf(outfile, "<a name=\"%s\"></a>", anchor);
+          anchor[0] = '\0';
+        }
+      }
+      else if (!strncmp(line, ".br", 3))
+      {
+       /*
+        * Grab line break...
+       */
+
+       fputs("<br>\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, "</%s>\n", list);
+//       list = NULL;
+//     }
+
+        pre = 1;
+       fputs("<pre class=\"man\">\n", outfile);
+      }
+      else if (!strncmp(line, ".Ve", 3) || !strncmp(line, ".fi", 3) || !strncmp(line, ".EE", 3))
+      {
        /*
-        * Process the text as if it was in-line...
+        * End preformatted...
        */
 
-        post = "\n<br>\n<br>";
-        goto process_text;
+       fputs(end_fonts[font], outfile);
+       font = 0;
+
+        if (pre)
+       {
+          pre = 0;
+         fputs("</pre>\n", outfile);
+       }
       }
       else if (!strncmp(line, ".\\}", 3))
       {
@@ -441,23 +811,13 @@ main(int  argc,                           /* I - Number of command-line args */
        */
       }
 #endif /* 0 */
-      else if (!strncmp(line, ".B ", 3))
+      else if (!strncmp(line, ".\\\"#", 4))
       {
        /*
-        * Grab bold text...
-       */
+        * Anchor for HTML output...
+        */
 
-       fprintf(outfile, "%s<b>%s</b>%s", end_fonts[font], line + 3,
-               start_fonts[font]);
-      }
-      else if (!strncmp(line, ".I ", 3))
-      {
-       /*
-        * Grab italic text...
-       */
-
-       fprintf(outfile, "%s<i>%s</i>%s", end_fonts[font], line + 3,
-               start_fonts[font]);
+        strlcpy(anchor, line + 4, sizeof(anchor));
       }
       else if (strncmp(line, ".\\\"", 3))
       {
@@ -470,15 +830,14 @@ main(int  argc,                           /* I - Number of command-line args */
        else if ((lineptr = strchr(line, '\n')) != NULL)
          *lineptr = '\0';
 
-        fprintf(stderr, "mantohtml: Unknown man page command \'%s\' on line %d!\n",
-               line, linenum);
+        fprintf(stderr, "mantohtml: Unknown man page command \'%s\' on line %d.\n",  line, linenum);
       }
 
      /*
       * Skip continuation lines...
       */
 
-      lineptr = line + strlen(line) - 2;
+      lineptr = line + strlen(line) - 1;
       if (lineptr >= line && *lineptr == '\\')
       {
         while (fgets(line, sizeof(line), infile))
@@ -497,169 +856,24 @@ main(int  argc,                          /* I - Number of command-line args */
       * Process man page text...
       */
 
-process_text:
-
-      for (lineptr = line; *lineptr; lineptr ++)
-      {
-        if (!strncmp(lineptr, "http://", 7))
-       {
-        /*
-         * Embed URL...
-         */
-
-          for (endptr = lineptr + 7;
-              *endptr && !isspace(*endptr & 255);
-              endptr ++);
-
-          endchar = *endptr;
-         *endptr = '\0';
-
-          fprintf(outfile, "<a href='%s'>%s</a>", lineptr, lineptr);
-         *endptr = endchar;
-         lineptr = endptr - 1;
-       }
-       else if (!strncmp(lineptr, "\\fI", 3) &&
-                (endptr = strstr(lineptr, "\\fR")) != NULL &&
-                (paren = strchr(lineptr, '(')) != NULL &&
-                paren < endptr)
-        {
-        /*
-         * Link to man page?
-         */
-
-          char manfile[1024],          /* Man page filename */
-               manurl[1024];           /* Man page URL */
-
-
-         /*
-         * See if the man file is available locally...
-         */
-
-          lineptr += 3;
-         endchar = *paren;
-         *paren  = '\0';
-
-         snprintf(manfile, sizeof(manfile), "%s.man", lineptr);
-         snprintf(manurl, sizeof(manurl), "man-%s.html?TOPIC=Man+Pages",
-                  lineptr);
-
-         *paren  = endchar;
-         endchar = *endptr;
-         *endptr = '\0';
-
-         if (access(manfile, 0))
-         {
-          /*
-           * Not a local man page, just do it italic...
-           */
-
-           fputs("<i>", outfile);
-           while (*lineptr)
-             putc_entity(*lineptr++, outfile);
-           fputs("</i>", outfile);
-         }
-         else
-         {
-          /*
-           * Local man page, do a link...
-           */
-
-           fprintf(outfile, "<a href='%s'>", manurl);
-           while (*lineptr)
-             putc_entity(*lineptr++, outfile);
-           fputs("</a>", outfile);
-         }
-
-          *endptr = endchar;
-         lineptr = endptr + 2;
-       }
-        else if (*lineptr == '\\')
-       {
-         lineptr ++;
-         if (!*lineptr)
-           break;
-         else if (isdigit(lineptr[0]) && isdigit(lineptr[1]) &&
-                  isdigit(lineptr[2]))
-         {
-           fprintf(outfile, "&#%d;", ((lineptr[0] - '0') * 8 +
-                                      lineptr[1] - '0') * 8 +
-                                     lineptr[2] - '0');
-           lineptr += 2;
-         }
-         else if (*lineptr == '&')
-           continue;
-         else if (*lineptr == 's')
-         {
-           while (lineptr[1] == '-' || isdigit(lineptr[1]))
-             lineptr ++;
-         }
-         else if (*lineptr == '*')
-         {
-           lineptr += 2;
-         }
-         else if (*lineptr != 'f')
-           putc_entity(*lineptr, outfile);
-         else
-         {
-           lineptr ++;
-           if (!*lineptr)
-             break;
-           else
-           {
-             fputs(end_fonts[font], outfile);
-
-             switch (*lineptr)
-             {
-               default : /* Regular */
-                   font = 0;
-                   break;
-               case 'B' : /* Bold */
-               case 'b' :
-                   font = 1;
-                   break;
-               case 'I' : /* Italic */
-               case 'i' :
-                   font = 2;
-                   break;
-             }
-
-             fputs(start_fonts[font], outfile);
-           }
-         }
-       }
-       else
-         putc_entity(*lineptr, outfile);
-      }
+      html_fputs(line, &font, outfile);
+      putc('\n', outfile);
 
       if (post)
       {
         fputs(post, outfile);
        post = NULL;
       }
-
-      if (list == 1)
-      {
-       fputs("</dt>\n<dd>", outfile);
-       list = 2;
-      }
     }
   }
 
   fprintf(outfile, "%s\n", end_fonts[font]);
-
-  if (blist)
-  {
-    fputs("</li>\n</ul>\n", outfile);
-  }
+  font = 0;
 
   if (list)
   {
-    if (list == 1)
-      fputs("</dt>\n", outfile);
-    else if (list)
-      fputs("</dd>\n", outfile);
-
-    fputs("</dl>\n", outfile);
+    fprintf(outfile, "</%s>\n", list);
+    list = NULL;
   }
 
   fputs("</body>\n"
@@ -684,12 +898,303 @@ process_text:
 
 
 /*
- * 'putc_entity()' - Put a single character, using entities as needed.
+ * '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, "<a href=\"%s\">", 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;
+      else if (*s == '\\' && s[1])
+      {
+        s ++;
+        html_putc(*s++, fp);
+      }
+      else
+        html_putc(*s++, fp);
+    }
+
+    if (!i && first)
+      fprintf(fp, "</%s>", first);
+    else if (i && second)
+      fprintf(fp, "</%s>", second);
+
+    if (i && link)
+    {
+      fputs("</a>", 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("&reg;", fp);
+              break;
+
+          case '(' :
+             if (!strncmp(s, "lq", 2))
+               fputs("&ldquo;", fp);
+             else if (!strncmp(s, "rq", 2))
+               fputs("&rdquo;", fp);
+              else if (!strncmp(s, "Tm", 2))
+                fputs("<sup>TM</sup>", 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("&mdash;", fp);
+          s += 3;
+        }
+        else if (!strncmp(s, "(en", 3))
+        {
+          fputs("&ndash;", fp);
+          s += 3;
+        }
+        else
+        {
+          putc(*s, fp);
+          s ++;
+        }
+      }
+      else if (*s == '[')
+      {
+       /*
+        * Substitute escaped character...
+        */
+
+        s ++;
+       if (!strncmp(s, "co]", 3))
+         fputs("&copy;", fp);
+       else if (!strncmp(s, "de]", 3))
+         fputs("&deg;", fp);
+        else if (!strncmp(s, "rg]", 3))
+         fputs("&reg;", fp);
+       else if (!strncmp(s, "tm]", 3))
+         fputs("<sup>TM</sup>", 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(*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, "<a href=\"%s\">%s</a>", temp, temp);
+      s = end;
+    }
+    else
+      html_putc(*s++ & 255, fp);
+  }
+}
+
+
+/*
+ * 'html_putc()' - Put a single character, using entities as needed.
  */
 
 static void
-putc_entity(int  ch,                   /* I - Character */
-            FILE *fp)                  /* I - File */
+html_putc(int  ch,                     /* I - Character */
+         FILE *fp)                     /* I - File */
 {
   if (ch == '&')
     fputs("&amp;", fp);
@@ -716,5 +1221,5 @@ strmove(char       *d,                     /* I - Destination */
 
 
 /*
- * End of "$Id: mantohtml.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: mantohtml.c 12362 2014-12-12 19:50:49Z msweet $".
  */
index 311353a..d5145ce 100644 (file)
@@ -1,46 +1,66 @@
 .\"
-.\" "$Id: mime.convs.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: mime.convs.man 12848 2015-08-26 18:51:57Z msweet $"
 .\"
-.\"   mime.convs man page for CUPS.
+.\" mime.convs man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2015 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH mime.convs 5 "CUPS" "20 March 2006" "Apple Inc."
+.TH mime.convs 5 "CUPS" "26 August 2015" "Apple Inc."
 .SH NAME
 mime.convs \- mime type conversion file for cups
 .SH DESCRIPTION
-The \fImime.convs\fR file defines the filters that are available
-for converting files from one format to another. The standard
-filters support text, PDF, PostScript, HP-GL/2, and many types of
-image files.
+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 can be added to the \fImime.convs\fR file or
-(preferably) to other files in the CUPS configuration directory.
+Additional filters are specified in files with the extension \fI.convs\fR in the CUPS configuration directory.
 .LP
-Each line in the \fImime.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:
+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 OS X.
+.SH EXAMPLES
+Define a filter that converts PostScript documents to CUPS Raster format:
 .nf
 
-super/type super/type cost filter
-application/postscript application/vnd.cups-raster 50 pstoraster
+    application/vnd.cups\-postscript application/vnd.cups\-raster 50 pstoraster
+
 .fi
 .SH SEE ALSO
-\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR,
-\fImime.types(5)\fR, \fIprinters.conf(5)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: mime.convs.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: mime.convs.man 12848 2015-08-26 18:51:57Z msweet $".
 .\"
index bf1dd9b..c3dd2f3 100644 (file)
 .\"
-.\" "$Id: mime.types.man 7670 2008-06-17 22:42:08Z mike $"
+.\" "$Id: mime.types.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   mime.types man page for CUPS.
+.\" mime.types man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH mime.types 5 "CUPS" "16 May 2009" "Apple Inc."
+.TH mime.types 5 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
 mime.types \- mime type description file for cups
 .SH DESCRIPTION
-The \fImime.types\fR file defines the recognized file types.
+The \fBmime.types\fR file defines the recognized file types.
 .LP
-Additional file types can be added to \fImime.types\fR or
-(preferably) in additional files in the CUPS configuration
-directory with the extension ".types".
+Additional file types are specified in files with the extension \fI.types\fR in the CUPS configuration directory.
 .LP
-Each line in the \fImime.types\fR file is a comment, blank, or
-rule line. Comment lines start with the # character. Rule lines
-start with the MIME type name and are optionally followed by a
-series of file recognition rules that are used to automatically
-identify print and web files:
-.br
+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
 
-    super/type rule [ ... ruleN]
+    \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 type names 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.
+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 and "," or whitespace for a logical OR, and negated using
-"!".
-.SH RULES
+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:
+values inside parenthesis.
+The following functions are available:
 .TP 5
-match("pattern")
-.br
-Pattern match on filename
+\fBmatch("\fIpattern\fB")\fR
+True if the filename matches the given shell wildcard \fIpattern\fR.
 .TP 5
-ascii(offset,length)
-.br
-True if bytes are valid printable ASCII (CR, NL, TAB, BS, 32-126)
+\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
-printable(offset,length)
-.br
-True if bytes are printable 8-bit chars (CR, NL, TAB, BS, 32-126, 128-254)
+\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
-priority(number)
-.br
-Specifies the relative priority of this MIME type. The default priority is 100.
+\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
-string(offset,"string")
-.br
-True if bytes are identical to string
+\fBstring(\fIoffset\fB,"\fIstring\fB")\fR
+True if the bytes starting at \fIoffset\fR are identical to \fIstring\fR.
 .TP 5
-istring(offset,"string")
-.br
-True if a case-insensitive comparison of the bytes is identical
+\fBistring(\fIoffset\fB,"\fIstring\fB")\fR
+True if the bytes starting at \fIoffset\fR match \fIstring\fR without respect to case.
 .TP 5
-char(offset,value)
-.br
-True if byte is identical
+\fBchar(\fIoffset\fB,\fIvalue\fB)\fR
+True if the byte at \fIoffset\fR is identical to \fIvalue\fR.
 .TP 5
-short(offset,value)
-.br
-True if 16-bit integer is identical
+\fBshort(\fIoffset\fB,\fIvalue\fB)\fR
+True if the 16-bit big-endian integer at \fIoffset\fR is identical to \fIvalue\fR.
 .TP 5
-int(offset,value)
-.br
-True if 32-bit integer is identical
+\fBint(\fIoffset\fB,\fIvalue\fB)\fR
+True if the 32-bit big-endian integer at \fIoffset\fR is identical to \fIvalue\fR.
 .TP 5
-locale("string")
-.br
-True if current locale matches string
+\fBlocale("\fIstring\fB")\fR
+True if current locale matches \fIstring\fR.
 .TP 5
-contains(offset,range,"string")
-.br
-True if the range contains the string
-.SH STRING CONSTANTS
-String constants can be specified inside quotes ("") for strings
-containing whitespace and angle brackets (<>) for hexadecimal
-strings.
-.SH TYPE MATCHING AND PRIORITY
-When CUPS needs to determine the MIME type of a given file, it checks every
-MIME type defined in the .types files. When two types have the same matching
-rules, 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.
+\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.
+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
-\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR,
-\fImime.convs(5)\fR, \fIprinters.conf(5)\fR,
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: mime.types.man 7670 2008-06-17 22:42:08Z mike $".
+.\" End of "$Id: mime.types.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 4112878..3284f59 100644 (file)
@@ -1,18 +1,18 @@
 .\"
-.\" "$Id$"
+.\" "$Id: notifier.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   notifier man page for CUPS.
+.\" notifier man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH notifier 7 "CUPS" "12 May 2009" "Apple Inc."
+.TH notifier 7 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
 notifier \- cups notification interface
 .SH SYNOPSIS
@@ -22,136 +22,23 @@ notifier \- cups notification interface
 .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.
+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
-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.
-.SH LOG MESSAGES
-Messages sent to stderr are generally logged to the current \fIErrorLog\fR.
-Each line begins with a standard prefix:
-
-.TP 5
-ALERT: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "alert" log level.
-
-.TP 5
-CRIT: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "critical" log level.
-
-.TP 5
-DEBUG: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "debug" log level.
-
-.TP 5
-DEBUG2: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "debug2" log level.
-
-.TP 5
-EMERG: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "emergency" log level.
-
-.TP 5
-ERROR: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "error" log level.
-
-.TP 5
-INFO: message
-.br
-Sets the printer-state-message attribute. If the current \fILogLevel\fR
-is set to "debug2", also adds the specified message to the
-current \fIErrorLog\fR using the "info" log level.
-
-.TP 5
-NOTICE: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "notice" log level.
-
-.TP 5
-WARNING: message
-.br
-Sets the printer-state-message attribute and adds the specified
-message to the current \fIErrorLog\fR using the "warning" log level.
-
-.SH ENVIRONMENT VARIABLES
-The following environment variables are defined by the CUPS server when
-executing the notifier:
-
-.TP 5
-CHARSET
-.br
-The default text character set, typically utf-8.
-
-.TP 5
-CUPS_CACHEDIR
-.br
-The directory for semi-persistent cache files can be found.
-
-.TP 5
-CUPS_DATADIR
-.br
-The directory where data files can be found.
-
-.TP 5
-CUPS_FILETYPE
-.br
-The type of file being printed: "job-sheet" for a banner page and "document"
-for a regular print file.
-
-.TP 5
-CUPS_SERVERROOT
-.br
-The root directory of the server.
-
-.TP 5
-LANG
-.br
-The default language locale (typically C or en).
-
-.TP 5
-PATH
-.br
-The standard execution path for external programs that may be run by
-the filter.
-
-.TP 5
-SOFTWARE
-.br
-The name and version number of the server (typically CUPS/1.2).
-
-.TP 5
-TZ
-.br
-The timezone of the server.
-
-.TP 5
-USER
-.br
-The user executing the filter, typically "lp"; consult the \fIcupsd.conf(5)\fR
-file for the current setting.
-
+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
-\fIbackend(7)\fR, \fIcupsd(8)\fR, \fIfilter(7)\fR,
-.br
-http://localhost:631/help
+.BR cupsd (8),
+.BR filter (7),
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id$".
+.\" End of "$Id: notifier.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 933e7d1..20e96c4 100644 (file)
 .\"
-.\" "$Id: ppdc.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: ppdc.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   ppdc man page for CUPS.
+.\" ppdc man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH ppdc 1 "CUPS" "15 February 2012" "Apple Inc."
+.TH ppdc 1 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
-ppdc \- cups ppd compiler
+ppdc \- cups ppd compiler (deprecated)
 .SH SYNOPSIS
 .B ppdc
-[ -D
-.I name[=value]
-] [ -I
+[
+\fB\-D \fIname\fR[\fB=\fIvalue\fR]
+] [
+.B \-I
 .I include-directory
-] [ -c
+] [
+.B \-c
 .I message-catalog
-] [ -d
+] [
+.B \-d
 .I output-directory
-] [ -l
+] [
+.B \-l
 .I language(s)
-] [-m] [-t] [ -v ] [ -z ] [ --cr ] [ --crlf ] [ --lf ]
+] [
+.B \-m
+] [
+.B \-t
+] [
+.B \-v
+] [
+.B \-z
+] [
+.B \-\-cr
+] [
+.B \-\-crlf
+] [
+.B \-\-lf
+]
 .I source-file
 .SH DESCRIPTION
-\fIppdc\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
-.PP
-The \fI-D\fR option sets the named variable for use in the
-source file. It is equivalent to using the #define directive
-in the source file.
-.PP
-The \fI-I\fR option specifies an alternate include directory;
-multiple \fI-I\fR options can be supplied to add additional
-directories.
-.PP
-The \fI-c\fR option specifies a single message catalog file in GNU
-gettext source format (filename.po) to be used for localization.
-.PP
-The \fI-d\fR option specifies the output directory for PPD
-files. The default output directory is "ppd".
-.PP
-The \fI-l\fR option 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.
-.PP
-The \fI-m\fR option specifies that the output filename should be
-based on the ModelName value instead of FileName or PCFilenName.
-.PP
-The \fI-t\fR option specifies that PPD files should be tested instead
-of generated.
-.PP
-The \fI-v\fR option provides more verbose output, basically a
-running status of which files are being loaded or written.
-.PP
-The \fI-z\fR option generates compressed PPD files (filename.ppd.gz).
+\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.
-.PP
-The \fI--cr\fR, \fI--crlf\fR, and \fI--lf\fR options specify the
-line ending to use - carriage return, carriage return and line feed,
-or line feed. The default is to use the line feed character alone.
+.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 SEE ALSO
-ppdhtml(1), ppdi(1), ppdmerge(1), ppdpo(1), ppdcfile(5)
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: ppdc.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: ppdc.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index a7a56a8..79ec4eb 100644 (file)
 .\"
-.\" "$Id: ppdcfile.man 7607 2008-05-21 01:06:23Z mike $"
+.\" "$Id: ppdcfile.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   ppdcfile man page for CUPS.
+.\" ppdcfile man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH ppdcfile 5 "CUPS" "3 December 2012" "Apple Inc."
+.TH ppdcfile 5 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
 ppdcfile \- cups ppd compiler source file format
 .SH DESCRIPTION
-The CUPS PPD compiler reads meta files that contain descriptions
-of one or more PPD files to be generated by \fIppdc\fR. This man
-page provides a quick reference to the supported keywords and
-should be used in conjunction with the online help for CUPS.
+The CUPS PPD compiler reads meta files that contain descriptions of one or more PPD files to be generated by
+.BR 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.
 .PP
-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.
+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.
 .PP
-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.
+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.
 .PP
-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:
+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:
 .TP 5
-\fB#define\fR name value
+\fB#define \fIname value\fR
 .TP 5
-\fB#elif\fR {name | value}
+\fB#elif \fR{\fIname \fR| \fIvalue\fR}
 .TP 5
 \fB#else\fR
 .TP 5
 \fB#endif\fR
 .TP 5
-\fB#font\fR name encoding "version" charset status
+\fB#font \fIname encoding "version" charset status\fR
 .TP 5
-\fB#if\fR {name | value}
+\fB#if \fR{\fIname \fR| \fIvalue\fR}
 .TP 5
-\fB#include\fR <filename>
+\fB#include <\fIfilename\fB>\fR
 .TP 5
-\fB#include\fR "filename"
+\fB#include "\fIfilename\fB"\fR
 .TP 5
-\fB#media\fR name width length
+\fB#media \fIname width length\fR
 .TP 5
-\fB#media\fR "name/text" width length
+\fB#media "\fIname\fB/\fItext\fB" \fIwidth length\fR
 .TP 5
-\fB#po\fR locale "filename.po"
+\fB#po \fIlocale \fB"\fIfilename\fB"\fR
 .TP 5
-\fBAttribute\fR name "" value
+\fBAttribute \fIname \fB"" \fIvalue\fR
 .TP 5
-\fBAttribute\fR name keyword value
+\fBAttribute \fIname keyword value\fR
 .TP 5
-\fBAttribute\fR name "keyword/text" value
+\fBAttribute \fIname \fB"\fIkeyword\fB/\fItext\fB" \fIvalue\fR
 .TP 5
-\fBChoice\fR name "code"
+\fBChoice \fIname \fB"\fIcode\fB"\fR
 .TP 5
-\fBChoice\fR "name/text" "code"
+\fBChoice \fB"\fIname\fB/\fItext\fB" "\fIcode\fB"\fR
 .TP 5
-\fBColorDevice\fR boolean-value
+\fBColorDevice \fIboolean-value\fR
 .TP 5
-\fBColorModel\fR name colorspace colororder compression
+\fBColorModel \fIname colorspace colororder compression\fR
 .TP 5
-\fBColorModel\fR "name/text" colorspace colororder compression
+\fBColorModel "\fIname\fB/\fItext\fB" \fIcolorspace colororder compression\fR
 .TP 5
-\fBColorProfile\fR resolution/mediatype gamma density matrix
+\fBColorProfile \fIresolution\fB/\fImediatype gamma density matrix\fR
 .TP 5
-\fBCopyright\fR "text"
+\fBCopyright "\fItext\fR"
 .TP 5
-\fBCustomMedia\fR name width length left bottom right top "size-code" "region-code"
+\fBCustomMedia \fIname width length left bottom right top \fB"\fIsize-code\fB" "\fIregion-code\fB"\fR
 .TP 5
-\fBCustomMedia\fR "name/text" width length left bottom right top "size-code" "region-code"
+\fBCustomMedia "\fIname\fB/\fItext\fB" \fIwidth length left bottom right top \fB"\fIsize-code\fB" "\fIregion-code\fB"\fR
 .TP 5
-\fBCutter\fR boolean-value
+\fBCutter \fIboolean-value\fR
 .TP 5
-\fBDarkness\fR temperature name
+\fBDarkness \fItemperature name\fR
 .TP 5
-\fBDarkness\fR temperature "name/text"
+\fBDarkness \fItemperature \fB"\fIname\fB/\fItext\fB"\fR
 .TP 5
-\fBDriverType\fR type
+\fBDriverType \fItype\fR
 .TP 5
-\fBDuplex\fR type
+\fBDuplex \fItype\fR
 .TP 5
-\fBFilter\fR mime-type cost program
+\fBFilter \Imime-type cost program\fR
 .TP 5
-\fBFinishing\fR name
+\fBFinishing \fIname\fR
 .TP 5
-\fBFinishing\fR "name/text"
+\fBFinishing "\fIname\fB/\fItext\fB"\fR
 .TP 5
-\fBFont\fR *
+\fBFont *\fR
 .TP 5
-\fBFont\fR name encoding "version" charset status
+\fBFont \fIname encoding \fB"\fIversion\fB" \fIcharset status\fR
 .TP 5
-\fBGroup\fR name
+\fBGroup \fIname\fR
 .TP 5
-\fBGroup\fR "name/text"
+\fBGroup "\fIname\fB/\fItext\fB"\fR
 .TP 5
-\fBHWMargins\fR left bottom right top
+\fBHWMargins \fIleft bottom right top\fR
 .TP 5
-\fBInputSlot\fR position name
+\fBInputSlot \fIposition name\fR
 .TP 5
-\fBInputSlot\fR position "name/text"
+\fBInputSlot \fIposition \fB"\fIname\fB/\fItext\fB"\fR
 .TP 5
-\fBInstallable\fR name
+\fBInstallable \fIname\fR
 .TP 5
-\fBInstallable\fR "name/text"
+\fBInstallable "\fIname\fB/\fItext\fB"\fR
 .TP 5
-\fBLocAttribute\fR name "keyword/text" value
+\fBLocAttribute \fIname \fB"\fIkeyword\fB/\fItext\fB" \fIvalue\fR
 .TP 5
-\fBManualCopies\fR boolean-value
+\fBManualCopies \fIboolean-value\fR
 .TP 5
-\fBManufacturer\fR "name"
+\fBManufacturer "\fIname\fB"\fR
 .TP 5
-\fBMaxSize\fR width length
+\fBMaxSize \fIwidth length\fR
 .TP 5
-\fBMediaSize\fR name
+\fBMediaSize \fIname\fR
 .TP 5
-\fBMediaType\fR type name
+\fBMediaType \fItype name\fR
 .TP 5
-\fBMediaType\fR type "name/text"
+\fBMediaType \fItype \fB"\fIname\fB/\fItext\fB"\fR
 .TP 5
-\fBMinSize\fR width length
+\fBMinSize \fIwidth length\fR
 .TP 5
-\fBModelName\fR "name"
+\fBModelName "\fIname\fB"\fR
 .TP 5
-\fBModelNumber\fR number
+\fBModelNumber \fInumber\fR
 .TP 5
-\fBOption\fR name type section order
+\fBOption \fIname type section order\fR
 .TP 5
-\fBOption\fR "name/text" type section order
+\fBOption "\fIname\fB/\fItext\fB" \fItype section order\fR
 .TP 5
-\fBPCFileName\fR "filename.ppd"
+\fBPCFileName "\fIfilename.ppd\fB"\fR
 .TP 5
-\fBResolution\fR colorspace bits-per-color row-count row-feed row-step name
+\fBResolution \fIcolorspace bits-per-color row-count row-feed row-step name\fR
 .TP 5
-\fBResolution\fR colorspace bits-per-color row-count row-feed row-step "name/text"
+\fBResolution \fIcolorspace bits-per-color row-count row-feed row-step \fB"\fIname\fB/\fItext\fB"\fR
 .TP 5
-\fBSimpleColorProfile\fR resolution/mediatype density yellow-density red-density gamma red-adjust green-adjust blue-adjust
+\fBSimpleColorProfile \fIresolution\fB/\fImediatype density yellow-density red-density gamma red-adjust green-adjust blue-adjust\fR
 .TP 5
-\fBThroughput\fR pages-per-minute
+\fBThroughput \fIpages-per-minute\fR
 .TP 5
-\fBUIConstraints\fR "*Option1 *Option2"
+\fBUIConstraints "\fI*Option1 *Option2\fB"\fR
 .TP 5
-\fBUIConstraints\fR "*Option1 Choice1 *Option2"
+\fBUIConstraints "\fI*Option1 Choice1 *Option2\fB"\fR
 .TP 5
-\fBUIConstraints\fR "*Option1 *Option2 Choice2"
+\fBUIConstraints "\fI*Option1 *Option2 Choice2\fB"\fR
 .TP 5
-\fBUIConstraints\fR "*Option1 Choice1 *Option2 Choice2"
+\fBUIConstraints "\fI*Option1 Choice1 *Option2 Choice2\fB"\fR
 .TP 5
-\fBVariablePaperSize\fR boolean-value
+\fBVariablePaperSize \fIboolean-value\fR
 .TP 5
-\fBVersion\fR number
+\fBVersion \fInumber\fR
 .SH SEE ALSO
-ppdc(1), ppdhtml(1), ppdi(1), ppdmerge(1), ppdpo(1)
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: ppdcfile.man 7607 2008-05-21 01:06:23Z mike $".
+.\" End of "$Id: ppdcfile.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 78df7d3..f5a9596 100644 (file)
@@ -1,46 +1,51 @@
 .\"
-.\" "$Id: ppdhtml.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: ppdhtml.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   ppdhtml man page for CUPS.
+.\" ppdhtml man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH ppdhtml 1 "CUPS" "10 October 2008" "Apple Inc."
+.TH ppdhtml 1 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
-ppdhtml \- cups html summary generator
+ppdhtml \- cups html summary generator (deprecated)
 .SH SYNOPSIS
 .B ppdhtml
-[ -D
-.I name[=value]
-] [ -I
+[
+\fB\-D \fIname\fR[\fB=\fIvalue\fR]
+] [
+.B \-I
 .I include-directory
 ]
 .I source-file
 .SH DESCRIPTION
-\fIppdhtml\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.
-.PP
-The \fI-D\fR option sets the named variable for use in the
-source file. It is equivalent to using the #define directive
-in the source file.
-.PP
-The \fI-I\fR option specifies an alternate include directory;
-multiple \fI-I\fR options can be supplied to add additional
-directories.
+\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 SEE ALSO
-ppdc(1), ppdcfile(5), ppdi(1), ppdmerge(1), ppdpo(1)
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: ppdhtml.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: ppdhtml.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 38658e0..db04476 100644 (file)
@@ -1,46 +1,58 @@
 .\"
-.\" "$Id: ppdi.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: ppdi.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   ppdi man page for CUPS.
+.\" ppdi man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH ppdi 1 "CUPS" "20 May 2008" "Apple Inc."
+.TH ppdi 1 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
-ppdi \- import ppd files
+ppdi \- import ppd files (deprecated)
 .SH SYNOPSIS
 .B ppdi
-[ \-I
+[
+.B \-I
 .I include-directory
-] [ \-o
+] [
+.B \-o
 .I source-file
 ]
 .I ppd-file
-[
-.I ppd-file2 ... ppd-fileN
+[ ...
+.I ppd-file
 ]
 .SH DESCRIPTION
-\fIppdi\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.
-.PP
-The \fI-o\fR option 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.
+\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 SEE ALSO
-ppdc(1), ppdhtml(1), ppdmerge(1), ppdpo(1), ppdcfile(5)
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: ppdi.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: ppdi.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 397314e..71239ad 100644 (file)
@@ -1,47 +1,54 @@
 .\"
-.\" "$Id: ppdmerge.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: ppdmerge.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   ppdmerge man page for CUPS.
+.\" ppdmerge man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH ppdmerge 1 "CUPS" "20 May 2008" "Apple Inc."
+.TH ppdmerge 1 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
-ppdmerge \- merge ppd files
+ppdmerge \- merge ppd files (deprecated)
 .SH SYNOPSIS
 .B ppdmerge
-[ \-o
+[
+.B \-o
 .I output-ppd-file
 ]
 .I ppd-file
-.I ppd-file2
-[
-.I ... ppd-fileN
+.I ppd-file
+[ ...
+.I ppd-file
 ]
 .SH DESCRIPTION
-\fIppdmerge\fR merges two or more PPD files into a single, multi-language
+\fBppdmerge\fR merges two or more PPD files into a single, multi-language
 PPD file.
-.PP
-The \fI-o\fR option 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, the new
+\fBThis program is deprecated and will be removed in a future release of CUPS.\fR
+.SH OPTIONS
+\fBppdmerge\fR supports the following options:
+.TP
+\fB\-o \fIoutput-ppd-file\fR
+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.
 .SH NOTES
-\fIppdmerge\fR does not check whether the merged PPD files are for the
-same device. Merging of different device PPDs will yield unpredictable
-results.
+\fBppdmerge\fR does not check whether the merged PPD files are for the same device.
+Merging of different device PPDs will yield unpredictable results.
 .SH SEE ALSO
-cupsprofile(1), ppdc(1), ppdhtml(1), ppdi(1), ppdpo(1), ppdcfile(5)
-.br
-http://localhost:631/help
+.BR ppdc (1),
+.BR ppdhtml (1),
+.BR ppdi (1),
+.BR ppdpo (1),
+.BR ppdcfile (5),
+CUPS Online Help (http://localhost:631/help)
 .SH COPYRIGHT
-Copyright 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: ppdmerge.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: ppdmerge.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index c6378bc..6acf098 100644 (file)
@@ -1,52 +1,58 @@
 .\"
-.\" "$Id: ppdpo.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: ppdpo.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   ppdpo man page for CUPS.
+.\" ppdpo man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2007 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2007 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH ppdpo 1 "CUPS" "23 April 2012" "Apple Inc."
+.TH ppdpo 1 "CUPS" "12 June 2014" "Apple Inc."
 .SH NAME
-ppdpo \- ppd message catalog generator
+ppdpo \- ppd message catalog generator (deprecated)
 .SH SYNOPSIS
 .B ppdpo
-[ -D
-.I name[=value]
-] [ -I
+[
+\fB\-D \fIname\fR[\fB=\fIvalue\fR]
+] [
+.B \-I
 .I include-directory
-] [ -o
+] [
+.B \-o
 .I output-file
 ]
 .I source-file
 .SH DESCRIPTION
-\fIppdpo\fR extracts UI strings from PPDC source files and updates either
-a GNU gettext or OS X strings format message catalog source file for
-translation.
-.PP
-The \fI-D\fR option sets the named variable for use in the
-source file. It is equivalent to using the #define directive
-in the source file.
-.PP
-The \fI-I\fR option specifies an alternate include directory;
-multiple \fI-I\fR options can be supplied to add additional
-directories.
-.PP
-The \fI-o\fR option specifies the output file. The supported extensions are
-".po" or ".po.gz" for GNU gettext format message catalogs and ".strings" for
-OS X strings files.
+\fBppdpo\fR extracts UI strings from PPDC source files and updates either a GNU gettext or OS X 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 OS X strings files.
 .SH SEE ALSO
-ppdc(1), ppdhtml(1), ppdi(1), ppdmerge(1), ppdcfile(5)
-.br
-http://localhost:631/help
+.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: ppdpo.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: ppdpo.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 6d8609f..9a3d148 100644 (file)
 .\"
-.\" "$Id: printers.conf.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: printers.conf.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   printers.conf man page for CUPS.
+.\" printers.conf man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 1997-2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH printers.conf 5 "CUPS" "29 April 2009" "Apple Inc."
+.TH printers.conf 5 "CUPS" "15 April 2014" "Apple Inc."
 .SH NAME
 printers.conf \- printer configuration file for cups
 .SH DESCRIPTION
-The \fIprinters.conf\fR file defines the local printers that are
-available. It is normally located in the \fI/etc/cups\fR directory and
-is generated automatically by the \fIcupsd(8)\fR program when printers
-are added or deleted.
-.LP
-Each line in the file can be a configuration directive, a blank line,
-or a comment. Comment lines start with the # character.
-.SH DIRECTIVES
-.TP 5
-<Printer name> ... </Printer>
-.br
-Defines a specific printer.
-.TP 5
-<DefaultPrinter name> ... </Printer>
-.br
-Defines a default printer.
-.TP 5
-Accepting Yes
-.TP 5
-Accepting No
-.br
-Specifies whether the printer is accepting new jobs.
-.TP 5
-AllowUser [ user @group ... ]
-.br
-Allows specific users and groups to print to the printer.
-.TP 5
-DenyUser [ user @group ... ]
-.br
-Prevents specific users and groups from printing to the printer.
-.TP 5
-DeviceURI uri
-.br
-Specifies the device URI for a printer.
-.TP 5
-ErrorPolicy abort-job
-.TP 5
-ErrorPolicy retry-current-job
-.TP 5
-ErrorPolicy retry-job
-.TP 5
-ErrorPolicy stop-printer
-.br
-Specifies the error policy for the printer.
-.TP 5
-Info text
-.br
-Specifies human-readable text describing the printer.
-.TP 5
-JobSheets banner banner
-.br
-Specifies the banner pages to use for the printer.
-.TP 5
-KLimit number
-.br
-Specifies the job-k-limit value for the printer.
-.TP 5
-Location text
-.br
-Specifies human-readable text describing the location of the printer.
-.TP 5
-OpPolicy name
-.br
-Specifies the operation policy for the printer.
-.TP 5
-PageLimit number
-.br
-Specifies the job-page-limit value for the printer.
-.TP 5
-PortMonitor monitor
-.br
-Specifies the port monitor for a printer.
-.TP 5
-QuotaPeriod seconds
-.br
-Specifies the job-quota-period value for the printer.
-.TP 5
-Shared Yes
-.TP 5
-Shared No
-.br
-Specifies whether the printer is shared.
-.TP 5
-State idle
-.TP 5
-State stopped
-.br
-Specifies the initial state of the printer (Idle or Stopped)
-.TP 5
-StateMessage text
-.br
-Specifies the message associated with the state.
-.TP 5
-StateTime seconds
-.br
-Specifies the date/time associated with the state.
+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
-\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR,
-\fImime.convs(5)\fR, \fImime.types(5)\fR,
-.br
-http://localhost:631/help
+.BR classes.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: printers.conf.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: printers.conf.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 5531c6a..860c086 100644 (file)
@@ -1,89 +1,36 @@
 .\"
-.\" "$Id: subscriptions.conf.man 7600 2008-05-20 21:06:23Z mike $"
+.\" "$Id: subscriptions.conf.man 12854 2015-08-28 14:08:00Z msweet $"
 .\"
-.\"   subscriptions.conf man page for CUPS.
+.\" subscriptions.conf man page for CUPS.
 .\"
-.\"   Copyright 2007-2013 by Apple Inc.
-.\"   Copyright 2006 by Easy Software Products.
+.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 1997-2006 by Easy Software Products.
 .\"
-.\"   These coded instructions, statements, and computer programs are the
-.\"   property of Apple Inc. and are protected by Federal copyright
-.\"   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-.\"   which should have been included with this file.  If this file is
-.\"   file is missing or damaged, see the license at "http://www.cups.org/".
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH subscriptions.conf 5 "CUPS" "30 April 2006" "Apple Inc."
+.TH subscriptions.conf 5 "CUPS" "15 April 2014" "Apple Inc."
 .SH NAME
-subscriptions.conf \- subscriptions file for cups
+subscriptions.conf \- subscription configuration file for cups
 .SH DESCRIPTION
-The \fIsubscriptions.conf\fR file defines the local subscriptions
-that are active. It is normally located in the \fI/etc/cups\fR
-directory and is generated automatically by the \fIcupsd(8)\fR
-program when subscriptions are created, renewed, or cancelled.
-.LP
-Each line in the file can be a configuration directive, a blank line,
-or a comment. Comment lines start with the # character.
-.SH DIRECTIVES
-.TP 5
-<Subscription NNN> ... </Subscription>
-.br
-Defines a subscription.
-.TP 5
-Events name [ ... name ]
-.br
-Specifies the events that are subscribed.
-.TP 5
-ExpirationTime unix-time
-.br
-Specifies the expiration time of a subscription as a UNIX time
-value in seconds since January 1st, 1970.
-.TP 5
-Interval seconds
-.br
-Specifies the preferred time interval for event notifications in
-seconds.
-.TP 5
-JobId job-id
-.br
-Specifies the job ID associated with the subscription.
-.TP 5
-LeaseDuration seconds
-.br
-Specifies the number of seconds that the subscription is valid
-for. If 0, the subscription does not expire.
-.TP 5
-NextEventId number
-.br
-Specifies the next notify-sequence-number to use for the
-subscription.
-.TP 5
-NextSubscriptionId number
-.br
-Specifies the next subscription-id to use.
-.TP 5
-Owner username
-.br
-Specifies the user that owns the subscription.
-.TP 5
-PrinterName printername
-.br
-Specifies the printer or class associated with the subscription.
-.TP 5
-Recipient uri
-.br
-Specifies the notify-recipient-uri value for push-type notifications.
-.TP 5
-UserData hex-escaped-data
-.br
-Specifies user data to be included in event notifications. This
-is typically the "from" address in mailto: notifications.
+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
-\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR,
-\fImime.convs(5)\fR, \fImime.types(5)\fR, \fRprinters.conf(5)\fR
-.br
-http://localhost:631/help
+.BR classes.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 2007-2013 by Apple Inc.
+Copyright \[co] 2007-2015 by Apple Inc.
 .\"
-.\" End of "$Id: subscriptions.conf.man 7600 2008-05-20 21:06:23Z mike $".
+.\" End of "$Id: subscriptions.conf.man 12854 2015-08-28 14:08:00Z msweet $".
 .\"
index 54d05e7..10a252a 100644 (file)
@@ -1,13 +1,14 @@
 bcp.o: bcp.c ../cups/cups-private.h ../cups/string-private.h ../config.h \
-  ../cups/debug-private.h ../cups/versioning.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../cups/debug-private.h ../cups/versioning.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h
 tbcp.o: tbcp.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
index c512db0..1c3bf69 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 10996 2013-05-29 11:51:34Z msweet $"
 #
 #   Port monitor makefile for CUPS.
 #
@@ -86,6 +86,7 @@ install-exec:
                $(INSTALL_DIR) $(SYMROOT); \
                for file in $(TARGETS); do \
                        cp $$file $(SYMROOT); \
+                       dsymutil $(SYMROOT)/$$file; \
                done \
        fi
 
@@ -142,5 +143,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 10996 2013-05-29 11:51:34Z msweet $".
 #
index 103c92e..11c2e68 100644 (file)
@@ -1,24 +1,18 @@
 /*
- * "$Id: bcp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: bcp.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   TBCP port monitor for CUPS.
+ * TBCP port monitor for CUPS.
  *
- *   Copyright 2007-2010 by Apple Inc.
- *   Copyright 1993-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1993-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()    - Main entry...
- *   psgets()  - Get a line from a file.
- *   pswrite() - Write data from a file.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -34,7 +28,7 @@
  */
 
 static char            *psgets(char *buf, size_t *bytes, FILE *fp);
-static size_t          pswrite(const char *buf, size_t bytes, FILE *fp);
+static ssize_t         pswrite(const char *buf, size_t bytes);
 
 
 /*
@@ -151,7 +145,7 @@ main(int  argc,                             /* I - Number of command-line args */
       if (psgets(line, &linelen, fp) == NULL)
        break;
     }
-    while (pswrite(line, linelen, stdout) > 0);
+    while (pswrite(line, linelen) > 0);
 
     fflush(stdout);
   }
@@ -184,7 +178,7 @@ psgets(char   *buf,                 /* I  - Buffer to read into */
   bufptr = buf;
   ch     = EOF;
 
-  while ((bufptr - buf) < len)
+  while ((size_t)(bufptr - buf) < len)
   {
     if ((ch = getc(fp)) == EOF)
       break;
@@ -209,7 +203,7 @@ psgets(char   *buf,                 /* I  - Buffer to read into */
     else if (ch == '\n')
       break;
     else
-      *bufptr++ = ch;
+      *bufptr++ = (char)ch;
   }
 
  /*
@@ -218,8 +212,8 @@ psgets(char   *buf,                 /* I  - Buffer to read into */
 
   if (ch == '\n' || ch == '\r')
   {
-    if ((bufptr - buf) < len)
-      *bufptr++ = ch;
+    if ((size_t)(bufptr - buf) < len)
+      *bufptr++ = (char)ch;
     else
       ungetc(ch, fp);
   }
@@ -229,7 +223,7 @@ psgets(char   *buf,                 /* I  - Buffer to read into */
   */
 
   *bufptr = '\0';
-  *bytes  = bufptr - buf;
+  *bytes  = (size_t)(bufptr - buf);
 
   if (ch == EOF && bufptr == buf)
     return (NULL);
@@ -242,10 +236,9 @@ psgets(char   *buf,                        /* I  - Buffer to read into */
  * 'pswrite()' - Write data from a file.
  */
 
-static size_t                          /* O - Number of bytes written */
+static ssize_t                         /* O - Number of bytes written */
 pswrite(const char *buf,               /* I - Buffer to write */
-        size_t     bytes,              /* I - Bytes to write */
-       FILE       *fp)                 /* I - File to write to */
+        size_t     bytes)              /* I - Bytes to write */
 {
   size_t       count;                  /* Remaining bytes */
 
@@ -283,10 +276,10 @@ pswrite(const char *buf,          /* I - Buffer to write */
          break;
     }
 
-  return (bytes);
+  return ((ssize_t)bytes);
 }
 
 
 /*
- * End of "$Id: bcp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: bcp.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index a65aaec..5325faf 100644 (file)
@@ -1,24 +1,18 @@
 /*
- * "$Id: tbcp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: tbcp.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   TBCP port monitor for CUPS.
+ * TBCP port monitor for CUPS.
  *
- *   Copyright 2007-2010 by Apple Inc.
- *   Copyright 1993-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1993-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()    - Main entry...
- *   psgets()  - Get a line from a file.
- *   pswrite() - Write data from a file.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
@@ -34,7 +28,7 @@
  */
 
 static char            *psgets(char *buf, size_t *bytes, FILE *fp);
-static size_t          pswrite(const char *buf, size_t bytes, FILE *fp);
+static ssize_t         pswrite(const char *buf, size_t bytes);
 
 
 /*
@@ -93,11 +87,8 @@ main(int  argc,                              /* I - Number of command-line args */
     */
 
     linelen = sizeof(line);
-    if (psgets(line, &linelen, fp) == NULL)
-    {
-      fputs("ERROR: Empty print file!\n", stderr);
-      return (1);
-    }
+    if (!psgets(line, &linelen, fp))
+      break;
 
    /*
     * Handle leading PJL fun...
@@ -138,7 +129,7 @@ main(int  argc,                             /* I - Number of command-line args */
     * Loop until we see end-of-file...
     */
 
-    while (pswrite(line, linelen, stdout) > 0)
+    while (pswrite(line, linelen) > 0)
     {
       linelen = sizeof(line);
       if (psgets(line, &linelen, fp) == NULL)
@@ -176,7 +167,7 @@ psgets(char   *buf,                 /* I  - Buffer to read into */
   bufptr = buf;
   ch     = EOF;
 
-  while ((bufptr - buf) < len)
+  while ((size_t)(bufptr - buf) < len)
   {
     if ((ch = getc(fp)) == EOF)
       break;
@@ -201,7 +192,7 @@ psgets(char   *buf,                 /* I  - Buffer to read into */
     else if (ch == '\n')
       break;
     else
-      *bufptr++ = ch;
+      *bufptr++ = (char)ch;
   }
 
  /*
@@ -210,8 +201,8 @@ psgets(char   *buf,                 /* I  - Buffer to read into */
 
   if (ch == '\n' || ch == '\r')
   {
-    if ((bufptr - buf) < len)
-      *bufptr++ = ch;
+    if ((size_t)(bufptr - buf) < len)
+      *bufptr++ = (char)ch;
     else
       ungetc(ch, fp);
   }
@@ -221,7 +212,7 @@ psgets(char   *buf,                 /* I  - Buffer to read into */
   */
 
   *bufptr = '\0';
-  *bytes  = bufptr - buf;
+  *bytes  = (size_t)(bufptr - buf);
 
   if (ch == EOF && bufptr == buf)
     return (NULL);
@@ -234,10 +225,9 @@ psgets(char   *buf,                        /* I  - Buffer to read into */
  * 'pswrite()' - Write data from a file.
  */
 
-static size_t                          /* O - Number of bytes written */
+static ssize_t                         /* O - Number of bytes written */
 pswrite(const char *buf,               /* I - Buffer to write */
-        size_t     bytes,              /* I - Bytes to write */
-       FILE       *fp)                 /* I - File to write to */
+        size_t     bytes)              /* I - Bytes to write */
 {
   size_t       count;                  /* Remaining bytes */
 
@@ -276,10 +266,10 @@ pswrite(const char *buf,          /* I - Buffer to write */
          break;
     }
 
-  return (bytes);
+  return ((ssize_t)bytes);
 }
 
 
 /*
- * End of "$Id: tbcp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: tbcp.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index f5a26a4..d844f9d 100644 (file)
@@ -1,20 +1,22 @@
 dbus.o: dbus.c ../cups/cups.h ../cups/file.h ../cups/versioning.h \
   ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h \
-  ../cups/string-private.h ../config.h
+  ../cups/pwg.h ../cups/string-private.h ../config.h
 mailto.o: mailto.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
 rss.o: rss.c ../cups/cups.h ../cups/file.h ../cups/versioning.h \
   ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h \
-  ../cups/string-private.h ../config.h ../cups/ipp-private.h
+  ../cups/pwg.h ../cups/string-private.h ../config.h \
+  ../cups/ipp-private.h
 testnotify.o: testnotify.c ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h
index df7a188..3206dd0 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 10996 2013-05-29 11:51:34Z msweet $"
 #
 #   Notifier makefile for CUPS.
 #
@@ -77,7 +77,10 @@ install-exec:
        done
        if test "x$(SYMROOT)" != "x"; then \
                $(INSTALL_DIR) $(SYMROOT); \
-               cp $(NOTIFIERS) $(SYMROOT); \
+               for file in $(NOTIFIERS); do \
+                       cp $$file $(SYMROOT); \
+                       dsymutil $(SYMROOT)/$$file; \
+               done \
        fi
 
 
@@ -158,5 +161,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 10996 2013-05-29 11:51:34Z msweet $".
 #
index 08449d3..2a01f24 100644 (file)
@@ -1,23 +1,18 @@
 /*
- * "$Id: dbus.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dbus.c 11594 2014-02-14 20:09:01Z msweet $"
  *
- *   D-Bus notifier for CUPS.
+ * D-Bus notifier for CUPS.
  *
- *   Copyright 2008-2011 by Apple Inc.
- *   Copyright (C) 2011 Red Hat, Inc.
- *   Copyright (C) 2007 Tim Waugh <twaugh@redhat.com>
- *   Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2008-2014 by Apple Inc.
+ * Copyright (C) 2011, 2013 Red Hat, Inc.
+ * Copyright (C) 2007 Tim Waugh <twaugh@redhat.com>
+ * Copyright 1997-2005 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()         - Read events and send DBUS notifications.
- *   acquire_lock() - Acquire a lock so we only have a single notifier running.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -154,10 +149,18 @@ enum
 
 
 /*
+ * Global variables...
+ */
+
+static char            lock_filename[1024];    /* Lock filename */
+
+
+/*
  * Local functions...
  */
 
 static int     acquire_lock(int *fd, char *lockfile, size_t locksize);
+static void    release_lock(void);
 
 
 /*
@@ -176,8 +179,6 @@ main(int  argc,                             /* I - Number of command-line args */
   DBusMessage          *message;       /* Message to send */
   DBusMessageIter      iter;           /* Iterator for message data */
   int                  lock_fd = -1;   /* Lock file descriptor */
-  char                 lock_filename[1024];
-                                       /* Lock filename */
 
 
  /*
@@ -416,7 +417,7 @@ main(int  argc,                             /* I - Number of command-line args */
        attr = ippFindAttribute(msg, "printer-state", IPP_TAG_ENUM);
        if (attr)
        {
-         dbus_uint32_t val = ippGetInteger(attr, 0);
+         dbus_uint32_t val = (dbus_uint32_t)ippGetInteger(attr, 0);
          dbus_message_iter_append_uint32(&iter, &val);
        }
        else
@@ -445,7 +446,7 @@ main(int  argc,                             /* I - Number of command-line args */
            if (i)
              *p++ = ',';
 
-           strcpy(p, ippGetString(attr, i, NULL));
+           strlcpy(p, ippGetString(attr, i, NULL), reasons_length - (size_t)(p - printer_reasons));
            p += strlen(p);
          }
          if (!dbus_message_iter_append_string(&iter, &printer_reasons))
@@ -464,7 +465,7 @@ main(int  argc,                             /* I - Number of command-line args */
                                IPP_TAG_BOOLEAN);
        if (attr)
        {
-         dbus_bool_t val = ippGetBoolean(attr, 0);
+         dbus_bool_t val = (dbus_bool_t)ippGetBoolean(attr, 0);
          dbus_message_iter_append_boolean(&iter, &val);
        }
        else
@@ -484,7 +485,7 @@ main(int  argc,                             /* I - Number of command-line args */
       attr = ippFindAttribute(msg, "notify-job-id", IPP_TAG_INTEGER);
       if (attr)
       {
-        dbus_uint32_t val = ippGetInteger(attr, 0);
+        dbus_uint32_t val = (dbus_uint32_t)ippGetInteger(attr, 0);
         dbus_message_iter_append_uint32(&iter, &val);
       }
       else
@@ -494,7 +495,7 @@ main(int  argc,                             /* I - Number of command-line args */
       attr = ippFindAttribute(msg, "job-state", IPP_TAG_ENUM);
       if (attr)
       {
-        dbus_uint32_t val = ippGetInteger(attr, 0);
+        dbus_uint32_t val = (dbus_uint32_t)ippGetInteger(attr, 0);
         dbus_message_iter_append_uint32(&iter, &val);
       }
       else
@@ -517,7 +518,7 @@ main(int  argc,                             /* I - Number of command-line args */
          if (i)
            *p++ = ',';
 
-         strcpy(p, ippGetString(attr, i, NULL));
+         strlcpy(p, ippGetString(attr, i, NULL), reasons_length - (size_t)(p - job_reasons));
          p += strlen(p);
        }
        if (!dbus_message_iter_append_string(&iter, &job_reasons))
@@ -542,7 +543,7 @@ main(int  argc,                             /* I - Number of command-line args */
                              IPP_TAG_INTEGER);
       if (attr)
       {
-        dbus_uint32_t val = ippGetInteger(attr, 0);
+        dbus_uint32_t val = (dbus_uint32_t)ippGetInteger(attr, 0);
         dbus_message_iter_append_uint32(&iter, &val);
       }
       else
@@ -576,7 +577,7 @@ main(int  argc,                             /* I - Number of command-line args */
   if (lock_fd >= 0)
   {
     close(lock_fd);
-    unlink(lock_filename);
+    release_lock();
   }
 
   return (0);
@@ -584,6 +585,27 @@ main(int  argc,                            /* I - Number of command-line args */
 
 
 /*
+ * 'release_lock()' - Release the singleton lock.
+ */
+
+static void
+release_lock(void)
+{
+  unlink(lock_filename);
+}
+
+
+/*
+ * 'handle_sigterm()' - Handle SIGTERM signal.
+ */
+static void
+handle_sigterm(int signum)
+{
+  release_lock();
+  _exit(0);
+}
+
+/*
  * 'acquire_lock()' - Acquire a lock so we only have a single notifier running.
  */
 
@@ -592,7 +614,8 @@ acquire_lock(int    *fd,            /* O - Lock file descriptor */
              char   *lockfile,         /* I - Lock filename buffer */
             size_t locksize)           /* I - Size of filename buffer */
 {
-  const char   *tmpdir;                /* Temporary directory */
+  const char           *tmpdir;        /* Temporary directory */
+  struct sigaction     action;         /* POSIX sigaction data */
 
 
  /*
@@ -610,8 +633,16 @@ acquire_lock(int    *fd,           /* O - Lock file descriptor */
 
   if ((*fd = open(lockfile, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) < 0)
     return (-1);
-  else
-    return (0);
+
+ /*
+  * Set a SIGTERM handler to make sure we release the lock if the
+  * scheduler decides to stop us.
+  */
+  memset(&action, 0, sizeof(action));
+  action.sa_handler = handle_sigterm;
+  sigaction(SIGTERM, &action, NULL);
+
+  return (0);
 }
 #else /* !HAVE_DBUS */
 int
@@ -623,5 +654,5 @@ main(void)
 
 
 /*
- * End of "$Id: dbus.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dbus.c 11594 2014-02-14 20:09:01Z msweet $".
  */
index fce6aec..724e12b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: mailto.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: mailto.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   "mailto" notifier for CUPS.
  *
@@ -642,5 +642,5 @@ print_attributes(ipp_t *ipp,                /* I - IPP request */
 
 
 /*
- * End of "$Id: mailto.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: mailto.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 1489847..f2a0402 100644 (file)
@@ -1,27 +1,16 @@
 /*
- * "$Id: rss.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: rss.c 12945 2015-10-26 19:46:02Z msweet $"
  *
- *   RSS notifier for CUPS.
+ * RSS notifier for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()           - Main entry for the test notifier.
- *   compare_rss()    - Compare two messages.
- *   delete_message() - Free all memory used by a message.
- *   load_rss()       - Load an existing RSS feed file.
- *   new_message()    - Create a new RSS message.
- *   password_cb()    - Return the cached password.
- *   save_rss()       - Save messages to a RSS file.
- *   xml_escape()     - Copy a string, escaping &, <, and > as needed.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -29,6 +18,7 @@
  */
 
 #include <cups/cups.h>
+#include <sys/stat.h>
 #include <cups/language.h>
 #include <cups/string-private.h>
 #include <cups/array.h>
@@ -629,6 +619,8 @@ save_rss(cups_array_t *rss,         /* I - RSS messages */
     return (0);
   }
 
+  fchmod(fileno(fp), 0644);
+
   fputs("<?xml version=\"1.0\"?>\n", fp);
   fputs("<rss version=\"2.0\">\n", fp);
   fputs("  <channel>\n", fp);
@@ -649,15 +641,21 @@ save_rss(cups_array_t *rss,               /* I - RSS messages */
        msg;
        msg = (_cups_rss_t *)cupsArrayPrev(rss))
   {
+    char *subject = xml_escape(msg->subject);
+    char *text = xml_escape(msg->text);
+
     fputs("    <item>\n", fp);
-    fprintf(fp, "      <title>%s</title>\n", msg->subject);
-    fprintf(fp, "      <description>%s</description>\n", msg->text);
+    fprintf(fp, "      <title>%s</title>\n", subject);
+    fprintf(fp, "      <description>%s</description>\n", text);
     if (msg->link_url)
       fprintf(fp, "      <link>%s</link>\n", msg->link_url);
     fprintf(fp, "      <pubDate>%s</pubDate>\n",
             httpGetDateString2(msg->event_time, date, sizeof(date)));
     fprintf(fp, "      <guid>%d</guid>\n", msg->sequence_number);
     fputs("    </item>\n", fp);
+
+    free(subject);
+    free(text);
   }
 
   fputs(" </channel>\n", fp);
@@ -737,5 +735,5 @@ xml_escape(const char *s)           /* I - String to escape */
 
 
 /*
- * End of "$Id: rss.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: rss.c 12945 2015-10-26 19:46:02Z msweet $".
  */
index 3186b6f..67441ce 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: testnotify.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testnotify.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Test notifier for CUPS.
  *
@@ -123,5 +123,5 @@ print_attributes(ipp_t *ipp,                /* I - IPP request */
 
 
 /*
- * End of "$Id: testnotify.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testnotify.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 3eb7f41..94a648e 100644 (file)
@@ -1,21 +1,21 @@
 #
-# "$Id: cups.list.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: cups.list.in 11776 2014-03-28 19:16:05Z msweet $"
 #
-#   ESP Package Manager (EPM) file list for CUPS.
+# ESP Package Manager (EPM) file list for CUPS.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products, all rights reserved.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 # Product information
 %product CUPS
-%copyright 2007-2012 by Apple Inc.
+%copyright 2007-2014 by Apple Inc.
 %vendor Apple Inc.
 #%license LICENSE.txt
 %readme LICENSE.txt
@@ -345,7 +345,6 @@ f 0555 root sys $BINDIR/cupstestppd systemv/cupstestppd
 f 0555 root sys $BINDIR/ipptool test/ipptool
 f 0555 root sys $BINDIR/lp systemv/lp
 f 0555 root sys $BINDIR/lpoptions systemv/lpoptions
-f 0555 root sys $BINDIR/lppasswd systemv/lppasswd
 f 0555 root sys $BINDIR/lpq berkeley/lpq
 f 0555 root sys $BINDIR/lpr berkeley/lpr
 f 0555 root sys $BINDIR/lprm berkeley/lprm
@@ -652,7 +651,6 @@ f 0444 root sys $MANDIR/man1/cupstestdsc.$MAN1EXT man/cupstestdsc.$MAN1EXT
 f 0444 root sys $MANDIR/man1/cupstestppd.$MAN1EXT man/cupstestppd.$MAN1EXT
 f 0444 root sys $MANDIR/man1/ipptool.$MAN1EXT man/ipptool.$MAN1EXT
 f 0444 root sys $MANDIR/man1/lpoptions.$MAN1EXT man/lpoptions.$MAN1EXT
-f 0444 root sys $MANDIR/man1/lppasswd.$MAN1EXT man/lppasswd.$MAN1EXT
 f 0444 root sys $MANDIR/man1/lpq.$MAN1EXT man/lpq.$MAN1EXT
 f 0444 root sys $MANDIR/man1/lprm.$MAN1EXT man/lprm.$MAN1EXT
 f 0444 root sys $MANDIR/man1/lpr.$MAN1EXT man/lpr.$MAN1EXT
@@ -736,5 +734,5 @@ f 0444 root sys $XINETD/cups-lpd scheduler/cups-lpd.xinetd
 %subpackage
 
 #
-# End of "$Id: cups.list.in 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: cups.list.in 11776 2014-03-28 19:16:05Z msweet $".
 #
index 93a1e1d..2d5219b 100644 (file)
@@ -1,25 +1,27 @@
 #
-# "$Id: cups.spec.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: cups.spec.in 12857 2015-08-31 15:00:45Z msweet $"
 #
-#   RPM "spec" file for CUPS.
+# RPM "spec" file for CUPS.
 #
-#   Original version by Jason McMullan <jmcc@ontv.com>.
+# Original version by Jason McMullan <jmcc@ontv.com>.
 #
-#   Copyright 2007-2013 by Apple Inc.
-#   Copyright 1999-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 1999-2007 by Easy Software Products, all rights reserved.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 # 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_dnssd: %define _dnssd --enable-dnssd}
 %{!?_with_dnssd: %define _dnssd --disable-dnssd}
 
+%{!?_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: 1.6.4
+Version: 2.1.2
 Release: 1
 Epoch: 1
 License: GPL
 Group: System Environment/Daemons
-Source: http://www.cups.org/software/1.6.4/cups-1.6.4-source.tar.bz2
+Source: http://www.cups.org/software/2.1.2/cups-2.1.2-source.tar.bz2
 Url: http://www.cups.org
 Packager: Anonymous <anonymous@foo.com>
 Vendor: Apple Inc.
 
+# 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
 
@@ -89,7 +118,7 @@ This package provides LPD client support.
 
 %build
 CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" \
-    ./configure %{_dbus} %{_dnssd} %{_static}
+    ./configure %{_dbus} %{_dnssd} %{_libusb1} %{_static}
 # If we got this far, all prerequisite libraries must be here.
 make
 
@@ -98,6 +127,7 @@ make
 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
 /sbin/chkconfig --add cups
@@ -135,7 +165,9 @@ rm -rf $RPM_BUILD_ROOT
 %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/interfaces
 %dir /etc/cups/ppd
 %attr(0700,root,root) %dir /etc/cups/ssl
@@ -149,31 +181,23 @@ rm -rf $RPM_BUILD_ROOT
 %dir /etc/pam.d
 /etc/pam.d/*
 
-# RC dirs are a pain under Linux...  Uncomment the appropriate ones if you
-# don't use Red Hat or Mandrake...
+%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/*
-
-# OLD RedHat/Mandrake
-#/etc/rc.d/init.d/*
-#/etc/rc.d/rc0.d/*
-#/etc/rc.d/rc2.d/*
-#/etc/rc.d/rc3.d/*
-#/etc/rc.d/rc5.d/*
-
-#/sbin/rc.d/*
-#/sbin/rc.d/rc0.d/*
-#/sbin/rc.d/rc2.d/*
-#/sbin/rc.d/rc3.d/*
-#/sbin/rc.d/rc5.d/*
+%endif
 
 /usr/bin/cancel
 /usr/bin/cupstestdsc
 /usr/bin/cupstestppd
+/usr/bin/ippfind
 /usr/bin/ipptool
 /usr/bin/lp*
 %dir /usr/lib/cups
@@ -206,10 +230,6 @@ rm -rf $RPM_BUILD_ROOT
 
 /usr/sbin/*
 %dir /usr/share/cups
-%dir /usr/share/cups/banners
-/usr/share/cups/banners/*
-%dir /usr/share/cups/data
-/usr/share/cups/data/*
 %dir /usr/share/cups/drv
 /usr/share/cups/drv/*
 %dir /usr/share/cups/ipptool
@@ -221,8 +241,11 @@ rm -rf $RPM_BUILD_ROOT
 /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/*.*
@@ -240,20 +263,20 @@ rm -rf $RPM_BUILD_ROOT
 /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/standard.html
 /usr/share/doc/cups/help/translation.html
-/usr/share/doc/cups/help/whatsnew.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/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/fr
+#/usr/share/doc/cups/fr/*
 %dir /usr/share/doc/cups/ja
 /usr/share/doc/cups/ja/*
 %dir /usr/share/doc/cups/ru
@@ -263,10 +286,14 @@ rm -rf $RPM_BUILD_ROOT
 /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/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/ru
@@ -274,33 +301,37 @@ rm -rf $RPM_BUILD_ROOT
 
 %dir /usr/share/man/man1
 /usr/share/man/man1/cancel.1.gz
+/usr/share/man/man1/cups.1.gz
 /usr/share/man/man1/cupstestdsc.1.gz
 /usr/share/man/man1/cupstestppd.1.gz
+/usr/share/man/man1/ippfind.1.gz
 /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/lppasswd.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/man8
 /usr/share/man/man8/accept.8.gz
+/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/cupsaddsmb.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/cups-deviced.8.gz
-/usr/share/man/man8/cups-driverd.8.gz
-/usr/share/man/man8/cups-snmp.8.gz
 /usr/share/man/man8/lpadmin.8.gz
 /usr/share/man/man8/lpc.8.gz
 /usr/share/man/man8/lpinfo.8.gz
@@ -355,7 +386,14 @@ rm -rf $RPM_BUILD_ROOT
 
 %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
@@ -364,5 +402,5 @@ rm -rf $RPM_BUILD_ROOT
 
 
 #
-# End of "$Id: cups.spec.in 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: cups.spec.in 12857 2015-08-31 15:00:45Z msweet $".
 #
index fd50b9d..63320a5 100644 (file)
@@ -1,25 +1,27 @@
 #
-# "$Id: cups.spec.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: cups.spec.in 12857 2015-08-31 15:00:45Z msweet $"
 #
-#   RPM "spec" file for CUPS.
+# RPM "spec" file for CUPS.
 #
-#   Original version by Jason McMullan <jmcc@ontv.com>.
+# Original version by Jason McMullan <jmcc@ontv.com>.
 #
-#   Copyright 2007-2013 by Apple Inc.
-#   Copyright 1999-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 1999-2007 by Easy Software Products, all rights reserved.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 # 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_dnssd: %define _dnssd --enable-dnssd}
 %{!?_with_dnssd: %define _dnssd --disable-dnssd}
 
+%{!?_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@
@@ -45,6 +55,25 @@ Url: http://www.cups.org
 Packager: Anonymous <anonymous@foo.com>
 Vendor: Apple Inc.
 
+# 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
 
@@ -89,7 +118,7 @@ This package provides LPD client support.
 
 %build
 CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" \
-    ./configure %{_dbus} %{_dnssd} %{_static}
+    ./configure %{_dbus} %{_dnssd} %{_libusb1} %{_static}
 # If we got this far, all prerequisite libraries must be here.
 make
 
@@ -98,6 +127,7 @@ make
 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
 /sbin/chkconfig --add cups
@@ -135,7 +165,9 @@ rm -rf $RPM_BUILD_ROOT
 %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/interfaces
 %dir /etc/cups/ppd
 %attr(0700,root,root) %dir /etc/cups/ssl
@@ -149,31 +181,23 @@ rm -rf $RPM_BUILD_ROOT
 %dir /etc/pam.d
 /etc/pam.d/*
 
-# RC dirs are a pain under Linux...  Uncomment the appropriate ones if you
-# don't use Red Hat or Mandrake...
+%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/*
-
-# OLD RedHat/Mandrake
-#/etc/rc.d/init.d/*
-#/etc/rc.d/rc0.d/*
-#/etc/rc.d/rc2.d/*
-#/etc/rc.d/rc3.d/*
-#/etc/rc.d/rc5.d/*
-
-#/sbin/rc.d/*
-#/sbin/rc.d/rc0.d/*
-#/sbin/rc.d/rc2.d/*
-#/sbin/rc.d/rc3.d/*
-#/sbin/rc.d/rc5.d/*
+%endif
 
 /usr/bin/cancel
 /usr/bin/cupstestdsc
 /usr/bin/cupstestppd
+/usr/bin/ippfind
 /usr/bin/ipptool
 /usr/bin/lp*
 %dir /usr/lib/cups
@@ -206,10 +230,6 @@ rm -rf $RPM_BUILD_ROOT
 
 /usr/sbin/*
 %dir /usr/share/cups
-%dir /usr/share/cups/banners
-/usr/share/cups/banners/*
-%dir /usr/share/cups/data
-/usr/share/cups/data/*
 %dir /usr/share/cups/drv
 /usr/share/cups/drv/*
 %dir /usr/share/cups/ipptool
@@ -221,8 +241,11 @@ rm -rf $RPM_BUILD_ROOT
 /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/*.*
@@ -240,20 +263,20 @@ rm -rf $RPM_BUILD_ROOT
 /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/standard.html
 /usr/share/doc/cups/help/translation.html
-/usr/share/doc/cups/help/whatsnew.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/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/fr
+#/usr/share/doc/cups/fr/*
 %dir /usr/share/doc/cups/ja
 /usr/share/doc/cups/ja/*
 %dir /usr/share/doc/cups/ru
@@ -263,10 +286,14 @@ rm -rf $RPM_BUILD_ROOT
 /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/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/ru
@@ -274,33 +301,37 @@ rm -rf $RPM_BUILD_ROOT
 
 %dir /usr/share/man/man1
 /usr/share/man/man1/cancel.1.gz
+/usr/share/man/man1/cups.1.gz
 /usr/share/man/man1/cupstestdsc.1.gz
 /usr/share/man/man1/cupstestppd.1.gz
+/usr/share/man/man1/ippfind.1.gz
 /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/lppasswd.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/man8
 /usr/share/man/man8/accept.8.gz
+/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/cupsaddsmb.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/cups-deviced.8.gz
-/usr/share/man/man8/cups-driverd.8.gz
-/usr/share/man/man8/cups-snmp.8.gz
 /usr/share/man/man8/lpadmin.8.gz
 /usr/share/man/man8/lpc.8.gz
 /usr/share/man/man8/lpinfo.8.gz
@@ -355,7 +386,14 @@ rm -rf $RPM_BUILD_ROOT
 
 %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
@@ -364,5 +402,5 @@ rm -rf $RPM_BUILD_ROOT
 
 
 #
-# End of "$Id: cups.spec.in 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: cups.spec.in 12857 2015-08-31 15:00:45Z msweet $".
 #
index bcabc31..9feb967 100644 (file)
 ppdc-array.o: ppdc-array.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-attr.o: ppdc-attr.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-catalog.o: ppdc-catalog.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-choice.o: ppdc-choice.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-constraint.o: ppdc-constraint.cxx ppdc-private.h ppdc.h \
   ../cups/file.h ../cups/versioning.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/ppd-private.h \
-  ../cups/ppd.h ../cups/thread-private.h
-ppdc-driver.o: ppdc-driver.cxx ppdc-private.h ppdc.h ../cups/file.h \
-  ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
   ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ppdc-driver.o: ppdc-driver.cxx ppdc-private.h ppdc.h ../cups/file.h \
+  ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-file.o: ppdc-file.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-filter.o: ppdc-filter.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-font.o: ppdc-font.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-group.o: ppdc-group.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-import.o: ppdc-import.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-mediasize.o: ppdc-mediasize.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-message.o: ppdc-message.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-option.o: ppdc-option.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-profile.o: ppdc-profile.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-shared.o: ppdc-shared.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-source.o: ppdc-source.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/raster.h ../data/epson.h ../data/hp.h ../data/label.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h ../cups/raster.h ../data/epson.h ../data/hp.h \
+  ../data/label.h
 ppdc-string.o: ppdc-string.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc-variable.o: ppdc-variable.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 genstrings.o: genstrings.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdc.o: ppdc.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdhtml.o: ppdhtml.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdi.o: ppdi.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 ppdmerge.o: ppdmerge.cxx ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
 ppdpo.o: ppdpo.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
 testcatalog.o: testcatalog.cxx ppdc-private.h ppdc.h ../cups/file.h \
   ../cups/versioning.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../config.h ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/pwg.h ../cups/ppd-private.h ../cups/ppd.h \
+  ../cups/thread-private.h
index c523144..7ac25ea 100644 (file)
@@ -1,16 +1,16 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12615 2015-05-06 20:21:51Z msweet $"
 #
-#   Makefile for the CUPS PPD Compiler.
+# Makefile for the CUPS PPD Compiler.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 2002-2006 by Easy Software Products.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 2002-2006 by Easy Software Products.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 #
@@ -104,7 +104,7 @@ clean:
        $(RM) $(TARGETS) $(UNITTARGETS)
        $(RM) -r ppd ppd2
        $(RM) sample-import.drv sample.c test.drv
-       $(RM) libcupsppdc.so libcupsppdc.sl libcupsppdc.dylib
+       $(RM) libcupsppdc.so libcupsppdc.dylib
 
 
 #
@@ -145,6 +145,7 @@ install-exec:
                $(INSTALL_DIR) $(SYMROOT); \
                for file in $(EXECTARGETS); do \
                        cp $$file $(SYMROOT); \
+                       dsymutil $(SYMROOT)/$$file; \
                done \
        fi
 
@@ -167,7 +168,7 @@ install-libs: $(INSTALLSTATIC)
        echo Installing libraries in $(LIBDIR)...
        $(INSTALL_DIR) -m 755 $(LIBDIR)
        $(INSTALL_LIB) $(LIBCUPSPPDC) $(LIBDIR)
-       if test $(LIBCUPSPPDC) = "libcupsppdc.so.1" -o $(LIBCUPSPPDC) = "libcupsppdc.sl.1"; then \
+       if test $(LIBCUPSPPDC) = "libcupsppdc.so.1"; then \
                $(RM) $(LIBDIR)/`basename $(LIBCUPSPPDC) .1`; \
                $(LN) $(LIBCUPSPPDC) $(LIBDIR)/`basename $(LIBCUPSPPDC) .1`; \
        fi
@@ -178,6 +179,7 @@ install-libs: $(INSTALLSTATIC)
        if test "x$(SYMROOT)" != "x"; then \
                $(INSTALL_DIR) $(SYMROOT); \
                cp $(LIBCUPSPPDC) $(SYMROOT); \
+               dsymutil $(SYMROOT)/$(LIBCUPSPPDC); \
        fi
 
 installstatic:
@@ -200,9 +202,6 @@ uninstall:
        $(RM) $(LIBDIR)/libcupsppdc.1.dylib
        $(RM) $(LIBDIR)/libcupsppdc.a
        $(RM) $(LIBDIR)/libcupsppdc.dylib
-       $(RM) $(LIBDIR)/libcupsppdc_s.a
-       $(RM) $(LIBDIR)/libcupsppdc.sl
-       $(RM) $(LIBDIR)/libcupsppdc.sl.1
        $(RM) $(LIBDIR)/libcupsppdc.so
        $(RM) $(LIBDIR)/libcupsppdc.so.1
        -$(RMDIR) $(LIBDIR)
@@ -291,9 +290,9 @@ ppdi-static:                ppdc-static ppdi.o libcupsppdc.a  ../cups/$(LIBCUPSSTATIC)
                $(COMMONLIBS) $(LIBZ)
        echo Testing PPD importer...
        $(RM) -r ppd ppd2 sample-import.drv
-       ./ppdc-static -I ../data sample.drv
+       ./ppdc-static -l en -I ../data sample.drv
        ./ppdi-static -I ../data -o sample-import.drv ppd/*
-       ./ppdc-static -I ../data -d ppd2 sample-import.drv
+       ./ppdc-static -l en -I ../data -d ppd2 sample-import.drv
        if diff -r ppd ppd2 >/dev/null; then \
                echo PPD import OK; \
        else \
@@ -332,10 +331,10 @@ testcatalog:              testcatalog.o libcupsppdc.a ../cups/$(LIBCUPSSTATIC)
 
 
 #
-# libcupsppdc.so.1, libcupsppdc.sl.1
+# libcupsppdc.so.1
 #
 
-libcupsppdc.so.1 libcupsppdc.sl.1:     $(LIBOBJS) ../cups/$(LIBCUPS)
+libcupsppdc.so.1     $(LIBOBJS) ../cups/$(LIBCUPS)
        echo Linking $@...
        $(DSOXX) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LINKCUPS)
        $(RM) `basename $@ .1`
@@ -355,23 +354,12 @@ libcupsppdc.1.dylib:      $(LIBOBJS) ../cups/$(LIBCUPS)
                -current_version 1.0.0 \
                -compatibility_version 1.0.0 \
                -exported_symbols_list t.exp \
-               $(LIBOBJS) $(LINKCUPS)
+               $(LIBOBJS) $(LINKCUPS) $(COMMONLIBS)
        $(RM) libcupsppdc.dylib t.exp
        $(LN) $@ libcupsppdc.dylib
 
 
 #
-# libcupsppdc_s.a
-#
-
-libcupsppdc_s.a:       $(LIBOBJS) ../cups/$(LIBCUPS)
-       echo Creating $@...
-       $(DSOXX) $(DSOFLAGS) -o libcupsppdc_s.o $(LIBOBJS) $(LINKCUPS)
-       $(RM) $@
-       $(AR) $(ARFLAGS) $@ libcupsppdc_s.o
-
-
-#
 # libcupsppdc.la
 #
 
@@ -400,5 +388,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12615 2015-05-06 20:21:51Z msweet $".
 #
index f3496c7..72e9a85 100644 (file)
@@ -1,31 +1,24 @@
 //
-// "$Id: genstrings.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: genstrings.cxx 11800 2014-04-08 19:53:57Z msweet $"
 //
-//   GNU gettext message generator for the CUPS PPD Compiler.
+// GNU gettext message generator for the CUPS PPD Compiler.
 //
-//   This program is used to generate a dummy source file containing all of
-//   the standard media and sample driver strings.  The results are picked up
-//   by GNU gettext and placed in the CUPS message catalog.
+// This program is used to generate a dummy source file containing all of
+// the standard media and sample driver strings.  The results are picked up
+// by GNU gettext and placed in the CUPS message catalog.
 //
-//   Copyright 2008-2011 by Apple Inc.
+// Copyright 2008-2014 by Apple Inc.
 //
-//   These coded instructions, statements, and computer programs are the
-//   property of Apple Inc. and are protected by Federal copyright
-//   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-//   which should have been included with this file.  If this file is
-//   file is missing or damaged, see the license at "http://www.cups.org/".
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file.  If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
 //
 // Usage:
 //
 //   ./genstrings >sample.c
 //
-// Contents:
-//
-//   main()           - Main entry for the PPD compiler.
-//   add_ui_strings() - Add all UI strings from the driver.
-//   write_cstring()  - Write a translation string as a valid C string to
-//                      stdout.
-//
 
 //
 // Include necessary headers...
@@ -211,5 +204,5 @@ write_cstring(const char *s)                /* I - String to write */
 
 
 //
-// End of "$Id: genstrings.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: genstrings.cxx 11800 2014-04-08 19:53:57Z msweet $".
 //
index 603ceb6..5b5bacc 100644 (file)
@@ -1,25 +1,16 @@
 //
-// "$Id: ppdc-array.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-array.cxx 11558 2014-02-06 18:33:34Z msweet $"
 //
-//   Array class for the CUPS PPD Compiler.
+// Array class for the CUPS PPD Compiler.
 //
-//   Copyright 2007-2009 by Apple Inc.
-//   Copyright 2002-2005 by Easy Software Products.
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 2002-2005 by Easy Software Products.
 //
-//   These coded instructions, statements, and computer programs are the
-//   property of Apple Inc. and are protected by Federal copyright
-//   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-//   which should have been included with this file.  If this file is
-//   file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-//   ppdcArray::ppdcArray()  - Create a new array.
-//   ppdcArray::~ppdcArray() - Destroy an array.
-//   ppdcArray::add()        - Add an element to an array.
-//   ppdcArray::first()      - Return the first element in the array.
-//   ppdcArray::next()       - Return the next element in the array.
-//   ppdcArray::remove()     - Remove an element from the array.
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file.  If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
 //
 
 //
@@ -48,7 +39,7 @@ ppdcArray::ppdcArray(ppdcArray *a)
       // Make a copy of the array...
       data = new ppdcShared *[count];
 
-      memcpy(data, a->data, count * sizeof(ppdcShared *));
+      memcpy(data, a->data, (size_t)count * sizeof(ppdcShared *));
 
       for (int i = 0; i < count; i ++)
         data[i]->retain();
@@ -98,7 +89,7 @@ ppdcArray::add(ppdcShared *d)
     alloc += 10;
     temp  = new ppdcShared *[alloc];
 
-    memcpy(temp, data, count * sizeof(ppdcShared *));
+    memcpy(temp, data, (size_t)count * sizeof(ppdcShared *));
 
     delete[] data;
     data = temp;
@@ -159,10 +150,10 @@ ppdcArray::remove(ppdcShared *d)          // I - Data element
   d->release();
 
   if (i < count)
-    memmove(data + i, data + i + 1, (count - i) * sizeof(ppdcShared *));
+    memmove(data + i, data + i + 1, (size_t)(count - i) * sizeof(ppdcShared *));
 }
 
 
 //
-// End of "$Id: ppdc-array.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-array.cxx 11558 2014-02-06 18:33:34Z msweet $".
 //
index 01286e7..4570f10 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-attr.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-attr.cxx 1378 2009-04-08 03:17:45Z msweet $"
 //
 //   Attribute class for the CUPS PPD Compiler.
 //
@@ -62,5 +62,5 @@ ppdcAttr::~ppdcAttr()
 
 
 //
-// End of "$Id: ppdc-attr.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-attr.cxx 1378 2009-04-08 03:17:45Z msweet $".
 //
index ab23717..35cadd6 100644 (file)
@@ -1,29 +1,16 @@
 //
-// "$Id: ppdc-catalog.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-catalog.cxx 11800 2014-04-08 19:53:57Z msweet $"
 //
-//   Shared message catalog class for the CUPS PPD Compiler.
+// Shared message catalog class for the CUPS PPD Compiler.
 //
-//   Copyright 2007-2012 by Apple Inc.
-//   Copyright 2002-2006 by Easy Software Products.
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 2002-2006 by Easy Software Products.
 //
-//   These coded instructions, statements, and computer programs are the
-//   property of Apple Inc. and are protected by Federal copyright
-//   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-//   which should have been included with this file.  If this file is
-//   file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-//   ppdcCatalog::ppdcCatalog()   - Create a shared message catalog.
-//   ppdcCatalog::~ppdcCatalog()  - Destroy a shared message catalog.
-//   ppdcCatalog::add_message()   - Add a new message.
-//   ppdcCatalog::find_message()  - Find a message in a catalog...
-//   ppdcCatalog::load_messages() - Load messages from a .po file.
-//   ppdcCatalog::save_messages() - Save the messages to a .po file.
-//   get_utf8()                   - Get a UTF-8 character.
-//   get_utf16()                  - Get a UTF-16 character...
-//   put_utf8()                   - Add a UTF-8 character to a string.
-//   put_utf16()                  - Write a UTF-16 character to a file.
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file.  If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
 //
 
 //
@@ -50,6 +37,9 @@ typedef enum
 // Local functions...
 //
 
+#if defined(__APPLE__) && defined(CUPS_BUNDLEDIR)
+static void    apple_add_message(CFStringRef key, CFStringRef val, ppdcCatalog *c);
+#endif /* __APPLE__ && CUPS_BUNDLEDIR */
 static int     get_utf8(char *&ptr);
 static int     get_utf16(cups_file_t *fp, ppdc_cs_t &cs);
 static int     put_utf8(int ch, char *&ptr, char *end);
@@ -64,10 +54,6 @@ ppdcCatalog::ppdcCatalog(const char *l,      // I - Locale
                          const char *f)        // I - Message catalog file
   : ppdcShared()
 {
-  _cups_globals_t      *cg = _cupsGlobals();
-                                       // Global information
-
-
   PPDC_NEW;
 
   locale   = new ppdcString(l);
@@ -80,6 +66,67 @@ ppdcCatalog::ppdcCatalog(const char *l,      // I - Locale
     char       pofile[1024];           // Message catalog file
 
 
+#if defined(__APPLE__) && defined(CUPS_BUNDLEDIR)
+    char               applelang[256]; // Apple language ID
+    CFURLRef           url;            // URL to cups.strings file
+    CFReadStreamRef    stream = NULL;  // File stream
+    CFPropertyListRef  plist = NULL;   // Localization file
+
+    snprintf(pofile, sizeof(pofile), CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", _cupsAppleLanguage(l, applelang, sizeof(applelang)));
+    if (access(pofile, 0))
+    {
+      // Try alternate lproj directory names...
+      const char *tl = l;              // Temporary locale string
+
+      if (!strncmp(l, "en", 2))
+       tl = "English";
+      else if (!strncmp(l, "nb", 2) || !strncmp(l, "nl", 2))
+       tl = "Dutch";
+      else if (!strncmp(l, "fr", 2))
+       tl = "French";
+      else if (!strncmp(l, "de", 2))
+       tl = "German";
+      else if (!strncmp(l, "it", 2))
+       tl = "Italian";
+      else if (!strncmp(l, "ja", 2))
+       tl = "Japanese";
+      else if (!strncmp(l, "es", 2))
+       tl = "Spanish";
+
+      snprintf(pofile, sizeof(pofile), CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", tl);
+    }
+
+    url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (UInt8 *)pofile, (CFIndex)strlen(pofile), false);
+    if (url)
+    {
+      stream = CFReadStreamCreateWithFile(kCFAllocatorDefault, url);
+
+      if (stream)
+      {
+       /*
+       * Read the property list containing the localization data.
+       */
+
+       CFReadStreamOpen(stream);
+
+       plist = CFPropertyListCreateWithStream(kCFAllocatorDefault, stream, 0, kCFPropertyListImmutable, NULL, NULL);
+
+       if (plist && CFGetTypeID(plist) == CFDictionaryGetTypeID())
+         CFDictionaryApplyFunction((CFDictionaryRef)plist, (CFDictionaryApplierFunction)apple_add_message, this);
+
+       if (plist)
+         CFRelease(plist);
+
+       CFRelease(stream);
+      }
+
+      CFRelease(url);
+    }
+
+#else
+    _cups_globals_t    *cg = _cupsGlobals();
+                                       // Global information
+
     snprintf(pofile, sizeof(pofile), "%s/%s/cups_%s.po", cg->localedir, l, l);
 
     if (load_messages(pofile) && strchr(l, '_'))
@@ -94,9 +141,10 @@ ppdcCatalog::ppdcCatalog(const char *l,     // I - Locale
 
       load_messages(pofile);
     }
+#endif /* __APPLE__ && CUPS_BUNDLEDIR */
   }
 
-  if (f)
+  if (f && *f)
     load_messages(f);
 }
 
@@ -206,8 +254,8 @@ ppdcCatalog::load_messages(
   else if (!strcmp(ptr, ".strings"))
   {
    /*
-    * Read messages in OS X ".strings" format, which are UTF-16 text files of
-    * the format:
+    * Read messages in OS X ".strings" format, which are either UTF-8/UTF-16
+    * text files of the format:
     *
     *     "id" = "str";
     *
@@ -610,6 +658,27 @@ ppdcCatalog::save_messages(
 }
 
 
+#if defined(__APPLE__) && defined(CUPS_BUNDLEDIR)
+//
+// 'apple_add_message()' - Add a message from a localization dictionary.
+//
+
+static void
+apple_add_message(CFStringRef key,     // I - Localization key
+                  CFStringRef val,     // I - Localized value
+                  ppdcCatalog *c)      // I - Message catalog
+{
+  char id[1024],                       // Message id
+       str[1024];                      // Localized message
+
+
+  if (CFStringGetCString(key, id, sizeof(id), kCFStringEncodingUTF8) &&
+      CFStringGetCString(val, str, sizeof(str), kCFStringEncodingUTF8))
+    c->add_message(id, str);
+}
+#endif /* __APPLE__ && CUPS_BUNDLEDIR */
+
+
 //
 // 'get_utf8()' - Get a UTF-8 character.
 //
@@ -817,7 +886,7 @@ put_utf8(int  ch,                   // I  - Unicode character
     if (ptr >= end)
       return (-1);
 
-    *ptr++ = ch;
+    *ptr++ = (char)ch;
   }
   else if (ch < 0x800)
   {
@@ -825,8 +894,8 @@ put_utf8(int  ch,                   // I  - Unicode character
     if ((ptr + 1) >= end)
       return (-1);
 
-    *ptr++ = 0xc0 | (ch >> 6);
-    *ptr++ = 0x80 | (ch & 0x3f);
+    *ptr++ = (char)(0xc0 | (ch >> 6));
+    *ptr++ = (char)(0x80 | (ch & 0x3f));
   }
   else if (ch < 0x10000)
   {
@@ -834,9 +903,9 @@ put_utf8(int  ch,                   // I  - Unicode character
     if ((ptr + 2) >= end)
       return (-1);
 
-    *ptr++ = 0xe0 | (ch >> 12);
-    *ptr++ = 0x80 | ((ch >> 6) & 0x3f);
-    *ptr++ = 0x80 | (ch & 0x3f);
+    *ptr++ = (char)(0xe0 | (ch >> 12));
+    *ptr++ = (char)(0x80 | ((ch >> 6) & 0x3f));
+    *ptr++ = (char)(0x80 | (ch & 0x3f));
   }
   else
   {
@@ -844,10 +913,10 @@ put_utf8(int  ch,                 // I  - Unicode character
     if ((ptr + 3) >= end)
       return (-1);
 
-    *ptr++ = 0xf0 | (ch >> 18);
-    *ptr++ = 0x80 | ((ch >> 12) & 0x3f);
-    *ptr++ = 0x80 | ((ch >> 6) & 0x3f);
-    *ptr++ = 0x80 | (ch & 0x3f);
+    *ptr++ = (char)(0xf0 | (ch >> 18));
+    *ptr++ = (char)(0x80 | ((ch >> 12) & 0x3f));
+    *ptr++ = (char)(0x80 | ((ch >> 6) & 0x3f));
+    *ptr++ = (char)(0x80 | (ch & 0x3f));
   }
 
   return (0);
@@ -868,8 +937,8 @@ put_utf16(cups_file_t *fp,          // I - File to write to
   if (ch < 0x10000)
   {
     // One-word UTF-16 big-endian...
-    buffer[0] = ch >> 8;
-    buffer[1] = ch;
+    buffer[0] = (unsigned char)(ch >> 8);
+    buffer[1] = (unsigned char)ch;
 
     if (cupsFileWrite(fp, (char *)buffer, 2) == 2)
       return (0);
@@ -879,10 +948,10 @@ put_utf16(cups_file_t *fp,                // I - File to write to
     // Two-word UTF-16 big-endian...
     ch -= 0x10000;
 
-    buffer[0] = 0xd8 | (ch >> 18);
-    buffer[1] = ch >> 10;
-    buffer[2] = 0xdc | ((ch >> 8) & 0x03);
-    buffer[3] = ch;
+    buffer[0] = (unsigned char)(0xd8 | (ch >> 18));
+    buffer[1] = (unsigned char)(ch >> 10);
+    buffer[2] = (unsigned char)(0xdc | ((ch >> 8) & 0x03));
+    buffer[3] = (unsigned char)ch;
 
     if (cupsFileWrite(fp, (char *)buffer, 4) == 4)
       return (0);
@@ -893,5 +962,5 @@ put_utf16(cups_file_t *fp,          // I - File to write to
 
 
 //
-// End of "$Id: ppdc-catalog.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-catalog.cxx 11800 2014-04-08 19:53:57Z msweet $".
 //
index 90872cb..e9937fe 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-choice.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-choice.cxx 1378 2009-04-08 03:17:45Z msweet $"
 //
 //   Option choice class for the CUPS PPD Compiler.
 //
@@ -57,5 +57,5 @@ ppdcChoice::~ppdcChoice()
 
 
 //
-// End of "$Id: ppdc-choice.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-choice.cxx 1378 2009-04-08 03:17:45Z msweet $".
 //
index 948c329..c060979 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-constraint.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-constraint.cxx 1378 2009-04-08 03:17:45Z msweet $"
 //
 //   Contraint class for the CUPS PPD Compiler.
 //
@@ -60,5 +60,5 @@ ppdcConstraint::~ppdcConstraint()
 
 
 //
-// End of "$Id: ppdc-constraint.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-constraint.cxx 1378 2009-04-08 03:17:45Z msweet $".
 //
index 61b2d24..105eb9c 100644 (file)
@@ -1,34 +1,16 @@
 //
-// "$Id: ppdc-driver.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-driver.cxx 11558 2014-02-06 18:33:34Z msweet $"
 //
-//   PPD file compiler definitions for the CUPS PPD Compiler.
+// PPD file compiler definitions for the CUPS PPD Compiler.
 //
-//   Copyright 2007-2011 by Apple Inc.
-//   Copyright 2002-2006 by Easy Software Products.
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 2002-2006 by Easy Software Products.
 //
-//   These coded instructions, statements, and computer programs are the
-//   property of Apple Inc. and are protected by Federal copyright
-//   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-//   which should have been included with this file.  If this file is
-//   file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-//   ppdcDriver::ppdcDriver()           - Create a new printer driver.
-//   ppdcDriver::~ppdcDriver()          - Destroy a printer driver.
-//   ppdcDriver::find_attr()            - Find an attribute.
-//   ppdcDriver::find_group()           - Find a group.
-//   ppdcDriver::find_option()          - Find an option.
-//   ppdcDriver::find_option_group()    - Find an option and its group.
-//   ppdcDriver::set_custom_size_code() - Set the custom page size code.
-//   ppdcDriver::set_default_font()     - Set the default font name.
-//   ppdcDriver::set_default_size()     - Set the default size name.
-//   ppdcDriver::set_file_name()        - Set the full filename.
-//   ppdcDriver::set_manufacturer()     - Set the manufacturer name.
-//   ppdcDriver::set_model_name()       - Set the model name.
-//   ppdcDriver::set_pc_file_name()     - Set the PC filename.
-//   ppdcDriver::set_version()          - Set the version string.
-//   ppdcDriver::write_ppd_file()       - Write a PPD file...
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file.  If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
 //
 
 //
@@ -1333,7 +1315,7 @@ ppdcDriver::write_ppd_file(
                     fn->status == PPDC_FONT_ROM ? "ROM" : "Disk", lf);
 
   cupsFilePrintf(fp, "*%% End of %s, %05d bytes.%s", pc_file_name->value,
-                (int)(cupsFileTell(fp) + 25 + strlen(pc_file_name->value)),
+                (int)((size_t)cupsFileTell(fp) + 25 + strlen(pc_file_name->value)),
                 lf);
 
   if (delete_cat)
@@ -1344,5 +1326,5 @@ ppdcDriver::write_ppd_file(
 
 
 //
-// End of "$Id: ppdc-driver.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-driver.cxx 11558 2014-02-06 18:33:34Z msweet $".
 //
index 3c243f3..0a24827 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-file.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-file.cxx 3755 2012-03-30 05:59:14Z msweet $"
 //
 //   File class for the CUPS PPD Compiler.
 //
@@ -106,5 +106,5 @@ ppdcFile::peek()
 
 
 //
-// End of "$Id: ppdc-file.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-file.cxx 3755 2012-03-30 05:59:14Z msweet $".
 //
index 0b0bf4b..cc1ae00 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-filter.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-filter.cxx 1378 2009-04-08 03:17:45Z msweet $"
 //
 //   Filter class for the CUPS PPD Compiler.
 //
@@ -56,5 +56,5 @@ ppdcFilter::~ppdcFilter()
 
 
 //
-// End of "$Id: ppdc-filter.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-filter.cxx 1378 2009-04-08 03:17:45Z msweet $".
 //
index d7b5f26..c5dad4d 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-font.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-font.cxx 1378 2009-04-08 03:17:45Z msweet $"
 //
 //   Shared font class for the CUPS PPD Compiler.
 //
@@ -62,5 +62,5 @@ ppdcFont::~ppdcFont()
 
 
 //
-// End of "$Id: ppdc-font.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-font.cxx 1378 2009-04-08 03:17:45Z msweet $".
 //
index 56c847b..00d0a7c 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-group.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-group.cxx 3275 2011-05-20 07:26:13Z msweet $"
 //
 //   Group class for the CUPS PPD Compiler.
 //
@@ -99,5 +99,5 @@ ppdcGroup::find_option(const char *n) // I - Name of option
 
 
 //
-// End of "$Id: ppdc-group.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-group.cxx 3275 2011-05-20 07:26:13Z msweet $".
 //
index 1c2a1c8..d41cbb9 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-import.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-import.cxx 3275 2011-05-20 07:26:13Z msweet $"
 //
 //   PPD file import methods for the CUPS PPD Compiler.
 //
@@ -339,5 +339,5 @@ ppdcSource::import_ppd(const char *f)       // I - Filename
 
 
 //
-// End of "$Id: ppdc-import.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-import.cxx 3275 2011-05-20 07:26:13Z msweet $".
 //
index 43bcf79..48afd38 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-mediasize.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-mediasize.cxx 1378 2009-04-08 03:17:45Z msweet $"
 //
 //   Shared media size class for the CUPS PPD Compiler.
 //
@@ -81,5 +81,5 @@ ppdcMediaSize::~ppdcMediaSize()
 
 
 //
-// End of "$Id: ppdc-mediasize.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-mediasize.cxx 1378 2009-04-08 03:17:45Z msweet $".
 //
index 614c237..fbbe40c 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-message.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-message.cxx 1378 2009-04-08 03:17:45Z msweet $"
 //
 //   Shared message class for the CUPS PPD Compiler.
 //
@@ -54,5 +54,5 @@ ppdcMessage::~ppdcMessage()
 
 
 //
-// End of "$Id: ppdc-message.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-message.cxx 1378 2009-04-08 03:17:45Z msweet $".
 //
index 6bbe1db..3fdc296 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-option.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-option.cxx 3275 2011-05-20 07:26:13Z msweet $"
 //
 //   Option class for the CUPS PPD Compiler.
 //
@@ -125,5 +125,5 @@ ppdcOption::set_defchoice(ppdcChoice *c)    // I - Choice
 
 
 //
-// End of "$Id: ppdc-option.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-option.cxx 3275 2011-05-20 07:26:13Z msweet $".
 //
index 0a63666..244e34f 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-profile.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-profile.cxx 1378 2009-04-08 03:17:45Z msweet $"
 //
 //   Color profile class for the CUPS PPD Compiler.
 //
@@ -61,5 +61,5 @@ ppdcProfile::~ppdcProfile()
 
 
 //
-// End of "$Id: ppdc-profile.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-profile.cxx 1378 2009-04-08 03:17:45Z msweet $".
 //
index bd2983b..e6b6167 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-shared.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-shared.cxx 1556 2009-06-10 19:02:58Z msweet $"
 //
 //   Shared data class for the CUPS PPD Compiler.
 //
@@ -84,5 +84,5 @@ ppdcShared::retain()
 
 
 //
-// End of "$Id: ppdc-shared.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-shared.cxx 1556 2009-06-10 19:02:58Z msweet $".
 //
index 46c1bdd..85ef17e 100644 (file)
@@ -1,59 +1,16 @@
 //
-// "$Id: ppdc-source.cxx 11173 2013-07-23 12:31:34Z msweet $"
-//
-//   Source class for the CUPS PPD Compiler.
-//
-//   Copyright 2007-2012 by Apple Inc.
-//   Copyright 2002-2007 by Easy Software Products.
-//
-//   These coded instructions, statements, and computer programs are the
-//   property of Apple Inc. and are protected by Federal copyright
-//   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-//   which should have been included with this file.  If this file is
-//   file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-//   ppdcSource::ppdcSource()         - Load a driver source file.
-//   ppdcSource::~ppdcSource()        - Free a driver source file.
-//   ppdcSource::add_include()        - Add an include directory.
-//   ppdcSource::find_driver()        - Find a driver.
-//   ppdcSource::find_include()       - Find an include file.
-//   ppdcSource::find_po()            - Find a message catalog for the given
-//                                      locale.
-//   ppdcSource::find_size()          - Find a media size.
-//   ppdcSource::find_variable()      - Find a variable.
-//   ppdcSource::get_attr()           - Get an attribute.
-//   ppdcSource::get_boolean()        - Get a boolean value.
-//   ppdcSource::get_choice()         - Get a choice.
-//   ppdcSource::get_color_model()    - Get an old-style color model option.
-//   ppdcSource::get_color_order()    - Get an old-style color order value.
-//   ppdcSource::get_color_profile()  - Get a color profile definition.
-//   ppdcSource::get_color_space()    - Get an old-style colorspace value.
-//   ppdcSource::get_constraint()     - Get a constraint.
-//   ppdcSource::get_custom_size()    - Get a custom media size definition from
-//                                      a file.
-//   ppdcSource::get_duplex()         - Get a duplex option.
-//   ppdcSource::get_filter()         - Get a filter.
-//   ppdcSource::get_float()          - Get a single floating-point number.
-//   ppdcSource::get_font()           - Get a font definition.
-//   ppdcSource::get_generic()        - Get a generic old-style option.
-//   ppdcSource::get_group()          - Get an option group.
-//   ppdcSource::get_installable()    - Get an installable option.
-//   ppdcSource::get_integer()        - Get an integer value from a file.
-//   ppdcSource::get_measurement()    - Get a measurement value.
-//   ppdcSource::get_option()         - Get an option definition.
-//   ppdcSource::get_po()             - Get a message catalog.
-//   ppdcSource::get_resolution()     - Get an old-style resolution option.
-//   ppdcSource::get_simple_profile() - Get a simple color profile definition.
-//   ppdcSource::get_size()           - Get a media size definition from a file.
-//   ppdcSource::get_token()          - Get a token from a file.
-//   ppdcSource::get_variable()       - Get a variable definition.
-//   ppdcSource::quotef()             - Write a formatted, quoted string...
-//   ppdcSource::read_file()          - Read a driver source file.
-//   ppdcSource::scan_file()          - Scan a driver source file.
-//   ppdcSource::set_variable()       - Set a variable.
-//   ppdcSource::write_file()         - Write the current source data to a file.
+// "$Id: ppdc-source.cxx 11558 2014-02-06 18:33:34Z msweet $"
+//
+// Source class for the CUPS PPD Compiler.
+//
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 2002-2007 by Easy Software Products.
+//
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file.  If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
 //
 
 //
@@ -235,9 +192,9 @@ ppdcSource::find_include(
   {
     // Check for the local file relative to the current directory...
     if (base && *base && f[0] != '/')
-      snprintf(n, nlen, "%s/%s", base, f);
+      snprintf(n, (size_t)nlen, "%s/%s", base, f);
     else
-      strlcpy(n, f, nlen);
+      strlcpy(n, f, (size_t)nlen);
 
     if (!access(n, 0))
       return (n);
@@ -253,7 +210,7 @@ ppdcSource::find_include(
   {
     for (dir = (ppdcString *)includes->first(); dir; dir = (ppdcString *)includes->next())
     {
-      snprintf(n, nlen, "%s/%s", dir->value, f);
+      snprintf(n, (size_t)nlen, "%s/%s", dir->value, f);
       if (!access(n, 0))
         return (n);
     }
@@ -262,11 +219,11 @@ ppdcSource::find_include(
   // Search the standard include directories...
   _cups_globals_t *cg = _cupsGlobals();        // Global data
 
-  snprintf(n, nlen, "%s/ppdc/%s", cg->cups_datadir, f);
+  snprintf(n, (size_t)nlen, "%s/ppdc/%s", cg->cups_datadir, f);
   if (!access(n, 0))
     return (n);
 
-  snprintf(n, nlen, "%s/po/%s", cg->cups_datadir, f);
+  snprintf(n, (size_t)nlen, "%s/po/%s", cg->cups_datadir, f);
   if (!access(n, 0))
     return (n);
   else
@@ -943,7 +900,7 @@ ppdcSource::get_filter(ppdcFile *fp)        // I - File to read
     while (isspace(*ptr))
       ptr ++;
 
-    strcpy(program, ptr);
+    strlcpy(program, ptr, sizeof(program));
   }
   else
   {
@@ -1706,7 +1663,7 @@ ppdcSource::get_po(ppdcFile *fp)  // I - File to read
   if ((baseptr = strrchr(basedir, '/')) != NULL)
     *baseptr = '\0';
   else
-    strcpy(basedir, ".");
+    strlcpy(basedir, ".", sizeof(basedir));
 
   // Find the po file...
   pofilename[0] = '\0';
@@ -1810,26 +1767,26 @@ ppdcSource::get_resolution(ppdcFile *fp)// I - File to read
 
   if (color_order >= 0)
   {
-    snprintf(commptr, sizeof(command) - (commptr - command),
+    snprintf(commptr, sizeof(command) - (size_t)(commptr - command),
              "/cupsColorOrder %d", color_order);
     commptr += strlen(commptr);
   }
 
   if (color_space >= 0)
   {
-    snprintf(commptr, sizeof(command) - (commptr - command),
+    snprintf(commptr, sizeof(command) - (size_t)(commptr - command),
              "/cupsColorSpace %d", color_space);
     commptr += strlen(commptr);
   }
 
   if (compression >= 0)
   {
-    snprintf(commptr, sizeof(command) - (commptr - command),
+    snprintf(commptr, sizeof(command) - (size_t)(commptr - command),
              "/cupsCompression %d", compression);
     commptr += strlen(commptr);
   }
 
-  snprintf(commptr, sizeof(command) - (commptr - command), ">>setpagedevice");
+  snprintf(commptr, sizeof(command) - (size_t)(commptr - command), ">>setpagedevice");
 
   // Return the new choice...
   return (new ppdcChoice(name, text, command));
@@ -2014,7 +1971,7 @@ ppdcSource::get_token(ppdcFile *fp,       // I - File to read
         if (!isalnum(ch) && ch != '_')
          break;
        else if (nameptr < (name + sizeof(name) - 1))
-         *nameptr++ = fp->get();
+         *nameptr++ = (char)fp->get();
       }
 
       if (nameptr == name)
@@ -2024,7 +1981,7 @@ ppdcSource::get_token(ppdcFile *fp,       // I - File to read
        {
          // $$ = $
          if (bufptr < bufend)
-           *bufptr++ = fp->get();
+           *bufptr++ = (char)fp->get();
        }
        else
        {
@@ -2044,7 +2001,7 @@ ppdcSource::get_token(ppdcFile *fp,       // I - File to read
        var = find_variable(name);
        if (var)
        {
-         strlcpy(bufptr, var->value->value, bufend - bufptr + 1);
+         strlcpy(bufptr, var->value->value, (size_t)(bufend - bufptr + 1));
          bufptr += strlen(bufptr);
        }
        else
@@ -2054,7 +2011,7 @@ ppdcSource::get_token(ppdcFile *fp,       // I - File to read
                            _("ppdc: Undefined variable (%s) on line %d of "
                              "%s."), name, fp->line, fp->filename);
 
-         snprintf(bufptr, bufend - bufptr + 1, "$%s", name);
+         snprintf(bufptr, (size_t)(bufend - bufptr + 1), "$%s", name);
          bufptr += strlen(bufptr);
        }
       }
@@ -2096,7 +2053,7 @@ ppdcSource::get_token(ppdcFile *fp,       // I - File to read
         empty = 0;
 
        if (bufptr < bufend)
-         *bufptr++ = ch;
+         *bufptr++ = (char)ch;
       }
     }
     else if (ch == '\'' || ch == '\"')
@@ -2112,7 +2069,7 @@ ppdcSource::get_token(ppdcFile *fp,       // I - File to read
       {
         // Insert the opposing quote char...
        if (bufptr < bufend)
-          *bufptr++ = ch;
+          *bufptr++ = (char)ch;
       }
       else
       {
@@ -2128,14 +2085,14 @@ ppdcSource::get_token(ppdcFile *fp,     // I - File to read
       startline = fp->line;
 
       if (bufptr < bufend)
-       *bufptr++ = ch;
+       *bufptr++ = (char)ch;
     }
     else if ((ch == ')' && quote == '(') || (ch == '>' && quote == '<'))
     {
       quote = 0;
 
       if (bufptr < bufend)
-       *bufptr++ = ch;
+       *bufptr++ = (char)ch;
     }
     else if (ch == '\\')
     {
@@ -2145,13 +2102,13 @@ ppdcSource::get_token(ppdcFile *fp,     // I - File to read
         break;
 
       if (bufptr < bufend)
-        *bufptr++ = ch;
+        *bufptr++ = (char)ch;
     }
     else if (bufptr < bufend)
     {
       empty = 0;
 
-      *bufptr++ = ch;
+      *bufptr++ = (char)ch;
 
       if ((ch == '{' || ch == '}') && !quote)
         break;
@@ -2171,7 +2128,6 @@ ppdcSource::get_token(ppdcFile *fp,       // I - File to read
   else
   {
     *bufptr = '\0';
-//    puts(buffer);
     return (buffer);
   }
 }
@@ -2292,7 +2248,7 @@ ppdcSource::quotef(cups_file_t *fp,       // I - File to write to
            if ((format - bufformat + 1) > (int)sizeof(tformat))
              break;
 
-           strncpy(tformat, bufformat, format - bufformat);
+           memcpy(tformat, bufformat, (size_t)(format - bufformat));
            tformat[format - bufformat] = '\0';
 
            bytes += cupsFilePrintf(fp, tformat, va_arg(ap, double));
@@ -2309,7 +2265,7 @@ ppdcSource::quotef(cups_file_t *fp,       // I - File to write to
            if ((format - bufformat + 1) > (int)sizeof(tformat))
              break;
 
-           strncpy(tformat, bufformat, format - bufformat);
+           memcpy(tformat, bufformat, (size_t)(format - bufformat));
            tformat[format - bufformat] = '\0';
 
 #  ifdef HAVE_LONG_LONG
@@ -2327,7 +2283,7 @@ ppdcSource::quotef(cups_file_t *fp,       // I - File to write to
            if ((format - bufformat + 1) > (int)sizeof(tformat))
              break;
 
-           strncpy(tformat, bufformat, format - bufformat);
+           memcpy(tformat, bufformat, (size_t)(format - bufformat));
            tformat[format - bufformat] = '\0';
 
            bytes += cupsFilePrintf(fp, tformat, va_arg(ap, void *));
@@ -2341,7 +2297,7 @@ ppdcSource::quotef(cups_file_t *fp,       // I - File to write to
            }
            else
            {
-             cupsFileWrite(fp, va_arg(ap, char *), width);
+             cupsFileWrite(fp, va_arg(ap, char *), (size_t)width);
              bytes += width;
            }
            break;
@@ -2350,7 +2306,7 @@ ppdcSource::quotef(cups_file_t *fp,       // I - File to write to
            if ((s = va_arg(ap, char *)) == NULL)
              s = (char *)"(nil)";
 
-           slen = strlen(s);
+           slen = (int)strlen(s);
            if (slen > width && prec != width)
              width = slen;
 
@@ -2630,7 +2586,7 @@ ppdcSource::scan_file(ppdcFile   *fp,     // I - File to read
       if ((baseptr = strrchr(basedir, '/')) != NULL)
        *baseptr = '\0';
       else
-       strcpy(basedir, ".");
+       strlcpy(basedir, ".", sizeof(basedir));
 
       // Find the include file...
       if (find_include(inctemp, basedir, incname, sizeof(incname)))
@@ -3847,5 +3803,5 @@ ppdcSource::write_file(const char *f)     // I - File to write
 
 
 //
-// End of "$Id: ppdc-source.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-source.cxx 11558 2014-02-06 18:33:34Z msweet $".
 //
index f9dfb9e..b6e3512 100644 (file)
@@ -1,9 +1,9 @@
 //
-// "$Id: ppdc-string.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-string.cxx 3933 2012-10-01 03:01:10Z msweet $"
 //
 //   Shared string class for the CUPS PPD Compiler.
 //
-//   Copyright 2007-2009 by Apple Inc.
+//   Copyright 2007-2012 by Apple Inc.
 //   Copyright 2002-2005 by Easy Software Products.
 //
 //   These coded instructions, statements, and computer programs are the
@@ -36,8 +36,10 @@ ppdcString::ppdcString(const char *v)        // I - String
 
   if (v)
   {
-    value = new char[strlen(v) + 1];
-    strcpy(value, v);
+    size_t vlen = strlen(v);
+
+    value = new char[vlen + 1];
+    memcpy(value, v, vlen + 1);
   }
   else
     value = 0;
@@ -58,5 +60,5 @@ ppdcString::~ppdcString()
 
 
 //
-// End of "$Id: ppdc-string.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-string.cxx 3933 2012-10-01 03:01:10Z msweet $".
 //
index 22b926c..d60ef72 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdc-variable.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc-variable.cxx 1378 2009-04-08 03:17:45Z msweet $"
 //
 //   Variable class for the CUPS PPD Compiler.
 //
@@ -67,5 +67,5 @@ ppdcVariable::set_value(const char *v)
 
 
 //
-// End of "$Id: ppdc-variable.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc-variable.cxx 1378 2009-04-08 03:17:45Z msweet $".
 //
index 55990c4..d8a7c60 100644 (file)
@@ -1,21 +1,16 @@
 //
-// "$Id: ppdc.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdc.cxx 11800 2014-04-08 19:53:57Z msweet $"
 //
-//   PPD file compiler main entry for the CUPS PPD Compiler.
+// PPD file compiler main entry for the CUPS PPD Compiler.
 //
-//   Copyright 2007-2012 by Apple Inc.
-//   Copyright 2002-2007 by Easy Software Products.
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 2002-2007 by Easy Software Products.
 //
-//   These coded instructions, statements, and computer programs are the
-//   property of Apple Inc. and are protected by Federal copyright
-//   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-//   which should have been included with this file.  If this file is
-//   file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-//   main()  - Main entry for the PPD compiler.
-//   usage() - Show usage and exit.
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file.  If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
 //
 
 //
@@ -192,7 +187,7 @@ main(int  argc,                             // I - Number of command-line arguments
 
                catalog = new ppdcCatalog(argv[i]);
 
-               if (catalog->messages->count == 0)
+               if (catalog->messages->count == 0 && strcmp(argv[i], "en"))
                {
                  _cupsLangPrintf(stderr,
                                  _("ppdc: Unable to find localization for "
@@ -344,7 +339,7 @@ main(int  argc,                             // I - Number of command-line arguments
          for (j = 0;
               outname[j] && j < (int)(sizeof(pcfilename) - 1);
               j ++)
-           pcfilename[j] = tolower(outname[j] & 255);
+           pcfilename[j] = (char)tolower(outname[j] & 255);
 
          pcfilename[j] = '\0';
        }
@@ -464,5 +459,5 @@ usage(void)
 
 
 //
-// End of "$Id: ppdc.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdc.cxx 11800 2014-04-08 19:53:57Z msweet $".
 //
index 89d7393..234495c 100644 (file)
@@ -1,21 +1,16 @@
 //
-// "$Id: ppdhtml.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdhtml.cxx 12633 2015-05-15 19:16:58Z msweet $"
 //
-//   PPD to HTML utility for the CUPS PPD Compiler.
+// PPD to HTML utility for the CUPS PPD Compiler.
 //
-//   Copyright 2007-2011 by Apple Inc.
-//   Copyright 2002-2005 by Easy Software Products.
+// Copyright 2007-2015 by Apple Inc.
+// Copyright 2002-2005 by Easy Software Products.
 //
-//   These coded instructions, statements, and computer programs are the
-//   property of Apple Inc. and are protected by Federal copyright
-//   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-//   which should have been included with this file.  If this file is
-//   file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-//   main()  - Main entry for the PPD to HTML utility.
-//   usage() - Show usage and exit.
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file.  If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
 //
 
 //
@@ -58,7 +53,7 @@ main(int  argc,                               // I - Number of command-line arguments
   _cupsSetLocale(argv);
 
   // Scan the command-line...
-  src = 0;
+  src = new ppdcSource();
 
   for (i = 1; i < argc; i ++)
     if (argv[i][0] == '-')
@@ -97,65 +92,75 @@ main(int  argc,                             // I - Number of command-line arguments
     else
     {
       // Open and load the driver info file...
-      src = new ppdcSource(argv[i]);
-
-      // Create a composite group with all of the features from the
-      // drivers in the info file...
-      composite = new ppdcGroup("", "");
-
-      for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next())
-        for (g = (ppdcGroup *)d->groups->first(); g; g = (ppdcGroup *)d->groups->next())
-         for (o = (ppdcOption *)g->options->first(); o; o = (ppdcOption *)g->options->next())
-         {
-           if ((compo = composite->find_option(o->name->value)) == NULL)
-             composite->add_option(new ppdcOption(o));
-         }
-
-      puts("<html>");
-      printf("<head><title>Driver Summary for %s</title></head>\n", argv[i]);
-      printf("<body><h1>Driver Summary for %s</h1>\n", argv[i]);
-      printf("<p><table border='1'><thead><tr><th>Printer</th><th>Media Size</th>");
-      for (compo = (ppdcOption *)composite->options->first(); compo; compo = (ppdcOption *)composite->options->next())
-        printf("<th>%s</th>", compo->text->value);
-      puts("</tr></thead><tbody>");
-
-      // Write HTML summary...
-      for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next())
-      {
-        // Write the summary for this driver...
-       printf("<tr valign='top'><td nowrap>%s</td><td nowrap>", d->model_name->value);
-       for (size = (ppdcMediaSize *)d->sizes->first(); size;
-            size = (ppdcMediaSize *)d->sizes->next())
-          printf("%s<br>", size->text->value);
-        printf("</td>");
-
-        for (compo = (ppdcOption *)composite->options->first(); compo;
-            compo = (ppdcOption *)composite->options->next())
-         if ((o = d->find_option(compo->name->value)) != NULL)
-         {
-           printf("<td nowrap>");
-           for (c = (ppdcChoice *)o->choices->first(); c;
-                c = (ppdcChoice *)o->choices->next())
-             printf("%s<br>", c->text->value);
-           printf("</td>");
-         }
-         else
-           printf("<td>N/A</td>");
-
-        puts("</tr>");
-      }
-
-      puts("</tbody></table></p>");
-      puts("</body>");
-      puts("</html>");
-      // Delete the printer driver information...
-      composite->release();
-      src->release();
+      src->read_file(argv[i]);
+    }
+
+  if ((d = (ppdcDriver *)src->drivers->first()) != NULL)
+  {
+    // Create a composite group with all of the features from the
+    // drivers in the info file...
+    composite = new ppdcGroup("", "");
+
+    while (d != NULL)
+    {
+      for (g = (ppdcGroup *)d->groups->first(); g; g = (ppdcGroup *)d->groups->next())
+       for (o = (ppdcOption *)g->options->first(); o; o = (ppdcOption *)g->options->next())
+       {
+         if ((compo = composite->find_option(o->name->value)) == NULL)
+           composite->add_option(new ppdcOption(o));
+       }
+
+      d = (ppdcDriver *)src->drivers->next();
     }
 
-  // If no drivers have been loaded, display the program usage message.
-  if (!src)
+    puts("<html>");
+    printf("<head><title>Driver Summary for %s</title></head>\n", argv[i]);
+    printf("<body><h1>Driver Summary for %s</h1>\n", argv[i]);
+    printf("<p><table border='1'><thead><tr><th>Printer</th><th>Media Size</th>");
+    for (compo = (ppdcOption *)composite->options->first(); compo; compo = (ppdcOption *)composite->options->next())
+      printf("<th>%s</th>", compo->text->value);
+    puts("</tr></thead><tbody>");
+
+    // Write HTML summary...
+    for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next())
+    {
+      // Write the summary for this driver...
+      printf("<tr valign='top'><td nowrap>%s</td><td nowrap>", d->model_name->value);
+      for (size = (ppdcMediaSize *)d->sizes->first(); size;
+          size = (ppdcMediaSize *)d->sizes->next())
+       printf("%s<br>", size->text->value);
+      printf("</td>");
+
+      for (compo = (ppdcOption *)composite->options->first(); compo;
+          compo = (ppdcOption *)composite->options->next())
+       if ((o = d->find_option(compo->name->value)) != NULL)
+       {
+         printf("<td nowrap>");
+         for (c = (ppdcChoice *)o->choices->first(); c;
+              c = (ppdcChoice *)o->choices->next())
+           printf("%s<br>", c->text->value);
+         printf("</td>");
+       }
+       else
+         printf("<td>N/A</td>");
+
+      puts("</tr>");
+    }
+
+    puts("</tbody></table></p>");
+    puts("</body>");
+    puts("</html>");
+
+    // Delete the printer driver information...
+    composite->release();
+  }
+  else
+  {
+    // If no drivers have been loaded, display the program usage message.
     usage();
+  }
+
+  src->release();
 
   // Return with no errors.
   return (0);
@@ -182,5 +187,5 @@ usage(void)
 
 
 //
-// End of "$Id: ppdhtml.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdhtml.cxx 12633 2015-05-15 19:16:58Z msweet $".
 //
index 2ebe410..cbc728b 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: ppdi.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdi.cxx 3071 2011-03-23 00:05:29Z msweet $"
 //
 //   PPD file import utility for the CUPS PPD Compiler.
 //
@@ -138,5 +138,5 @@ usage(void)
 
 
 //
-// End of "$Id: ppdi.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdi.cxx 3071 2011-03-23 00:05:29Z msweet $".
 //
index 2564905..cc38881 100644 (file)
@@ -1,22 +1,16 @@
 //
-// "$Id: ppdmerge.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdmerge.cxx 11558 2014-02-06 18:33:34Z msweet $"
 //
-//   PPD file merge utility for the CUPS PPD Compiler.
+// PPD file merge utility for the CUPS PPD Compiler.
 //
-//   Copyright 2007-2011 by Apple Inc.
-//   Copyright 2002-2007 by Easy Software Products.
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 2002-2007 by Easy Software Products.
 //
-//   These coded instructions, statements, and computer programs are the
-//   property of Apple Inc. and are protected by Federal copyright
-//   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-//   which should have been included with this file.  If this file is
-//   file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-//   main()       - Main entry for the PPD merge utility.
-//   ppd_locale() - Return the locale associated with a PPD file.
-//   usage()      - Show usage and exit.
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file.  If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
 //
 
 //
@@ -302,8 +296,8 @@ main(int  argc,                             // I - Number of command-line arguments
 static const char *                    // O - Locale string
 ppd_locale(ppd_file_t *ppd)            // I - PPD file
 {
-  int          i,                      // Looping var
-               vlen;                   // Length of LanguageVersion string
+  int          i;                      // Looping var
+  size_t       vlen;                   // Length of LanguageVersion string
   static char  locale[255];            // Locale string
   static struct                                // LanguageVersion translation table
   {
@@ -375,5 +369,5 @@ usage(void)
 
 
 //
-// End of "$Id: ppdmerge.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdmerge.cxx 11558 2014-02-06 18:33:34Z msweet $".
 //
index 14e96d0..ab53bf4 100644 (file)
@@ -1,22 +1,16 @@
 //
-// "$Id: ppdpo.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: ppdpo.cxx 12633 2015-05-15 19:16:58Z msweet $"
 //
-//   PPD file message catalog program for the CUPS PPD Compiler.
+// PPD file message catalog program for the CUPS PPD Compiler.
 //
-//   Copyright 2007-2012 by Apple Inc.
-//   Copyright 2002-2005 by Easy Software Products.
+// Copyright 2007-2015 by Apple Inc.
+// Copyright 2002-2005 by Easy Software Products.
 //
-//   These coded instructions, statements, and computer programs are the
-//   property of Apple Inc. and are protected by Federal copyright
-//   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-//   which should have been included with this file.  If this file is
-//   file is missing or damaged, see the license at "http://www.cups.org/".
-//
-// Contents:
-//
-//   main()           - Main entry for the PPD compiler.
-//   add_ui_strings() - Add all UI strings from the driver.
-//   usage()          - Show usage and exit.
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file.  If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
 //
 
 //
@@ -58,7 +52,7 @@ main(int  argc,                               // I - Number of command-line arguments
 
   // Scan the command-line...
   catalog = new ppdcCatalog("en");
-  src     = 0;
+  src     = new ppdcSource();
   verbose = 0;
   outfile = 0;
 
@@ -123,23 +117,28 @@ main(int  argc,                           // I - Number of command-line arguments
                        _("ppdc: Loading driver information file \"%s\"."),
                        argv[i]);
 
-      src = new ppdcSource(argv[i]);
+      src->read_file(argv[i]);
+    }
 
-      // Add UI strings...
-      for (d = (ppdcDriver *)src->drivers->first();
-           d;
-          d = (ppdcDriver *)src->drivers->next())
-      {
-       if (verbose)
-         _cupsLangPrintf(stderr, _("ppdc: Adding/updating UI text from %s."),
-                         argv[i]);
+  // If no drivers have been loaded, display the program usage message.
+  if ((d = (ppdcDriver *)src->drivers->first()) != NULL)
+  {
+    // Add UI strings...
+    while (d != NULL)
+    {
+      if (verbose)
+       _cupsLangPrintf(stderr, _("ppdc: Adding/updating UI text from %s."), argv[i]);
 
-        add_ui_strings(d, catalog);
-      }
+      add_ui_strings(d, catalog);
 
-      // Delete the printer driver information...
-      src->release();
+      d = (ppdcDriver *)src->drivers->next();
     }
+  }
+  else
+    usage();
+
+  // Delete the printer driver information...
+  src->release();
 
   // Write the message catalog...
   if (!outfile)
@@ -149,10 +148,6 @@ main(int  argc,                            // I - Number of command-line arguments
 
   catalog->release();
 
-  // If no drivers have been loaded, display the program usage message.
-  if (!src)
-    usage();
-
   // Return with no errors.
   return (0);
 }
@@ -263,5 +258,5 @@ usage(void)
 
 
 //
-// End of "$Id: ppdpo.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: ppdpo.cxx 12633 2015-05-15 19:16:58Z msweet $".
 //
index ec808d2..854e334 100644 (file)
@@ -1,16 +1,16 @@
 //
-// "$Id: sample.drv 3794 2012-04-23 22:44:16Z msweet $"
+// "$Id: sample.drv 12789 2015-07-20 14:51:28Z msweet $"
 //
-//   Driver info file for CUPS-supplied PPDs.
+// Driver info file for CUPS-supplied PPDs.
 //
-//   Copyright 2007-2011 by Apple Inc.
-//   Copyright 1993-2006 by Easy Software Products.
+// Copyright 2007-2014 by Apple Inc.
+// Copyright 1993-2006 by Easy Software Products.
 //
-//   These coded instructions, statements, and computer programs are the
-//   property of Apple Inc. and are protected by Federal copyright
-//   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-//   which should have been included with this file.  If this file is
-//   file is missing or damaged, see the license at "http://www.cups.org/".
+// These coded instructions, statements, and computer programs are the
+// property of Apple Inc. and are protected by Federal copyright
+// law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+// which should have been included with this file.  If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
 //
 
 // Include necessary files...
 
 // Localizations are provided for all of the base languages supported by
 // CUPS...
-//#po da ""
-//#po de ""
-//#po es ""
-//#po et ""
-//#po fi ""
-//#po fr ""
-//#po he ""
-//#po id ""
-//#po it ""
-//#po ja ""
-//#po ko ""
-//#po nl ""
-//#po no ""
-//#po pl ""
-//#po pt ""
-//#po pt_BR ""
-//#po ru ""
-//#po sv ""
-//#po zh ""
-//#po zh_TW ""
+#po ar ""
+#po ca ""
+#po cs ""
+#po da ""
+#po de ""
+#po el ""
+#po es ""
+#po fi ""
+#po fr ""
+#po he ""
+#po hr ""
+#po hu ""
+#po id ""
+#po it ""
+#po ja ""
+#po ko ""
+#po ms ""
+#po no ""
+#po pl ""
+#po pt ""
+#po pt_PT ""
+#po ro ""
+#po ru ""
+#po sk ""
+#po sv ""
+#po th ""
+#po tr ""
+#po uk ""
+#po vi ""
+#po zh_CN ""
+#po zh_TW ""
 
 // MediaSize sizes used by label drivers...
 #media "w90h18/1.25x0.25\"" 90 18
 #media "w576h468/8.00x6.50\"" 576 468
 
 // Common stuff for all drivers...
-Attribute "cupsVersion" "" "1.6"
+Attribute "cupsVersion" "" "2.1"
 Attribute "FileSystem" "" "False"
 Attribute "LandscapeOrientation" "" "Plus90"
 Attribute "TTRasterizer" "" "Type42"
 
-Copyright "Copyright 2007-2012 by Apple Inc."
+Copyright "Copyright 2007-2014 by Apple Inc."
 Copyright "Copyright 1997-2007 by Easy Software Products."
 Copyright ""
 Copyright "These coded instructions, statements, and computer programs are the"
@@ -119,7 +130,7 @@ Copyright "file is missing or damaged, see the license at \"http://www.cups.org/
 
 Font *
 
-Version "1.5"
+Version "2.1"
 
 // Dymo Label Printer
 {
@@ -206,90 +217,6 @@ Version "1.5"
     *Resolution k 1 8 0 0 120x72dpi
     Resolution k 1 8 0 0 240x72dpi
   }
-
-  // Epson Stylus Color Series
-  {
-    ModelName "Stylus Color Series"
-    Attribute NickName "" "Epson Stylus Color Series"
-    PCFileName "stcolor.ppd"
-    ModelNumber $EPSON_COLOR
-    ColorDevice Yes
-
-    HWMargins 8.6 39.6 8.6 25.51
-    *MediaSize Letter
-    MediaSize Legal
-    MediaSize A4
-
-    Resolution - 1 0 0 0 180dpi
-    *Resolution - 1 0 0 0 360dpi
-    Resolution - 1 0 0 0 720dpi
-
-    *ColorModel CMYK cmyk banded 1
-    ColorModel Gray/Grayscale k chunky 1
-  }
-
-  // Epson New Stylus Color Series
-  {
-    ModelName "New Stylus Color Series"
-    Attribute NickName "" "Epson New Stylus Color Series"
-    PCFileName "stcolor2.ppd"
-    ModelNumber $EPSON_ICOLOR
-    ColorDevice Yes
-
-    HWMargins 8.6 39.6 8.6 25.51
-    *MediaSize Letter
-    MediaSize Legal
-    MediaSize A4
-
-    Resolution - 1 0 0 0 180dpi
-    *Resolution - 1 0 0 0 360dpi
-    Resolution - 1 0 0 0 720dpi
-
-    *ColorModel CMYK cmyk banded 1
-    ColorModel Gray/Grayscale k chunky 1
-  }
-
-  // Epson Stylus Color Series
-  {
-    ModelName "Stylus Photo Series"
-    Attribute NickName "" "Epson Stylus Photo Series"
-    PCFileName "stphoto.ppd"
-    ModelNumber $EPSON_PHOTO
-    ColorDevice Yes
-
-    HWMargins 8.6 39.6 8.6 25.51
-    *MediaSize Letter
-    MediaSize Legal
-    MediaSize A4
-
-    Resolution - 1 0 0 0 180dpi
-    *Resolution - 1 0 0 0 360dpi
-    Resolution - 1 0 0 0 720dpi
-
-    *ColorModel CMYK cmykcm banded 1
-    ColorModel Gray/Grayscale k chunky 1
-  }
-
-  // Epson New Stylus Color Series
-  {
-    ModelName "New Stylus Photo Series"
-    Attribute NickName "" "Epson New Stylus Photo Series"
-    PCFileName "stphoto2.ppd"
-    ModelNumber $EPSON_IPHOTO
-    ColorDevice Yes
-
-    HWMargins 8.6 39.6 8.6 25.51
-    *MediaSize Letter
-    MediaSize Legal
-    MediaSize A4
-
-    Resolution - 1 0 0 0 180dpi
-    *Resolution - 1 0 0 0 360dpi
-    Resolution - 1 0 0 0 720dpi
-
-    *ColorModel CMYK cmykcm banded 1
-    ColorModel Gray/Grayscale k chunky 1
-  }
 }
 
 // Generic drivers
@@ -1241,5 +1168,5 @@ Version "1.5"
 }
 
 //
-// End of "$Id: sample.drv 3794 2012-04-23 22:44:16Z msweet $".
+// End of "$Id: sample.drv 12789 2015-07-20 14:51:28Z msweet $".
 //
index 1e8ecaa..0943dcc 100644 (file)
@@ -1,5 +1,5 @@
 //
-// "$Id: testcatalog.cxx 11173 2013-07-23 12:31:34Z msweet $"
+// "$Id: testcatalog.cxx 1378 2009-04-08 03:17:45Z msweet $"
 //
 //   Test program for message catalog class.
 //
@@ -59,5 +59,5 @@ main(int  argc,                               // I - Number of command-line arguments
 
 
 //
-// End of "$Id: testcatalog.cxx 11173 2013-07-23 12:31:34Z msweet $".
+// End of "$Id: testcatalog.cxx 1378 2009-04-08 03:17:45Z msweet $".
 //
index 2035646..e61c288 100644 (file)
 auth.o: auth.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
-avahi.o: avahi.c ../config.h
+  client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+  banners.h dirsvc.h network.h subscriptions.h
 banners.o: banners.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h ../cups/dir.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h ../cups/dir.h
 cert.o: cert.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+  banners.h dirsvc.h network.h subscriptions.h
 classes.o: classes.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
 client.o: client.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
+colorman.o: colorman.c cupsd.h ../cups/cups-private.h \
+  ../cups/string-private.h ../config.h ../cups/debug-private.h \
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
 conf.o: conf.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+  banners.h dirsvc.h network.h subscriptions.h
 dirsvc.o: dirsvc.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
 env.o: env.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+  banners.h dirsvc.h network.h subscriptions.h
 file.o: file.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h ../cups/dir.h
+  client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+  banners.h dirsvc.h network.h subscriptions.h ../cups/dir.h
 main.o: main.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+  banners.h dirsvc.h network.h subscriptions.h
 ipp.o: ipp.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+  banners.h dirsvc.h network.h subscriptions.h
 listen.o: listen.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
 job.o: job.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h ../cups/backend.h ../cups/dir.h
+  client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+  banners.h dirsvc.h network.h subscriptions.h ../cups/backend.h \
+  ../cups/dir.h
 log.o: log.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
-network.o: network.c ../cups/http-private.h ../config.h ../cups/http.h \
-  ../cups/versioning.h ../cups/array.h ../cups/md5-private.h \
-  ../cups/ipp-private.h ../cups/ipp.h cupsd.h ../cups/cups-private.h \
-  ../cups/string-private.h ../cups/debug-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  client.h policy.h printers.h classes.h job.h colorman.h conf.h \
+  banners.h dirsvc.h network.h subscriptions.h
+network.o: network.c ../cups/http-private.h ../config.h \
+  ../cups/language.h ../cups/array.h ../cups/versioning.h ../cups/http.h \
+  ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h cupsd.h \
+  ../cups/cups-private.h ../cups/string-private.h \
+  ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
 policy.o: policy.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
 printers.o: printers.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h ../cups/dir.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h ../cups/dir.h
 process.o: process.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
 quotas.o: quotas.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
 select.o: select.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
-server.o: server.c ../cups/http-private.h ../config.h ../cups/http.h \
-  ../cups/versioning.h ../cups/array.h ../cups/md5-private.h \
-  ../cups/ipp-private.h ../cups/ipp.h cupsd.h ../cups/cups-private.h \
-  ../cups/string-private.h ../cups/debug-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
+server.o: server.c ../cups/http-private.h ../config.h ../cups/language.h \
+  ../cups/array.h ../cups/versioning.h ../cups/http.h \
+  ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h cupsd.h \
+  ../cups/cups-private.h ../cups/string-private.h \
+  ../cups/debug-private.h ../cups/array-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
 statbuf.o: statbuf.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
 subscriptions.o: subscriptions.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
 sysman.o: sysman.c cupsd.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
-timeout.o: timeout.c cupsd.h ../cups/cups-private.h \
-  ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h
-tls.o: tls.c cupsd.h ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h sysman.h statbuf.h cert.h auth.h \
-  client.h policy.h printers.h classes.h job.h conf.h banners.h dirsvc.h \
-  network.h subscriptions.h tls-darwin.c
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h \
+  sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h \
+  classes.h job.h colorman.h conf.h banners.h dirsvc.h network.h \
+  subscriptions.h
 filter.o: filter.c ../cups/string-private.h ../config.h \
   ../cups/debug-private.h ../cups/versioning.h mime.h ../cups/array.h \
   ../cups/ipp.h ../cups/http.h ../cups/file.h
@@ -271,59 +277,60 @@ type.o: type.c ../cups/string-private.h ../config.h \
   ../cups/ipp.h ../cups/http.h ../cups/file.h
 cupsfilter.o: cupsfilter.c ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/file-private.h mime.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/file-private.h mime.h
 cups-deviced.o: cups-deviced.c util.h ../cups/array-private.h \
   ../cups/array.h ../cups/versioning.h ../cups/file-private.h \
   ../cups/cups-private.h ../cups/string-private.h ../config.h \
   ../cups/debug-private.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/dir.h
-cups-exec.o: cups-exec.c ../cups/string-private.h ../config.h
+cups-exec.o: cups-exec.c ../cups/string-private.h ../config.h \
+  ../cups/file.h ../cups/versioning.h
 cups-lpd.o: cups-lpd.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
 testlpd.o: testlpd.c ../cups/cups.h ../cups/file.h ../cups/versioning.h \
   ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h \
-  ../cups/string-private.h ../config.h
+  ../cups/pwg.h ../cups/string-private.h ../config.h
 testmime.o: testmime.c ../cups/string-private.h ../config.h ../cups/dir.h \
   ../cups/versioning.h ../cups/debug-private.h ../cups/ppd-private.h \
   ../cups/cups.h ../cups/file.h ../cups/ipp.h ../cups/http.h \
-  ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/pwg-private.h \
-  mime.h
+  ../cups/array.h ../cups/language.h ../cups/pwg.h ../cups/ppd.h \
+  ../cups/pwg-private.h mime.h
 testspeed.o: testspeed.c ../cups/string-private.h ../config.h \
   ../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/language.h \
+  ../cups/http.h ../cups/array.h ../cups/language.h ../cups/pwg.h \
   ../cups/debug-private.h
 testsub.o: testsub.c ../cups/cups.h ../cups/file.h ../cups/versioning.h \
   ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h \
-  ../cups/debug-private.h ../cups/string-private.h ../config.h \
-  ../cups/ipp-private.h
+  ../cups/pwg.h ../cups/debug-private.h ../cups/string-private.h \
+  ../config.h ../cups/ipp-private.h
 util.o: util.c util.h ../cups/array-private.h ../cups/array.h \
   ../cups/versioning.h ../cups/file-private.h ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
   ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h
 cups-driverd.o: cups-driverd.cxx util.h ../cups/array-private.h \
   ../cups/array.h ../cups/versioning.h ../cups/file-private.h \
   ../cups/cups-private.h ../cups/string-private.h ../config.h \
   ../cups/debug-private.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/dir.h ../ppdc/ppdc.h
index 2790569..c7d244d 100644 (file)
@@ -1,16 +1,16 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12519 2015-02-17 13:10:19Z msweet $"
 #
-#   Scheduler Makefile for CUPS.
+# Scheduler Makefile for CUPS.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products, all rights reserved.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 include ../Makedefs
@@ -40,8 +40,7 @@ CUPSDOBJS =   \
                server.o \
                statbuf.o \
                subscriptions.o \
-               sysman.o \
-               tls.o
+               sysman.o
 LIBOBJS =      \
                filter.o \
                mime.o \
@@ -114,7 +113,7 @@ unittests:  $(UNITTARGETS)
 clean:
        $(RM) $(OBJS)
        $(RM) $(TARGETS) $(UNITTARGETS) convert
-       $(RM) libcupsmime.so libcupsmime.sl libcupsmime.dylib
+       $(RM) libcupsmime.so libcupsmime.dylib
 
 
 #
@@ -172,7 +171,7 @@ install-data:
        echo Creating $(REQUESTS)/tmp...
        $(INSTALL_DIR) -m 1770 -g $(CUPS_GROUP) $(REQUESTS)/tmp
        echo Creating $(CACHEDIR)...
-       $(INSTALL_DIR) -m 775 -g $(CUPS_GROUP) $(CACHEDIR)
+       $(INSTALL_DIR) -m 770 -g $(CUPS_GROUP) $(CACHEDIR)
        if test "x$(INITDIR)" != x; then \
                echo Installing init scripts...; \
                $(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/init.d; \
@@ -180,32 +179,36 @@ install-data:
                for level in $(RCLEVELS); do \
                        $(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/rc$${level}.d; \
                        $(LN) ../init.d/cups $(BUILDROOT)$(INITDIR)/rc$${level}.d/S$(RCSTART)cups; \
-                       if test `uname` = HP-UX; then \
-                               level=`expr $$level - 1`; \
-                               $(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/rc$${level}.d; \
-                       fi; \
                        $(LN) ../init.d/cups $(BUILDROOT)$(INITDIR)/rc$${level}.d/K$(RCSTOP)cups; \
                done; \
                $(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/rc0.d; \
                $(LN) ../init.d/cups $(BUILDROOT)$(INITDIR)/rc0.d/K$(RCSTOP)cups; \
        fi
-       if test "x$(INITDIR)" = x -a "x$(INITDDIR)" != x; then \
-               $(INSTALL_DIR) $(BUILDROOT)$(INITDDIR); \
-               if test "$(INITDDIR)" = "/System/Library/LaunchDaemons"; then \
-                       echo Installing LaunchDaemons configuration files...; \
-                       $(INSTALL_DATA) org.cups.cupsd.plist $(BUILDROOT)$(DEFAULT_LAUNCHD_CONF); \
-                       $(INSTALL_DATA) org.cups.cups-lpd.plist $(BUILDROOT)/System/Library/LaunchDaemons; \
-               else \
-                       echo Installing RC script...; \
-                       $(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDDIR)/cups; \
-               fi \
+       if test "x$(INITDDIR)" != x; then \
+               echo Installing init script...; \
+               $(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDDIR); \
+               $(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDDIR); \
+       fi
+       if test "x$(LAUNCHD_DIR)" != x; then \
+               echo Installing launchd configuration files...; \
+               $(INSTALL_DIR) $(BUILDROOT)$(LAUNCHD_DIR); \
+               $(INSTALL_DATA) org.cups.cupsd.plist $(BUILDROOT)$(LAUNCHD_DIR); \
+               $(INSTALL_DATA) org.cups.cups-lpd.plist $(BUILDROOT)$(LAUNCHD_DIR); \
        fi
        if test "x$(SMFMANIFESTDIR)" != x; then \
                echo Installing SMF manifest in $(SMFMANIFESTDIR)...;\
                $(INSTALL_DIR) $(BUILDROOT)/$(SMFMANIFESTDIR); \
                $(INSTALL_SCRIPT) cups.xml $(BUILDROOT)$(SMFMANIFESTDIR)/cups.xml; \
        fi
-       if test "x$(XINETD)" != x; then \
+       if test "x$(SYSTEMD_DIR)" != x; then \
+               echo Installing systemd configuration files...; \
+               $(INSTALL_DIR) $(BUILDROOT)$(SYSTEMD_DIR); \
+               $(INSTALL_DATA) org.cups.cupsd.path $(BUILDROOT)$(SYSTEMD_DIR); \
+               $(INSTALL_DATA) org.cups.cupsd.service $(BUILDROOT)$(SYSTEMD_DIR); \
+               $(INSTALL_DATA) org.cups.cupsd.socket $(BUILDROOT)$(SYSTEMD_DIR); \
+               $(INSTALL_DATA) org.cups.cups-lpdAT.service $(BUILDROOT)$(SYSTEMD_DIR)/org.cups.cups-lpd@.service; \
+               $(INSTALL_DATA) org.cups.cups-lpd.socket $(BUILDROOT)$(SYSTEMD_DIR); \
+       elif test "x$(XINETD)" != x; then \
                echo Installing xinetd configuration file for cups-lpd...; \
                $(INSTALL_DIR) -m 755 $(BUILDROOT)$(XINETD); \
                $(INSTALL_DATA) cups-lpd.xinetd $(BUILDROOT)$(XINETD)/cups-lpd; \
@@ -232,6 +235,7 @@ install-exec:
                $(INSTALL_DIR) $(SYMROOT); \
                for file in $(PROGRAMS); do \
                        cp $$file $(SYMROOT); \
+                       dsymutil $(SYMROOT)/$$file; \
                done \
        fi
 
@@ -254,7 +258,7 @@ install-libs: $(INSTALLSTATIC)
        echo Installing libraries in $(LIBDIR)...
        $(INSTALL_DIR) -m 755 $(LIBDIR)
        $(INSTALL_LIB) $(LIBCUPSMIME) $(LIBDIR)
-       if test $(LIBCUPSMIME) = "libcupsmime.so.1" -o $(LIBCUPSMIME) = "libcupsmime.sl.1"; then \
+       if test $(LIBCUPSMIME) = "libcupsmime.so.1"; then \
                $(RM) $(LIBDIR)/`basename $(LIBCUPSMIME) .1`; \
                $(LN) $(LIBCUPSMIME) $(LIBDIR)/`basename $(LIBCUPSMIME) .1`; \
        fi
@@ -265,6 +269,7 @@ install-libs: $(INSTALLSTATIC)
        if test "x$(SYMROOT)" != "x"; then \
                $(INSTALL_DIR) $(SYMROOT); \
                cp $(LIBCUPSMIME) $(SYMROOT); \
+               dsymutil $(SYMROOT)/$(LIBCUPSMIME); \
        fi
 
 installstatic:
@@ -285,7 +290,6 @@ uninstall:
        $(RM) $(SERVERBIN)/daemon/cups-driverd
        $(RM) $(SERVERBIN)/daemon/cups-exec
        $(RM) $(SERVERBIN)/daemon/cups-lpd
-       $(RM) $(BUILDROOT)/System/Library/Printers/Libraries/convert
        -$(RMDIR) $(STATEDIR)/certs
        -$(RMDIR) $(STATEDIR)
        -$(RMDIR) $(SERVERROOT)/ppd
@@ -302,16 +306,13 @@ uninstall:
        $(RM) $(LIBDIR)/libcupsmime.1.dylib
        $(RM) $(LIBDIR)/libcupsmime.a
        $(RM) $(LIBDIR)/libcupsmime.dylib
-       $(RM) $(LIBDIR)/libcupsmime_s.a
-       $(RM) $(LIBDIR)/libcupsmime.sl
-       $(RM) $(LIBDIR)/libcupsmime.sl.1
        $(RM) $(LIBDIR)/libcupsmime.so
        $(RM) $(LIBDIR)/libcupsmime.so.1
        -$(RMDIR) $(LIBDIR)
        $(RM) $(INCLUDEDIR)/cups/mime.h
        -$(RMDIR) $(INCLUDEDIR)/cups
-       echo Uninstalling startup script...
        if test "x$(INITDIR)" != x; then \
+               echo Uninstalling init scripts...; \
                $(RM) $(BUILDROOT)$(INITDIR)/init.d/cups; \
                $(RMDIR) $(BUILDROOT)$(INITDIR)/init.d; \
                $(RM)  $(BUILDROOT)$(INITDIR)/rc0.d/K00cups; \
@@ -323,23 +324,24 @@ uninstall:
                $(RM) $(BUILDROOT)$(INITDIR)/rc5.d/S99cups; \
                $(RMDIR) $(BUILDROOT)$(INITDIR)/rc5.d; \
        fi
-       if test "x$(INITDIR)" = x -a "x$(INITDDIR)" != x; then \
-               if test "$(INITDDIR)" = "/System/Library/StartupItems/PrintingServices"; then \
-                       $(RM) $(BUILDROOT)$(INITDDIR)/PrintingServices; \
-                       $(RM) $(BUILDROOT)$(INITDDIR)/StartupParameters.plist; \
-                       $(RM) $(BUILDROOT)$(INITDDIR)/Resources/English.lproj/Localizable.strings; \
-                       $(RMDIR) $(BUILDROOT)$(INITDDIR)/Resources/English.lproj; \
-               elif test "$(INITDDIR)" = "/System/Library/LaunchDaemons"; then \
-                       $(RM) $(BUILDROOT)$(INITDDIR)/org.cups.cupsd.plist; \
-                       $(RM) $(BUILDROOT)$(INITDDIR)/org.cups.cups-lpd.plist; \
-                       $(RMDIR) $(BUILDROOT)/System/Library/StartupItems/PrintingServices; \
-               else \
-                       $(INSTALL_SCRIPT) init/cups.sh $(BUILDROOT)$(INITDDIR)/cups; \
-               fi \
+       if test "x$(INITDDIR)" != x; then \
+               echo Uninstalling startup script...; \
+               $(RM) $(BUILDROOT)$(INITDDIR)/cups.sh; \
                $(RMDIR) $(BUILDROOT)$(INITDDIR); \
        fi
+       if test "x$LAUNCHD_DIR" != x; then \
+               echo Uninstalling launchd files...; \
+               $(RM) $(BUILDROOT)$(LAUNCHD_DIR)/org.cups.cupsd.plist; \
+               $(RM) $(BUILDROOT)$(LAUNCHD_DIR)/org.cups.cups-lpd.plist; \
+       fi
+       if test "x$SYSTEMD_DIR" != x; then \
+               echo Uninstalling systemd files...; \
+               $(RM) $(BUILDROOT)$(SYSTEMD_DIR)/org.cups.cupsd.path; \
+               $(RM) $(BUILDROOT)$(SYSTEMD_DIR)/org.cups.cupsd.service; \
+               $(RM) $(BUILDROOT)$(SYSTEMD_DIR)/org.cups.cupsd.socket; \
+       fi
        if test "x$(SMFMANIFESTDIR)" != x; then \
-               echo Uninstalling SMF manifest in $(SMFMANIFESTDIR)...;\
+               echo Uninstalling SMF manifest file...;\
                $(RM) $(BUILDROOT)$(SMFMANIFESTDIR)/cups.xml; \
        fi
        if test "x$(XINETD)" != x; then \
@@ -378,18 +380,16 @@ cupsd:    $(CUPSDOBJS) $(LIBCUPSMIME) ../cups/$(LIBCUPS)
        echo Linking $@...
        $(CC) $(LDFLAGS) -o cupsd $(CUPSDOBJS) -L. -lcupsmime \
                $(LIBZ) $(SSLLIBS) $(LIBSLP) $(LIBLDAP) $(PAMLIBS) \
-               $(LIBPAPER) $(LIBMALLOC) $(SERVERLIBS) $(DNSSDLIBS) $(LIBS) \
-               $(LIBGSSAPI) $(LIBWRAP)
+               $(LIBPAPER) $(LIBMALLOC) $(SERVERLIBS) $(ONDEMANDLIBS) \
+                $(DNSSDLIBS) $(LIBS) $(LIBGSSAPI) $(LIBWRAP)
 
 cupsd-static:  $(CUPSDOBJS) libcupsmime.a ../cups/$(LIBCUPSSTATIC)
        echo Linking $@...
        $(CC) $(LDFLAGS) -o cupsd-static $(CUPSDOBJS) libcupsmime.a \
                $(LIBZ) $(SSLLIBS) $(LIBSLP) $(LIBLDAP) $(PAMLIBS) \
                ../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(LIBZ) $(LIBPAPER) \
-               $(LIBMALLOC) $(SERVERLIBS) $(DNSSDLIBS) $(LIBGSSAPI) \
-               $(LIBWRAP)
-
-tls.o: tls-darwin.c tls-gnutls.c tls-openssl.c
+               $(LIBMALLOC) $(SERVERLIBS) $(ONDEMANDLIBS) $(DNSSDLIBS) \
+                $(LIBGSSAPI) $(LIBWRAP)
 
 
 #
@@ -402,6 +402,12 @@ cupsfilter:        cupsfilter.o $(LIBCUPSMIME) ../cups/$(LIBCUPS)
        $(RM) convert
        $(LN) cupsfilter convert
 
+cupsfilter-static:     cupsfilter.o libcupsmime.a ../cups/$(LIBCUPSSTATIC)
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o cupsfilter-static cupsfilter.o libcupsmime.a \
+               ../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(LIBZ) $(SSLLIBS) \
+               $(DNSSDLIBS) $(LIBGSSAPI)
+
 
 #
 # Make the device daemon, "cups-deviced".
@@ -441,10 +447,10 @@ cups-lpd: cups-lpd.o ../cups/$(LIBCUPS)
 
 
 #
-# libcupsmime.so.1, libcupsmime.sl.1
+# libcupsmime.so.1
 #
 
-libcupsmime.so.1 libcupsmime.sl.1:     $(LIBOBJS)
+libcupsmime.so.1     $(LIBOBJS)
        echo Linking $@...
        $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBS)
        $(RM) `basename $@ .1`
@@ -468,17 +474,6 @@ libcupsmime.1.dylib:       $(LIBOBJS) libcupsmime.exp
 
 
 #
-# libcupsmime_s.a
-#
-
-libcupsmime_s.a:       $(LIBOBJS)
-       echo Creating $@...
-       $(DSO) $(DSOFLAGS) -o libcupsmime_s.o $(LIBOBJS) $(LIBS)
-       $(RM) $@
-       $(AR) $(ARFLAGS) $@ libcupsmime_s.o
-
-
-#
 # libcupsmime.la
 #
 
@@ -559,5 +554,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12519 2015-02-17 13:10:19Z msweet $".
 #
index 1169adf..ac9badc 100644 (file)
@@ -1,51 +1,19 @@
 /*
- * "$Id: auth.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: auth.c 12945 2015-10-26 19:46:02Z msweet $"
  *
- *   Authorization routines for the CUPS scheduler.
+ * Authorization routines for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   This file contains Kerberos support code, copyright 2006 by
- *   Jelmer Vernooij.
+ * This file contains Kerberos support code, copyright 2006 by
+ * Jelmer Vernooij.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdAddIPMask()          - Add an IP address authorization mask.
- *   cupsdAddLocation()        - Add a location for authorization.
- *   cupsdAddName()            - Add a name to a location...
- *   cupsdAddNameMask()        - Add a host or interface name authorization
- *                               mask.
- *   cupsdAuthorize()          - Validate any authorization credentials.
- *   cupsdCheckAccess()        - Check whether the given address is allowed to
- *                               access a location.
- *   cupsdCheckAuth()          - Check authorization masks.
- *   cupsdCheckGroup()         - Check for a user's group membership.
- *   cupsdCopyLocation()       - Make a copy of a location...
- *   cupsdDeleteAllLocations() - Free all memory used for location
- *                               authorization.
- *   cupsdFindBest()           - Find the location entry that best matches the
- *                               resource.
- *   cupsdFindLocation()       - Find the named location.
- *   cupsdFreeLocation()       - Free all memory used by a location.
- *   cupsdIsAuthorized()       - Check to see if the user is authorized...
- *   cupsdNewLocation()        - Create a new location for authorization.
- *   check_authref()           - Check if an authorization services reference
- *                               has the supplied right.
- *   compare_locations()       - Compare two locations.
- *   copy_authmask()           - Copy function for auth masks.
- *   cups_crypt()              - Encrypt the password using the DES or MD5
- *                               algorithms, as needed.
- *   free_authmask()           - Free function for auth masks.
- *   get_md5_password()        - Get an MD5 password.
- *   pam_func()                - PAM conversation function.
- *   to64()                    - Base64-encode an integer value...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -67,9 +35,6 @@
 #    include <security/pam_appl.h>
 #  endif /* HAVE_PAM_PAM_APPL_H */
 #endif /* HAVE_LIBPAM */
-#ifdef HAVE_USERSEC_H
-#  include <usersec.h>
-#endif /* HAVE_USERSEC_H */
 #ifdef HAVE_MEMBERSHIP_H
 #  include <membership.h>
 #endif /* HAVE_MEMBERSHIP_H */
@@ -108,16 +73,14 @@ static int         check_authref(cupsd_client_t *con, const char *right);
 static int             compare_locations(cupsd_location_t *a,
                                          cupsd_location_t *b);
 static cupsd_authmask_t        *copy_authmask(cupsd_authmask_t *am, void *data);
-#if !HAVE_LIBPAM && !defined(HAVE_USERSEC_H)
+#if !HAVE_LIBPAM
 static char            *cups_crypt(const char *pw, const char *salt);
-#endif /* !HAVE_LIBPAM && !HAVE_USERSEC_H */
+#endif /* !HAVE_LIBPAM */
 static void            free_authmask(cupsd_authmask_t *am, void *data);
-static char            *get_md5_password(const char *username,
-                                         const char *group, char passwd[33]);
 #if HAVE_LIBPAM
 static int             pam_func(int, const struct pam_message **,
                                 struct pam_response **, void *);
-#elif !defined(HAVE_USERSEC_H)
+#else
 static void            to64(char *s, unsigned long v, int n);
 #endif /* HAVE_LIBPAM */
 
@@ -136,15 +99,6 @@ typedef struct cupsd_authdata_s             /**** Authentication data ****/
 
 
 /*
- * Local globals...
- */
-
-#if defined(__hpux) && HAVE_LIBPAM
-static cupsd_authdata_t        *auth_data;     /* Current client being authenticated */
-#endif /* __hpux && HAVE_LIBPAM */
-
-
-/*
  * 'cupsdAddIPMask()' - Add an IP address authorization mask.
  */
 
@@ -157,12 +111,7 @@ cupsdAddIPMask(
   cupsd_authmask_t     temp;           /* New host/domain mask */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "cupsdAddIPMask(masks=%p(%p), address=%x:%x:%x:%x, "
-                 "netmask=%x:%x:%x:%x)",
-                 masks, *masks,
-                 address[0], address[1], address[2], address[3],
-                 netmask[0], netmask[1], netmask[2], netmask[3]);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddIPMask(masks=%p(%p), address=%x:%x:%x:%x, netmask=%x:%x:%x:%x)", masks, *masks, address[0], address[1], address[2], address[3], netmask[0], netmask[1], netmask[2], netmask[3]);
 
   temp.type = CUPSD_AUTH_IP;
   memcpy(temp.mask.ip.address, address, sizeof(temp.mask.ip.address));
@@ -202,8 +151,7 @@ cupsdAddLocation(cupsd_location_t *loc)     /* I - Location to add */
   {
     cupsArrayAdd(Locations, loc);
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddLocation: Added location \"%s\"",
-                    loc->location ? loc->location : "(null)");
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddLocation: Added location \"%s\"", loc->location ? loc->location : "(null)");
   }
 }
 
@@ -216,8 +164,7 @@ void
 cupsdAddName(cupsd_location_t *loc,    /* I - Location to add to */
              char             *name)   /* I - Name to add */
 {
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddName(loc=%p, name=\"%s\")",
-                  loc, name);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddName(loc=%p, name=\"%s\")", loc, name);
 
   if (!loc->names)
     loc->names = cupsArrayNew3(NULL, NULL, NULL, 0,
@@ -247,9 +194,7 @@ cupsdAddNameMask(cups_array_t **masks,      /* IO - Masks array (created as needed) *
                        *ifptr;         /* Pointer to end of name */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "cupsdAddNameMask(masks=%p(%p), name=\"%s\")",
-                  masks, *masks, name);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddNameMask(masks=%p(%p), name=\"%s\")", masks, *masks, name);
 
   if (!_cups_strcasecmp(name, "@LOCAL"))
   {
@@ -326,26 +271,6 @@ cupsdAuthorize(cupsd_client_t *con)        /* I - Client connection */
                password[HTTP_MAX_VALUE];
                                        /* Password string */
   cupsd_cert_t *localuser;             /* Certificate username */
-  char         nonce[HTTP_MAX_VALUE],  /* Nonce value from client */
-               md5[33],                /* MD5 password */
-               basicmd5[33];           /* MD5 of Basic password */
-  static const char * const states[] = /* HTTP client states... */
-               {
-                 "WAITING",
-                 "OPTIONS",
-                 "GET",
-                 "GET",
-                 "HEAD",
-                 "POST",
-                 "POST",
-                 "POST",
-                 "PUT",
-                 "PUT",
-                 "DELETE",
-                 "TRACE",
-                 "CLOSE",
-                 "STATUS"
-               };
 
 
  /*
@@ -353,13 +278,10 @@ cupsdAuthorize(cupsd_client_t *con)       /* I - Client connection */
   * authentication to expect...
   */
 
-  con->best = cupsdFindBest(con->uri, con->http.state);
+  con->best = cupsdFindBest(con->uri, httpGetState(con->http));
   con->type = CUPSD_AUTH_NONE;
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "[Client %d] con->uri=\"%s\", con->best=%p(%s)",
-                  con->http.fd, con->uri, con->best,
-                  con->best ? con->best->location : "");
+  cupsdLogClient(con, CUPSD_LOG_DEBUG2, "con->uri=\"%s\", con->best=%p(%s)", con->uri, con->best, con->best ? con->best->location : "");
 
   if (con->best && con->best->type != CUPSD_AUTH_NONE)
   {
@@ -375,10 +297,7 @@ cupsdAuthorize(cupsd_client_t *con)        /* I - Client connection */
   * Decode the Authorization string...
   */
 
-  authorization = httpGetField(&con->http, HTTP_FIELD_AUTHORIZATION);
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Client %d] Authorization=\"%s\"",
-                  con->http.fd, authorization);
+  authorization = httpGetField(con->http, HTTP_FIELD_AUTHORIZATION);
 
   username[0] = '\0';
   password[0] = '\0';
@@ -401,16 +320,16 @@ cupsdAuthorize(cupsd_client_t *con)       /* I - Client connection */
     * No authorization data provided, return early...
     */
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                    "[Client %d] No authentication data provided.",
-                    con->http.fd);
+    cupsdLogClient(con, CUPSD_LOG_DEBUG, "No authentication data provided.");
     return;
   }
 #ifdef HAVE_AUTHORIZATION_H
   else if (!strncmp(authorization, "AuthRef ", 8) &&
-           !_cups_strcasecmp(con->http.hostname, "localhost"))
+           httpAddrLocalhost(httpGetAddress(con->http)))
   {
     OSStatus           status;         /* Status */
+    char               authdata[HTTP_MAX_VALUE];
+                                       /* Nonce value from client */
     int                        authlen;        /* Auth string length */
     AuthorizationItemSet *authinfo;    /* Authorization item set */
 
@@ -422,24 +341,18 @@ cupsdAuthorize(cupsd_client_t *con)       /* I - Client connection */
     while (isspace(*authorization & 255))
       authorization ++;
 
-    authlen = sizeof(nonce);
-    httpDecode64_2(nonce, &authlen, authorization);
+    authlen = sizeof(authdata);
+    httpDecode64_2(authdata, &authlen, authorization);
 
     if (authlen != kAuthorizationExternalFormLength)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "[Client %d] External Authorization reference size is "
-                     "incorrect.", con->http.fd);
+      cupsdLogClient(con, CUPSD_LOG_ERROR, "External Authorization reference size is incorrect.");
       return;
     }
 
-    if ((status = AuthorizationCreateFromExternalForm(
-                     (AuthorizationExternalForm *)nonce, &con->authref)) != 0)
+    if ((status = AuthorizationCreateFromExternalForm((AuthorizationExternalForm *)authdata, &con->authref)) != 0)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "[Client %d] AuthorizationCreateFromExternalForm "
-                     "returned %d (%s)", con->http.fd, (int)status,
-                     cssmErrorString(status));
+      cupsdLogClient(con, CUPSD_LOG_ERROR, "AuthorizationCreateFromExternalForm returned %d (%s)", (int)status, cssmErrorString(status));
       return;
     }
 
@@ -453,9 +366,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
       {
         strlcpy(username, authinfo->items[0].value, sizeof(username));
 
-        cupsdLogMessage(CUPSD_LOG_DEBUG,
-                       "[Client %d] Authorized as \"%s\" using AuthRef",
-                       con->http.fd, username);
+        cupsdLogClient(con, CUPSD_LOG_DEBUG, "Authorized as \"%s\" using AuthRef.", username);
       }
 
       AuthorizationFreeItemSet(authinfo);
@@ -473,28 +384,21 @@ cupsdAuthorize(cupsd_client_t *con)       /* I - Client connection */
 
       peersize = sizeof(peercred);
 
-      if (getsockopt(con->http.fd, 0, LOCAL_PEERCRED, &peercred, &peersize))
+      if (getsockopt(httpGetFd(con->http), 0, LOCAL_PEERCRED, &peercred, &peersize))
       {
-        cupsdLogMessage(CUPSD_LOG_ERROR,
-                        "[Client %d] Unable to get peer credentials - %s",
-                        con->http.fd, strerror(errno));
+        cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to get peer credentials - %s", strerror(errno));
         return;
       }
 
       if ((pwd = getpwuid(CUPSD_UCRED_UID(peercred))) == NULL)
       {
-        cupsdLogMessage(CUPSD_LOG_ERROR,
-                        "[Client %d] Unable to find UID %d for peer "
-                        "credentials.", con->http.fd,
-                        (int)CUPSD_UCRED_UID(peercred));
+        cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to find UID %d for peer credentials.", (int)CUPSD_UCRED_UID(peercred));
         return;
       }
 
       strlcpy(username, pwd->pw_name, sizeof(username));
 
-      cupsdLogMessage(CUPSD_LOG_DEBUG,
-                     "[Client %d] Authorized as \"%s\" using "
-                     "AuthRef + PeerCred", con->http.fd, username);
+      cupsdLogClient(con, CUPSD_LOG_DEBUG, "Authorized as \"%s\" using AuthRef + PeerCred.", username);
     }
 
     con->type = CUPSD_AUTH_BASIC;
@@ -502,7 +406,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
 #endif /* HAVE_AUTHORIZATION_H */
 #if defined(SO_PEERCRED) && defined(AF_LOCAL)
   else if (!strncmp(authorization, "PeerCred ", 9) &&
-           con->http.hostaddr->addr.sa_family == AF_LOCAL)
+           con->http->hostaddr->addr.sa_family == AF_LOCAL && con->best)
   {
    /*
     * Use peer credentials from domain socket connection...
@@ -539,50 +443,37 @@ cupsdAuthorize(cupsd_client_t *con)       /* I - Client connection */
 
     if (no_peer)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "[Client %d] PeerCred authentication not allowed for "
-                     "resource per AUTHKEY policy.", con->http.fd);
+      cupsdLogClient(con, CUPSD_LOG_ERROR, "PeerCred authentication not allowed for resource per AUTHKEY policy.");
       return;
     }
 #endif /* HAVE_AUTHORIZATION_H */
 
     if ((pwd = getpwnam(authorization + 9)) == NULL)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "[Client %d] User \"%s\" does not exist.", con->http.fd,
-                      authorization + 9);
+      cupsdLogClient(con, CUPSD_LOG_ERROR, "User \"%s\" does not exist.", authorization + 9);
       return;
     }
 
     peersize = sizeof(peercred);
 
 #  ifdef __APPLE__
-    if (getsockopt(con->http.fd, 0, LOCAL_PEERCRED, &peercred, &peersize))
+    if (getsockopt(httpGetFd(con->http), 0, LOCAL_PEERCRED, &peercred, &peersize))
 #  else
-    if (getsockopt(con->http.fd, SOL_SOCKET, SO_PEERCRED, &peercred, &peersize))
+    if (getsockopt(httpGetFd(con->http), SOL_SOCKET, SO_PEERCRED, &peercred, &peersize))
 #  endif /* __APPLE__ */
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "[Client %d] Unable to get peer credentials - %s",
-                      con->http.fd, strerror(errno));
+      cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to get peer credentials - %s", strerror(errno));
       return;
     }
 
     if (pwd->pw_uid != CUPSD_UCRED_UID(peercred))
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "[Client %d] Invalid peer credentials for \"%s\" - got "
-                      "%d, expected %d!", con->http.fd, authorization + 9,
-                     CUPSD_UCRED_UID(peercred), pwd->pw_uid);
+      cupsdLogClient(con, CUPSD_LOG_ERROR, "Invalid peer credentials for \"%s\" - got %d, expected %d.", authorization + 9, CUPSD_UCRED_UID(peercred), pwd->pw_uid);
 #  ifdef HAVE_SYS_UCRED_H
-      cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] cr_version=%d",
-                      con->http.fd, peercred.cr_version);
-      cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] cr_uid=%d",
-                      con->http.fd, peercred.cr_uid);
-      cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] cr_ngroups=%d",
-                      con->http.fd, peercred.cr_ngroups);
-      cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] cr_groups[0]=%d",
-                      con->http.fd, peercred.cr_groups[0]);
+      cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cr_version=%d", peercred.cr_version);
+      cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cr_uid=%d", peercred.cr_uid);
+      cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cr_ngroups=%d", peercred.cr_ngroups);
+      cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cr_groups[0]=%d", peercred.cr_groups[0]);
 #  endif /* HAVE_SYS_UCRED_H */
       return;
     }
@@ -593,15 +484,13 @@ cupsdAuthorize(cupsd_client_t *con)       /* I - Client connection */
     con->gss_uid = CUPSD_UCRED_UID(peercred);
 #  endif /* HAVE_GSSAPI */
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                    "[Client %d] Authorized as %s using PeerCred", con->http.fd,
-                   username);
+    cupsdLogClient(con, CUPSD_LOG_DEBUG, "Authorized as %s using PeerCred.", username);
 
     con->type = CUPSD_AUTH_BASIC;
   }
 #endif /* SO_PEERCRED && AF_LOCAL */
   else if (!strncmp(authorization, "Local", 5) &&
-           !_cups_strcasecmp(con->http.hostname, "localhost"))
+          httpAddrLocalhost(httpGetAddress(con->http)))
   {
    /*
     * Get Local certificate authentication data...
@@ -613,18 +502,14 @@ cupsdAuthorize(cupsd_client_t *con)       /* I - Client connection */
 
     if ((localuser = cupsdFindCert(authorization)) == NULL)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "[Client %d] Local authentication certificate not found.",
-                      con->http.fd);
+      cupsdLogClient(con, CUPSD_LOG_ERROR, "Local authentication certificate not found.");
       return;
     }
 
     strlcpy(username, localuser->username, sizeof(username));
     con->type = localuser->type;
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                   "[Client %d] Authorized as %s using Local", con->http.fd,
-                   username);
+    cupsdLogClient(con, CUPSD_LOG_DEBUG, "Authorized as %s using Local.", username);
   }
   else if (!strncmp(authorization, "Basic", 5))
   {
@@ -648,8 +533,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
 
     if ((ptr = strchr(username, ':')) == NULL)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR, "[Client %d] Missing Basic password.",
-                      con->http.fd);
+      cupsdLogClient(con, CUPSD_LOG_ERROR, "Missing Basic password.");
       return;
     }
 
@@ -661,8 +545,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
       * Username must not be empty...
       */
 
-      cupsdLogMessage(CUPSD_LOG_ERROR, "[Client %d] Empty Basic username.",
-                      con->http.fd);
+      cupsdLogClient(con, CUPSD_LOG_ERROR, "Empty Basic username.");
       return;
     }
 
@@ -672,8 +555,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
       * Password must not be empty...
       */
 
-      cupsdLogMessage(CUPSD_LOG_ERROR, "[Client %d] Empty Basic password.",
-                      con->http.fd);
+      cupsdLogClient(con, CUPSD_LOG_ERROR, "Empty Basic password.");
       return;
     }
 
@@ -703,59 +585,40 @@ cupsdAuthorize(cupsd_client_t *con)       /* I - Client connection */
             strlcpy(data.username, username, sizeof(data.username));
            strlcpy(data.password, password, sizeof(data.password));
 
-#  if defined(__sun) || defined(__hpux)
+#  ifdef __sun
            pamdata.conv        = (int (*)(int, struct pam_message **,
                                           struct pam_response **,
                                           void *))pam_func;
 #  else
            pamdata.conv        = pam_func;
-#  endif /* __sun || __hpux */
+#  endif /* __sun */
            pamdata.appdata_ptr = &data;
 
-#  ifdef __hpux
-          /*
-           * Workaround for HP-UX bug in pam_unix; see pam_func() below for
-           * more info...
-           */
-
-           auth_data = &data;
-#  endif /* __hpux */
-
            pamerr = pam_start("cups", username, &pamdata, &pamh);
            if (pamerr != PAM_SUCCESS)
            {
-             cupsdLogMessage(CUPSD_LOG_ERROR,
-                             "[Client %d] pam_start() returned %d (%s)",
-                             con->http.fd, pamerr, pam_strerror(pamh, pamerr));
+             cupsdLogClient(con, CUPSD_LOG_ERROR, "pam_start() returned %d (%s)", pamerr, pam_strerror(pamh, pamerr));
              return;
            }
 
 #  ifdef HAVE_PAM_SET_ITEM
 #    ifdef PAM_RHOST
-           pamerr = pam_set_item(pamh, PAM_RHOST, con->http.hostname);
+           pamerr = pam_set_item(pamh, PAM_RHOST, con->http->hostname);
            if (pamerr != PAM_SUCCESS)
-             cupsdLogMessage(CUPSD_LOG_WARN,
-                             "[Client %d] pam_set_item(PAM_RHOST) "
-                             "returned %d (%s)", con->http.fd, pamerr,
-                             pam_strerror(pamh, pamerr));
+             cupsdLogClient(con, CUPSD_LOG_WARN, "pam_set_item(PAM_RHOST) returned %d (%s)", pamerr, pam_strerror(pamh, pamerr));
 #    endif /* PAM_RHOST */
 
 #    ifdef PAM_TTY
            pamerr = pam_set_item(pamh, PAM_TTY, "cups");
            if (pamerr != PAM_SUCCESS)
-             cupsdLogMessage(CUPSD_LOG_WARN,
-                             "[Client %d] pam_set_item(PAM_TTY) "
-                             "returned %d (%s)!", con->http.fd, pamerr,
-                             pam_strerror(pamh, pamerr));
+             cupsdLogClient(con, CUPSD_LOG_WARN, "pam_set_item(PAM_TTY) returned %d (%s)", pamerr, pam_strerror(pamh, pamerr));
 #    endif /* PAM_TTY */
 #  endif /* HAVE_PAM_SET_ITEM */
 
            pamerr = pam_authenticate(pamh, PAM_SILENT);
            if (pamerr != PAM_SUCCESS)
            {
-             cupsdLogMessage(CUPSD_LOG_ERROR,
-                             "[Client %d] pam_authenticate() returned %d (%s)",
-                             con->http.fd, pamerr, pam_strerror(pamh, pamerr));
+             cupsdLogClient(con, CUPSD_LOG_ERROR, "pam_authenticate() returned %d (%s)", pamerr, pam_strerror(pamh, pamerr));
              pam_end(pamh, 0);
              return;
            }
@@ -763,47 +626,19 @@ cupsdAuthorize(cupsd_client_t *con)       /* I - Client connection */
 #  ifdef HAVE_PAM_SETCRED
             pamerr = pam_setcred(pamh, PAM_ESTABLISH_CRED | PAM_SILENT);
            if (pamerr != PAM_SUCCESS)
-             cupsdLogMessage(CUPSD_LOG_WARN,
-                             "[Client %d] pam_setcred() returned %d (%s)",
-                             con->http.fd, pamerr,
-                             pam_strerror(pamh, pamerr));
+             cupsdLogClient(con, CUPSD_LOG_WARN, "pam_setcred() returned %d (%s)", pamerr, pam_strerror(pamh, pamerr));
 #  endif /* HAVE_PAM_SETCRED */
 
            pamerr = pam_acct_mgmt(pamh, PAM_SILENT);
            if (pamerr != PAM_SUCCESS)
            {
-             cupsdLogMessage(CUPSD_LOG_ERROR,
-                             "[Client %d] pam_acct_mgmt() returned %d (%s)",
-                             con->http.fd, pamerr, pam_strerror(pamh, pamerr));
+             cupsdLogClient(con, CUPSD_LOG_ERROR, "pam_acct_mgmt() returned %d (%s)", pamerr, pam_strerror(pamh, pamerr));
              pam_end(pamh, 0);
              return;
            }
 
            pam_end(pamh, PAM_SUCCESS);
 
-#elif defined(HAVE_USERSEC_H)
-          /*
-           * Use AIX authentication interface...
-           */
-
-           char        *authmsg;       /* Authentication message */
-           int         reenter;        /* ??? */
-
-
-           cupsdLogMessage(CUPSD_LOG_DEBUG,
-                           "[Client %d] AIX authenticate of username \"%s\"",
-                           con->http.fd, username);
-
-           reenter = 1;
-           if (authenticate(username, password, &reenter, &authmsg) != 0)
-           {
-             cupsdLogMessage(CUPSD_LOG_DEBUG,
-                             "[Client %d] Unable to authenticate username "
-                             "\"%s\": %s", con->http.fd, username,
-                             strerror(errno));
-             return;
-           }
-
 #else
            /*
            * Use normal UNIX password file-based authentication...
@@ -825,9 +660,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
              * No such user...
              */
 
-             cupsdLogMessage(CUPSD_LOG_ERROR,
-                             "[Client %d] Unknown username \"%s\".",
-                             con->http.fd, username);
+             cupsdLogClient(con, CUPSD_LOG_ERROR, "Unknown username \"%s\".", username);
              return;
            }
 
@@ -841,9 +674,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
              * Don't allow blank passwords!
              */
 
-             cupsdLogMessage(CUPSD_LOG_ERROR,
-                             "[Client %d] Username \"%s\" has no shadow "
-                             "password.", con->http.fd, username);
+             cupsdLogClient(con, CUPSD_LOG_ERROR, "Username \"%s\" has no shadow password.", username);
              return;
            }
 
@@ -856,9 +687,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */
              * Don't allow blank passwords!
              */
 
-             cupsdLogMessage(CUPSD_LOG_ERROR,
-                             "[Client %d] Username \"%s\" has no password.",
-                             con->http.fd, username);
+             cupsdLogClient(con, CUPSD_LOG_ERROR, "Username \"%s\" has no password.", username);
              return;
            }
 
@@ -869,10 +698,6 @@ cupsdAuthorize(cupsd_client_t *con)        /* I - Client connection */
 
            pass = cups_crypt(password, pw->pw_passwd);
 
-           cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                           "[Client %d] pw_passwd=\"%s\", crypt=\"%s\"",
-                           con->http.fd, pw->pw_passwd, pass);
-
            if (!pass || strcmp(pw->pw_passwd, pass))
            {
 #  ifdef HAVE_SHADOW_H
@@ -880,143 +705,28 @@ cupsdAuthorize(cupsd_client_t *con)      /* I - Client connection */
              {
                pass = cups_crypt(password, spw->sp_pwdp);
 
-               cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                               "[Client %d] sp_pwdp=\"%s\", crypt=\"%s\"",
-                               con->http.fd, spw->sp_pwdp, pass);
-
                if (pass == NULL || strcmp(spw->sp_pwdp, pass))
                {
-                 cupsdLogMessage(CUPSD_LOG_ERROR,
-                                 "[Client %d] Authentication failed for user "
-                                 "\"%s\".", con->http.fd, username);
+                 cupsdLogClient(con, CUPSD_LOG_ERROR, "Authentication failed for user \"%s\".", username);
                  return;
                }
              }
              else
 #  endif /* HAVE_SHADOW_H */
              {
-               cupsdLogMessage(CUPSD_LOG_ERROR,
-                               "[Client %d] Authentication failed for user "
-                               "\"%s\".", con->http.fd, username);
+               cupsdLogClient(con, CUPSD_LOG_ERROR, "Authentication failed for user \"%s\".", username);
                return;
               }
            }
 #endif /* HAVE_LIBPAM */
           }
 
-         cupsdLogMessage(CUPSD_LOG_DEBUG,
-                         "[Client %d] Authorized as %s using Basic",
-                         con->http.fd, username);
+         cupsdLogClient(con, CUPSD_LOG_DEBUG, "Authorized as \"%s\" using Basic.", username);
           break;
-
-      case CUPSD_AUTH_BASICDIGEST :
-         /*
-         * Do Basic authentication with the Digest password file...
-         */
-
-         if (!get_md5_password(username, NULL, md5))
-         {
-            cupsdLogMessage(CUPSD_LOG_ERROR,
-                           "[Client %d] Unknown MD5 username \"%s\".",
-                           con->http.fd, username);
-            return;
-         }
-
-         httpMD5(username, "CUPS", password, basicmd5);
-
-         if (strcmp(md5, basicmd5))
-         {
-            cupsdLogMessage(CUPSD_LOG_ERROR,
-                           "[Client %d] Authentication failed for \"%s\".",
-                           con->http.fd, username);
-            return;
-         }
-
-         cupsdLogMessage(CUPSD_LOG_DEBUG,
-                         "[Client %d] Authorized as %s using BasicDigest",
-                         con->http.fd, username);
-         break;
     }
 
     con->type = type;
   }
-  else if (!strncmp(authorization, "Digest", 6))
-  {
-   /*
-    * Get the username, password, and nonce from the Digest attributes...
-    */
-
-    if (!httpGetSubField2(&(con->http), HTTP_FIELD_AUTHORIZATION, "username",
-                          username, sizeof(username)) || !username[0])
-    {
-     /*
-      * Username must not be empty...
-      */
-
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "[Client %d] Empty or missing Digest username.",
-                      con->http.fd);
-      return;
-    }
-
-    if (!httpGetSubField2(&(con->http), HTTP_FIELD_AUTHORIZATION, "response",
-                          password, sizeof(password)) || !password[0])
-    {
-     /*
-      * Password must not be empty...
-      */
-
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "[Client %d] Empty or missing Digest password.",
-                      con->http.fd);
-      return;
-    }
-
-    if (!httpGetSubField(&(con->http), HTTP_FIELD_AUTHORIZATION, "nonce",
-                         nonce))
-    {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "[Client %d] No nonce value for Digest authentication.",
-                     con->http.fd);
-      return;
-    }
-
-    if (strcmp(con->http.hostname, nonce))
-    {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "[Client %d] Bad nonce value, expected \"%s\", "
-                     "got \"%s\".", con->http.fd, con->http.hostname, nonce);
-      return;
-    }
-
-   /*
-    * Validate the username and password...
-    */
-
-    if (!get_md5_password(username, NULL, md5))
-    {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "[Client %d] Unknown MD5 username \"%s\".",
-                     con->http.fd, username);
-      return;
-    }
-
-    httpMD5Final(nonce, states[con->http.state], con->uri, md5);
-
-    if (strcmp(md5, password))
-    {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "[Client %d] Authentication failed for \"%s\".",
-                     con->http.fd, username);
-      return;
-    }
-
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                    "[Client %d] Authorized as %s using Digest", con->http.fd,
-                   username);
-
-    con->type = CUPSD_AUTH_DIGEST;
-  }
 #ifdef HAVE_GSSAPI
   else if (!strncmp(authorization, "Negotiate", 9))
   {
@@ -1037,12 +747,9 @@ cupsdAuthorize(cupsd_client_t *con)       /* I - Client connection */
     * to use it...
     */
 
-    if (gss_init_sec_context == NULL)
+    if (&gss_init_sec_context == NULL)
     {
-      cupsdLogMessage(CUPSD_LOG_WARN,
-                      "[Client %d] GSSAPI/Kerberos authentication failed "
-                      "because the Kerberos framework is not present.",
-                      con->http.fd);
+      cupsdLogClient(con, CUPSD_LOG_WARN, "GSSAPI/Kerberos authentication failed because the Kerberos framework is not present.");
       return;
     }
 #  endif /* __APPLE__ */
@@ -1057,9 +764,7 @@ cupsdAuthorize(cupsd_client_t *con)        /* I - Client connection */
 
     if (!*authorization)
     {
-      cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                     "[Client %d] No authentication data specified.",
-                     con->http.fd);
+      cupsdLogClient(con, CUPSD_LOG_DEBUG2, "No authentication data specified.");
       return;
     }
 
@@ -1067,11 +772,11 @@ cupsdAuthorize(cupsd_client_t *con)      /* I - Client connection */
     * Decode the authorization string to get the input token...
     */
 
-    len                = strlen(authorization);
-    input_token.value  = malloc(len);
+    len                = (int)strlen(authorization);
+    input_token.value  = malloc((size_t)len);
     input_token.value  = httpDecode64_2(input_token.value, &len,
                                        authorization);
-    input_token.length = len;
+    input_token.length = (size_t)len;
 
    /*
     * Accept the input token to get the authorization info...
@@ -1096,9 +801,7 @@ cupsdAuthorize(cupsd_client_t *con)        /* I - Client connection */
 
     if (GSS_ERROR(major_status))
     {
-      cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status,
-                        "[Client %d] Error accepting GSSAPI security context",
-                        con->http.fd);
+      cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status, "[Client %d] Error accepting GSSAPI security context.", con->number);
 
       if (context != GSS_C_NO_CONTEXT)
        gss_delete_sec_context(&minor_status, &context, GSS_C_NO_BUFFER);
@@ -1112,8 +815,7 @@ cupsdAuthorize(cupsd_client_t *con)        /* I - Client connection */
     */
 
     if (major_status == GSS_S_CONTINUE_NEEDED)
-      cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status,
-                        "[Client %d] Credentials not complete", con->http.fd);
+      cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status, "[Client %d] Credentials not complete.", con->number);
     else if (major_status == GSS_S_COMPLETE)
     {
       major_status = gss_display_name(&minor_status, client_name,
@@ -1121,8 +823,7 @@ cupsdAuthorize(cupsd_client_t *con)        /* I - Client connection */
 
       if (GSS_ERROR(major_status))
       {
-       cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status,
-                          "[Client %d] Error getting username", con->http.fd);
+       cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status, "[Client %d] Error getting username.", con->number);
        gss_release_name(&minor_status, &client_name);
        gss_delete_sec_context(&minor_status, &context, GSS_C_NO_BUFFER);
        return;
@@ -1130,9 +831,7 @@ cupsdAuthorize(cupsd_client_t *con)        /* I - Client connection */
 
       strlcpy(username, output_token.value, sizeof(username));
 
-      cupsdLogMessage(CUPSD_LOG_DEBUG,
-                     "[Client %d] Authorized as %s using Negotiate",
-                     con->http.fd, username);
+      cupsdLogClient(con, CUPSD_LOG_DEBUG, "Authorized as \"%s\" using Negotiate.", username);
 
       gss_release_name(&minor_status, &client_name);
       gss_release_buffer(&minor_status, &output_token);
@@ -1148,7 +847,7 @@ cupsdAuthorize(cupsd_client_t *con)        /* I - Client connection */
     * to run as the correct user to get Kerberos credentials of its own.
     */
 
-    if (_httpAddrFamily(con->http.hostaddr) == AF_LOCAL)
+    if (httpAddrFamily(con->http->hostaddr) == AF_LOCAL)
     {
       cupsd_ucred_t    peercred;       /* Peer credentials */
       socklen_t                peersize;       /* Size of peer credentials */
@@ -1156,21 +855,17 @@ cupsdAuthorize(cupsd_client_t *con)      /* I - Client connection */
       peersize = sizeof(peercred);
 
 #    ifdef __APPLE__
-      if (getsockopt(con->http.fd, 0, LOCAL_PEERCRED, &peercred, &peersize))
+      if (getsockopt(httpGetFd(con->http), 0, LOCAL_PEERCRED, &peercred, &peersize))
 #    else
-      if (getsockopt(con->http.fd, SOL_SOCKET, SO_PEERCRED, &peercred,
+      if (getsockopt(httpGetFd(con->http), SOL_SOCKET, SO_PEERCRED, &peercred,
                      &peersize))
 #    endif /* __APPLE__ */
       {
-       cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "[Client %d] Unable to get peer credentials - %s",
-                       con->http.fd, strerror(errno));
+       cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to get peer credentials - %s", strerror(errno));
       }
       else
       {
-       cupsdLogMessage(CUPSD_LOG_DEBUG,
-                       "[Client %d] Using credentials for UID %d.",
-                       con->http.fd, CUPSD_UCRED_UID(peercred));
+       cupsdLogClient(con, CUPSD_LOG_DEBUG, "Using credentials for UID %d.", CUPSD_UCRED_UID(peercred));
         con->gss_uid = CUPSD_UCRED_UID(peercred);
       }
     }
@@ -1183,11 +878,9 @@ cupsdAuthorize(cupsd_client_t *con)       /* I - Client connection */
 
 
     if (sscanf(authorization, "%255s", scheme) != 1)
-      strcpy(scheme, "UNKNOWN");
+      strlcpy(scheme, "UNKNOWN", sizeof(scheme));
 
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "[Client %d] Bad authentication data \"%s ...\"",
-                    con->http.fd, scheme);
+    cupsdLogClient(con, CUPSD_LOG_ERROR, "Bad authentication data \"%s ...\".", scheme);
     return;
   }
 
@@ -1210,8 +903,8 @@ cupsdAuthorize(cupsd_client_t *con)        /* I - Client connection */
 int                                    /* O - 1 if allowed, 0 otherwise */
 cupsdCheckAccess(
     unsigned         ip[4],            /* I - Client address */
-    char             *name,            /* I - Client hostname */
-    int              namelen,          /* I - Length of hostname */
+    const char       *name,            /* I - Client hostname */
+    size_t           namelen,          /* I - Length of hostname */
     cupsd_location_t *loc)             /* I - Location to check */
 {
   int  allow;                          /* 1 if allowed, 0 otherwise */
@@ -1269,8 +962,8 @@ cupsdCheckAccess(
 
 int                                    /* O - 1 if mask matches, 0 otherwise */
 cupsdCheckAuth(unsigned     ip[4],     /* I - Client address */
-              char         *name,      /* I - Client hostname */
-              int          name_len,   /* I - Length of hostname */
+              const char   *name,      /* I - Client hostname */
+              size_t       name_len,   /* I - Length of hostname */
               cups_array_t *masks)     /* I - Masks */
 {
   int                  i;              /* Looping var */
@@ -1302,6 +995,8 @@ cupsdCheckAuth(unsigned     ip[4], /* I - Client address */
           netip6[3] = htonl(ip[3]);
 #endif /* AF_INET6 */
 
+         cupsdNetIFUpdate();
+
           if (!strcmp(mask->mask.name.name, "*"))
          {
 #ifdef __APPLE__
@@ -1317,8 +1012,6 @@ cupsdCheckAuth(unsigned     ip[4],        /* I - Client address */
            * Check against all local interfaces...
            */
 
-            cupsdNetIFUpdate();
-
            for (iface = (cupsd_netif_t *)cupsArrayFirst(NetIFList);
                 iface;
                 iface = (cupsd_netif_t *)cupsArrayNext(NetIFList))
@@ -1456,7 +1149,6 @@ cupsdCheckGroup(
 {
   int          i;                      /* Looping var */
   struct group *group;                 /* System group info */
-  char         junk[33];               /* MD5 password (not used) */
 #ifdef HAVE_MBR_UID_TO_UUID
   uuid_t       useruuid,               /* UUID for username */
                groupuuid;              /* UUID for groupname */
@@ -1464,9 +1156,7 @@ cupsdCheckGroup(
 #endif /* HAVE_MBR_UID_TO_UUID */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "cupsdCheckGroup(username=\"%s\", user=%p, groupname=\"%s\")",
-                  username, user, groupname);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckGroup(username=\"%s\", user=%p, groupname=\"%s\")", username, user, groupname);
 
  /*
   * Validate input...
@@ -1543,15 +1233,6 @@ cupsdCheckGroup(
 #endif /* HAVE_MBR_UID_TO_UUID */
 
  /*
-  * Username not found, group not found, or user is not part of the
-  * system group...  Check for a user and group in the MD5 password
-  * file...
-  */
-
-  if (get_md5_password(username, groupname, junk) != NULL)
-    return (1);
-
- /*
   * If we get this far, then the user isn't part of the named group...
   */
 
@@ -1587,6 +1268,7 @@ cupsdCopyLocation(
   if (loc->location)
     temp->location = _cupsStrAlloc(loc->location);
 
+  temp->length     = loc->length;
   temp->limit      = loc->limit;
   temp->order_type = loc->order_type;
   temp->type       = loc->type;
@@ -1672,7 +1354,7 @@ cupsdFindBest(const char   *path, /* I - Resource path */
                        *uriptr;        /* Pointer into URI */
   cupsd_location_t     *loc,           /* Current location */
                        *best;          /* Best match for location so far */
-  int                  bestlen;        /* Length of best match */
+  size_t               bestlen;        /* Length of best match */
   int                  limit;          /* Limit field */
   static const int     limits[] =      /* Map http_status_t to CUPSD_AUTH_LIMIT_xyz */
                {
@@ -1689,6 +1371,8 @@ cupsdFindBest(const char   *path, /* I - Resource path */
                  CUPSD_AUTH_LIMIT_DELETE,
                  CUPSD_AUTH_LIMIT_TRACE,
                  CUPSD_AUTH_LIMIT_ALL,
+                 CUPSD_AUTH_LIMIT_ALL,
+                 CUPSD_AUTH_LIMIT_ALL,
                  CUPSD_AUTH_LIMIT_ALL
                };
 
@@ -1701,6 +1385,12 @@ cupsdFindBest(const char   *path,        /* I - Resource path */
 
   strlcpy(uri, path, sizeof(uri));
 
+  if ((uriptr = strchr(uri, '?')) != NULL)
+    *uriptr = '\0';            /* Drop trailing query string */
+
+  if ((uriptr = uri + strlen(uri) - 1) > uri && *uriptr == '/')
+    *uriptr = '\0';            /* Remove trailing '/' */
+
   if (!strncmp(uri, "/printers/", 10) ||
       !strncmp(uri, "/classes/", 9))
   {
@@ -1714,8 +1404,6 @@ cupsdFindBest(const char   *path, /* I - Resource path */
       *uriptr = '\0';
   }
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: uri = \"%s\"...", uri);
-
  /*
   * Loop through the list of locations to find a match...
   */
@@ -1724,12 +1412,14 @@ cupsdFindBest(const char   *path,       /* I - Resource path */
   best    = NULL;
   bestlen = 0;
 
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: uri=\"%s\", limit=%x...", uri, limit);
+
+
   for (loc = (cupsd_location_t *)cupsArrayFirst(Locations);
        loc;
        loc = (cupsd_location_t *)cupsArrayNext(Locations))
   {
-    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: Location %s Limit %x",
-                    loc->location ? loc->location : "nil", loc->limit);
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: Location %s(%d) Limit %x", loc->location ? loc->location : "(null)", (int)loc->length, loc->limit);
 
     if (!strncmp(uri, "/printers/", 10) || !strncmp(uri, "/classes/", 9))
     {
@@ -1767,8 +1457,7 @@ cupsdFindBest(const char   *path, /* I - Resource path */
   * Return the match, if any...
   */
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: best = %s",
-                  best ? best->location : "NONE");
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: best=%s", best ? best->location : "NONE");
 
   return (best);
 }
@@ -1817,9 +1506,13 @@ cupsdIsAuthorized(cupsd_client_t *con,   /* I - Connection */
   int                  i,              /* Looping vars */
                        auth,           /* Authorization status */
                        type;           /* Type of authentication */
+  http_addr_t          *hostaddr = httpGetAddress(con->http);
+                                       /* Client address */
+  const char           *hostname = httpGetHostname(con->http, NULL, 0);
+                                       /* Client hostname */
   unsigned             address[4];     /* Authorization address */
   cupsd_location_t     *best;          /* Best match for location so far */
-  int                  hostlen;        /* Length of hostname */
+  size_t               hostlen;        /* Length of hostname */
   char                 *name,          /* Current username */
                        username[256],  /* Username to authorize */
                        ownername[256], /* Owner name to authorize */
@@ -1835,19 +1528,13 @@ cupsdIsAuthorized(cupsd_client_t *con,  /* I - Connection */
                {
                  "None",
                  "Basic",
-                 "Digest",
-                 "BasicDigest",
                  "Negotiate"
                };
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "cupsdIsAuthorized: con->uri=\"%s\", con->best=%p(%s)",
-                  con->uri, con->best, con->best ? con->best->location ?
-                                          con->best->location : "(null)" : "");
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: con->uri=\"%s\", con->best=%p(%s)", con->uri, con->best, con->best ? con->best->location ? con->best->location : "(null)" : "");
   if (owner)
-    cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                    "cupsdIsAuthorized: owner=\"%s\"", owner);
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: owner=\"%s\"", owner);
 
  /*
   * If there is no "best" authentication rule for this request, then
@@ -1857,8 +1544,9 @@ cupsdIsAuthorized(cupsd_client_t *con,    /* I - Connection */
 
   if (!con->best)
   {
-    if (!strcmp(con->http.hostname, "localhost") ||
-        !strcmp(con->http.hostname, ServerName))
+    if (httpAddrLocalhost(httpGetAddress(con->http)) ||
+        !strcmp(hostname, ServerName) ||
+       cupsArrayFind(ServerAlias, (void *)hostname))
       return (HTTP_OK);
     else
       return (HTTP_FORBIDDEN);
@@ -1869,35 +1557,30 @@ cupsdIsAuthorized(cupsd_client_t *con,  /* I - Connection */
   if ((type = best->type) == CUPSD_AUTH_DEFAULT)
     type = cupsdDefaultAuthType();
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "cupsdIsAuthorized: level=CUPSD_AUTH_%s, type=%s, "
-                 "satisfy=CUPSD_AUTH_SATISFY_%s, num_names=%d",
-                  levels[best->level], types[type],
-                 best->satisfy ? "ANY" : "ALL", cupsArrayCount(best->names));
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: level=CUPSD_AUTH_%s, type=%s, satisfy=CUPSD_AUTH_SATISFY_%s, num_names=%d", levels[best->level], types[type], best->satisfy ? "ANY" : "ALL", cupsArrayCount(best->names));
 
   if (best->limit == CUPSD_AUTH_LIMIT_IPP)
-    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: op=%x(%s)",
-                    best->op, ippOpString(best->op));
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: op=%x(%s)", best->op, ippOpString(best->op));
 
  /*
   * Check host/ip-based accesses...
   */
 
 #ifdef AF_INET6
-  if (con->http.hostaddr->addr.sa_family == AF_INET6)
+  if (httpAddrFamily(hostaddr) == AF_INET6)
   {
    /*
     * Copy IPv6 address...
     */
 
-    address[0] = ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[0]);
-    address[1] = ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[1]);
-    address[2] = ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[2]);
-    address[3] = ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[3]);
+    address[0] = ntohl(hostaddr->ipv6.sin6_addr.s6_addr32[0]);
+    address[1] = ntohl(hostaddr->ipv6.sin6_addr.s6_addr32[1]);
+    address[2] = ntohl(hostaddr->ipv6.sin6_addr.s6_addr32[2]);
+    address[3] = ntohl(hostaddr->ipv6.sin6_addr.s6_addr32[3]);
   }
   else
 #endif /* AF_INET6 */
-  if (con->http.hostaddr->addr.sa_family == AF_INET)
+  if (con->http->hostaddr->addr.sa_family == AF_INET)
   {
    /*
     * Copy IPv4 address...
@@ -1906,18 +1589,17 @@ cupsdIsAuthorized(cupsd_client_t *con,  /* I - Connection */
     address[0] = 0;
     address[1] = 0;
     address[2] = 0;
-    address[3] = ntohl(con->http.hostaddr->ipv4.sin_addr.s_addr);
+    address[3] = ntohl(hostaddr->ipv4.sin_addr.s_addr);
   }
   else
     memset(address, 0, sizeof(address));
 
-  hostlen = strlen(con->http.hostname);
+  hostlen = strlen(hostname);
 
-  auth = cupsdCheckAccess(address, con->http.hostname, hostlen, best)
+  auth = cupsdCheckAccess(address, hostname, hostlen, best)
              ? CUPSD_AUTH_ALLOW : CUPSD_AUTH_DENY;
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: auth=CUPSD_AUTH_%s...",
-                  auth ? "DENY" : "ALLOW");
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: auth=CUPSD_AUTH_%s...", auth ? "DENY" : "ALLOW");
 
   if (auth == CUPSD_AUTH_DENY && best->satisfy == CUPSD_AUTH_SATISFY_ALL)
     return (HTTP_FORBIDDEN);
@@ -1927,8 +1609,9 @@ cupsdIsAuthorized(cupsd_client_t *con,    /* I - Connection */
   * See if encryption is required...
   */
 
-  if ((best->encryption >= HTTP_ENCRYPT_REQUIRED && !con->http.tls &&
-      _cups_strcasecmp(con->http.hostname, "localhost") &&
+  if ((best->encryption >= HTTP_ENCRYPT_REQUIRED && !con->http->tls &&
+      _cups_strcasecmp(hostname, "localhost") &&
+      !httpAddrLocalhost(hostaddr) &&
       best->satisfy == CUPSD_AUTH_SATISFY_ALL) &&
       !(type == CUPSD_AUTH_NEGOTIATE ||
         (type == CUPSD_AUTH_NONE &&
@@ -1993,9 +1676,9 @@ cupsdIsAuthorized(cupsd_client_t *con,    /* I - Connection */
 #ifdef HAVE_GSSAPI
         (type != CUPSD_AUTH_NEGOTIATE || con->gss_uid <= 0) &&
 #endif /* HAVE_GSSAPI */
-        (con->type != CUPSD_AUTH_BASIC || type != CUPSD_AUTH_BASICDIGEST))
+        con->type != CUPSD_AUTH_BASIC)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR, "Authorized using %s, expected %s!",
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Authorized using %s, expected %s.",
                       types[con->type], types[type]);
 
       return (HTTP_UNAUTHORIZED);
@@ -2056,8 +1739,7 @@ cupsdIsAuthorized(cupsd_client_t *con,    /* I - Connection */
     * allowed...
     */
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                    "cupsdIsAuthorized: Checking user membership...");
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: Checking user membership...");
 
 #ifdef HAVE_AUTHORIZATION_H
    /*
@@ -2110,8 +1792,7 @@ cupsdIsAuthorized(cupsd_client_t *con,    /* I - Connection */
   * Check to see if this user is in any of the named groups...
   */
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "cupsdIsAuthorized: Checking group membership...");
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: Checking group membership...");
 
  /*
   * Check to see if this user is in any of the named groups...
@@ -2121,9 +1802,7 @@ cupsdIsAuthorized(cupsd_client_t *con,    /* I - Connection */
        name;
        name = (char *)cupsArrayNext(best->names))
   {
-    cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                    "cupsdIsAuthorized: Checking group \"%s\" membership...",
-                    name);
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: Checking group \"%s\" membership...", name);
 
     if (!_cups_strcasecmp(name, "@SYSTEM"))
     {
@@ -2139,8 +1818,7 @@ cupsdIsAuthorized(cupsd_client_t *con,    /* I - Connection */
   * The user isn't part of the specified group, so deny access...
   */
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG,
-                  "cupsdIsAuthorized: User not in group(s)!");
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdIsAuthorized: User not in group(s).");
 
   return (con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED);
 }
@@ -2230,9 +1908,7 @@ check_authref(cupsd_client_t *con,        /* I - Connection */
     return (0);
   }
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "AuthorizationCopyRights(\"%s\") succeeded!",
-                 authright.name);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "AuthorizationCopyRights(\"%s\") succeeded.", authright.name);
 
   return (1);
 }
@@ -2290,7 +1966,7 @@ copy_authmask(cupsd_authmask_t *mask,     /* I - Existing auth mask */
 }
 
 
-#if !HAVE_LIBPAM && !defined(HAVE_USERSEC_H)
+#if !HAVE_LIBPAM
 /*
  * 'cups_crypt()' - Encrypt the password using the DES or MD5 algorithms,
  *                  as needed.
@@ -2379,23 +2055,23 @@ cups_crypt(const char *pw,              /* I - Password string */
     * Copy the final sum to the result string and return...
     */
 
-    memcpy(result, salt, salt_end - salt);
+    memcpy(result, salt, (size_t)(salt_end - salt));
     ptr = result + (salt_end - salt);
     *ptr++ = '$';
 
     for (i = 0; i < 5; i ++, ptr += 4)
     {
-      n = (((digest[i] << 8) | digest[i + 6]) << 8);
+      n = ((((unsigned)digest[i] << 8) | (unsigned)digest[i + 6]) << 8);
 
       if (i < 4)
-        n |= digest[i + 12];
+        n |= (unsigned)digest[i + 12];
       else
-        n |= digest[5];
+        n |= (unsigned)digest[5];
 
       to64(ptr, n, 4);
     }
 
-    to64(ptr, digest[11], 2);
+    to64(ptr, (unsigned)digest[11], 2);
     ptr += 2;
     *ptr = '\0';
 
@@ -2410,7 +2086,7 @@ cups_crypt(const char *pw,                /* I - Password string */
     return (crypt(pw, salt));
   }
 }
-#endif /* !HAVE_LIBPAM && !HAVE_USERSEC_H */
+#endif /* !HAVE_LIBPAM */
 
 
 /*
@@ -2430,68 +2106,6 @@ free_authmask(cupsd_authmask_t *mask,    /* I - Auth mask to free */
 }
 
 
-/*
- * 'get_md5_password()' - Get an MD5 password.
- */
-
-static char *                          /* O - MD5 password string */
-get_md5_password(const char *username, /* I - Username */
-                 const char *group,    /* I - Group */
-                 char       passwd[33])        /* O - MD5 password string */
-{
-  cups_file_t  *fp;                    /* passwd.md5 file */
-  char         filename[1024],         /* passwd.md5 filename */
-               line[256],              /* Line from file */
-               tempuser[33],           /* User from file */
-               tempgroup[33];          /* Group from file */
-
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "get_md5_password(username=\"%s\", group=\"%s\", passwd=%p)",
-                  username, group ? group : "(null)", passwd);
-
-  snprintf(filename, sizeof(filename), "%s/passwd.md5", ServerRoot);
-  if ((fp = cupsFileOpen(filename, "r")) == NULL)
-  {
-    if (errno != ENOENT)
-      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open %s - %s", filename,
-                      strerror(errno));
-
-    return (NULL);
-  }
-
-  while (cupsFileGets(fp, line, sizeof(line)) != NULL)
-  {
-    if (sscanf(line, "%32[^:]:%32[^:]:%32s", tempuser, tempgroup, passwd) != 3)
-    {
-      cupsdLogMessage(CUPSD_LOG_ERROR, "Bad MD5 password line: %s", line);
-      continue;
-    }
-
-    if (!strcmp(username, tempuser) &&
-        (group == NULL || !strcmp(group, tempgroup)))
-    {
-     /*
-      * Found the password entry!
-      */
-
-      cupsdLogMessage(CUPSD_LOG_DEBUG2, "Found MD5 user %s, group %s...",
-                      username, tempgroup);
-
-      cupsFileClose(fp);
-      return (passwd);
-    }
-  }
-
- /*
-  * Didn't find a password entry - return NULL!
-  */
-
-  cupsFileClose(fp);
-  return (NULL);
-}
-
-
 #if HAVE_LIBPAM
 /*
  * 'pam_func()' - PAM conversation function.
@@ -2514,7 +2128,7 @@ pam_func(
   * Allocate memory for the responses...
   */
 
-  if ((replies = malloc(sizeof(struct pam_response) * num_msg)) == NULL)
+  if ((replies = malloc(sizeof(struct pam_response) * (size_t)num_msg)) == NULL)
     return (PAM_CONV_ERR);
 
  /*
@@ -2523,17 +2137,7 @@ pam_func(
 
   DEBUG_printf(("pam_func: appdata_ptr = %p\n", appdata_ptr));
 
-#ifdef __hpux
- /*
-  * Apparently some versions of HP-UX 11 have a broken pam_unix security
-  * module.  This is a workaround...
-  */
-
-  data = auth_data;
-  (void)appdata_ptr;
-#else
   data = (cupsd_authdata_t *)appdata_ptr;
-#endif /* __hpux */
 
   for (i = 0; i < num_msg; i ++)
   {
@@ -2583,7 +2187,7 @@ pam_func(
 
   return (PAM_SUCCESS);
 }
-#elif !defined(HAVE_USERSEC_H)
+#else
 
 
 /*
@@ -2607,5 +2211,5 @@ to64(char          *s,                    /* O - Output string */
 
 
 /*
- * End of "$Id: auth.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: auth.c 12945 2015-10-26 19:46:02Z msweet $".
  */
index 8979023..c42c0a2 100644 (file)
@@ -1,16 +1,16 @@
 /*
- * "$Id: auth.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: auth.h 11776 2014-03-28 19:16:05Z msweet $"
  *
- *   Authorization definitions for the CUPS scheduler.
+ * Authorization definitions for the CUPS scheduler.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
 #define CUPSD_AUTH_DEFAULT     -1      /* Use DefaultAuthType */
 #define CUPSD_AUTH_NONE                0       /* No authentication */
 #define CUPSD_AUTH_BASIC       1       /* Basic authentication */
-#define CUPSD_AUTH_DIGEST      2       /* Digest authentication */
-#define CUPSD_AUTH_BASICDIGEST 3       /* Basic authentication w/passwd.md5 */
-#define CUPSD_AUTH_NEGOTIATE   4       /* Kerberos authentication */
-#define CUPSD_AUTH_AUTO                5       /* Kerberos or Basic, depending on configuration of server */
+#define CUPSD_AUTH_NEGOTIATE   2       /* Kerberos authentication */
+#define CUPSD_AUTH_AUTO                3       /* Kerberos or Basic, depending on configuration of server */
 
 #define CUPSD_AUTH_ANON                0       /* Anonymous access */
 #define CUPSD_AUTH_USER                1       /* Must have a valid username/password */
@@ -74,7 +72,7 @@ typedef struct
 
 typedef struct
 {
-  int          length;                 /* Length of name */
+  size_t       length;                 /* Length of name */
   char         *name;                  /* Name string */
 } cupsd_namemask_t;
 
@@ -91,9 +89,9 @@ typedef struct
 typedef struct
 {
   char                 *location;      /* Location of resource */
+  size_t               length;         /* Length of location string */
   ipp_op_t             op;             /* IPP operation */
   int                  limit,          /* Limit for these types of requests */
-                       length,         /* Length of location string */
                        order_type,     /* Allow or Deny */
                        type,           /* Type of authentication */
                        level,          /* Access level required */
@@ -130,10 +128,8 @@ extern void                cupsdAddLocation(cupsd_location_t *loc);
 extern void            cupsdAddName(cupsd_location_t *loc, char *name);
 extern int             cupsdAddNameMask(cups_array_t **masks, char *name);
 extern void            cupsdAuthorize(cupsd_client_t *con);
-extern int             cupsdCheckAccess(unsigned ip[4], char *name,
-                                        int namelen, cupsd_location_t *loc);
-extern int             cupsdCheckAuth(unsigned ip[4], char *name, int namelen,
-                                      cups_array_t *masks);
+extern int             cupsdCheckAccess(unsigned ip[4], const char *name, size_t namelen, cupsd_location_t *loc);
+extern int             cupsdCheckAuth(unsigned ip[4], const char *name, size_t namelen, cups_array_t *masks);
 extern int             cupsdCheckGroup(const char *username,
                                        struct passwd *user,
                                        const char *groupname);
@@ -147,5 +143,5 @@ extern cupsd_location_t     *cupsdNewLocation(const char *location);
 
 
 /*
- * End of "$Id: auth.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: auth.h 11776 2014-03-28 19:16:05Z msweet $".
  */
index 87a1a68..631a891 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: banners.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: banners.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Banner routines for the CUPS scheduler.
  *
@@ -220,5 +220,5 @@ free_banners(void)
 
 
 /*
- * End of "$Id: banners.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: banners.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 4a91e8a..19ab6f7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: banners.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: banners.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Banner definitions for the CUPS scheduler.
  *
@@ -41,5 +41,5 @@ extern void           cupsdLoadBanners(const char *d);
 
 
 /*
- * End of "$Id: banners.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: banners.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index cd47228..6d93426 100644 (file)
@@ -1,25 +1,16 @@
 /*
- * "$Id: cert.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cert.c 12972 2015-11-13 20:30:37Z msweet $"
  *
- *   Authentication certificate routines for the CUPS scheduler.
+ * Authentication certificate routines for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdAddCert()        - Add a certificate.
- *   cupsdDeleteCert()     - Delete a single certificate.
- *   cupsdDeleteAllCerts() - Delete all certificates...
- *   cupsdFindCert()       - Find a certificate.
- *   cupsdInitCerts()      - Initialize the certificate "system" and root
- *                           certificate.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
 
 
 /*
+ * Local functions...
+ */
+
+static int     ctcompare(const char *a, const char *b);
+
+
+/*
  * 'cupsdAddCert()' - Add a certificate.
  */
 
@@ -52,8 +50,7 @@ cupsdAddCert(int        pid,          /* I - Process ID */
                                        /* Hex constants... */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "cupsdAddCert: Adding certificate for PID %d", pid);
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdAddCert: Adding certificate for PID %d", pid);
 
  /*
   * Allocate memory for the certificate...
@@ -111,8 +108,7 @@ cupsdAddCert(int        pid,                /* I - Process ID */
     fchmod(fd, 0440);
     fchown(fd, RunUser, SystemGroupIDs[0]);
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddCert: NumSystemGroups=%d",
-                    NumSystemGroups);
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddCert: NumSystemGroups=%d", NumSystemGroups);
 
 #ifdef HAVE_ACL_INIT
     if (NumSystemGroups > 1)
@@ -288,8 +284,7 @@ cupsdDeleteCert(int pid)            /* I - Process ID */
       * Remove this certificate from the list...
       */
 
-      cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                      "cupsdDeleteCert: Removing certificate for PID %d", pid);
+      cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDeleteCert: Removing certificate for PID %d.", pid);
 
       DEBUG_printf(("DELETE pid=%d, username=%s, cert=%s\n", cert->pid,
                     cert->username, cert->certificate));
@@ -363,17 +358,15 @@ cupsdFindCert(const char *certificate)    /* I - Certificate */
   cupsd_cert_t *cert;                  /* Current certificate */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert(certificate=%s)",
-                  certificate);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert(certificate=%s)", certificate);
   for (cert = Certs; cert != NULL; cert = cert->next)
-    if (!_cups_strcasecmp(certificate, cert->certificate))
+    if (!ctcompare(certificate, cert->certificate))
     {
-      cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Returning %s...",
-                      cert->username);
+      cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Returning \"%s\".", cert->username);
       return (cert);
     }
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Certificate not found!");
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Certificate not found.");
 
   return (NULL);
 }
@@ -417,10 +410,10 @@ cupsdInitCerts(void)
     * them as the seed...
     */
 
-    seed = cupsFileGetChar(fp);
-    seed = (seed << 8) | cupsFileGetChar(fp);
-    seed = (seed << 8) | cupsFileGetChar(fp);
-    CUPS_SRAND((seed << 8) | cupsFileGetChar(fp));
+    seed = (unsigned)cupsFileGetChar(fp);
+    seed = (seed << 8) | (unsigned)cupsFileGetChar(fp);
+    seed = (seed << 8) | (unsigned)cupsFileGetChar(fp);
+    CUPS_SRAND((seed << 8) | (unsigned)cupsFileGetChar(fp));
 
     cupsFileClose(fp);
   }
@@ -436,5 +429,27 @@ cupsdInitCerts(void)
 
 
 /*
- * End of "$Id: cert.c 11173 2013-07-23 12:31:34Z msweet $".
+ * 'ctcompare()' - Compare two strings in constant time.
+ */
+
+static int                             /* O - 0 on match, non-zero on non-match */
+ctcompare(const char *a,               /* I - First string */
+          const char *b)               /* I - Second string */
+{
+  int  result = 0;                     /* Result */
+
+
+  while (*a && *b)
+  {
+    result |= *a ^ *b;
+    a ++;
+    b ++;
+  }
+
+  return (result);
+}
+
+
+/*
+ * End of "$Id: cert.c 12972 2015-11-13 20:30:37Z msweet $".
  */
index 26eaa9f..063c5de 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cert.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cert.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Authentication certificate definitions for the CUPS scheduler.
  *
@@ -49,5 +49,5 @@ extern void           cupsdInitCerts(void);
 
 
 /*
- * End of "$Id: cert.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cert.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index 1aed92c..17add06 100644 (file)
@@ -1,27 +1,16 @@
 /*
- * "$Id: classes.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: classes.c 11781 2014-03-28 20:57:22Z msweet $"
  *
- *   Printer class routines for the CUPS scheduler.
+ * Printer class routines for the CUPS scheduler.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdAddClass()                 - Add a class to the system.
- *   cupsdAddPrinterToClass()        - Add a printer to a class...
- *   cupsdDeletePrinterFromClass()   - Delete a printer from a class.
- *   cupsdDeletePrinterFromClasses() - Delete a printer from all classes.
- *   cupsdFindAvailablePrinter()     - Find an available printer in a class.
- *   cupsdFindClass()                - Find the named class.
- *   cupsdLoadAllClasses()           - Load classes from the classes.conf file.
- *   cupsdSaveAllClasses()           - Save classes to the classes.conf file.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -93,7 +82,7 @@ cupsdAddPrinterToClass(
   if (c->num_printers == 0)
     temp = malloc(sizeof(cupsd_printer_t *));
   else
-    temp = realloc(c->printers, sizeof(cupsd_printer_t *) * (c->num_printers + 1));
+    temp = realloc(c->printers, sizeof(cupsd_printer_t *) * (size_t)(c->num_printers + 1));
 
   if (temp == NULL)
   {
@@ -147,7 +136,7 @@ cupsdDeletePrinterFromClass(
     c->num_printers --;
     if (i < c->num_printers)
       memmove(c->printers + i, c->printers + i + 1,
-              (c->num_printers - i) * sizeof(cupsd_printer_t *));
+              (size_t)(c->num_printers - i) * sizeof(cupsd_printer_t *));
   }
   else
     return (0);
@@ -343,7 +332,7 @@ cupsdLoadAllClasses(void)
         cupsdLogMessage(CUPSD_LOG_ERROR,
                        "Syntax error on line %d of classes.conf.", linenum);
     }
-    else if (!_cups_strcasecmp(line, "</Class>"))
+    else if (!_cups_strcasecmp(line, "</Class>") || !_cups_strcasecmp(line, "</DefaultClass>"))
     {
       if (p != NULL)
       {
@@ -806,7 +795,10 @@ cupsdSaveAllClasses(void)
       cupsFilePutConf(fp, "Option", value);
     }
 
-    cupsFilePuts(fp, "</Class>\n");
+    if (pclass == DefaultPrinter)
+      cupsFilePuts(fp, "</DefaultClass>\n");
+    else
+      cupsFilePuts(fp, "</Class>\n");
   }
 
   cupsdCloseCreatedConfFile(fp, filename);
@@ -814,5 +806,5 @@ cupsdSaveAllClasses(void)
 
 
 /*
- * End of "$Id: classes.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: classes.c 11781 2014-03-28 20:57:22Z msweet $".
  */
index 6d94de2..bc0196e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: classes.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: classes.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Printer class definitions for the CUPS scheduler.
  *
@@ -31,5 +31,5 @@ extern void           cupsdSaveAllClasses(void);
 
 
 /*
- * End of "$Id: classes.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: classes.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index b341e9d..3ec3b5c 100644 (file)
@@ -1,90 +1,38 @@
 /*
- * "$Id: client.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: client.c 12978 2015-11-17 19:29:52Z msweet $"
  *
- *   Client routines for the CUPS scheduler.
+ * Client routines for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   This file contains Kerberos support code, copyright 2006 by
- *   Jelmer Vernooij.
+ * This file contains Kerberos support code, copyright 2006 by
+ * Jelmer Vernooij.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdAcceptClient()    - Accept a new client.
- *   cupsdCloseAllClients() - Close all remote clients immediately.
- *   cupsdCloseClient()     - Close a remote client.
- *   cupsdFlushHeader()     - Flush the header fields to the client.
- *   cupsdReadClient()     - Read data from a client.
- *   cupsdSendCommand()     - Send output from a command via HTTP.
- *   cupsdSendError()      - Send an error message via HTTP.
- *   cupsdSendHeader()     - Send an HTTP request.
- *   cupsdUpdateCGI()      - Read status messages from CGI scripts and
- *                           programs.
- *   cupsdWriteClient()     - Write data to a client as needed.
- *   check_if_modified()    - Decode an "If-Modified-Since" line.
- *   compare_clients()     - Compare two client connections.
- *   data_ready()          - Check whether data is available from a client.
- *   get_file()            - Get a filename and state info.
- *   install_cupsd_conf()    - Install a configuration file.
- *   is_cgi()              - Is the resource a CGI script/program?
- *   is_path_absolute()     - Is a path absolute and free of relative elements
- *                           (i.e. "..").
- *   pipe_command()        - Pipe the output of a command to the remote
- *                           client.
- *   valid_host()          - Is the Host: field valid?
- *   write_file()          - Send a file via HTTP.
- *   write_pipe()          - Flag that data is available on the CGI pipe.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
  * Include necessary headers...
  */
 
+#define _CUPS_NO_DEPRECATED
+#define _HTTP_NO_PRIVATE
 #include "cupsd.h"
 
+#ifdef __APPLE__
+#  include <libproc.h>
+#endif /* __APPLE__ */
 #ifdef HAVE_TCPD_H
 #  include <tcpd.h>
 #endif /* HAVE_TCPD_H */
 
 
 /*
- * Local globals...
- */
-
-static const char      * const http_states[] =
-                       {               /* HTTP state strings */
-                         "HTTP_WAITING",
-                         "HTTP_OPTIONS",
-                         "HTTP_GET",
-                         "HTTP_GET_SEND",
-                         "HTTP_HEAD",
-                         "HTTP_POST",
-                         "HTTP_POST_RECV",
-                         "HTTP_POST_SEND",
-                         "HTTP_PUT",
-                         "HTTP_PUT_RECV",
-                         "HTTP_DELETE",
-                         "HTTP_TRACE",
-                         "HTTP_CLOSE",
-                         "HTTP_STATUS"
-                       };
-static const char      * const ipp_states[] =
-                       {               /* IPP state strings */
-                         "IPP_IDLE",
-                         "IPP_HEADER",
-                         "IPP_ATTRIBUTE",
-                         "IPP_DATA"
-                       };
-
-
-/*
  * Local functions...
  */
 
@@ -92,9 +40,11 @@ static int           check_if_modified(cupsd_client_t *con,
                                          struct stat *filestats);
 static int             compare_clients(cupsd_client_t *a, cupsd_client_t *b,
                                        void *data);
-static int             data_ready(cupsd_client_t *con);
+#ifdef HAVE_SSL
+static int             cupsd_start_tls(cupsd_client_t *con, http_encryption_t e);
+#endif /* HAVE_SSL */
 static char            *get_file(cupsd_client_t *con, struct stat *filestats,
-                                 char *filename, int len);
+                                 char *filename, size_t len);
 static http_status_t   install_cupsd_conf(cupsd_client_t *con);
 static int             is_cgi(cupsd_client_t *con, const char *filename,
                               struct stat *filestats, mime_type_t *type);
@@ -115,14 +65,12 @@ static void                write_pipe(cupsd_client_t *con);
 void
 cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
 {
+  const char           *hostname;      /* Hostname of client */
+  char                 name[256];      /* Hostname of client */
   int                  count;          /* Count of connections on a host */
-  int                  val;            /* Parameter value */
   cupsd_client_t       *con,           /* New client pointer */
                        *tempcon;       /* Temporary client pointer */
-  http_addrlist_t      *addrlist,      /* List of adddresses for host */
-                       *addr;          /* Current address */
   socklen_t            addrlen;        /* Length of address */
-  char                 *hostname;      /* Hostname for address */
   http_addr_t          temp;           /* Temporary address variable */
   static time_t                last_dos = 0;   /* Time of last DoS attack */
 #ifdef HAVE_TCPD_H
@@ -130,9 +78,7 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
 #endif /* HAVE_TCPD_H */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "cupsdAcceptClient(lis=%p(%d)) Clients=%d",
-                  lis, lis->fd, cupsArrayCount(Clients));
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAcceptClient(lis=%p(%d)) Clients=%d", lis, lis->fd, cupsArrayCount(Clients));
 
  /*
   * Make sure we don't have a full set of clients already...
@@ -174,19 +120,14 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
     return;
   }
 
-  con->file            = -1;
-  con->http.activity   = time(NULL);
-  con->http.hostaddr   = &(con->clientaddr);
-  con->http.wait_value = 10000;
-
  /*
   * Accept the client and get the remote address...
   */
 
-  addrlen = sizeof(http_addr_t);
+  con->number = ++ LastClientNumber;
+  con->file   = -1;
 
-  if ((con->http.fd = accept(lis->fd, (struct sockaddr *)con->http.hostaddr,
-                             &addrlen)) < 0)
+  if ((con->http = httpAcceptConnection(lis->fd, 0)) == NULL)
   {
     if (errno == ENFILE || errno == EMFILE)
       cupsdPauseListening();
@@ -199,23 +140,10 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
   }
 
  /*
-  * Save the connected port number...
-  */
-
-  _httpAddrSetPort(con->http.hostaddr, _httpAddrPort(&(lis->address)));
-
-#ifdef AF_INET6
- /*
-  * Convert IPv4 over IPv6 addresses (::ffff:n.n.n.n) to IPv4 forms we
-  * can more easily use...
+  * Save the connected address and port number...
   */
 
-  if (lis->address.addr.sa_family == AF_INET6 &&
-      con->http.hostaddr->ipv6.sin6_addr.s6_addr32[0] == 0 &&
-      con->http.hostaddr->ipv6.sin6_addr.s6_addr32[1] == 0 &&
-      ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[2]) == 0xffff)
-    con->http.hostaddr->ipv6.sin6_addr.s6_addr32[2] = 0;
-#endif /* AF_INET6 */
+  con->clientaddr = lis->address;
 
  /*
   * Check the number of clients on the same address...
@@ -224,7 +152,7 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
   for (count = 0, tempcon = (cupsd_client_t *)cupsArrayFirst(Clients);
        tempcon;
        tempcon = (cupsd_client_t *)cupsArrayNext(Clients))
-    if (httpAddrEqual(tempcon->http.hostaddr, con->http.hostaddr))
+    if (httpAddrEqual(httpGetAddress(tempcon->http), httpGetAddress(con->http)))
     {
       count ++;
       if (count >= MaxClientsPerHost)
@@ -238,18 +166,12 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
       last_dos = time(NULL);
       cupsdLogMessage(CUPSD_LOG_WARN,
                       "Possible DoS attack - more than %d clients connecting "
-                     "from %s!",
+                     "from %s.",
                      MaxClientsPerHost,
-                     httpAddrString(con->http.hostaddr, con->http.hostname,
-                                    sizeof(con->http.hostname)));
+                     httpGetHostname(con->http, name, sizeof(name)));
     }
 
-#ifdef WIN32
-    closesocket(con->http.fd);
-#else
-    close(con->http.fd);
-#endif /* WIN32 */
-
+    httpClose(con->http);
     free(con);
     return;
   }
@@ -258,31 +180,10 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
   * Get the hostname or format the IP address as needed...
   */
 
-  if (httpAddrLocalhost(con->http.hostaddr))
-  {
-   /*
-    * Map accesses from the loopback interface to "localhost"...
-    */
-
-    strlcpy(con->http.hostname, "localhost", sizeof(con->http.hostname));
-    hostname = con->http.hostname;
-  }
+  if (HostNameLookups)
+    hostname = httpResolveHostname(con->http, NULL, 0);
   else
-  {
-   /*
-    * Map accesses from the same host to the server name.
-    */
-
-    if (HostNameLookups)
-      hostname = httpAddrLookup(con->http.hostaddr, con->http.hostname,
-                                sizeof(con->http.hostname));
-    else
-    {
-      hostname = NULL;
-      httpAddrString(con->http.hostaddr, con->http.hostname,
-                     sizeof(con->http.hostname));
-    }
-  }
+    hostname = httpGetHostname(con->http, NULL, 0);
 
   if (hostname == NULL && HostNameLookups == 2)
   {
@@ -290,15 +191,11 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
     * Can't have an unresolved IP address with double-lookups enabled...
     */
 
-#ifdef WIN32
-    closesocket(con->http.fd);
-#else
-    close(con->http.fd);
-#endif /* WIN32 */
+    httpClose(con->http);
 
-    cupsdLogMessage(CUPSD_LOG_WARN,
+    cupsdLogClient(con, CUPSD_LOG_WARN,
                     "Name lookup failed - connection from %s closed!",
-                    con->http.hostname);
+                    httpGetHostname(con->http, NULL, 0));
 
     free(con);
     return;
@@ -310,15 +207,17 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
     * Do double lookups as needed...
     */
 
-    if ((addrlist = httpAddrGetList(con->http.hostname, AF_UNSPEC, NULL))
-            != NULL)
+    http_addrlist_t    *addrlist,      /* List of addresses */
+                       *addr;          /* Current address */
+
+    if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, NULL)) != NULL)
     {
      /*
       * See if the hostname maps to the same IP address...
       */
 
       for (addr = addrlist; addr; addr = addr->next)
-        if (httpAddrEqual(con->http.hostaddr, &(addr->addr)))
+        if (httpAddrEqual(httpGetAddress(con->http), &(addr->addr)))
           break;
     }
     else
@@ -333,15 +232,11 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
       * with double-lookups enabled...
       */
 
-#ifdef WIN32
-      closesocket(con->http.fd);
-#else
-      close(con->http.fd);
-#endif /* WIN32 */
+      httpClose(con->http);
 
-      cupsdLogMessage(CUPSD_LOG_WARN,
+      cupsdLogClient(con, CUPSD_LOG_WARN,
                       "IP lookup failed - connection from %s closed!",
-                      con->http.hostname);
+                      httpGetHostname(con->http, NULL, 0));
       free(con);
       return;
     }
@@ -352,53 +247,73 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
   * See if the connection is denied by TCP wrappers...
   */
 
-  request_init(&wrap_req, RQ_DAEMON, "cupsd", RQ_FILE, con->http.fd, NULL);
+  request_init(&wrap_req, RQ_DAEMON, "cupsd", RQ_FILE, httpGetFd(con->http),
+               NULL);
   fromhost(&wrap_req);
 
   if (!hosts_access(&wrap_req))
   {
-#ifdef WIN32
-    closesocket(con->http.fd);
-#else
-    close(con->http.fd);
-#endif /* WIN32 */
+    httpClose(con->http);
 
-    cupsdLogMessage(CUPSD_LOG_WARN,
+    cupsdLogClient(con, CUPSD_LOG_WARN,
                     "Connection from %s refused by /etc/hosts.allow and "
-                   "/etc/hosts.deny rules.", con->http.hostname);
+                   "/etc/hosts.deny rules.", httpGetHostname(con->http, NULL, 0));
     free(con);
     return;
   }
 #endif /* HAVE_TCPD_H */
 
 #ifdef AF_LOCAL
-  if (con->http.hostaddr->addr.sa_family == AF_LOCAL)
-    cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Accepted from %s (Domain)",
-                    con->http.fd, con->http.hostname);
+  if (httpAddrFamily(httpGetAddress(con->http)) == AF_LOCAL)
+  {
+#  ifdef __APPLE__
+    socklen_t  peersize;               /* Size of peer credentials */
+    pid_t      peerpid;                /* Peer process ID */
+    char       peername[256];          /* Name of process */
+
+    peersize = sizeof(peerpid);
+    if (!getsockopt(httpGetFd(con->http), SOL_LOCAL, LOCAL_PEERPID, &peerpid,
+                    &peersize))
+    {
+      if (!proc_name((int)peerpid, peername, sizeof(peername)))
+       cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                      "Accepted from %s (Domain ???[%d])",
+                       httpGetHostname(con->http, NULL, 0), (int)peerpid);
+      else
+       cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                       "Accepted from %s (Domain %s[%d])",
+                       httpGetHostname(con->http, NULL, 0), peername, (int)peerpid);
+    }
+    else
+#  endif /* __APPLE__ */
+
+    cupsdLogClient(con, CUPSD_LOG_DEBUG, "Accepted from %s (Domain)",
+                   httpGetHostname(con->http, NULL, 0));
+  }
   else
 #endif /* AF_LOCAL */
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Accepted from %s:%d (IPv%d)",
-                  con->http.fd, con->http.hostname,
-                 _httpAddrPort(con->http.hostaddr),
-                 _httpAddrFamily(con->http.hostaddr) == AF_INET ? 4 : 6);
+  cupsdLogClient(con, CUPSD_LOG_DEBUG, "Accepted from %s:%d (IPv%d)",
+                 httpGetHostname(con->http, NULL, 0),
+                httpAddrPort(httpGetAddress(con->http)),
+                httpAddrFamily(httpGetAddress(con->http)) == AF_INET ? 4 : 6);
 
  /*
   * Get the local address the client connected to...
   */
 
   addrlen = sizeof(temp);
-  if (getsockname(con->http.fd, (struct sockaddr *)&temp, &addrlen))
+  if (getsockname(httpGetFd(con->http), (struct sockaddr *)&temp, &addrlen))
   {
-    cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to get local address - %s",
-                    strerror(errno));
+    cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to get local address - %s",
+                   strerror(errno));
 
-    strcpy(con->servername, "localhost");
+    strlcpy(con->servername, "localhost", sizeof(con->servername));
     con->serverport = LocalPort;
   }
 #ifdef AF_LOCAL
-  else if (_httpAddrFamily(&temp) == AF_LOCAL)
+  else if (httpAddrFamily(&temp) == AF_LOCAL)
   {
-    strcpy(con->servername, "localhost");
+    strlcpy(con->servername, "localhost", sizeof(con->servername));
     con->serverport = LocalPort;
   }
 #endif /* AF_LOCAL */
@@ -411,7 +326,7 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
     else
       httpAddrString(&temp, con->servername, sizeof(con->servername));
 
-    con->serverport = _httpAddrPort(&(lis->address));
+    con->serverport = httpAddrPort(&(lis->address));
   }
 
  /*
@@ -421,25 +336,13 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
   cupsArrayAdd(Clients, con);
 
  /*
-  * 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(con->http.fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
-
- /*
-  * Close this file on all execs...
-  */
-
-  fcntl(con->http.fd, F_SETFD, fcntl(con->http.fd, F_GETFD) | FD_CLOEXEC);
-
- /*
   * Add the socket to the server select.
   */
 
-  cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, NULL, con);
+  cupsdAddSelect(httpGetFd(con->http), (cupsd_selfunc_t)cupsdReadClient, NULL,
+                 con);
+
+  cupsdLogClient(con, CUPSD_LOG_DEBUG, "Waiting for request.");
 
  /*
   * Temporarily suspend accept()'s until we lose a client...
@@ -453,15 +356,13 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */
   * See if we are connecting on a secure port...
   */
 
-  if (lis->encryption == HTTP_ENCRYPT_ALWAYS)
+  if (lis->encryption == HTTP_ENCRYPTION_ALWAYS)
   {
    /*
     * https connection; go secure...
     */
 
-    con->http.encryption = HTTP_ENCRYPT_ALWAYS;
-
-    if (!cupsdStartTLS(con))
+    if (cupsd_start_tls(con, HTTP_ENCRYPTION_ALWAYS))
       cupsdCloseClient(con);
   }
   else
@@ -480,8 +381,7 @@ cupsdCloseAllClients(void)
   cupsd_client_t       *con;           /* Current client */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCloseAllClients() Clients=%d",
-                  cupsArrayCount(Clients));
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCloseAllClients() Clients=%d", cupsArrayCount(Clients));
 
   for (con = (cupsd_client_t *)cupsArrayFirst(Clients);
        con;
@@ -499,36 +399,18 @@ int                                       /* O - 1 if partial close, 0 if fully closed */
 cupsdCloseClient(cupsd_client_t *con)  /* I - Client to close */
 {
   int          partial;                /* Do partial close for SSL? */
-#ifdef HAVE_LIBSSL
-#elif defined(HAVE_GNUTLS)
-#  elif defined(HAVE_CDSASSL)
-#endif /* HAVE_LIBSSL */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Closing connection.",
-                  con->http.fd);
+  cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing connection.");
 
  /*
   * Flush pending writes before closing...
   */
 
-  httpFlushWrite(HTTP(con));
+  httpFlushWrite(con->http);
 
   partial = 0;
 
-#ifdef HAVE_SSL
- /*
-  * Shutdown encryption as needed...
-  */
-
-  if (con->http.tls)
-  {
-    partial = 1;
-
-    cupsdEndTLS(con);
-  }
-#endif /* HAVE_SSL */
-
   if (con->pipe_pid != 0)
   {
    /*
@@ -551,19 +433,31 @@ cupsdCloseClient(cupsd_client_t *con)     /* I - Client to close */
   * Close the socket and clear the file from the input set for select()...
   */
 
-  if (con->http.fd >= 0)
+  if (httpGetFd(con->http) >= 0)
   {
     cupsArrayRemove(ActiveClients, con);
     cupsdSetBusyState();
 
+#ifdef HAVE_SSL
+   /*
+    * Shutdown encryption as needed...
+    */
+
+    if (httpIsEncrypted(con->http))
+      partial = 1;
+#endif /* HAVE_SSL */
+
     if (partial)
     {
      /*
       * Only do a partial close so that the encrypted client gets everything.
       */
 
-      shutdown(con->http.fd, 0);
-      cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, NULL, con);
+      httpShutdown(con->http);
+      cupsdAddSelect(httpGetFd(con->http), (cupsd_selfunc_t)cupsdReadClient,
+                     NULL, con);
+
+      cupsdLogClient(con, CUPSD_LOG_DEBUG, "Waiting for socket close.");
     }
     else
     {
@@ -571,9 +465,9 @@ cupsdCloseClient(cupsd_client_t *con)       /* I - Client to close */
       * Shut the socket down fully...
       */
 
-      cupsdRemoveSelect(con->http.fd);
-      close(con->http.fd);
-      con->http.fd = -1;
+      cupsdRemoveSelect(httpGetFd(con->http));
+      httpClose(con->http);
+      con->http = NULL;
     }
   }
 
@@ -583,13 +477,16 @@ cupsdCloseClient(cupsd_client_t *con)     /* I - Client to close */
     * Free memory...
     */
 
-    if (con->http.input_set)
-      free(con->http.input_set);
+    cupsdRemoveSelect(httpGetFd(con->http));
+
+    httpClose(con->http);
 
-    httpClearCookie(HTTP(con));
-    httpClearFields(HTTP(con));
+    if (con->filename)
+    {
+      unlink(con->filename);
+      cupsdClearString(&con->filename);
+    }
 
-    cupsdClearString(&con->filename);
     cupsdClearString(&con->command);
     cupsdClearString(&con->options);
     cupsdClearString(&con->query_string);
@@ -642,21 +539,6 @@ cupsdCloseClient(cupsd_client_t *con)      /* I - Client to close */
 
 
 /*
- * 'cupsdFlushHeader()' - Flush the header fields to the client.
- */
-
-int                                    /* I - Bytes written or -1 on error */
-cupsdFlushHeader(cupsd_client_t *con)  /* I - Client to flush to */
-{
-  int bytes = httpFlushWrite(HTTP(con));
-
-  con->http.data_encoding = HTTP_ENCODE_LENGTH;
-
-  return (bytes);
-}
-
-
-/*
  * 'cupsdReadClient()' - Read data from a client.
  */
 
@@ -664,11 +546,8 @@ void
 cupsdReadClient(cupsd_client_t *con)   /* I - Client to read from */
 {
   char                 line[32768],    /* Line from client... */
-                       operation[64],  /* Operation code from socket */
-                       version[64],    /* HTTP version number string */
                        locale[64],     /* Locale */
                        *ptr;           /* Pointer into strings */
-  int                  major, minor;   /* HTTP version numbers */
   http_status_t                status;         /* Transfer status */
   ipp_state_t          ipp_state;      /* State of IPP transfer */
   int                  bytes;          /* Number of bytes to POST */
@@ -680,25 +559,34 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
   static unsigned      request_id = 0; /* Request ID for temp files */
 
 
-  status = HTTP_CONTINUE;
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                 "[Client %d] cupsdReadClient "
-                 "error=%d, "
-                 "used=%d, "
-                 "state=%s, "
-                 "data_encoding=HTTP_ENCODE_%s, "
-                 "data_remaining=" CUPS_LLFMT ", "
-                 "request=%p(%s), "
-                 "file=%d",
-                 con->http.fd, con->http.error, con->http.used,
-                 http_states[con->http.state],
-                 con->http.data_encoding == HTTP_ENCODE_CHUNKED ?
-                     "CHUNKED" : "LENGTH",
-                 CUPS_LLCAST con->http.data_remaining,
-                 con->request,
-                 con->request ? ipp_states[con->request->state] : "",
-                 con->file);
+  status = HTTP_STATUS_CONTINUE;
+
+  cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cupsdReadClient: error=%d, used=%d, state=%s, data_encoding=HTTP_ENCODING_%s, data_remaining=" CUPS_LLFMT ", request=%p(%s), file=%d", httpError(con->http), (int)httpGetReady(con->http), httpStateString(httpGetState(con->http)), httpIsChunked(con->http) ? "CHUNKED" : "LENGTH", CUPS_LLCAST httpGetRemaining(con->http), con->request, con->request ? ippStateString(ippGetState(con->request)) : "", con->file);
+
+  if (httpGetState(con->http) == HTTP_STATE_GET_SEND ||
+      httpGetState(con->http) == HTTP_STATE_POST_SEND ||
+      httpGetState(con->http) == HTTP_STATE_STATUS)
+  {
+   /*
+    * If we get called in the wrong state, then something went wrong with the
+    * connection and we need to shut it down...
+    */
+
+    if (!httpGetReady(con->http) && recv(httpGetFd(con->http), buf, 1, MSG_PEEK) < 1)
+    {
+     /*
+      * Connection closed...
+      */
+
+      cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing on EOF.");
+      cupsdCloseClient(con);
+      return;
+    }
+
+    cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing on unexpected HTTP read state %s.", httpStateString(httpGetState(con->http)));
+    cupsdCloseClient(con);
+    return;
+  }
 
 #ifdef HAVE_SSL
   if (con->auto_ssl)
@@ -709,18 +597,16 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
 
     con->auto_ssl = 0;
 
-    if (recv(con->http.fd, buf, 1, MSG_PEEK) == 1 &&
+    if (recv(httpGetFd(con->http), buf, 1, MSG_PEEK) == 1 &&
         (!buf[0] || !strchr("DGHOPT", buf[0])))
     {
      /*
       * Encrypt this connection...
       */
 
-      cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                      "[Client %d] Saw first byte %02X, auto-negotiating "
-                     "SSL/TLS session.", con->http.fd, buf[0] & 255);
+      cupsdLogClient(con, CUPSD_LOG_DEBUG2, "Saw first byte %02X, auto-negotiating SSL/TLS session.", buf[0] & 255);
 
-      if (!cupsdStartTLS(con))
+      if (cupsd_start_tls(con, HTTP_ENCRYPTION_ALWAYS))
         cupsdCloseClient(con);
 
       return;
@@ -728,24 +614,26 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
   }
 #endif /* HAVE_SSL */
 
-  switch (con->http.state)
+  switch (httpGetState(con->http))
   {
-    case HTTP_WAITING :
+    case HTTP_STATE_WAITING :
        /*
         * See if we've received a request line...
        */
 
-        if (httpGets(line, sizeof(line) - 1, HTTP(con)) == NULL)
+        con->operation = httpReadRequest(con->http, con->uri, sizeof(con->uri));
+        if (con->operation == HTTP_STATE_ERROR ||
+           con->operation == HTTP_STATE_UNKNOWN_METHOD ||
+           con->operation == HTTP_STATE_UNKNOWN_VERSION)
        {
-         if (con->http.error && con->http.error != EPIPE)
-           cupsdLogMessage(CUPSD_LOG_DEBUG,
-                           "[Client %d] HTTP_WAITING Closing for error %d "
-                           "(%s)", con->http.fd, con->http.error,
-                           strerror(con->http.error));
+         if (httpError(con->http))
+           cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                          "HTTP_STATE_WAITING Closing for error %d (%s)",
+                          httpError(con->http), strerror(httpError(con->http)));
          else
-           cupsdLogMessage(CUPSD_LOG_DEBUG,
-                           "[Client %d] HTTP_WAITING Closing on EOF",
-                           con->http.fd);
+           cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                          "HTTP_STATE_WAITING Closing on error: %s",
+                          cupsLastErrorString());
 
          cupsdCloseClient(con);
          return;
@@ -755,29 +643,19 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
         * Ignore blank request lines...
        */
 
-        if (line[0] == '\0')
+        if (con->operation == HTTP_STATE_WAITING)
          break;
 
        /*
         * Clear other state variables...
        */
 
-        httpClearFields(HTTP(con));
-
-        con->http.activity        = time(NULL);
-        con->http.version         = HTTP_1_0;
-       con->http.keep_alive      = HTTP_KEEPALIVE_OFF;
-       con->http.data_encoding   = HTTP_ENCODE_LENGTH;
-       con->http.data_remaining  = 0;
-       con->http._data_remaining = 0;
-       con->operation            = HTTP_WAITING;
-       con->bytes                = 0;
-       con->file                 = -1;
-       con->file_ready           = 0;
-       con->pipe_pid             = 0;
-       con->username[0]          = '\0';
-       con->password[0]          = '\0';
-       con->uri[0]               = '\0';
+       con->bytes       = 0;
+       con->file        = -1;
+       con->file_ready  = 0;
+       con->pipe_pid    = 0;
+       con->username[0] = '\0';
+       con->password[0] = '\0';
 
        cupsdClearString(&con->command);
        cupsdClearString(&con->options);
@@ -807,62 +685,6 @@ cupsdReadClient(cupsd_client_t *con)       /* I - Client to read from */
 #endif /* HAVE_GSSAPI */
 
        /*
-        * Grab the request line...
-       */
-
-        switch (sscanf(line, "%63s%1023s%63s", operation, con->uri, version))
-       {
-         case 1 :
-             if (line[0])
-             {
-               cupsdLogMessage(CUPSD_LOG_ERROR,
-                               "[Client %d] Bad request line \"%s\" from %s.",
-                               con->http.fd,
-                               _httpEncodeURI(buf, line, sizeof(buf)),
-                               con->http.hostname);
-               cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
-               cupsdCloseClient(con);
-              }
-             return;
-         case 2 :
-             con->http.version = HTTP_0_9;
-             break;
-         case 3 :
-             if (sscanf(version, "HTTP/%d.%d", &major, &minor) != 2)
-             {
-               cupsdLogMessage(CUPSD_LOG_ERROR,
-                               "[Client %d] Bad request line \"%s\" from %s.",
-                               con->http.fd,
-                               _httpEncodeURI(buf, line, sizeof(buf)),
-                               con->http.hostname);
-               cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
-               cupsdCloseClient(con);
-               return;
-             }
-
-             if (major < 2)
-             {
-               con->http.version = (http_version_t)(major * 100 + minor);
-               if (con->http.version == HTTP_1_1 && KeepAlive)
-                 con->http.keep_alive = HTTP_KEEPALIVE_ON;
-               else
-                 con->http.keep_alive = HTTP_KEEPALIVE_OFF;
-             }
-             else
-             {
-               cupsdLogMessage(CUPSD_LOG_ERROR,
-                               "[Client %d] Unsupported request line \"%s\" "
-                               "from %s.", con->http.fd,
-                               _httpEncodeURI(buf, line, sizeof(buf)),
-                               con->http.hostname);
-               cupsdSendError(con, HTTP_NOT_SUPPORTED, CUPSD_AUTH_NONE);
-               cupsdCloseClient(con);
-               return;
-             }
-             break;
-       }
-
-       /*
         * Handle full URLs in the request line...
        */
 
@@ -874,18 +696,24 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
                resource[HTTP_MAX_URI]; /* Resource path */
           int  port;                   /* Port number */
 
-
          /*
          * Separate the URI into its components...
          */
 
-          httpSeparateURI(HTTP_URI_CODING_MOST, con->uri,
-                         scheme, sizeof(scheme),
-                         userpass, sizeof(userpass),
-                         hostname, sizeof(hostname), &port,
-                         resource, sizeof(resource));
+          if (httpSeparateURI(HTTP_URI_CODING_MOST, con->uri,
+                             scheme, sizeof(scheme),
+                             userpass, sizeof(userpass),
+                             hostname, sizeof(hostname), &port,
+                             resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
+          {
+           cupsdLogClient(con, CUPSD_LOG_ERROR, "Bad URI \"%s\" in request.",
+                           con->uri);
+           cupsdSendError(con, HTTP_STATUS_METHOD_NOT_ALLOWED, CUPSD_AUTH_NONE);
+           cupsdCloseClient(con);
+           return;
+         }
 
-         /*
+        /*
          * Only allow URIs with the servername, localhost, or an IP
          * address...
          */
@@ -893,16 +721,16 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
          if (strcmp(scheme, "file") &&
              _cups_strcasecmp(hostname, ServerName) &&
              _cups_strcasecmp(hostname, "localhost") &&
+             !cupsArrayFind(ServerAlias, hostname) &&
              !isdigit(hostname[0]) && hostname[0] != '[')
          {
           /*
            * Nope, we don't do proxies...
            */
 
-           cupsdLogMessage(CUPSD_LOG_ERROR,
-                           "[Client %d] Bad URI \"%s\" in request.",
-                           con->http.fd, con->uri);
-           cupsdSendError(con, HTTP_METHOD_NOT_ALLOWED, CUPSD_AUTH_NONE);
+           cupsdLogClient(con, CUPSD_LOG_ERROR, "Bad URI \"%s\" in request.",
+                           con->uri);
+           cupsdSendError(con, HTTP_STATUS_METHOD_NOT_ALLOWED, CUPSD_AUTH_NONE);
            cupsdCloseClient(con);
            return;
          }
@@ -912,45 +740,19 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
          * con->uri are HTTP_MAX_URI bytes in size...
          */
 
-          strcpy(con->uri, resource);
+          strlcpy(con->uri, resource, sizeof(con->uri));
        }
 
        /*
         * Process the request...
        */
 
-        if (!strcmp(operation, "GET"))
-         con->http.state = HTTP_GET;
-        else if (!strcmp(operation, "PUT"))
-         con->http.state = HTTP_PUT;
-        else if (!strcmp(operation, "POST"))
-         con->http.state = HTTP_POST;
-        else if (!strcmp(operation, "DELETE"))
-         con->http.state = HTTP_DELETE;
-        else if (!strcmp(operation, "TRACE"))
-         con->http.state = HTTP_TRACE;
-        else if (!strcmp(operation, "OPTIONS"))
-         con->http.state = HTTP_OPTIONS;
-        else if (!strcmp(operation, "HEAD"))
-         con->http.state = HTTP_HEAD;
-       else
-       {
-         cupsdLogMessage(CUPSD_LOG_ERROR,
-                         "[Client %d] Bad operation \"%s\".", con->http.fd,
-                         operation);
-         cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
-         cupsdCloseClient(con);
-         return;
-       }
-
         gettimeofday(&(con->start), NULL);
-        con->operation = con->http.state;
 
-        cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] %s %s HTTP/%d.%d",
-                       con->http.fd, operation, con->uri,
-                       con->http.version / 100, con->http.version % 100);
-
-       con->http.status = HTTP_OK;
+        cupsdLogClient(con, CUPSD_LOG_DEBUG, "%s %s HTTP/%d.%d",
+                      httpStateString(con->operation) + 11, con->uri,
+                      httpGetVersion(con->http) / 100,
+                       httpGetVersion(con->http) % 100);
 
         if (!cupsArrayFind(ActiveClients, con))
        {
@@ -958,49 +760,45 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
           cupsdSetBusyState();
         }
 
-    case HTTP_OPTIONS :
-    case HTTP_DELETE :
-    case HTTP_GET :
-    case HTTP_HEAD :
-    case HTTP_POST :
-    case HTTP_PUT :
-    case HTTP_TRACE :
+    case HTTP_STATE_OPTIONS :
+    case HTTP_STATE_DELETE :
+    case HTTP_STATE_GET :
+    case HTTP_STATE_HEAD :
+    case HTTP_STATE_POST :
+    case HTTP_STATE_PUT :
+    case HTTP_STATE_TRACE :
        /*
         * Parse incoming parameters until the status changes...
        */
 
-        while ((status = httpUpdate(HTTP(con))) == HTTP_CONTINUE)
-         if (!data_ready(con))
+        while ((status = httpUpdate(con->http)) == HTTP_STATUS_CONTINUE)
+         if (!httpGetReady(con->http))
            break;
 
-       if (status != HTTP_OK && status != HTTP_CONTINUE)
+       if (status != HTTP_STATUS_OK && status != HTTP_STATUS_CONTINUE)
        {
-         if (con->http.error && con->http.error != EPIPE)
-           cupsdLogMessage(CUPSD_LOG_DEBUG,
-                           "[Client %d] Closing for error %d (%s) while "
-                           "reading headers.",
-                           con->http.fd, con->http.error,
-                           strerror(con->http.error));
+         if (httpError(con->http) && httpError(con->http) != EPIPE)
+           cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                           "Closing for error %d (%s) while reading headers.",
+                           httpError(con->http), strerror(httpError(con->http)));
          else
-           cupsdLogMessage(CUPSD_LOG_DEBUG,
-                           "[Client %d] Closing on EOF while reading headers.",
-                           con->http.fd);
+           cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                          "Closing on EOF while reading headers.");
 
-         cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
+         cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE);
          cupsdCloseClient(con);
          return;
        }
        break;
 
     default :
-        if (!data_ready(con) && recv(con->http.fd, buf, 1, MSG_PEEK) < 1)
+        if (!httpGetReady(con->http) && recv(httpGetFd(con->http), buf, 1, MSG_PEEK) < 1)
        {
         /*
          * Connection closed...
          */
 
-         cupsdLogMessage(CUPSD_LOG_DEBUG,
-                         "[Client %d] Closing on EOF", con->http.fd);
+         cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing on EOF.");
           cupsdCloseClient(con);
          return;
        }
@@ -1011,24 +809,26 @@ cupsdReadClient(cupsd_client_t *con)     /* I - Client to read from */
   * Handle new transfers...
   */
 
-  if (status == HTTP_OK)
+  cupsdLogClient(con, CUPSD_LOG_DEBUG, "Read: status=%d", status);
+
+  if (status == HTTP_STATUS_OK)
   {
-    if (con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE][0])
+    if (httpGetField(con->http, HTTP_FIELD_ACCEPT_LANGUAGE)[0])
     {
      /*
       * Figure out the locale from the Accept-Language and Content-Type
       * fields...
       */
 
-      if ((ptr = strchr(con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE],
+      if ((ptr = strchr(httpGetField(con->http, HTTP_FIELD_ACCEPT_LANGUAGE),
                         ',')) != NULL)
         *ptr = '\0';
 
-      if ((ptr = strchr(con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE],
+      if ((ptr = strchr(httpGetField(con->http, HTTP_FIELD_ACCEPT_LANGUAGE),
                         ';')) != NULL)
         *ptr = '\0';
 
-      if ((ptr = strstr(con->http.fields[HTTP_FIELD_CONTENT_TYPE],
+      if ((ptr = strstr(httpGetField(con->http, HTTP_FIELD_CONTENT_TYPE),
                         "charset=")) != NULL)
       {
        /*
@@ -1037,14 +837,14 @@ cupsdReadClient(cupsd_client_t *con)     /* I - Client to read from */
        */
 
         snprintf(locale, sizeof(locale), "%s.%s",
-                con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE], ptr + 8);
+                httpGetField(con->http, HTTP_FIELD_ACCEPT_LANGUAGE), ptr + 8);
 
        if ((ptr = strchr(locale, ',')) != NULL)
          *ptr = '\0';
       }
       else
         snprintf(locale, sizeof(locale), "%s.UTF-8",
-                con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE]);
+                httpGetField(con->http, HTTP_FIELD_ACCEPT_LANGUAGE));
 
       con->language = cupsLangGet(locale);
     }
@@ -1053,25 +853,23 @@ cupsdReadClient(cupsd_client_t *con)     /* I - Client to read from */
 
     cupsdAuthorize(con);
 
-    if (!_cups_strncasecmp(con->http.fields[HTTP_FIELD_CONNECTION],
+    if (!_cups_strncasecmp(httpGetField(con->http, HTTP_FIELD_CONNECTION),
                            "Keep-Alive", 10) && KeepAlive)
-      con->http.keep_alive = HTTP_KEEPALIVE_ON;
-    else if (!_cups_strncasecmp(con->http.fields[HTTP_FIELD_CONNECTION],
+      httpSetKeepAlive(con->http, HTTP_KEEPALIVE_ON);
+    else if (!_cups_strncasecmp(httpGetField(con->http, HTTP_FIELD_CONNECTION),
                                 "close", 5))
-      con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+      httpSetKeepAlive(con->http, HTTP_KEEPALIVE_OFF);
 
-    if (!con->http.fields[HTTP_FIELD_HOST][0] &&
-        con->http.version >= HTTP_1_1)
+    if (!httpGetField(con->http, HTTP_FIELD_HOST)[0] &&
+        httpGetVersion(con->http) >= HTTP_VERSION_1_1)
     {
      /*
       * HTTP/1.1 and higher require the "Host:" field...
       */
 
-      if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE))
+      if (!cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE))
       {
-        cupsdLogMessage(CUPSD_LOG_ERROR,
-                        "[Client %d] Missing Host: field in request.",
-                        con->http.fd);
+        cupsdLogClient(con, CUPSD_LOG_ERROR, "Missing Host: field in request.");
        cupsdCloseClient(con);
        return;
       }
@@ -1083,18 +881,17 @@ cupsdReadClient(cupsd_client_t *con)     /* I - Client to read from */
       * or IPv6 values in the Host: field.
       */
 
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "[Client %d] Request from \"%s\" using invalid Host: "
-                      "field \"%s\"", con->http.fd, con->http.hostname,
-                      con->http.fields[HTTP_FIELD_HOST]);
+      cupsdLogClient(con, CUPSD_LOG_ERROR,
+                     "Request from \"%s\" using invalid Host: field \"%s\".",
+                     httpGetHostname(con->http, NULL, 0), httpGetField(con->http, HTTP_FIELD_HOST));
 
-      if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE))
+      if (!cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE))
       {
        cupsdCloseClient(con);
        return;
       }
     }
-    else if (con->operation == HTTP_OPTIONS)
+    else if (con->operation == HTTP_STATE_OPTIONS)
     {
      /*
       * Do OPTIONS command...
@@ -1102,45 +899,37 @@ cupsdReadClient(cupsd_client_t *con)     /* I - Client to read from */
 
       if (con->best && con->best->type != CUPSD_AUTH_NONE)
       {
-       if (!cupsdSendHeader(con, HTTP_UNAUTHORIZED, NULL, CUPSD_AUTH_NONE))
+        httpClearFields(con->http);
+
+       if (!cupsdSendHeader(con, HTTP_STATUS_UNAUTHORIZED, NULL, CUPSD_AUTH_NONE))
        {
          cupsdCloseClient(con);
          return;
        }
       }
 
-      if (!_cups_strcasecmp(con->http.fields[HTTP_FIELD_CONNECTION], "Upgrade") &&
-         con->http.tls == NULL)
+      if (!_cups_strcasecmp(httpGetField(con->http, HTTP_FIELD_CONNECTION), "Upgrade") && strstr(httpGetField(con->http, HTTP_FIELD_UPGRADE), "TLS/") != NULL && !httpIsEncrypted(con->http))
       {
 #ifdef HAVE_SSL
        /*
         * Do encryption stuff...
        */
 
-       if (!cupsdSendHeader(con, HTTP_SWITCHING_PROTOCOLS, NULL, CUPSD_AUTH_NONE))
-       {
-         cupsdCloseClient(con);
-         return;
-       }
-
-       httpPrintf(HTTP(con), "Connection: Upgrade\r\n");
-       httpPrintf(HTTP(con), "Upgrade: TLS/1.0,HTTP/1.1\r\n");
-       httpPrintf(HTTP(con), "Content-Length: 0\r\n");
-       httpPrintf(HTTP(con), "\r\n");
+        httpClearFields(con->http);
 
-       if (cupsdFlushHeader(con) < 0)
-        {
+       if (!cupsdSendHeader(con, HTTP_STATUS_SWITCHING_PROTOCOLS, NULL, CUPSD_AUTH_NONE))
+       {
          cupsdCloseClient(con);
          return;
        }
 
-        if (!cupsdStartTLS(con))
+        if (cupsd_start_tls(con, HTTP_ENCRYPTION_REQUIRED))
         {
          cupsdCloseClient(con);
          return;
        }
 #else
-       if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE))
+       if (!cupsdSendError(con, HTTP_STATUS_NOT_IMPLEMENTED, CUPSD_AUTH_NONE))
        {
          cupsdCloseClient(con);
          return;
@@ -1148,17 +937,12 @@ cupsdReadClient(cupsd_client_t *con)     /* I - Client to read from */
 #endif /* HAVE_SSL */
       }
 
-      if (!cupsdSendHeader(con, HTTP_OK, NULL, CUPSD_AUTH_NONE))
-      {
-       cupsdCloseClient(con);
-       return;
-      }
-
-      httpPrintf(HTTP(con), "Allow: GET, HEAD, OPTIONS, POST, PUT\r\n");
-      httpPrintf(HTTP(con), "Content-Length: 0\r\n");
-      httpPrintf(HTTP(con), "\r\n");
+      httpClearFields(con->http);
+      httpSetField(con->http, HTTP_FIELD_ALLOW,
+                  "GET, HEAD, OPTIONS, POST, PUT");
+      httpSetField(con->http, HTTP_FIELD_CONTENT_LENGTH, "0");
 
-      if (cupsdFlushHeader(con) < 0)
+      if (!cupsdSendHeader(con, HTTP_STATUS_OK, NULL, CUPSD_AUTH_NONE))
       {
        cupsdCloseClient(con);
        return;
@@ -1170,11 +954,10 @@ cupsdReadClient(cupsd_client_t *con)     /* I - Client to read from */
       * Protect against malicious users!
       */
 
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "[Client %d] Request for non-absolute resource \"%s\".",
-                      con->http.fd, con->uri);
+      cupsdLogClient(con, CUPSD_LOG_ERROR,
+                     "Request for non-absolute resource \"%s\".", con->uri);
 
-      if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE))
+      if (!cupsdSendError(con, HTTP_STATUS_FORBIDDEN, CUPSD_AUTH_NONE))
       {
        cupsdCloseClient(con);
        return;
@@ -1182,39 +965,30 @@ cupsdReadClient(cupsd_client_t *con)     /* I - Client to read from */
     }
     else
     {
-      if (!_cups_strcasecmp(con->http.fields[HTTP_FIELD_CONNECTION],
-                            "Upgrade") && con->http.tls == NULL)
+      if (!_cups_strcasecmp(httpGetField(con->http, HTTP_FIELD_CONNECTION),
+                            "Upgrade") && !httpIsEncrypted(con->http))
       {
 #ifdef HAVE_SSL
        /*
         * Do encryption stuff...
        */
 
-       if (!cupsdSendHeader(con, HTTP_SWITCHING_PROTOCOLS, NULL,
+        httpClearFields(con->http);
+
+       if (!cupsdSendHeader(con, HTTP_STATUS_SWITCHING_PROTOCOLS, NULL,
                             CUPSD_AUTH_NONE))
        {
          cupsdCloseClient(con);
          return;
        }
 
-       httpPrintf(HTTP(con), "Connection: Upgrade\r\n");
-       httpPrintf(HTTP(con), "Upgrade: TLS/1.0,HTTP/1.1\r\n");
-       httpPrintf(HTTP(con), "Content-Length: 0\r\n");
-       httpPrintf(HTTP(con), "\r\n");
-
-       if (cupsdFlushHeader(con) < 0)
-        {
-         cupsdCloseClient(con);
-         return;
-       }
-
-        if (!cupsdStartTLS(con))
+        if (cupsd_start_tls(con, HTTP_ENCRYPTION_REQUIRED))
         {
          cupsdCloseClient(con);
          return;
        }
 #else
-       if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE))
+       if (!cupsdSendError(con, HTTP_STATUS_NOT_IMPLEMENTED, CUPSD_AUTH_NONE))
        {
          cupsdCloseClient(con);
          return;
@@ -1222,23 +996,23 @@ cupsdReadClient(cupsd_client_t *con)     /* I - Client to read from */
 #endif /* HAVE_SSL */
       }
 
-      if ((status = cupsdIsAuthorized(con, NULL)) != HTTP_OK)
+      if ((status = cupsdIsAuthorized(con, NULL)) != HTTP_STATUS_OK)
       {
        cupsdSendError(con, status, CUPSD_AUTH_NONE);
        cupsdCloseClient(con);
        return;
       }
 
-      if (con->http.expect &&
-          (con->operation == HTTP_POST || con->operation == HTTP_PUT))
+      if (httpGetExpect(con->http) &&
+          (con->operation == HTTP_STATE_POST || con->operation == HTTP_STATE_PUT))
       {
-        if (con->http.expect == HTTP_CONTINUE)
+        if (httpGetExpect(con->http) == HTTP_STATUS_CONTINUE)
        {
         /*
          * Send 100-continue header...
          */
 
-         if (!cupsdSendHeader(con, HTTP_CONTINUE, NULL, CUPSD_AUTH_NONE))
+          if (httpWriteResponse(con->http, HTTP_STATUS_CONTINUE))
          {
            cupsdCloseClient(con);
            return;
@@ -1250,29 +1024,23 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
          * Send 417-expectation-failed header...
          */
 
-         if (!cupsdSendHeader(con, HTTP_EXPECTATION_FAILED, NULL,
-                              CUPSD_AUTH_NONE))
-         {
-           cupsdCloseClient(con);
-           return;
-         }
-
-         httpPrintf(HTTP(con), "Content-Length: 0\r\n");
-         httpPrintf(HTTP(con), "\r\n");
+          httpClearFields(con->http);
+         httpSetField(con->http, HTTP_FIELD_CONTENT_LENGTH, "0");
 
-         if (cupsdFlushHeader(con) < 0)
-          {
-           cupsdCloseClient(con);
-           return;
-         }
+         cupsdSendError(con, HTTP_STATUS_EXPECTATION_FAILED, CUPSD_AUTH_NONE);
+          cupsdCloseClient(con);
+          return;
        }
       }
 
-      switch (con->http.state)
+      switch (httpGetState(con->http))
       {
-       case HTTP_GET_SEND :
+       case HTTP_STATE_GET_SEND :
+            cupsdLogClient(con, CUPSD_LOG_DEBUG, "Processing GET %s", con->uri);
+
             if ((!strncmp(con->uri, "/ppd/", 5) ||
-                !strncmp(con->uri, "/printers/", 10)) &&
+                !strncmp(con->uri, "/printers/", 10) ||
+                !strncmp(con->uri, "/classes/", 9)) &&
                !strcmp(con->uri + strlen(con->uri) - 4, ".ppd"))
            {
             /*
@@ -1284,8 +1052,36 @@ cupsdReadClient(cupsd_client_t *con)     /* I - Client to read from */
 
              if (!strncmp(con->uri, "/ppd/", 5))
                p = cupsdFindPrinter(con->uri + 5);
-             else
+             else if (!strncmp(con->uri, "/printers/", 10))
                p = cupsdFindPrinter(con->uri + 10);
+             else
+             {
+               p = cupsdFindClass(con->uri + 9);
+
+               if (p)
+               {
+                 int i;                /* Looping var */
+
+                 for (i = 0; i < p->num_printers; i ++)
+                 {
+                   if (!(p->printers[i]->type & CUPS_PRINTER_CLASS))
+                   {
+                     char ppdname[1024];/* PPD filename */
+
+                     snprintf(ppdname, sizeof(ppdname), "%s/ppd/%s.ppd",
+                              ServerRoot, p->printers[i]->name);
+                     if (!access(ppdname, 0))
+                     {
+                       p = p->printers[i];
+                       break;
+                     }
+                   }
+                 }
+
+                  if (i >= p->num_printers)
+                    p = NULL;
+               }
+             }
 
              if (p)
              {
@@ -1293,7 +1089,7 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
              }
              else
              {
-               if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+               if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
                {
                  cupsdCloseClient(con);
                  return;
@@ -1319,13 +1115,39 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
               else if (!strncmp(con->uri, "/printers/", 10))
                 p = cupsdFindPrinter(con->uri + 10);
               else
-                p = cupsdFindClass(con->uri + 9);
+              {
+               p = cupsdFindClass(con->uri + 9);
+
+               if (p)
+               {
+                 int i;                /* Looping var */
+
+                 for (i = 0; i < p->num_printers; i ++)
+                 {
+                   if (!(p->printers[i]->type & CUPS_PRINTER_CLASS))
+                   {
+                     char ppdname[1024];/* PPD filename */
+
+                     snprintf(ppdname, sizeof(ppdname), "%s/ppd/%s.ppd",
+                              ServerRoot, p->printers[i]->name);
+                     if (!access(ppdname, 0))
+                     {
+                       p = p->printers[i];
+                       break;
+                     }
+                   }
+                 }
+
+                  if (i >= p->num_printers)
+                    p = NULL;
+               }
+             }
 
               if (p)
                snprintf(con->uri, sizeof(con->uri), "/icons/%s.png", p->name);
              else
              {
-               if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+               if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
                {
                  cupsdCloseClient(con);
                  return;
@@ -1340,7 +1162,7 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
              * Web interface is disabled. Show an appropriate message...
              */
 
-             if (!cupsdSendError(con, HTTP_WEBIF_DISABLED, CUPSD_AUTH_NONE))
+             if (!cupsdSendError(con, HTTP_STATUS_CUPS_WEBIF_DISABLED, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
@@ -1411,17 +1233,17 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
 
               if (!cupsdSendCommand(con, con->command, con->options, 0))
              {
-               if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+               if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
                {
                  cupsdCloseClient(con);
                  return;
                }
               }
              else
-               cupsdLogRequest(con, HTTP_OK);
+               cupsdLogRequest(con, HTTP_STATUS_OK);
 
-             if (con->http.version <= HTTP_1_0)
-               con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+             if (httpGetVersion(con->http) <= HTTP_VERSION_1_0)
+               httpSetKeepAlive(con->http, HTTP_KEEPALIVE_OFF);
            }
             else if ((!strncmp(con->uri, "/admin/conf/", 12) &&
                      (strchr(con->uri + 12, '/') ||
@@ -1435,10 +1257,10 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
              * /admin/conf...
              */
 
-             cupsdLogMessage(CUPSD_LOG_ERROR,
+             cupsdLogClient(con, CUPSD_LOG_ERROR,
                              "Request for subdirectory \"%s\"!", con->uri);
 
-             if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE))
+             if (!cupsdSendError(con, HTTP_STATUS_FORBIDDEN, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
@@ -1455,7 +1277,7 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
               if ((filename = get_file(con, &filestats, buf,
                                       sizeof(buf))) == NULL)
              {
-               if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+               if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
                {
                  cupsdCloseClient(con);
                  return;
@@ -1466,6 +1288,8 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
 
              type = mimeFileType(MimeDatabase, filename, NULL, NULL);
 
+              cupsdLogClient(con, CUPSD_LOG_DEBUG, "filename=\"%s\", type=%s/%s", filename, type ? type->super : "", type ? type->type : "");
+
               if (is_cgi(con, filename, &filestats, type))
              {
               /*
@@ -1475,23 +1299,23 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
 
                if (!cupsdSendCommand(con, con->command, con->options, 0))
                {
-                 if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+                 if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
                  {
                    cupsdCloseClient(con);
                    return;
                  }
                }
                else
-                 cupsdLogRequest(con, HTTP_OK);
+                 cupsdLogRequest(con, HTTP_STATUS_OK);
 
-               if (con->http.version <= HTTP_1_0)
-                 con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+               if (httpGetVersion(con->http) <= HTTP_VERSION_1_0)
+                 httpSetKeepAlive(con->http, HTTP_KEEPALIVE_OFF);
                break;
              }
 
              if (!check_if_modified(con, &filestats))
               {
-               if (!cupsdSendError(con, HTTP_NOT_MODIFIED, CUPSD_AUTH_NONE))
+               if (!cupsdSendError(con, HTTP_STATUS_NOT_MODIFIED, CUPSD_AUTH_NONE))
                {
                  cupsdCloseClient(con);
                  return;
@@ -1500,11 +1324,11 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
              else
               {
                if (type == NULL)
-                 strcpy(line, "text/plain");
+                 strlcpy(line, "text/plain", sizeof(line));
                else
                  snprintf(line, sizeof(line), "%s/%s", type->super, type->type);
 
-               if (!write_file(con, HTTP_OK, filename, line, &filestats))
+               if (!write_file(con, HTTP_STATUS_OK, filename, line, &filestats))
                {
                  cupsdCloseClient(con);
                  return;
@@ -1513,21 +1337,21 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
            }
             break;
 
-       case HTTP_POST_RECV :
+       case HTTP_STATE_POST_RECV :
            /*
            * See if the POST request includes a Content-Length field, and if
            * so check the length against any limits that are set...
            */
 
-            if (con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] &&
+            if (httpGetField(con->http, HTTP_FIELD_CONTENT_LENGTH)[0] &&
                MaxRequestSize > 0 &&
-               con->http.data_remaining > MaxRequestSize)
+               httpGetLength2(con->http) > MaxRequestSize)
            {
             /*
              * Request too large...
              */
 
-              if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+              if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
@@ -1535,15 +1359,13 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
 
              break;
             }
-           else if (con->http.data_remaining < 0 ||
-                    (!con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] &&
-                     con->http.data_encoding == HTTP_ENCODE_LENGTH))
+           else if (httpGetLength2(con->http) < 0)
            {
             /*
              * Negative content lengths are invalid!
              */
 
-              if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE))
+              if (!cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
@@ -1557,7 +1379,7 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
            * content-type field will be "application/ipp"...
            */
 
-           if (!strcmp(con->http.fields[HTTP_FIELD_CONTENT_TYPE],
+           if (!strcmp(httpGetField(con->http, HTTP_FIELD_CONTENT_TYPE),
                        "application/ipp"))
               con->request = ippNew();
             else if (!WebInterface)
@@ -1566,7 +1388,7 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
              * Web interface is disabled. Show an appropriate message...
              */
 
-             if (!cupsdSendError(con, HTTP_WEBIF_DISABLED, CUPSD_AUTH_NONE))
+             if (!cupsdSendError(con, HTTP_STATUS_CUPS_WEBIF_DISABLED, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
@@ -1634,8 +1456,8 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
                  cupsdSetString(&con->options, NULL);
              }
 
-             if (con->http.version <= HTTP_1_0)
-               con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+             if (httpGetVersion(con->http) <= HTTP_VERSION_1_0)
+               httpSetKeepAlive(con->http, HTTP_KEEPALIVE_OFF);
            }
            else
            {
@@ -1646,7 +1468,7 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
               if ((filename = get_file(con, &filestats, buf,
                                       sizeof(buf))) == NULL)
              {
-               if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+               if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
                {
                  cupsdCloseClient(con);
                  return;
@@ -1663,7 +1485,7 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
                * Only POST to CGI's...
                */
 
-               if (!cupsdSendError(con, HTTP_UNAUTHORIZED, CUPSD_AUTH_NONE))
+               if (!cupsdSendError(con, HTTP_STATUS_UNAUTHORIZED, CUPSD_AUTH_NONE))
                {
                  cupsdCloseClient(con);
                  return;
@@ -1672,7 +1494,7 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
            }
            break;
 
-       case HTTP_PUT_RECV :
+       case HTTP_STATE_PUT_RECV :
           /*
            * Validate the resource name...
            */
@@ -1683,11 +1505,10 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
              * PUT can only be done to the cupsd.conf file...
              */
 
-             cupsdLogMessage(CUPSD_LOG_ERROR,
-                             "[Client %d] Disallowed PUT request for \"%s\".",
-                             con->http.fd, con->uri);
+             cupsdLogClient(con, CUPSD_LOG_ERROR,
+                            "Disallowed PUT request for \"%s\".", con->uri);
 
-             if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE))
+             if (!cupsdSendError(con, HTTP_STATUS_FORBIDDEN, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
@@ -1701,15 +1522,15 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
            * so check the length against any limits that are set...
            */
 
-            if (con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] &&
+            if (httpGetField(con->http, HTTP_FIELD_CONTENT_LENGTH)[0] &&
                MaxRequestSize > 0 &&
-               con->http.data_remaining > MaxRequestSize)
+               httpGetLength2(con->http) > MaxRequestSize)
            {
             /*
              * Request too large...
              */
 
-              if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+              if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
@@ -1717,13 +1538,13 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
 
              break;
             }
-           else if (con->http.data_remaining < 0)
+           else if (httpGetLength2(con->http) < 0)
            {
             /*
              * Negative content lengths are invalid!
              */
 
-              if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE))
+              if (!cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
@@ -1742,12 +1563,11 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
 
            if (con->file < 0)
            {
-             cupsdLogMessage(CUPSD_LOG_ERROR,
-                             "[Client %d] Unable to create request file "
-                             "\"%s\": %s", con->http.fd, con->filename,
-                             strerror(errno));
+             cupsdLogClient(con, CUPSD_LOG_ERROR,
+                            "Unable to create request file \"%s\": %s",
+                             con->filename, strerror(errno));
 
-             if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+             if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
@@ -1759,13 +1579,13 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
            fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC);
            break;
 
-       case HTTP_DELETE :
-       case HTTP_TRACE :
-            cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE);
+       case HTTP_STATE_DELETE :
+       case HTTP_STATE_TRACE :
+            cupsdSendError(con, HTTP_STATUS_NOT_IMPLEMENTED, CUPSD_AUTH_NONE);
            cupsdCloseClient(con);
            return;
 
-       case HTTP_HEAD :
+       case HTTP_STATE_HEAD :
             if (!strncmp(con->uri, "/printers/", 10) &&
                !strcmp(con->uri + strlen(con->uri) - 4, ".ppd"))
            {
@@ -1780,12 +1600,13 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
                snprintf(con->uri, sizeof(con->uri), "/ppd/%s.ppd", p->name);
              else
              {
-               if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+               if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
                {
                  cupsdCloseClient(con);
                  return;
                }
 
+               cupsdLogRequest(con, HTTP_STATUS_NOT_FOUND);
                break;
              }
            }
@@ -1803,36 +1624,27 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
                snprintf(con->uri, sizeof(con->uri), "/icons/%s.png", p->name);
              else
              {
-               if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+               if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
                {
                  cupsdCloseClient(con);
                  return;
                }
 
+               cupsdLogRequest(con, HTTP_STATUS_NOT_FOUND);
                break;
              }
            }
            else if (!WebInterface)
            {
-              if (!cupsdSendHeader(con, HTTP_OK, line, CUPSD_AUTH_NONE))
-             {
-               cupsdCloseClient(con);
-               return;
-             }
-
-             if (httpPrintf(HTTP(con), "\r\n") < 0)
-             {
-               cupsdCloseClient(con);
-               return;
-             }
+              httpClearFields(con->http);
 
-             if (cupsdFlushHeader(con) < 0)
+              if (!cupsdSendHeader(con, HTTP_STATUS_OK, NULL, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
              }
 
-             con->http.state = HTTP_WAITING;
+              cupsdLogRequest(con, HTTP_STATUS_OK);
              break;
            }
 
@@ -1848,25 +1660,15 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
              * CGI output...
              */
 
-              if (!cupsdSendHeader(con, HTTP_OK, "text/html", CUPSD_AUTH_NONE))
-             {
-               cupsdCloseClient(con);
-               return;
-             }
-
-             if (httpPrintf(HTTP(con), "\r\n") < 0)
-             {
-               cupsdCloseClient(con);
-               return;
-             }
+              httpClearFields(con->http);
 
-             if (cupsdFlushHeader(con) < 0)
+              if (!cupsdSendHeader(con, HTTP_STATUS_OK, "text/html", CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
              }
 
-              cupsdLogRequest(con, HTTP_OK);
+              cupsdLogRequest(con, HTTP_STATUS_OK);
            }
             else if ((!strncmp(con->uri, "/admin/conf/", 12) &&
                      (strchr(con->uri + 12, '/') ||
@@ -1880,39 +1682,41 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
              * /admin/conf...
              */
 
-             cupsdLogMessage(CUPSD_LOG_ERROR,
-                             "[Client %d] Request for subdirectory \"%s\".",
-                             con->http.fd, con->uri);
+             cupsdLogClient(con, CUPSD_LOG_ERROR,
+                            "Request for subdirectory \"%s\".", con->uri);
 
-             if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE))
+             if (!cupsdSendError(con, HTTP_STATUS_FORBIDDEN, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
              }
 
+              cupsdLogRequest(con, HTTP_STATUS_FORBIDDEN);
              break;
            }
            else if ((filename = get_file(con, &filestats, buf,
                                          sizeof(buf))) == NULL)
            {
-             if (!cupsdSendHeader(con, HTTP_NOT_FOUND, "text/html",
+              httpClearFields(con->http);
+
+             if (!cupsdSendHeader(con, HTTP_STATUS_NOT_FOUND, "text/html",
                                   CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
              }
 
-              cupsdLogRequest(con, HTTP_NOT_FOUND);
+              cupsdLogRequest(con, HTTP_STATUS_NOT_FOUND);
            }
            else if (!check_if_modified(con, &filestats))
             {
-              if (!cupsdSendError(con, HTTP_NOT_MODIFIED, CUPSD_AUTH_NONE))
+              if (!cupsdSendError(con, HTTP_STATUS_NOT_MODIFIED, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
              }
 
-              cupsdLogRequest(con, HTTP_NOT_MODIFIED);
+              cupsdLogRequest(con, HTTP_STATUS_NOT_MODIFIED);
            }
            else
            {
@@ -1922,46 +1726,24 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
 
              type = mimeFileType(MimeDatabase, filename, NULL, NULL);
              if (type == NULL)
-               strcpy(line, "text/plain");
+               strlcpy(line, "text/plain", sizeof(line));
              else
                snprintf(line, sizeof(line), "%s/%s", type->super, type->type);
 
-              if (!cupsdSendHeader(con, HTTP_OK, line, CUPSD_AUTH_NONE))
-             {
-               cupsdCloseClient(con);
-               return;
-             }
+              httpClearFields(con->http);
 
-             if (httpPrintf(HTTP(con), "Last-Modified: %s\r\n",
-                            httpGetDateString(filestats.st_mtime)) < 0)
-             {
-               cupsdCloseClient(con);
-               return;
-             }
+             httpSetField(con->http, HTTP_FIELD_LAST_MODIFIED,
+                          httpGetDateString(filestats.st_mtime));
+             httpSetLength(con->http, (size_t)filestats.st_size);
 
-             if (httpPrintf(HTTP(con), "Content-Length: %lu\r\n",
-                            (unsigned long)filestats.st_size) < 0)
+              if (!cupsdSendHeader(con, HTTP_STATUS_OK, line, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
              }
 
-              cupsdLogRequest(con, HTTP_OK);
-           }
-
-            if (httpPrintf(HTTP(con), "\r\n") < 0)
-           {
-             cupsdCloseClient(con);
-             return;
-           }
-
-           if (cupsdFlushHeader(con) < 0)
-            {
-             cupsdCloseClient(con);
-             return;
+              cupsdLogRequest(con, HTTP_STATUS_OK);
            }
-
-            con->http.state = HTTP_WAITING;
             break;
 
        default :
@@ -1974,22 +1756,20 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
   * Handle any incoming data...
   */
 
-  switch (con->http.state)
+  switch (httpGetState(con->http))
   {
-    case HTTP_PUT_RECV :
+    case HTTP_STATE_PUT_RECV :
         do
        {
-          if ((bytes = httpRead2(HTTP(con), line, sizeof(line))) < 0)
+          if ((bytes = httpRead2(con->http, line, sizeof(line))) < 0)
          {
-           if (con->http.error && con->http.error != EPIPE)
-             cupsdLogMessage(CUPSD_LOG_DEBUG,
-                             "[Client %d] HTTP_PUT_RECV Closing for error "
-                             "%d (%s)", con->http.fd, con->http.error,
-                             strerror(con->http.error));
+           if (httpError(con->http) && httpError(con->http) != EPIPE)
+             cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                             "HTTP_STATE_PUT_RECV Closing for error %d (%s)",
+                             httpError(con->http), strerror(httpError(con->http)));
            else
-             cupsdLogMessage(CUPSD_LOG_DEBUG,
-                             "[Client %d] HTTP_PUT_RECV Closing on EOF",
-                             con->http.fd);
+             cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                            "HTTP_STATE_PUT_RECV Closing on EOF.");
 
            cupsdCloseClient(con);
            return;
@@ -1998,29 +1778,47 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
          {
            con->bytes += bytes;
 
-            if (write(con->file, line, bytes) < bytes)
+            if (MaxRequestSize > 0 && con->bytes > MaxRequestSize)
+            {
+             close(con->file);
+             con->file = -1;
+             unlink(con->filename);
+             cupsdClearString(&con->filename);
+
+              if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+             {
+               cupsdCloseClient(con);
+               return;
+             }
+            }
+
+            if (write(con->file, line, (size_t)bytes) < bytes)
            {
-              cupsdLogMessage(CUPSD_LOG_ERROR,
-                             "[Client %d] Unable to write %d bytes to "
-                             "\"%s\": %s", con->http.fd, bytes, con->filename,
-                             strerror(errno));
+              cupsdLogClient(con, CUPSD_LOG_ERROR,
+                            "Unable to write %d bytes to \"%s\": %s", bytes,
+                             con->filename, strerror(errno));
 
              close(con->file);
              con->file = -1;
              unlink(con->filename);
              cupsdClearString(&con->filename);
 
-              if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+              if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
              }
            }
          }
+          else if (httpGetState(con->http) == HTTP_STATE_PUT_RECV)
+          {
+            cupsdCloseClient(con);
+            return;
+          }
         }
-       while (con->http.state == HTTP_PUT_RECV && data_ready(con));
+       while (httpGetState(con->http) == HTTP_STATE_PUT_RECV && httpGetReady(con->http));
 
-        if (con->http.state == HTTP_WAITING)
+        if (httpGetState(con->http) == HTTP_STATE_STATUS)
        {
         /*
          * End of file, see how big it is...
@@ -2041,7 +1839,7 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
            unlink(con->filename);
            cupsdClearString(&con->filename);
 
-            if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+            if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
            {
              cupsdCloseClient(con);
              return;
@@ -2066,7 +1864,7 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
        }
         break;
 
-    case HTTP_POST_RECV :
+    case HTTP_STATE_POST_RECV :
         do
        {
           if (con->request && con->file < 0)
@@ -2075,39 +1873,43 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
            * Grab any request data from the connection...
            */
 
-           if ((ipp_state = ippRead(&(con->http), con->request)) == IPP_ERROR)
+           if (!httpWait(con->http, 0))
+             return;
+
+           if ((ipp_state = ippRead(con->http, con->request)) == IPP_STATE_ERROR)
            {
-              cupsdLogMessage(CUPSD_LOG_ERROR,
-                              "[Client %d] IPP read error: %s", con->http.fd,
-                              cupsLastErrorString());
+              cupsdLogClient(con, CUPSD_LOG_ERROR, "IPP read error: %s",
+                             cupsLastErrorString());
 
-             cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
+             cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE);
              cupsdCloseClient(con);
              return;
            }
-           else if (ipp_state != IPP_DATA)
+           else if (ipp_state != IPP_STATE_DATA)
            {
-              if (con->http.state == HTTP_POST_SEND)
+              if (httpGetState(con->http) == HTTP_STATE_POST_SEND)
              {
-               cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE);
+               cupsdSendError(con, HTTP_STATUS_BAD_REQUEST, CUPSD_AUTH_NONE);
                cupsdCloseClient(con);
                return;
              }
 
+             if (httpGetReady(con->http))
+               continue;
              break;
             }
            else
            {
-             cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] %d.%d %s %d",
-                             con->http.fd, con->request->request.op.version[0],
+             cupsdLogClient(con, CUPSD_LOG_DEBUG, "%d.%d %s %d",
+                             con->request->request.op.version[0],
                              con->request->request.op.version[1],
                              ippOpString(con->request->request.op.operation_id),
                              con->request->request.op.request_id);
-             con->bytes += ippLength(con->request);
+             con->bytes += (off_t)ippLength(con->request);
            }
          }
 
-          if (con->file < 0 && con->http.state != HTTP_POST_SEND)
+          if (con->file < 0 && httpGetState(con->http) != HTTP_STATE_POST_SEND)
          {
            /*
            * Create a file as needed for the request data...
@@ -2119,12 +1921,11 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
 
            if (con->file < 0)
            {
-             cupsdLogMessage(CUPSD_LOG_ERROR,
-                             "[Client %d] Unable to create request file "
-                             "\"%s\": %s", con->http.fd, con->filename,
-                             strerror(errno));
+             cupsdLogClient(con, CUPSD_LOG_ERROR,
+                            "Unable to create request file \"%s\": %s",
+                             con->filename, strerror(errno));
 
-             if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+             if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
@@ -2136,19 +1937,19 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
             fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC);
          }
 
-         if (con->http.state != HTTP_POST_SEND)
+         if (httpGetState(con->http) != HTTP_STATE_POST_SEND)
          {
-            if ((bytes = httpRead2(HTTP(con), line, sizeof(line))) < 0)
+           if (!httpWait(con->http, 0))
+             return;
+            else if ((bytes = httpRead2(con->http, line, sizeof(line))) < 0)
            {
-             if (con->http.error && con->http.error != EPIPE)
-               cupsdLogMessage(CUPSD_LOG_DEBUG,
-                               "[Client %d] HTTP_POST_SEND Closing for "
-                               "error %d (%s)", con->http.fd, con->http.error,
-                               strerror(con->http.error));
+             if (httpError(con->http) && httpError(con->http) != EPIPE)
+               cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                              "HTTP_STATE_POST_SEND Closing for error %d (%s)",
+                               httpError(con->http), strerror(httpError(con->http)));
              else
-               cupsdLogMessage(CUPSD_LOG_DEBUG,
-                               "[Client %d] HTTP_POST_SEND Closing on EOF",
-                               con->http.fd);
+               cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                              "HTTP_STATE_POST_SEND Closing on EOF.");
 
              cupsdCloseClient(con);
              return;
@@ -2157,19 +1958,32 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
            {
              con->bytes += bytes;
 
-              if (write(con->file, line, bytes) < bytes)
+              if (MaxRequestSize > 0 && con->bytes > MaxRequestSize)
+              {
+                close(con->file);
+                con->file = -1;
+                unlink(con->filename);
+                cupsdClearString(&con->filename);
+
+                if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+                {
+                  cupsdCloseClient(con);
+                  return;
+                }
+              }
+
+              if (write(con->file, line, (size_t)bytes) < bytes)
              {
-               cupsdLogMessage(CUPSD_LOG_ERROR,
-                               "[Client %d] Unable to write %d bytes to "
-                               "\"%s\": %s", con->http.fd, bytes,
-                               con->filename, strerror(errno));
+               cupsdLogClient(con, CUPSD_LOG_ERROR,
+                              "Unable to write %d bytes to \"%s\": %s",
+                               bytes, con->filename, strerror(errno));
 
                close(con->file);
                con->file = -1;
                unlink(con->filename);
                cupsdClearString(&con->filename);
 
-               if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE,
+               if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE,
                                    CUPSD_AUTH_NONE))
                {
                  cupsdCloseClient(con);
@@ -2177,21 +1991,21 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
                }
              }
            }
-           else if (con->http.state == HTTP_POST_RECV)
+           else if (httpGetState(con->http) == HTTP_STATE_POST_RECV)
               return;
-           else if (con->http.state != HTTP_POST_SEND)
+           else if (httpGetState(con->http) != HTTP_STATE_POST_SEND)
            {
-             cupsdLogMessage(CUPSD_LOG_DEBUG,
-                             "[Client %d] Closing on unexpected state %s.",
-                             con->http.fd, http_states[con->http.state]);
+             cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                            "Closing on unexpected state %s.",
+                            httpStateString(httpGetState(con->http)));
              cupsdCloseClient(con);
              return;
            }
          }
         }
-       while (con->http.state == HTTP_POST_RECV && data_ready(con));
+       while (httpGetState(con->http) == HTTP_STATE_POST_RECV && httpGetReady(con->http));
 
-       if (con->http.state == HTTP_POST_SEND)
+       if (httpGetState(con->http) == HTTP_STATE_POST_SEND)
        {
          if (con->file >= 0)
          {
@@ -2220,7 +2034,7 @@ cupsdReadClient(cupsd_client_t *con)      /* I - Client to read from */
                con->request = NULL;
               }
 
-              if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
+              if (!cupsdSendError(con, HTTP_STATUS_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE))
              {
                cupsdCloseClient(con);
                return;
@@ -2240,14 +2054,14 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
            {
              if (!cupsdSendCommand(con, con->command, con->options, 0))
              {
-               if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE))
+               if (!cupsdSendError(con, HTTP_STATUS_NOT_FOUND, CUPSD_AUTH_NONE))
                {
                  cupsdCloseClient(con);
                  return;
                }
               }
              else
-               cupsdLogRequest(con, HTTP_OK);
+               cupsdLogRequest(con, HTTP_STATUS_OK);
             }
          }
 
@@ -2270,13 +2084,12 @@ cupsdReadClient(cupsd_client_t *con)    /* I - Client to read from */
         break; /* Anti-compiler-warning-code */
   }
 
-  if (con->http.state == HTTP_WAITING)
+  if (httpGetState(con->http) == HTTP_STATE_WAITING)
   {
-    if (!con->http.keep_alive)
+    if (!httpGetKeepAlive(con->http))
     {
-      cupsdLogMessage(CUPSD_LOG_DEBUG,
-                     "[Client %d] Closing because Keep-Alive disabled",
-                     con->http.fd);
+      cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                     "Closing because Keep-Alive is disabled.");
       cupsdCloseClient(con);
     }
     else
@@ -2308,10 +2121,10 @@ cupsdSendCommand(
 
     if (fd < 0)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "[Client %d] Unable to open \"%s\" for reading: %s",
-                      con->http.fd, con->filename ? con->filename : "/dev/null",
-                     strerror(errno));
+      cupsdLogClient(con, CUPSD_LOG_ERROR,
+                     "Unable to open \"%s\" for reading: %s",
+                     con->filename ? con->filename : "/dev/null",
+                    strerror(errno));
       return (0);
     }
 
@@ -2320,16 +2133,16 @@ cupsdSendCommand(
   else
     fd = -1;
 
-  con->pipe_pid = pipe_command(con, fd, &(con->file), command, options, root);
+  con->pipe_pid    = pipe_command(con, fd, &(con->file), command, options, root);
+  con->pipe_status = HTTP_STATUS_OK;
+
+  httpClearFields(con->http);
 
   if (fd >= 0)
     close(fd);
 
-  cupsdLogMessage(CUPSD_LOG_INFO, "[Client %d] Started \"%s\" (pid=%d)",
-                  con->http.fd, command, con->pipe_pid);
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] file=%d", con->http.fd,
-                  con->file);
+  cupsdLogClient(con, CUPSD_LOG_INFO, "Started \"%s\" (pid=%d, file=%d)",
+                 command, con->pipe_pid, con->file);
 
   if (con->pipe_pid == 0)
     return (0);
@@ -2338,6 +2151,8 @@ cupsdSendCommand(
 
   cupsdAddSelect(con->file, (cupsd_selfunc_t)write_pipe, NULL, con);
 
+  cupsdLogClient(con, CUPSD_LOG_DEBUG, "Waiting for CGI data.");
+
   con->sent_header = 0;
   con->file_ready  = 0;
   con->got_fields  = 0;
@@ -2356,9 +2171,10 @@ cupsdSendError(cupsd_client_t *con,      /* I - Connection */
                http_status_t  code,    /* I - Error code */
               int            auth_type)/* I - Authentication type */
 {
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "[Client %d] cupsdSendError code=%d, auth_type=%d",
-                 con->http.fd, code, auth_type);
+  char location[HTTP_MAX_VALUE];       /* Location field */
+
+
+  cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cupsdSendError code=%d, auth_type=%d", code, auth_type);
 
 #ifdef HAVE_SSL
  /*
@@ -2366,12 +2182,12 @@ cupsdSendError(cupsd_client_t *con,     /* I - Connection */
   * server is configured...
   */
 
-  if (code == HTTP_UNAUTHORIZED &&
-      DefaultEncryption == HTTP_ENCRYPT_REQUIRED &&
-      _cups_strcasecmp(con->http.hostname, "localhost") &&
-      !con->http.tls)
+  if (code == HTTP_STATUS_UNAUTHORIZED &&
+      DefaultEncryption == HTTP_ENCRYPTION_REQUIRED &&
+      _cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost") &&
+      !httpIsEncrypted(con->http))
   {
-    code = HTTP_UPGRADE_REQUIRED;
+    code = HTTP_STATUS_UPGRADE_REQUIRED;
   }
 #endif /* HAVE_SSL */
 
@@ -2389,34 +2205,20 @@ cupsdSendError(cupsd_client_t *con,     /* I - Connection */
   * never disable it in that case.
   */
 
-  if (code >= HTTP_BAD_REQUEST && con->http.auth_type != CUPSD_AUTH_NEGOTIATE)
-    con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+  strlcpy(location, httpGetField(con->http, HTTP_FIELD_LOCATION), sizeof(location));
 
- /*
-  * Send an error message back to the client.  If the error code is a
-  * 400 or 500 series, make sure the message contains some text, too!
-  */
+  httpClearFields(con->http);
 
-  if (!cupsdSendHeader(con, code, NULL, auth_type))
-    return (0);
+  httpSetField(con->http, HTTP_FIELD_LOCATION, location);
 
-#ifdef HAVE_SSL
-  if (code == HTTP_UPGRADE_REQUIRED)
-    if (httpPrintf(HTTP(con), "Connection: Upgrade\r\n") < 0)
-      return (0);
+  if (code >= HTTP_STATUS_BAD_REQUEST && con->type != CUPSD_AUTH_NEGOTIATE)
+    httpSetKeepAlive(con->http, HTTP_KEEPALIVE_OFF);
 
-  if (httpPrintf(HTTP(con), "Upgrade: TLS/1.0,HTTP/1.1\r\n") < 0)
-    return (0);
-#endif /* HAVE_SSL */
+  if (httpGetVersion(con->http) >= HTTP_VERSION_1_1 &&
+      httpGetKeepAlive(con->http) == HTTP_KEEPALIVE_OFF)
+    httpSetField(con->http, HTTP_FIELD_CONNECTION, "close");
 
-  if (con->http.version >= HTTP_1_1 &&
-      con->http.keep_alive == HTTP_KEEPALIVE_OFF)
-  {
-    if (httpPrintf(HTTP(con), "Connection: close\r\n") < 0)
-      return (0);
-  }
-
-  if (code >= HTTP_BAD_REQUEST)
+  if (code >= HTTP_STATUS_BAD_REQUEST)
   {
    /*
     * Send a human-readable error message.
@@ -2430,13 +2232,13 @@ cupsdSendError(cupsd_client_t *con,     /* I - Connection */
 
     redirect[0] = '\0';
 
-    if (code == HTTP_UNAUTHORIZED)
+    if (code == HTTP_STATUS_UNAUTHORIZED)
       text = _cupsLangString(con->language,
                              _("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."));
-    else if (code == HTTP_UPGRADE_REQUIRED)
+    else if (code == HTTP_STATUS_UPGRADE_REQUIRED)
     {
       text = urltext;
 
@@ -2453,7 +2255,7 @@ cupsdSendError(cupsd_client_t *con,       /* I - Connection */
               "CONTENT=\"3;URL=https://%s:%d%s\">\n",
               con->servername, con->serverport, con->uri);
     }
-    else if (code == HTTP_WEBIF_DISABLED)
+    else if (code == HTTP_STATUS_CUPS_WEBIF_DISABLED)
       text = _cupsLangString(con->language,
                              _("The web interface is currently disabled. Run "
                               "\"cupsctl WebInterface=yes\" to enable it."));
@@ -2477,25 +2279,34 @@ cupsdSendError(cupsd_client_t *con,     /* I - Connection */
             "<P>%s</P>\n"
             "</BODY>\n"
             "</HTML>\n",
-            httpStatus(code), redirect, httpStatus(code), text);
+            _httpStatus(con->language, code), redirect,
+            _httpStatus(con->language, code), text);
 
-    if (httpPrintf(HTTP(con), "Content-Type: text/html; charset=utf-8\r\n") < 0)
-      return (0);
-    if (httpPrintf(HTTP(con), "Content-Length: %d\r\n",
-                   (int)strlen(message)) < 0)
+   /*
+    * Send an error message back to the client.  If the error code is a
+    * 400 or 500 series, make sure the message contains some text, too!
+    */
+
+    size_t length = strlen(message);   /* Length of message */
+
+    httpSetLength(con->http, length);
+
+    if (!cupsdSendHeader(con, code, "text/html", auth_type))
       return (0);
-    if (httpPrintf(HTTP(con), "\r\n") < 0)
+
+    if (httpWrite2(con->http, message, length) < 0)
       return (0);
-    if (httpPrintf(HTTP(con), "%s", message) < 0)
+
+    if (httpFlushWrite(con->http) < 0)
       return (0);
   }
-  else if (httpPrintf(HTTP(con), "\r\n") < 0)
-    return (0);
-
-  if (cupsdFlushHeader(con) < 0)
-    return (0);
+  else
+  {
+    httpSetField(con->http, HTTP_FIELD_CONTENT_LENGTH, "0");
 
-  con->http.state = HTTP_WAITING;
+    if (!cupsdSendHeader(con, code, NULL, auth_type))
+      return (0);
+  }
 
   return (1);
 }
@@ -2515,54 +2326,29 @@ cupsdSendHeader(
   char         auth_str[1024];         /* Authorization string */
 
 
+  cupsdLogClient(con, CUPSD_LOG_DEBUG, "cupsdSendHeader: code=%d, type=\"%s\", auth_type=%d", code, type, auth_type);
+
  /*
   * Send the HTTP status header...
   */
 
-  if (code == HTTP_CONTINUE)
-  {
-   /*
-    * 100-continue doesn't send any headers...
-    */
-
-    return (httpPrintf(HTTP(con), "HTTP/%d.%d 100 Continue\r\n\r\n",
-                      con->http.version / 100, con->http.version % 100) > 0);
-  }
-  else if (code == HTTP_WEBIF_DISABLED)
+  if (code == HTTP_STATUS_CUPS_WEBIF_DISABLED)
   {
    /*
     * Treat our special "web interface is disabled" status as "200 OK" for web
     * browsers.
     */
 
-    code = HTTP_OK;
+    code = HTTP_STATUS_OK;
   }
 
-  httpFlushWrite(HTTP(con));
-
-  con->http.data_encoding = HTTP_ENCODE_FIELDS;
-
-  if (httpPrintf(HTTP(con), "HTTP/%d.%d %d %s\r\n", con->http.version / 100,
-                 con->http.version % 100, code, httpStatus(code)) < 0)
-    return (0);
-  if (httpPrintf(HTTP(con), "Date: %s\r\n", httpGetDateString(time(NULL))) < 0)
-    return (0);
   if (ServerHeader)
-    if (httpPrintf(HTTP(con), "Server: %s\r\n", ServerHeader) < 0)
-      return (0);
-  if (con->http.keep_alive && con->http.version >= HTTP_1_0)
-  {
-    if (httpPrintf(HTTP(con), "Connection: Keep-Alive\r\n") < 0)
-      return (0);
-    if (httpPrintf(HTTP(con), "Keep-Alive: timeout=%d\r\n",
-                   KeepAliveTimeout) < 0)
-      return (0);
-  }
-  if (code == HTTP_METHOD_NOT_ALLOWED)
-    if (httpPrintf(HTTP(con), "Allow: GET, HEAD, OPTIONS, POST, PUT\r\n") < 0)
-      return (0);
+    httpSetField(con->http, HTTP_FIELD_SERVER, ServerHeader);
+
+  if (code == HTTP_STATUS_METHOD_NOT_ALLOWED)
+    httpSetField(con->http, HTTP_FIELD_ALLOW, "GET, HEAD, OPTIONS, POST, PUT");
 
-  if (code == HTTP_UNAUTHORIZED)
+  if (code == HTTP_STATUS_UNAUTHORIZED)
   {
     if (auth_type == CUPSD_AUTH_NONE)
     {
@@ -2574,16 +2360,13 @@ cupsdSendHeader(
 
     auth_str[0] = '\0';
 
-    if (auth_type == CUPSD_AUTH_BASIC || auth_type == CUPSD_AUTH_BASICDIGEST)
+    if (auth_type == CUPSD_AUTH_BASIC)
       strlcpy(auth_str, "Basic realm=\"CUPS\"", sizeof(auth_str));
-    else if (auth_type == CUPSD_AUTH_DIGEST)
-      snprintf(auth_str, sizeof(auth_str), "Digest realm=\"CUPS\", nonce=\"%s\"",
-              con->http.hostname);
 #ifdef HAVE_GSSAPI
     else if (auth_type == CUPSD_AUTH_NEGOTIATE)
     {
 #  ifdef AF_LOCAL
-      if (_httpAddrFamily(con->http.hostaddr) == AF_LOCAL)
+      if (httpAddrFamily(httpGetAddress(con->http)) == AF_LOCAL)
         strlcpy(auth_str, "Basic realm=\"CUPS\"", sizeof(auth_str));
       else
 #  endif /* AF_LOCAL */
@@ -2592,7 +2375,7 @@ cupsdSendHeader(
 #endif /* HAVE_GSSAPI */
 
     if (con->best && auth_type != CUPSD_AUTH_NEGOTIATE &&
-        !_cups_strcasecmp(con->http.hostname, "localhost"))
+        !_cups_strcasecmp(httpGetHostname(con->http, NULL, 0), "localhost"))
     {
      /*
       * Add a "trc" (try root certification) parameter for local non-Kerberos
@@ -2608,7 +2391,7 @@ cupsdSendHeader(
       size_t   auth_size;              /* Size of remaining buffer */
 
       auth_key  = auth_str + strlen(auth_str);
-      auth_size = sizeof(auth_str) - (auth_key - auth_str);
+      auth_size = sizeof(auth_str) - (size_t)(auth_key - auth_str);
 
       for (name = (char *)cupsArrayFirst(con->best->names);
            name;
@@ -2641,35 +2424,24 @@ cupsdSendHeader(
 
     if (auth_str[0])
     {
-      cupsdLogMessage(CUPSD_LOG_DEBUG,
-                      "[Client %d] WWW-Authenticate: %s", con->http.fd,
-                      auth_str);
+      cupsdLogClient(con, CUPSD_LOG_DEBUG, "WWW-Authenticate: %s", auth_str);
 
-      if (httpPrintf(HTTP(con), "WWW-Authenticate: %s\r\n", auth_str) < 0)
-        return (0);
+      httpSetField(con->http, HTTP_FIELD_WWW_AUTHENTICATE, auth_str);
     }
   }
 
   if (con->language && strcmp(con->language->language, "C"))
-  {
-    if (httpPrintf(HTTP(con), "Content-Language: %s\r\n",
-                   con->language->language) < 0)
-      return (0);
-  }
+    httpSetField(con->http, HTTP_FIELD_CONTENT_LANGUAGE, con->language->language);
 
   if (type)
   {
     if (!strcmp(type, "text/html"))
-    {
-      if (httpPrintf(HTTP(con),
-                     "Content-Type: text/html; charset=utf-8\r\n") < 0)
-        return (0);
-    }
-    else if (httpPrintf(HTTP(con), "Content-Type: %s\r\n", type) < 0)
-      return (0);
+      httpSetField(con->http, HTTP_FIELD_CONTENT_TYPE, "text/html; charset=utf-8");
+    else
+      httpSetField(con->http, HTTP_FIELD_CONTENT_TYPE, type);
   }
 
-  return (1);
+  return (!httpWriteResponse(con->http, code));
 }
 
 
@@ -2722,36 +2494,35 @@ cupsdWriteClient(cupsd_client_t *con)   /* I - Client connection */
   ipp_state_t  ipp_state;              /* IPP state value */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                 "[Client %d] cupsdWriteClient "
-                 "error=%d, "
-                 "used=%d, "
-                 "state=%s, "
-                 "data_encoding=HTTP_ENCODE_%s, "
-                 "data_remaining=" CUPS_LLFMT ", "
-                 "response=%p(%s), "
-                 "pipe_pid=%d, "
-                 "file=%d",
-                 con->http.fd, con->http.error, con->http.used,
-                 http_states[con->http.state],
-                 con->http.data_encoding == HTTP_ENCODE_CHUNKED ?
-                     "CHUNKED" : "LENGTH",
-                 CUPS_LLCAST con->http.data_remaining,
-                 con->response,
-                 con->response ? ipp_states[con->response->state] : "",
-                 con->pipe_pid, con->file);
-
-  if (con->http.state != HTTP_GET_SEND &&
-      con->http.state != HTTP_POST_SEND)
+  cupsdLogClient(con, CUPSD_LOG_DEBUG, "con->http=%p", con->http);
+  cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                "cupsdWriteClient "
+                "error=%d, "
+                "used=%d, "
+                "state=%s, "
+                "data_encoding=HTTP_ENCODING_%s, "
+                "data_remaining=" CUPS_LLFMT ", "
+                "response=%p(%s), "
+                "pipe_pid=%d, "
+                "file=%d",
+                httpError(con->http), (int)httpGetReady(con->http),
+                httpStateString(httpGetState(con->http)),
+                httpIsChunked(con->http) ? "CHUNKED" : "LENGTH",
+                CUPS_LLCAST httpGetLength2(con->http),
+                con->response,
+                con->response ? ippStateString(ippGetState(con->request)) : "",
+                con->pipe_pid, con->file);
+
+  if (httpGetState(con->http) != HTTP_STATE_GET_SEND &&
+      httpGetState(con->http) != HTTP_STATE_POST_SEND)
   {
    /*
     * If we get called in the wrong state, then something went wrong with the
     * connection and we need to shut it down...
     */
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                   "[Client %d] Closing on unexpected HTTP state %s.",
-                   con->http.fd, http_states[con->http.state]);
+    cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing on unexpected HTTP write state %s.",
+                  httpStateString(httpGetState(con->http)));
     cupsdCloseClient(con);
     return;
   }
@@ -2764,27 +2535,71 @@ cupsdWriteClient(cupsd_client_t *con)   /* I - Client connection */
 
     cupsdAddSelect(con->file, (cupsd_selfunc_t)write_pipe, NULL, con);
 
+    cupsdLogClient(con, CUPSD_LOG_DEBUG, "Waiting for CGI data.");
+
     if (!con->file_ready)
     {
      /*
       * Try again later when there is CGI output available...
       */
 
-      cupsdRemoveSelect(con->http.fd);
+      cupsdRemoveSelect(httpGetFd(con->http));
       return;
     }
 
     con->file_ready = 0;
   }
 
-  if (con->response && con->response->state != IPP_DATA)
+  bytes = (ssize_t)(sizeof(con->header) - (size_t)con->header_used);
+
+  if (!con->pipe_pid && bytes > (ssize_t)httpGetRemaining(con->http))
   {
-    ipp_state = ippWrite(HTTP(con), con->response);
-    bytes     = ipp_state != IPP_ERROR &&
-                (con->file >= 0 || ipp_state != IPP_DATA);
+   /*
+    * Limit GET bytes to original size of file (STR #3265)...
+    */
+
+    bytes = (ssize_t)httpGetRemaining(con->http);
   }
-  else if ((bytes = read(con->file, con->header + con->header_used,
-                        sizeof(con->header) - con->header_used)) > 0)
+
+  if (con->response && con->response->state != IPP_STATE_DATA)
+  {
+    size_t wused = httpGetPending(con->http);  /* Previous write buffer use */
+
+    do
+    {
+     /*
+      * Write a single attribute or the IPP message header...
+      */
+
+      ipp_state = ippWrite(con->http, con->response);
+
+     /*
+      * If the write buffer has been flushed, stop buffering up attributes...
+      */
+
+      if (httpGetPending(con->http) <= wused)
+        break;
+    }
+    while (ipp_state != IPP_STATE_DATA && ipp_state != IPP_STATE_ERROR);
+
+    cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                   "Writing IPP response, ipp_state=%s, old "
+                   "wused=" CUPS_LLFMT ", new wused=" CUPS_LLFMT,
+                   ippStateString(ipp_state),
+                  CUPS_LLCAST wused, CUPS_LLCAST httpGetPending(con->http));
+
+    if (httpGetPending(con->http) > 0)
+      httpFlushWrite(con->http);
+
+    bytes = ipp_state != IPP_STATE_ERROR &&
+           (con->file >= 0 || ipp_state != IPP_STATE_DATA);
+
+    cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                   "bytes=%d, http_state=%d, data_remaining=" CUPS_LLFMT,
+                   (int)bytes, httpGetState(con->http),
+                   CUPS_LLCAST httpGetLength2(con->http));
+  }
+  else if ((bytes = read(con->file, con->header + con->header_used, (size_t)bytes)) > 0)
   {
     con->header_used += bytes;
 
@@ -2809,7 +2624,7 @@ cupsdWriteClient(cupsd_client_t *con)     /* I - Client connection */
            bufptr[-1] = '\0';
          *bufptr++ = '\0';
 
-          cupsdLogMessage(CUPSD_LOG_DEBUG, "Script header: %s", con->header);
+          cupsdLogClient(con, CUPSD_LOG_DEBUG, "Script header: %s", con->header);
 
           if (!con->sent_header)
          {
@@ -2817,46 +2632,43 @@ cupsdWriteClient(cupsd_client_t *con)   /* I - Client connection */
            * Handle redirection and CGI status codes...
            */
 
-            if (!_cups_strncasecmp(con->header, "Location:", 9))
+           http_field_t field;         /* HTTP field */
+           char        *value = strchr(con->header, ':');
+                                       /* Value of field */
+
+           if (value)
            {
-             if (!cupsdSendHeader(con, HTTP_SEE_OTHER, NULL, CUPSD_AUTH_NONE))
-             {
-               cupsdCloseClient(con);
-               return;
-             }
+             *value++ = '\0';
+             while (isspace(*value & 255))
+               value ++;
+           }
 
-             con->sent_header = 2;
+           field = httpFieldValue(con->header);
 
-             if (httpPrintf(HTTP(con), "Content-Length: 0\r\n") < 0)
-               return;
+           if (field != HTTP_FIELD_UNKNOWN && value)
+           {
+             httpSetField(con->http, field, value);
+
+             if (field == HTTP_FIELD_LOCATION)
+             {
+               con->pipe_status = HTTP_STATUS_SEE_OTHER;
+               con->sent_header = 2;
+             }
+             else
+               con->sent_header = 1;
            }
-           else if (!_cups_strncasecmp(con->header, "Status:", 7))
+           else if (!_cups_strcasecmp(con->header, "Status") && value)
            {
-             cupsdSendError(con, (http_status_t)atoi(con->header + 7),
-                            CUPSD_AUTH_NONE);
+             con->pipe_status = (http_status_t)atoi(value);
              con->sent_header = 2;
            }
-           else
+           else if (!_cups_strcasecmp(con->header, "Set-Cookie") && value)
            {
-             if (!cupsdSendHeader(con, HTTP_OK, NULL, CUPSD_AUTH_NONE))
-             {
-               cupsdCloseClient(con);
-               return;
-             }
-
+             httpSetCookie(con->http, value);
              con->sent_header = 1;
-
-             if (con->http.version == HTTP_1_1)
-             {
-               if (httpPrintf(HTTP(con), "Transfer-Encoding: chunked\r\n") < 0)
-                 return;
-             }
-            }
+           }
          }
 
-         if (_cups_strncasecmp(con->header, "Status:", 7))
-           httpPrintf(HTTP(con), "%s\r\n", con->header);
-
          /*
          * Update buffer...
          */
@@ -2864,7 +2676,7 @@ cupsdWriteClient(cupsd_client_t *con)     /* I - Client connection */
          con->header_used -= bufptr - con->header;
 
          if (con->header_used > 0)
-           memmove(con->header, bufptr, con->header_used);
+           memmove(con->header, bufptr, (size_t)con->header_used);
 
          bufptr = con->header - 1;
 
@@ -2876,14 +2688,28 @@ cupsdWriteClient(cupsd_client_t *con)   /* I - Client connection */
          {
            con->got_fields = 1;
 
-            if (cupsdFlushHeader(con) < 0)
+           if (httpGetVersion(con->http) == HTTP_VERSION_1_1 &&
+               !httpGetField(con->http, HTTP_FIELD_CONTENT_LENGTH)[0])
+             httpSetLength(con->http, 0);
+
+            cupsdLogClient(con, CUPSD_LOG_DEBUG, "Sending status %d for CGI.", con->pipe_status);
+
+            if (con->pipe_status == HTTP_STATUS_OK)
            {
-             cupsdCloseClient(con);
-             return;
+             if (!cupsdSendHeader(con, con->pipe_status, NULL, CUPSD_AUTH_NONE))
+             {
+               cupsdCloseClient(con);
+               return;
+             }
+           }
+           else
+           {
+             if (!cupsdSendError(con, con->pipe_status, CUPSD_AUTH_NONE))
+             {
+               cupsdCloseClient(con);
+               return;
+             }
            }
-
-           if (con->http.version == HTTP_1_1)
-             con->http.data_encoding = HTTP_ENCODE_CHUNKED;
           }
          else
            field_col = 0;
@@ -2893,30 +2719,25 @@ cupsdWriteClient(cupsd_client_t *con)   /* I - Client connection */
       }
 
       if (!con->got_fields)
-      {
-        con->http.activity = time(NULL);
         return;
-      }
     }
 
     if (con->header_used > 0)
     {
-      if (httpWrite2(HTTP(con), con->header, con->header_used) < 0)
+      if (httpWrite2(con->http, con->header, (size_t)con->header_used) < 0)
       {
-       cupsdLogMessage(CUPSD_LOG_DEBUG,
-                       "[Client %d] Closing for error %d (%s)",
-                       con->http.fd, con->http.error,
-                       strerror(con->http.error));
+       cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing for error %d (%s)",
+                      httpError(con->http), strerror(httpError(con->http)));
        cupsdCloseClient(con);
        return;
       }
 
-      if (con->http.data_encoding == HTTP_ENCODE_CHUNKED)
-        httpFlushWrite(HTTP(con));
+      if (httpIsChunked(con->http))
+        httpFlushWrite(con->http);
 
       con->bytes += con->header_used;
 
-      if (con->http.state == HTTP_WAITING)
+      if (httpGetState(con->http) == HTTP_STATE_WAITING)
        bytes = 0;
       else
         bytes = con->header_used;
@@ -2926,33 +2747,36 @@ cupsdWriteClient(cupsd_client_t *con)   /* I - Client connection */
   }
 
   if (bytes <= 0 ||
-      (con->http.state != HTTP_GET_SEND && con->http.state != HTTP_POST_SEND))
+      (httpGetState(con->http) != HTTP_STATE_GET_SEND &&
+       httpGetState(con->http) != HTTP_STATE_POST_SEND))
   {
     if (!con->sent_header && con->pipe_pid)
-      cupsdSendError(con, HTTP_SERVER_ERROR, CUPSD_AUTH_NONE);
+      cupsdSendError(con, HTTP_STATUS_SERVER_ERROR, CUPSD_AUTH_NONE);
     else
     {
-      cupsdLogRequest(con, HTTP_OK);
-
-      httpFlushWrite(HTTP(con));
+      cupsdLogRequest(con, HTTP_STATUS_OK);
 
-      if (con->http.data_encoding == HTTP_ENCODE_CHUNKED && con->sent_header == 1)
+      if (httpIsChunked(con->http) && (!con->pipe_pid || con->sent_header > 0))
       {
-       if (httpWrite2(HTTP(con), "", 0) < 0)
+        cupsdLogClient(con, CUPSD_LOG_DEBUG, "Sending 0-length chunk.");
+
+       if (httpWrite2(con->http, "", 0) < 0)
        {
-         cupsdLogMessage(CUPSD_LOG_DEBUG,
-                         "[Client %d] Closing for error %d (%s)",
-                         con->http.fd, con->http.error,
-                         strerror(con->http.error));
+         cupsdLogClient(con, CUPSD_LOG_DEBUG, "Closing for error %d (%s)",
+                        httpError(con->http), strerror(httpError(con->http)));
          cupsdCloseClient(con);
          return;
        }
       }
+
+      cupsdLogClient(con, CUPSD_LOG_DEBUG, "Flushing write buffer.");
+      httpFlushWrite(con->http);
+      cupsdLogClient(con, CUPSD_LOG_DEBUG, "New state is %s", httpStateString(httpGetState(con->http)));
     }
 
-    con->http.state = HTTP_WAITING;
+    cupsdAddSelect(httpGetFd(con->http), (cupsd_selfunc_t)cupsdReadClient, NULL, con);
 
-    cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, NULL, con);
+    cupsdLogClient(con, CUPSD_LOG_DEBUG, "Waiting for request.");
 
     if (con->file >= 0)
     {
@@ -2988,11 +2812,10 @@ cupsdWriteClient(cupsd_client_t *con)   /* I - Client connection */
     cupsdClearString(&con->options);
     cupsdClearString(&con->query_string);
 
-    if (!con->http.keep_alive)
+    if (!httpGetKeepAlive(con->http))
     {
-      cupsdLogMessage(CUPSD_LOG_DEBUG,
-                     "[Client %d] Closing because Keep-Alive disabled.",
-                     con->http.fd);
+      cupsdLogClient(con, CUPSD_LOG_DEBUG,
+                    "Closing because Keep-Alive is disabled.");
       cupsdCloseClient(con);
       return;
     }
@@ -3002,8 +2825,6 @@ cupsdWriteClient(cupsd_client_t *con)     /* I - Client connection */
       cupsdSetBusyState();
     }
   }
-
-  con->http.activity = time(NULL);
 }
 
 
@@ -3016,23 +2837,19 @@ check_if_modified(
     cupsd_client_t *con,               /* I - Client connection */
     struct stat    *filestats)         /* I - File information */
 {
-  char         *ptr;                   /* Pointer into field */
+  const char   *ptr;                   /* Pointer into field */
   time_t       date;                   /* Time/date value */
   off_t                size;                   /* Size/length value */
 
 
   size = 0;
   date = 0;
-  ptr  = con->http.fields[HTTP_FIELD_IF_MODIFIED_SINCE];
+  ptr  = httpGetField(con->http, HTTP_FIELD_IF_MODIFIED_SINCE);
 
   if (*ptr == '\0')
     return (1);
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "[Client %d] check_if_modified "
-                 "filestats=%p(" CUPS_LLFMT ", %d)) If-Modified-Since=\"%s\"",
-                  con->http.fd, filestats, CUPS_LLCAST filestats->st_size,
-                 (int)filestats->st_mtime, ptr);
+  cupsdLogClient(con, CUPSD_LOG_DEBUG2, "check_if_modified: filestats=%p(" CUPS_LLFMT ", %d)) If-Modified-Since=\"%s\"", filestats, CUPS_LLCAST filestats->st_size, (int)filestats->st_mtime, ptr);
 
   while (*ptr != '\0')
   {
@@ -3083,35 +2900,26 @@ compare_clients(cupsd_client_t *a,      /* I - First client */
 }
 
 
+#ifdef HAVE_SSL
 /*
- * 'data_ready()' - Check whether data is available from a client.
+ * 'cupsd_start_tls()' - Start encryption on a connection.
  */
 
-static int                             /* O - 1 if data is ready, 0 otherwise */
-data_ready(cupsd_client_t *con)                /* I - Client */
+static int                             /* O - 0 on success, -1 on error */
+cupsd_start_tls(cupsd_client_t    *con,        /* I - Client connection */
+                http_encryption_t e)   /* I - Encryption mode */
 {
-  if (con->http.used > 0)
-    return (1);
-#ifdef HAVE_SSL
-  else if (con->http.tls)
+  if (httpEncryption(con->http, e))
   {
-#  ifdef HAVE_LIBSSL
-    if (SSL_pending((SSL *)(con->http.tls)))
-      return (1);
-#  elif defined(HAVE_GNUTLS)
-    if (gnutls_record_check_pending(con->http.tls))
-      return (1);
-#  elif defined(HAVE_CDSASSL)
-    size_t bytes;                      /* Bytes that are available */
-
-    if (!SSLGetBufferedReadSize(con->http.tls, &bytes) && bytes > 0)
-      return (1);
-#  endif /* HAVE_LIBSSL */
+    cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to encrypt connection: %s",
+                   cupsLastErrorString());
+    return (-1);
   }
-#endif /* HAVE_SSL */
 
+  cupsdLogClient(con, CUPSD_LOG_DEBUG, "Connection now encrypted.");
   return (0);
 }
+#endif /* HAVE_SSL */
 
 
 /*
@@ -3122,12 +2930,14 @@ static char *                           /* O  - Real filename */
 get_file(cupsd_client_t *con,          /* I  - Client connection */
          struct stat    *filestats,    /* O  - File information */
          char           *filename,     /* IO - Filename buffer */
-         int            len)           /* I  - Buffer length */
+         size_t         len)           /* I  - Buffer length */
 {
   int          status;                 /* Status of filesystem calls */
   char         *ptr;                   /* Pointer info filename */
-  int          plen;                   /* Remaining length after pointer */
-  char         language[7];            /* Language subdirectory, if any */
+  size_t       plen;                   /* Remaining length after pointer */
+  char         language[7],            /* Language subdirectory, if any */
+               dest[1024];             /* Destination name */
+  int          perm_check = 1;         /* Do permissions check? */
 
 
  /*
@@ -3137,17 +2947,59 @@ get_file(cupsd_client_t *con,           /* I  - Client connection */
   language[0] = '\0';
 
   if (!strncmp(con->uri, "/ppd/", 5) && !strchr(con->uri + 5, '/'))
+  {
+    strlcpy(dest, con->uri + 5, sizeof(dest));
+    ptr = dest + strlen(dest) - 4;
+
+    if (ptr <= dest || strcmp(ptr, ".ppd"))
+    {
+      cupsdLogClient(con, CUPSD_LOG_INFO, "Disallowed path \"%s\".", con->uri);
+      return (NULL);
+    }
+
+    *ptr = '\0';
+    if (!cupsdFindPrinter(dest))
+    {
+      cupsdLogClient(con, CUPSD_LOG_INFO, "No printer \"%s\" found.", dest);
+      return (NULL);
+    }
+
     snprintf(filename, len, "%s%s", ServerRoot, con->uri);
+
+    perm_check = 0;
+  }
   else if (!strncmp(con->uri, "/icons/", 7) && !strchr(con->uri + 7, '/'))
   {
-    snprintf(filename, len, "%s/%s", CacheDir, con->uri + 7);
+    strlcpy(dest, con->uri + 7, sizeof(dest));
+    ptr = dest + strlen(dest) - 4;
+
+    if (ptr <= dest || strcmp(ptr, ".png"))
+    {
+      cupsdLogClient(con, CUPSD_LOG_INFO, "Disallowed path \"%s\".", con->uri);
+      return (NULL);
+    }
+
+    *ptr = '\0';
+    if (!cupsdFindDest(dest))
+    {
+      cupsdLogClient(con, CUPSD_LOG_INFO, "No printer \"%s\" found.", dest);
+      return (NULL);
+    }
+
+    snprintf(filename, len, "%s/%s.png", CacheDir, dest);
     if (access(filename, F_OK) < 0)
       snprintf(filename, len, "%s/images/generic.png", DocumentRoot);
+
+    perm_check = 0;
   }
   else if (!strncmp(con->uri, "/rss/", 5) && !strchr(con->uri + 5, '/'))
     snprintf(filename, len, "%s/rss/%s", CacheDir, con->uri + 5);
-  else if (!strncmp(con->uri, "/admin/conf/", 12))
-    snprintf(filename, len, "%s%s", ServerRoot, con->uri + 11);
+  else if (!strcmp(con->uri, "/admin/conf/cupsd.conf"))
+  {
+    strlcpy(filename, ConfigurationFile, len);
+
+    perm_check = 0;
+  }
   else if (!strncmp(con->uri, "/admin/log/", 11))
   {
     if (!strncmp(con->uri + 11, "access_log", 10) && AccessLog[0] == '/')
@@ -3158,6 +3010,8 @@ get_file(cupsd_client_t *con,             /* I  - Client connection */
       strlcpy(filename, PageLog, len);
     else
       return (NULL);
+
+    perm_check = 0;
   }
   else if (con->language)
   {
@@ -3175,7 +3029,7 @@ get_file(cupsd_client_t *con,             /* I  - Client connection */
   * then fallback to the default one...
   */
 
-  if ((status = stat(filename, filestats)) != 0 && language[0] &&
+  if ((status = lstat(filename, filestats)) != 0 && language[0] &&
       strncmp(con->uri, "/icons/", 7) &&
       strncmp(con->uri, "/ppd/", 5) &&
       strncmp(con->uri, "/rss/", 5) &&
@@ -3192,7 +3046,7 @@ get_file(cupsd_client_t *con,             /* I  - Client connection */
     if ((ptr = strchr(filename, '?')) != NULL)
       *ptr = '\0';
 
-    if ((status = stat(filename, filestats)) != 0)
+    if ((status = lstat(filename, filestats)) != 0)
     {
      /*
       * Drop the language prefix and try the root directory...
@@ -3204,12 +3058,33 @@ get_file(cupsd_client_t *con,           /* I  - Client connection */
       if ((ptr = strchr(filename, '?')) != NULL)
        *ptr = '\0';
 
-      status = stat(filename, filestats);
+      status = lstat(filename, filestats);
     }
   }
 
  /*
-  * If we're found a directory, get the index.html file instead...
+  * If we've found a symlink, 404 the sucker to avoid disclosing information.
+  */
+
+  if (!status && S_ISLNK(filestats->st_mode))
+  {
+    cupsdLogClient(con, CUPSD_LOG_INFO, "Symlinks such as \"%s\" are not allowed.", filename);
+    return (NULL);
+  }
+
+ /*
+  * Similarly, if the file/directory does not have world read permissions, do
+  * not allow access...
+  */
+
+  if (!status && perm_check && !(filestats->st_mode & S_IROTH))
+  {
+    cupsdLogClient(con, CUPSD_LOG_INFO, "Files/directories such as \"%s\" must be world-readable.", filename);
+    return (NULL);
+  }
+
+ /*
+  * If we've found a directory, get the index.html file instead...
   */
 
   if (!status && S_ISDIR(filestats->st_mode))
@@ -3249,16 +3124,16 @@ get_file(cupsd_client_t *con,           /* I  - Client connection */
        *ptr = '\0';
 
       ptr  = filename + strlen(filename);
-      plen = len - (ptr - filename);
+      plen = len - (size_t)(ptr - filename);
 
       strlcpy(ptr, "index.html", plen);
-      status = stat(filename, filestats);
+      status = lstat(filename, filestats);
 
 #ifdef HAVE_JAVA
       if (status)
       {
        strlcpy(ptr, "index.class", plen);
-       status = stat(filename, filestats);
+       status = lstat(filename, filestats);
       }
 #endif /* HAVE_JAVA */
 
@@ -3266,7 +3141,7 @@ get_file(cupsd_client_t *con,             /* I  - Client connection */
       if (status)
       {
        strlcpy(ptr, "index.pl", plen);
-       status = stat(filename, filestats);
+       status = lstat(filename, filestats);
       }
 #endif /* HAVE_PERL */
 
@@ -3274,7 +3149,7 @@ get_file(cupsd_client_t *con,             /* I  - Client connection */
       if (status)
       {
        strlcpy(ptr, "index.php", plen);
-       status = stat(filename, filestats);
+       status = lstat(filename, filestats);
       }
 #endif /* HAVE_PHP */
 
@@ -3282,24 +3157,42 @@ get_file(cupsd_client_t *con,           /* I  - Client connection */
       if (status)
       {
        strlcpy(ptr, "index.pyc", plen);
-       status = stat(filename, filestats);
+       status = lstat(filename, filestats);
       }
 
       if (status)
       {
        strlcpy(ptr, "index.py", plen);
-       status = stat(filename, filestats);
+       status = lstat(filename, filestats);
       }
 #endif /* HAVE_PYTHON */
 
     }
     while (status && language[0]);
+
+   /*
+    * If we've found a symlink, 404 the sucker to avoid disclosing information.
+    */
+
+    if (!status && S_ISLNK(filestats->st_mode))
+    {
+      cupsdLogClient(con, CUPSD_LOG_INFO, "Symlinks such as \"%s\" are not allowed.", filename);
+      return (NULL);
+    }
+
+   /*
+    * Similarly, if the file/directory does not have world read permissions, do
+    * not allow access...
+    */
+
+    if (!status && perm_check && !(filestats->st_mode & S_IROTH))
+    {
+      cupsdLogClient(con, CUPSD_LOG_INFO, "Files/directories such as \"%s\" must be world-readable.", filename);
+      return (NULL);
+    }
   }
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "[Client %d] get_file filestats=%p, filename=%p, len=%d, "
-                 "returning \"%s\".", con->http.fd, filestats, filename, len,
-                 status ? "(null)" : filename);
+  cupsdLogClient(con, CUPSD_LOG_DEBUG2, "get_file: filestats=%p, filename=%p, len=" CUPS_LLFMT ", returning \"%s\".", filestats, filename, CUPS_LLCAST len, status ? "(null)" : filename);
 
   if (status)
     return (NULL);
@@ -3328,9 +3221,9 @@ install_cupsd_conf(cupsd_client_t *con)   /* I - Connection */
 
   if ((in = cupsFileOpen(con->filename, "rb")) == NULL)
   {
-    cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open request file \"%s\": %s",
+    cupsdLogClient(con, CUPSD_LOG_ERROR, "Unable to open request file \"%s\": %s",
                     con->filename, strerror(errno));
-    return (HTTP_SERVER_ERROR);
+    goto server_error;
   }
 
  /*
@@ -3340,10 +3233,10 @@ install_cupsd_conf(cupsd_client_t *con) /* I - Connection */
   if ((out = cupsdCreateConfFile(ConfigurationFile, ConfigFilePerm)) == NULL)
   {
     cupsFileClose(in);
-    return (HTTP_SERVER_ERROR);
+    goto server_error;
   }
 
-  cupsdLogMessage(CUPSD_LOG_INFO, "Installing config file \"%s\"...",
+  cupsdLogClient(con, CUPSD_LOG_INFO, "Installing config file \"%s\"...",
                   ConfigurationFile);
 
  /*
@@ -3351,9 +3244,9 @@ install_cupsd_conf(cupsd_client_t *con)   /* I - Connection */
   */
 
   while ((bytes = cupsFileRead(in, buffer, sizeof(buffer))) > 0)
-    if (cupsFileWrite(out, buffer, bytes) < bytes)
+    if (cupsFileWrite(out, buffer, (size_t)bytes) < bytes)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
+      cupsdLogClient(con, CUPSD_LOG_ERROR,
                       "Unable to copy to config file \"%s\": %s",
                      ConfigurationFile, strerror(errno));
 
@@ -3361,9 +3254,9 @@ install_cupsd_conf(cupsd_client_t *con)   /* I - Connection */
       cupsFileClose(out);
 
       snprintf(filename, sizeof(filename), "%s.N", ConfigurationFile);
-      cupsdRemoveFile(filename);
+      cupsdUnlinkOrRemoveFile(filename);
 
-      return (HTTP_SERVER_ERROR);
+      goto server_error;
     }
 
  /*
@@ -3373,13 +3266,13 @@ install_cupsd_conf(cupsd_client_t *con) /* I - Connection */
   cupsFileClose(in);
 
   if (cupsdCloseCreatedConfFile(out, ConfigurationFile))
-    return (HTTP_SERVER_ERROR);
+    goto server_error;
 
  /*
   * Remove the request file...
   */
 
-  cupsdRemoveFile(con->filename);
+  cupsdUnlinkOrRemoveFile(con->filename);
   cupsdClearString(&con->filename);
 
  /*
@@ -3393,7 +3286,18 @@ install_cupsd_conf(cupsd_client_t *con)  /* I - Connection */
   * Return that the file was created successfully...
   */
 
-  return (HTTP_CREATED);
+  return (HTTP_STATUS_CREATED);
+
+ /*
+  * Common exit for errors...
+  */
+
+  server_error:
+
+  cupsdUnlinkOrRemoveFile(con->filename);
+  cupsdClearString(&con->filename);
+
+  return (HTTP_STATUS_SERVER_ERROR);
 }
 
 
@@ -3426,11 +3330,7 @@ is_cgi(cupsd_client_t *con,              /* I - Client connection */
 
   if (!type || _cups_strcasecmp(type->super, "application"))
   {
-    cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                   "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
-                   "type=%s/%s, returning 0", con->http.fd, filename,
-                   filestats, type ? type->super : "unknown",
-                   type ? type->type : "unknown");
+    cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 0.", filename, filestats, type ? type->super : "unknown", type ? type->type : "unknown");
     return (0);
   }
 
@@ -3446,10 +3346,7 @@ is_cgi(cupsd_client_t *con,              /* I - Client connection */
     if (options)
       cupsdSetStringf(&con->options, " %s", options);
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                   "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
-                   "type=%s/%s, returning 1", con->http.fd, filename,
-                   filestats, type->super, type->type);
+    cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 1.", filename, filestats, type->super, type->type);
     return (1);
   }
 #ifdef HAVE_JAVA
@@ -3466,10 +3363,7 @@ is_cgi(cupsd_client_t *con,              /* I - Client connection */
     else
       cupsdSetStringf(&con->options, " %s", filename);
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                   "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
-                   "type=%s/%s, returning 1", con->http.fd, filename,
-                   filestats, type->super, type->type);
+    cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 1.", filename, filestats, type->super, type->type);
     return (1);
   }
 #endif /* HAVE_JAVA */
@@ -3487,10 +3381,7 @@ is_cgi(cupsd_client_t *con,              /* I - Client connection */
     else
       cupsdSetStringf(&con->options, " %s", filename);
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                   "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
-                   "type=%s/%s, returning 1", con->http.fd, filename,
-                   filestats, type->super, type->type);
+    cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 1.", filename, filestats, type->super, type->type);
     return (1);
   }
 #endif /* HAVE_PERL */
@@ -3508,10 +3399,7 @@ is_cgi(cupsd_client_t *con,              /* I - Client connection */
     else
       cupsdSetStringf(&con->options, " %s", filename);
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                   "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
-                   "type=%s/%s, returning 1", con->http.fd, filename,
-                   filestats, type->super, type->type);
+    cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 1.", filename, filestats, type->super, type->type);
     return (1);
   }
 #endif /* HAVE_PHP */
@@ -3529,18 +3417,12 @@ is_cgi(cupsd_client_t *con,             /* I - Client connection */
     else
       cupsdSetStringf(&con->options, " %s", filename);
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                   "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
-                   "type=%s/%s, returning 1", con->http.fd, filename,
-                   filestats, type->super, type->type);
+    cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 1.", filename, filestats, type->super, type->type);
     return (1);
   }
 #endif /* HAVE_PYTHON */
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                 "[Client %d] is_cgi filename=\"%s\", filestats=%p, "
-                 "type=%s/%s, returning 0", con->http.fd, filename,
-                 filestats, type->super, type->type);
+  cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 0.", filename, filestats, type->super, type->type);
   return (0);
 }
 
@@ -3560,6 +3442,14 @@ is_path_absolute(const char *path)       /* I - Input path */
     return (0);
 
  /*
+  * Check for "<" or quotes in the path and reject since this is probably
+  * someone trying to inject HTML...
+  */
+
+  if (strchr(path, '<') != NULL || strchr(path, '\"') != NULL || strchr(path, '\'') != NULL)
+    return (0);
+
+ /*
   * Check for "/.." in the path...
   */
 
@@ -3639,21 +3529,12 @@ pipe_command(cupsd_client_t *con,       /* I - Client connection */
   * be consistent with Apache...
   */
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "[Client %d] pipe_command infile=%d, outfile=%p, "
-                 "command=\"%s\", options=\"%s\", root=%d",
-                  con->http.fd, infile, outfile, command,
-                 options ? options : "(null)", root);
+  cupsdLogClient(con, CUPSD_LOG_DEBUG2, "pipe_command: infile=%d, outfile=%p, command=\"%s\", options=\"%s\", root=%d", infile, outfile, command, options ? options : "(null)", root);
 
   argv[0] = command;
 
   if (options)
-  {
-    commptr = options;
-    if (*commptr == ' ')
-      commptr ++;
-    strlcpy(argbuf, commptr, sizeof(argbuf));
-  }
+    strlcpy(argbuf, options, sizeof(argbuf));
   else
     argbuf[0] = '\0';
 
@@ -3680,7 +3561,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
       commptr ++;
   }
 
-  if (*commptr == '?' && con->operation == HTTP_GET && !con->query_string)
+  if (*commptr == '?' && con->operation == HTTP_STATE_GET && !con->query_string)
   {
     commptr ++;
     cupsdSetStringf(&(con->query_string), "QUERY_STRING=%s", commptr);
@@ -3723,9 +3604,9 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
        */
 
        if (commptr[1] >= '0' && commptr[1] <= '9')
-          *commptr = (commptr[1] - '0') << 4;
+          *commptr = (char)((commptr[1] - '0') << 4);
        else
-          *commptr = (tolower(commptr[1]) - 'a' + 10) << 4;
+          *commptr = (char)((tolower(commptr[1]) - 'a' + 10) << 4);
 
        if (commptr[2] >= '0' && commptr[2] <= '9')
           *commptr |= commptr[2] - '0';
@@ -3753,7 +3634,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
   if (con->username[0])
   {
     snprintf(auth_type, sizeof(auth_type), "AUTH_TYPE=%s",
-             httpGetField(HTTP(con), HTTP_FIELD_AUTHORIZATION));
+             httpGetField(con->http, HTTP_FIELD_AUTHORIZATION));
 
     if ((uriptr = strchr(auth_type + 10, ' ')) != NULL)
       *uriptr = '\0';
@@ -3773,7 +3654,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
          * the POSIX locale...
          */
 
-         strcpy(lang, "LANG=C");
+         strlcpy(lang, "LANG=C", sizeof(lang));
          break;
 
       case 2 :
@@ -3801,14 +3682,14 @@ pipe_command(cupsd_client_t *con,       /* I - Client connection */
   else if (con->language)
     snprintf(lang, sizeof(lang), "LANG=%s.UTF8", con->language->language);
   else
-    strcpy(lang, "LANG=C");
+    strlcpy(lang, "LANG=C", sizeof(lang));
 
-  strcpy(remote_addr, "REMOTE_ADDR=");
-  httpAddrString(con->http.hostaddr, remote_addr + 12,
+  strlcpy(remote_addr, "REMOTE_ADDR=", sizeof(remote_addr));
+  httpAddrString(httpGetAddress(con->http), remote_addr + 12,
                  sizeof(remote_addr) - 12);
 
   snprintf(remote_host, sizeof(remote_host), "REMOTE_HOST=%s",
-           con->http.hostname);
+           httpGetHostname(con->http, NULL, 0));
 
   snprintf(script_name, sizeof(script_name), "SCRIPT_NAME=%s", con->uri);
   if ((uriptr = strchr(script_name, '?')) != NULL)
@@ -3817,14 +3698,14 @@ pipe_command(cupsd_client_t *con,       /* I - Client connection */
   snprintf(script_filename, sizeof(script_filename), "SCRIPT_FILENAME=%s%s",
            DocumentRoot, script_name + 12);
 
-  sprintf(server_port, "SERVER_PORT=%d", con->serverport);
+  snprintf(server_port, sizeof(server_port), "SERVER_PORT=%d", con->serverport);
 
-  if (con->http.fields[HTTP_FIELD_HOST][0])
+  if (httpGetField(con->http, HTTP_FIELD_HOST)[0])
   {
     char *nameptr;                     /* Pointer to ":port" */
 
     snprintf(server_name, sizeof(server_name), "SERVER_NAME=%s",
-            con->http.fields[HTTP_FIELD_HOST]);
+            httpGetField(con->http, HTTP_FIELD_HOST));
     if ((nameptr = strrchr(server_name, ':')) != NULL && !strchr(nameptr, ']'))
       *nameptr = '\0';                 /* Strip trailing ":port" */
   }
@@ -3857,35 +3738,35 @@ pipe_command(cupsd_client_t *con,       /* I - Client connection */
     envp[envc ++] = remote_user;
   }
 
-  if (con->http.version == HTTP_1_1)
+  if (httpGetVersion(con->http) == HTTP_VERSION_1_1)
     envp[envc ++] = "SERVER_PROTOCOL=HTTP/1.1";
-  else if (con->http.version == HTTP_1_0)
+  else if (httpGetVersion(con->http) == HTTP_VERSION_1_0)
     envp[envc ++] = "SERVER_PROTOCOL=HTTP/1.0";
   else
     envp[envc ++] = "SERVER_PROTOCOL=HTTP/0.9";
 
-  if (con->http.cookie)
+  if (httpGetCookie(con->http))
   {
     snprintf(http_cookie, sizeof(http_cookie), "HTTP_COOKIE=%s",
-             con->http.cookie);
+             httpGetCookie(con->http));
     envp[envc ++] = http_cookie;
   }
 
-  if (con->http.fields[HTTP_FIELD_USER_AGENT][0])
+  if (httpGetField(con->http, HTTP_FIELD_USER_AGENT)[0])
   {
     snprintf(http_user_agent, sizeof(http_user_agent), "HTTP_USER_AGENT=%s",
-             con->http.fields[HTTP_FIELD_USER_AGENT]);
+             httpGetField(con->http, HTTP_FIELD_USER_AGENT));
     envp[envc ++] = http_user_agent;
   }
 
-  if (con->http.fields[HTTP_FIELD_REFERER][0])
+  if (httpGetField(con->http, HTTP_FIELD_REFERER)[0])
   {
     snprintf(http_referer, sizeof(http_referer), "HTTP_REFERER=%s",
-             con->http.fields[HTTP_FIELD_REFERER]);
+             httpGetField(con->http, HTTP_FIELD_REFERER));
     envp[envc ++] = http_referer;
   }
 
-  if (con->operation == HTTP_GET)
+  if (con->operation == HTTP_STATE_GET)
   {
     envp[envc ++] = "REQUEST_METHOD=GET";
 
@@ -3905,7 +3786,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
     sprintf(content_length, "CONTENT_LENGTH=" CUPS_LLFMT,
             CUPS_LLCAST con->bytes);
     snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s",
-             con->http.fields[HTTP_FIELD_CONTENT_TYPE]);
+             httpGetField(con->http, HTTP_FIELD_CONTENT_TYPE));
 
     envp[envc ++] = "REQUEST_METHOD=POST";
     envp[envc ++] = content_length;
@@ -3916,7 +3797,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
   * Tell the CGI if we are using encryption...
   */
 
-  if (con->http.tls)
+  if (httpIsEncrypted(con->http))
     envp[envc ++] = "HTTPS=ON";
 
  /*
@@ -3991,31 +3872,42 @@ valid_host(cupsd_client_t *con)         /* I - Client connection */
 {
   cupsd_alias_t        *a;                     /* Current alias */
   cupsd_netif_t        *netif;                 /* Current network interface */
-  const char   *host,                  /* Host field */
-               *end;                   /* End character */
+  const char   *end;                   /* End character */
+  char         *ptr;                   /* Pointer into host value */
+
 
+ /*
+  * Copy the Host: header for later use...
+  */
+
+  strlcpy(con->clientname, httpGetField(con->http, HTTP_FIELD_HOST),
+          sizeof(con->clientname));
+  if ((ptr = strrchr(con->clientname, ':')) != NULL && !strchr(ptr, ']'))
+  {
+    *ptr++ = '\0';
+    con->clientport = atoi(ptr);
+  }
+  else
+    con->clientport = con->serverport;
 
-  host = con->http.fields[HTTP_FIELD_HOST];
+ /*
+  * Then validate...
+  */
 
-  if (httpAddrLocalhost(con->http.hostaddr))
+  if (httpAddrLocalhost(httpGetAddress(con->http)))
   {
    /*
     * Only allow "localhost" or the equivalent IPv4 or IPv6 numerical
     * addresses when accessing CUPS via the loopback interface...
     */
 
-    return (!_cups_strcasecmp(host, "localhost") ||
-            !_cups_strncasecmp(host, "localhost:", 10) ||
-           !_cups_strcasecmp(host, "localhost.") ||
-            !_cups_strncasecmp(host, "localhost.:", 11) ||
+    return (!_cups_strcasecmp(con->clientname, "localhost") ||
+           !_cups_strcasecmp(con->clientname, "localhost.") ||
 #ifdef __linux
-           !_cups_strcasecmp(host, "localhost.localdomain") ||
-            !_cups_strncasecmp(host, "localhost.localdomain:", 22) ||
+           !_cups_strcasecmp(con->clientname, "localhost.localdomain") ||
 #endif /* __linux */
-            !strcmp(host, "127.0.0.1") ||
-           !strncmp(host, "127.0.0.1:", 10) ||
-           !strcmp(host, "[::1]") ||
-           !strncmp(host, "[::1]:", 6));
+            !strcmp(con->clientname, "127.0.0.1") ||
+           !strcmp(con->clientname, "[::1]"));
   }
 
 #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
@@ -4023,19 +3915,18 @@ valid_host(cupsd_client_t *con)         /* I - Client connection */
   * Check if the hostname is something.local (Bonjour); if so, allow it.
   */
 
-  if ((end = strrchr(host, '.')) != NULL && end > host &&
-      (!end[1] || end[1] == ':'))
+  if ((end = strrchr(con->clientname, '.')) != NULL && end > con->clientname &&
+      !end[1])
   {
    /*
     * "." on end, work back to second-to-last "."...
     */
-    for (end --; end > host && *end != '.'; end --);
+
+    for (end --; end > con->clientname && *end != '.'; end --);
   }
 
   if (end && (!_cups_strcasecmp(end, ".local") ||
-             !_cups_strncasecmp(end, ".local:", 7) ||
-             !_cups_strcasecmp(end, ".local.") ||
-             !_cups_strncasecmp(end, ".local.:", 8)))
+             !_cups_strcasecmp(end, ".local.")))
     return (1);
 #endif /* HAVE_DNSSD || HAVE_AVAHI */
 
@@ -4043,22 +3934,16 @@ valid_host(cupsd_client_t *con)         /* I - Client connection */
   * Check if the hostname is an IP address...
   */
 
-  if (isdigit(*host & 255) || *host == '[')
+  if (isdigit(con->clientname[0] & 255) || con->clientname[0] == '[')
   {
    /*
     * Possible IPv4/IPv6 address...
     */
 
-    char       temp[1024],             /* Temporary string */
-               *ptr;                   /* Pointer into temporary string */
     http_addrlist_t *addrlist;         /* List of addresses */
 
 
-    strlcpy(temp, host, sizeof(temp));
-    if ((ptr = strrchr(temp, ':')) != NULL && !strchr(ptr, ']'))
-      *ptr = '\0';                     /* Strip :port from host value */
-
-    if ((addrlist = httpAddrGetList(temp, AF_UNSPEC, NULL)) != NULL)
+    if ((addrlist = httpAddrGetList(con->clientname, AF_UNSPEC, NULL)) != NULL)
     {
      /*
       * Good IPv4/IPv6 address...
@@ -4084,16 +3969,15 @@ valid_host(cupsd_client_t *con)         /* I - Client connection */
     if (!strcmp(a->name, "*"))
       return (1);
 
-    if (!_cups_strncasecmp(host, a->name, a->namelen))
+    if (!_cups_strncasecmp(con->clientname, a->name, a->namelen))
     {
      /*
-      * Prefix matches; check the character at the end - it must be ":", ".",
-      * ".:", or nul...
+      * Prefix matches; check the character at the end - it must be "." or nul.
       */
 
-      end = host + a->namelen;
+      end = con->clientname + a->namelen;
 
-      if (!*end || *end == ':' || (*end == '.' && (!end[1] || end[1] == ':')))
+      if (!*end || (*end == '.' && !end[1]))
         return (1);
     }
   }
@@ -4110,16 +3994,15 @@ valid_host(cupsd_client_t *con)         /* I - Client connection */
     if (!strcmp(a->name, "*"))
       return (1);
 
-    if (!_cups_strncasecmp(host, a->name, a->namelen))
+    if (!_cups_strncasecmp(con->clientname, a->name, a->namelen))
     {
      /*
-      * Prefix matches; check the character at the end - it must be ":", ".",
-      * ".:", or nul...
+      * Prefix matches; check the character at the end - it must be "." or nul.
       */
 
-      end = host + a->namelen;
+      end = con->clientname + a->namelen;
 
-      if (!*end || *end == ':' || (*end == '.' && (!end[1] || end[1] == ':')))
+      if (!*end || (*end == '.' && !end[1]))
         return (1);
     }
   }
@@ -4133,16 +4016,15 @@ valid_host(cupsd_client_t *con)         /* I - Client connection */
        netif;
        netif = (cupsd_netif_t *)cupsArrayNext(NetIFList))
   {
-    if (!_cups_strncasecmp(host, netif->hostname, netif->hostlen))
+    if (!_cups_strncasecmp(con->clientname, netif->hostname, netif->hostlen))
     {
      /*
-      * Prefix matches; check the character at the end - it must be ":", ".",
-      * ".:", or nul...
+      * Prefix matches; check the character at the end - it must be "." or nul.
       */
 
-      end = host + netif->hostlen;
+      end = con->clientname + netif->hostlen;
 
-      if (!*end || *end == ':' || (*end == '.' && (!end[1] || end[1] == ':')))
+      if (!*end || (*end == '.' && !end[1]))
         return (1);
     }
   }
@@ -4164,43 +4046,29 @@ write_file(cupsd_client_t *con,         /* I - Client connection */
 {
   con->file = open(filename, O_RDONLY);
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "[Client %d] write_file code=%d, filename=\"%s\" (%d), "
-                 "type=\"%s\", filestats=%p", con->http.fd,
-                 code, filename, con->file, type ? type : "(null)", filestats);
+  cupsdLogClient(con, CUPSD_LOG_DEBUG2, "write_file: code=%d, filename=\"%s\" (%d), type=\"%s\", filestats=%p.", code, filename, con->file, type ? type : "(null)", filestats);
 
   if (con->file < 0)
     return (0);
 
   fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC);
 
-  con->pipe_pid = 0;
+  con->pipe_pid    = 0;
+  con->sent_header = 1;
 
-  if (!cupsdSendHeader(con, code, type, CUPSD_AUTH_NONE))
-    return (0);
+  httpClearFields(con->http);
 
-  if (httpPrintf(HTTP(con), "Last-Modified: %s\r\n",
-                 httpGetDateString(filestats->st_mtime)) < 0)
-    return (0);
-  if (httpPrintf(HTTP(con), "Content-Length: " CUPS_LLFMT "\r\n",
-                 CUPS_LLCAST filestats->st_size) < 0)
-    return (0);
-  if (httpPrintf(HTTP(con), "\r\n") < 0)
-    return (0);
+  httpSetLength(con->http, (size_t)filestats->st_size);
 
-  if (cupsdFlushHeader(con) < 0)
-    return (0);
+  httpSetField(con->http, HTTP_FIELD_LAST_MODIFIED,
+              httpGetDateString(filestats->st_mtime));
 
-  con->http.data_encoding  = HTTP_ENCODE_LENGTH;
-  con->http.data_remaining = filestats->st_size;
+  if (!cupsdSendHeader(con, code, type, CUPSD_AUTH_NONE))
+    return (0);
 
-  if (con->http.data_remaining <= INT_MAX)
-    con->http._data_remaining = con->http.data_remaining;
-  else
-    con->http._data_remaining = INT_MAX;
+  cupsdAddSelect(httpGetFd(con->http), NULL, (cupsd_selfunc_t)cupsdWriteClient, con);
 
-  cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient,
-                 (cupsd_selfunc_t)cupsdWriteClient, con);
+  cupsdLogClient(con, CUPSD_LOG_DEBUG, "Sending file.");
 
   return (1);
 }
@@ -4213,17 +4081,17 @@ write_file(cupsd_client_t *con,         /* I - Client connection */
 static void
 write_pipe(cupsd_client_t *con)                /* I - Client connection */
 {
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "[Client %d] write_pipe CGI output on fd %d",
-                  con->http.fd, con->file);
+  cupsdLogClient(con, CUPSD_LOG_DEBUG2, "write_pipe: CGI output on fd %d.", con->file);
 
   con->file_ready = 1;
 
   cupsdRemoveSelect(con->file);
-  cupsdAddSelect(con->http.fd, NULL, (cupsd_selfunc_t)cupsdWriteClient, con);
+  cupsdAddSelect(httpGetFd(con->http), NULL, (cupsd_selfunc_t)cupsdWriteClient, con);
+
+  cupsdLogClient(con, CUPSD_LOG_DEBUG, "CGI data ready to be sent.");
 }
 
 
 /*
- * End of "$Id: client.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: client.c 12978 2015-11-17 19:29:52Z msweet $".
  */
index 106e43e..5096c4f 100644 (file)
@@ -1,16 +1,16 @@
 /*
- * "$Id: client.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: client.h 11717 2014-03-21 16:42:53Z msweet $"
  *
- *   Client definitions for the CUPS scheduler.
+ * Client definitions for the CUPS scheduler.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 #ifdef HAVE_AUTHORIZATION_H
@@ -24,7 +24,8 @@
 
 struct cupsd_client_s
 {
-  http_t               http;           /* HTTP client connection */
+  int                  number;         /* Connection number */
+  http_t               *http;          /* HTTP client connection */
   ipp_t                        *request,       /* IPP request information */
                        *response;      /* IPP response information */
   cupsd_location_t     *best;          /* Best match for AAA */
@@ -45,6 +46,7 @@ struct cupsd_client_s
   int                  file;           /* Input/output file */
   int                  file_ready;     /* Input ready on file/pipe? */
   int                  pipe_pid;       /* Pipe process ID (or 0 if not a pipe) */
+  http_status_t                pipe_status;    /* HTTP status from pipe process */
   int                  sent_header,    /* Non-zero if sent HTTP header */
                        got_fields,     /* Non-zero if all fields seen */
                        header_used;    /* Number of header bytes used */
@@ -53,7 +55,9 @@ struct cupsd_client_s
 #ifdef HAVE_SSL
   int                  auto_ssl;       /* Automatic test for SSL/TLS */
 #endif /* HAVE_SSL */
-  http_addr_t          clientaddr;     /* Client address */
+  http_addr_t          clientaddr;     /* Client's server address */
+  char                 clientname[256];/* Client's server name for connection */
+  int                  clientport;     /* Client's server port for connection */
   char                 servername[256];/* Server name for connection */
   int                  serverport;     /* Server port for connection */
 #ifdef HAVE_GSSAPI
@@ -65,7 +69,7 @@ struct cupsd_client_s
 #endif /* HAVE_AUTHORIZATION_H */
 };
 
-#define HTTP(con) &((con)->http)
+#define HTTP(con) ((con)->http)
 
 
 /*
@@ -77,6 +81,9 @@ typedef struct
   int                  fd;             /* File descriptor for this server */
   http_addr_t          address;        /* Bind address of socket */
   http_encryption_t    encryption;     /* To encrypt or not to encrypt... */
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+  int                  on_demand;      /* Is this a socket from launchd/systemd? */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
 } cupsd_listener_t;
 
 
@@ -84,7 +91,9 @@ typedef struct
  * Globals...
  */
 
-VAR int                        ListenBackLog   VALUE(SOMAXCONN),
+VAR int                        LastClientNumber VALUE(0),
+                                       /* Last client connection number */
+                       ListenBackLog   VALUE(SOMAXCONN),
                                        /* Max backlog of pending connections */
                        LocalPort       VALUE(631),
                                        /* Local port to use */
@@ -116,7 +125,6 @@ extern void cupsdAcceptClient(cupsd_listener_t *lis);
 extern void    cupsdCloseAllClients(void);
 extern int     cupsdCloseClient(cupsd_client_t *con);
 extern void    cupsdDeleteAllListeners(void);
-extern int     cupsdFlushHeader(cupsd_client_t *con);
 extern void    cupsdPauseListening(void);
 extern int     cupsdProcessIPPRequest(cupsd_client_t *con);
 extern void    cupsdReadClient(cupsd_client_t *con);
@@ -140,5 +148,5 @@ extern int  cupsdStartTLS(cupsd_client_t *con);
 
 
 /*
- * End of "$Id: client.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: client.h 11717 2014-03-21 16:42:53Z msweet $".
  */
index be064b6..0d90dde 100644 (file)
@@ -1,22 +1,22 @@
 /*
- * "$Id: colorman.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: colorman.c 12619 2015-05-06 21:00:19Z msweet $"
  *
- *   Color management routines for the CUPS scheduler.
+ * Color management routines for the CUPS scheduler.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   Original DBUS/colord code is Copyright 2011 Red Hat, Inc.
+ * Original DBUS/colord code is Copyright 2011 Red Hat, Inc.
  *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
  *
  *   Redistributions of source code must retain the above copyright
  *   notice, this list of conditions and the following disclaimer.
  *   notice, this list of conditions and the following disclaimer in the
  *   documentation and/or other materials provided with the distribution.
  *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- *   COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- *   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- *   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- *   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- *   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- *   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- *   OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Contents:
- *
- *   cupsdRegisterColor()         - Register vendor color profiles in a PPD
- *                                  file.
- *   cupsdStartColor()            - Initialize color management.
- *   cupsdStopColor()             - Shutdown color management.
- *   cupsdUnregisterColor()       - Unregister vendor color profiles in a PPD
- *                                  file.
- *   apple_init_profile()         - Initialize a color profile.
- *   apple_register_profiles()    - Register color profiles for a printer.
- *   apple_unregister_profiles()   - Remove color profiles for the specified
- *                                  printer.
- *   colord_create_device()       - Create a device and register profiles.
- *   colord_create_profile()      - Create a color profile for a printer.
- *   colord_delete_device()       - Delete a device
- *   colord_device_add_profile()   - Assign a profile to a device.
- *   colord_dict_add_strings()    - Add two strings to a dictionary.
- *   colord_find_device()         - Finds a device
- *   colord_get_qualifier_format() - Get the qualifier format.
- *   colord_register_printer()    - Register profiles for a printer.
- *   colord_unregister_printer()   - Unregister profiles for a printer.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
 /*
@@ -173,8 +151,11 @@ cupsdRegisterColor(cupsd_printer_t *p)     /* I - Printer */
   }
 
 #elif defined(HAVE_DBUS)
-  colord_unregister_printer(p);
-  colord_register_printer(p);
+  if (!RunUser)
+  {
+    colord_unregister_printer(p);
+    colord_register_printer(p);
+  }
 #endif /* __APPLE__ */
 }
 
@@ -208,7 +189,8 @@ void
 cupsdStopColor(void)
 {
 #if !defined(__APPLE__) && defined(HAVE_DBUS)
-  dbus_connection_unref(colord_con);
+  if (colord_con)
+    dbus_connection_unref(colord_con);
   colord_con = NULL;
 #endif /* !__APPLE__ && HAVE_DBUS */
 }
@@ -226,7 +208,8 @@ cupsdUnregisterColor(cupsd_printer_t *p)/* I - Printer */
     apple_unregister_profiles(p);
 
 #elif defined(HAVE_DBUS)
-  colord_unregister_printer(p);
+  if (!RunUser)
+    colord_unregister_printer(p);
 #endif /* __APPLE__ */
 }
 
@@ -327,9 +310,7 @@ apple_init_profile(
 
  if (iccfile && *iccfile)
  {
-    url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
-                                                 (const UInt8 *)iccfile,
-                                                  strlen(iccfile), false);
+    url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (const UInt8 *)iccfile, (CFIndex)strlen(iccfile), false);
 
     if (url)
     {
@@ -387,7 +368,7 @@ apple_register_profiles(
   * Make sure ColorSync is available...
   */
 
-  if (ColorSyncRegisterDevice == NULL)
+  if (&ColorSyncRegisterDevice == NULL)
     return;
 
  /*
@@ -887,7 +868,7 @@ apple_unregister_profiles(
   * Make sure ColorSync is available...
   */
 
-  if (ColorSyncUnregisterDevice != NULL)
+  if (&ColorSyncUnregisterDevice != NULL)
   {
     CFUUIDRef deviceUUID;              /* Device UUID */
 
@@ -1538,5 +1519,5 @@ colord_unregister_printer(
 
 
 /*
- * End of "$Id: colorman.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: colorman.c 12619 2015-05-06 21:00:19Z msweet $".
  */
index a95adcf..3360fd4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: colorman.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: colorman.h 3833 2012-05-23 22:51:18Z msweet $"
  *
  *   Color management definitions for the CUPS scheduler.
  *
@@ -24,5 +24,5 @@ extern void   cupsdUnregisterColor(cupsd_printer_t *p);
 
 
 /*
- * End of "$Id: colorman.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: colorman.h 3833 2012-05-23 22:51:18Z msweet $".
  */
index 7ae8fed..f3e6514 100644 (file)
@@ -1,39 +1,16 @@
 /*
- * "$Id: conf.c 11221 2013-08-06 16:16:01Z msweet $"
+ * "$Id: conf.c 12819 2015-07-31 13:52:00Z msweet $"
  *
- *   Configuration routines for the CUPS scheduler.
+ * Configuration routines for the CUPS scheduler.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdAddAlias()         - Add a host alias.
- *   cupsdCheckPermissions()  - Fix the mode and ownership of a file or
- *                             directory.
- *   cupsdDefaultAuthType()   - Get the default AuthType.
- *   cupsdFreeAliases()       - Free all of the alias entries.
- *   cupsdReadConfiguration() - Read the cupsd.conf file.
- *   get_address()           - Get an address + port number from a line.
- *   get_addr_and_mask()      - Get an IP address and netmask.
- *   mime_error_cb()         - Log a MIME error.
- *   parse_aaa()             - Parse authentication, authorization, and access
- *                             control lines.
- *   parse_fatal_errors()     - Parse FatalErrors values in a string.
- *   parse_groups()          - Parse system group names in a string.
- *   parse_protocols()       - Parse browse protocols in a string.
- *   parse_variable()        - Parse a variable line.
- *   read_cupsd_conf()       - Read the cupsd.conf configuration file.
- *   read_cups_files_conf()   - Read the cups-files.conf configuration file.
- *   read_location()         - Read a <Location path> definition.
- *   read_policy()           - Read a <Policy name> definition.
- *   set_policy_defaults()    - Set default policy values as needed.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
 #include <stdarg.h>
 #include <grp.h>
 #include <sys/utsname.h>
+#ifdef HAVE_ASL_H
+#  include <asl.h>
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+#  define SD_JOURNAL_SUPPRESS_LOCATION
+#  include <systemd/sd-journal.h>
+#endif /* HAVE_ASL_H */
 #include <syslog.h>
 
 #ifdef HAVE_LIBPAPER
@@ -70,7 +53,8 @@ typedef enum
   CUPSD_VARTYPE_TIME,                  /* Time interval option */
   CUPSD_VARTYPE_STRING,                        /* String option */
   CUPSD_VARTYPE_BOOLEAN,               /* Boolean option */
-  CUPSD_VARTYPE_PATHNAME               /* File/directory name option */
+  CUPSD_VARTYPE_PATHNAME,              /* File/directory name option */
+  CUPSD_VARTYPE_PERM                   /* File/directory permissions */
 } cupsd_vartype_t;
 
 typedef struct
@@ -107,13 +91,16 @@ static const cupsd_var_t   cupsd_vars[] =
 #ifdef HAVE_GSSAPI
   { "GSSServiceName",          &GSSServiceName,        CUPSD_VARTYPE_STRING },
 #endif /* HAVE_GSSAPI */
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+  { "IdleExitTimeout",         &IdleExitTimeout,       CUPSD_VARTYPE_TIME },
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
   { "JobKillDelay",            &JobKillDelay,          CUPSD_VARTYPE_TIME },
   { "JobRetryLimit",           &JobRetryLimit,         CUPSD_VARTYPE_INTEGER },
   { "JobRetryInterval",                &JobRetryInterval,      CUPSD_VARTYPE_TIME },
   { "KeepAliveTimeout",                &KeepAliveTimeout,      CUPSD_VARTYPE_TIME },
   { "KeepAlive",               &KeepAlive,             CUPSD_VARTYPE_BOOLEAN },
 #ifdef HAVE_LAUNCHD
-  { "LaunchdTimeout",          &LaunchdTimeout,        CUPSD_VARTYPE_TIME },
+  { "LaunchdTimeout",          &IdleExitTimeout,       CUPSD_VARTYPE_TIME },
 #endif /* HAVE_LAUNCHD */
   { "LimitRequestBody",                &MaxRequestSize,        CUPSD_VARTYPE_INTEGER },
   { "ListenBackLog",           &ListenBackLog,         CUPSD_VARTYPE_INTEGER },
@@ -127,7 +114,7 @@ static const cupsd_var_t    cupsd_vars[] =
   { "MaxJobs",                 &MaxJobs,               CUPSD_VARTYPE_INTEGER },
   { "MaxJobsPerPrinter",       &MaxJobsPerPrinter,     CUPSD_VARTYPE_INTEGER },
   { "MaxJobsPerUser",          &MaxJobsPerUser,        CUPSD_VARTYPE_INTEGER },
-  { "MaxJobTime",              &MaxJobTime,            CUPSD_VARTYPE_INTEGER },
+  { "MaxJobTime",              &MaxJobTime,            CUPSD_VARTYPE_TIME },
   { "MaxLeaseDuration",                &MaxLeaseDuration,      CUPSD_VARTYPE_TIME },
   { "MaxLogSize",              &MaxLogSize,            CUPSD_VARTYPE_INTEGER },
   { "MaxRequestSize",          &MaxRequestSize,        CUPSD_VARTYPE_INTEGER },
@@ -152,13 +139,13 @@ static const cupsd_var_t  cupsfiles_vars[] =
 {
   { "AccessLog",               &AccessLog,             CUPSD_VARTYPE_STRING },
   { "CacheDir",                        &CacheDir,              CUPSD_VARTYPE_STRING },
-  { "ConfigFilePerm",          &ConfigFilePerm,        CUPSD_VARTYPE_INTEGER },
+  { "ConfigFilePerm",          &ConfigFilePerm,        CUPSD_VARTYPE_PERM },
   { "DataDir",                 &DataDir,               CUPSD_VARTYPE_STRING },
   { "DocumentRoot",            &DocumentRoot,          CUPSD_VARTYPE_STRING },
   { "ErrorLog",                        &ErrorLog,              CUPSD_VARTYPE_STRING },
   { "FileDevice",              &FileDevice,            CUPSD_VARTYPE_BOOLEAN },
   { "FontPath",                        &FontPath,              CUPSD_VARTYPE_STRING },
-  { "LogFilePerm",             &LogFilePerm,           CUPSD_VARTYPE_INTEGER },
+  { "LogFilePerm",             &LogFilePerm,           CUPSD_VARTYPE_PERM },
   { "LPDConfigFile",           &LPDConfigFile,         CUPSD_VARTYPE_STRING },
   { "PageLog",                 &PageLog,               CUPSD_VARTYPE_STRING },
   { "Printcap",                        &Printcap,              CUPSD_VARTYPE_STRING },
@@ -166,10 +153,7 @@ static const cupsd_var_t   cupsfiles_vars[] =
   { "RequestRoot",             &RequestRoot,           CUPSD_VARTYPE_STRING },
   { "ServerBin",               &ServerBin,             CUPSD_VARTYPE_PATHNAME },
 #ifdef HAVE_SSL
-  { "ServerCertificate",       &ServerCertificate,     CUPSD_VARTYPE_PATHNAME },
-#  if defined(HAVE_LIBSSL) || defined(HAVE_GNUTLS)
-  { "ServerKey",               &ServerKey,             CUPSD_VARTYPE_PATHNAME },
-#  endif /* HAVE_LIBSSL || HAVE_GNUTLS */
+  { "ServerKeychain",          &ServerKeychain,        CUPSD_VARTYPE_PATHNAME },
 #endif /* HAVE_SSL */
   { "ServerRoot",              &ServerRoot,            CUPSD_VARTYPE_PATHNAME },
   { "SMBConfigFile",           &SMBConfigFile,         CUPSD_VARTYPE_STRING },
@@ -236,7 +220,7 @@ cupsdAddAlias(cups_array_t *aliases,        /* I - Array of aliases */
     return;
 
   a->namelen = namelen;
-  strcpy(a->name, name);               /* OK since a->name is allocated */
+  memcpy(a->name, name, namelen + 1);  /* OK since a->name is allocated */
 
   cupsArrayAdd(aliases, a);
 }
@@ -250,9 +234,9 @@ int                                 /* O - 0 on success, -1 on error, 1 on warning */
 cupsdCheckPermissions(
     const char *filename,              /* I - File/directory name */
     const char *suffix,                        /* I - Additional file/directory name */
-    int        mode,                   /* I - Permissions */
-    int        user,                   /* I - Owner */
-    int        group,                  /* I - Group */
+    mode_t     mode,                   /* I - Permissions */
+    uid_t      user,                   /* I - Owner */
+    gid_t      group,                  /* I - Group */
     int        is_dir,                 /* I - 1 = directory, 0 = file */
     int        create_dir)             /* I - 1 = create directory, -1 = create w/o logging, 0 = not */
 {
@@ -291,8 +275,20 @@ cupsdCheckPermissions(
                          "Unable to create directory \"%s\" - %s", filename,
                          strerror(errno));
         else
-         syslog(LOG_ERR, "Unable to create directory \"%s\" - %s", filename,
-                strerror(errno));
+#ifdef HAVE_ASL_H
+        {
+         asl_object_t  m;              /* Log message */
+
+         m = asl_new(ASL_TYPE_MSG);
+         asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+         asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to create directory \"%s\" - %s", filename, strerror(errno));
+         asl_release(m);
+       }
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+         sd_journal_print(LOG_ERR, "Unable to create directory \"%s\" - %s", filename, strerror(errno));
+#else
+         syslog(LOG_ERR, "Unable to create directory \"%s\" - %s", filename, strerror(errno));
+#endif /* HAVE_ASL_H */
 
         return (-1);
       }
@@ -329,7 +325,20 @@ cupsdCheckPermissions(
     if (create_dir >= 0)
       cupsdLogMessage(CUPSD_LOG_ERROR, "\"%s\" is not a directory.", filename);
     else
+#ifdef HAVE_ASL_H
+    {
+      asl_object_t     m;              /* Log message */
+
+      m = asl_new(ASL_TYPE_MSG);
+      asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+      asl_log(NULL, m, ASL_LEVEL_ERR, "\"%s\" is not a directory.", filename);
+      asl_release(m);
+    }
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+      sd_journal_print(LOG_ERR, "\"%s\" is not a directory.", filename);
+#else
       syslog(LOG_ERR, "\"%s\" is not a directory.", filename);
+#endif /* HAVE_ASL_H */
 
     return (-1);
   }
@@ -358,8 +367,20 @@ cupsdCheckPermissions(
                        "Unable to change ownership of \"%s\" - %s", filename,
                        strerror(errno));
       else
-       syslog(LOG_ERR, "Unable to change ownership of \"%s\" - %s", filename,
-              strerror(errno));
+#ifdef HAVE_ASL_H
+      {
+       asl_object_t    m;              /* Log message */
+
+       m = asl_new(ASL_TYPE_MSG);
+       asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+       asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to change ownership of \"%s\" - %s", filename, strerror(errno));
+       asl_release(m);
+      }
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+       sd_journal_print(LOG_ERR, "Unable to change ownership of \"%s\" - %s", filename, strerror(errno));
+#else
+       syslog(LOG_ERR, "Unable to change ownership of \"%s\" - %s", filename, strerror(errno));
+#endif /* HAVE_ASL_H */
 
       return (1);
     }
@@ -378,8 +399,20 @@ cupsdCheckPermissions(
                        "Unable to change permissions of \"%s\" - %s", filename,
                        strerror(errno));
       else
-       syslog(LOG_ERR, "Unable to change permissions of \"%s\" - %s", filename,
-              strerror(errno));
+#ifdef HAVE_ASL_H
+      {
+       asl_object_t    m;              /* Log message */
+
+       m = asl_new(ASL_TYPE_MSG);
+       asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+       asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to change permissions of \"%s\" - %s", filename, strerror(errno));
+       asl_release(m);
+      }
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+       sd_journal_print(LOG_ERR, "Unable to change permissions of \"%s\" - %s", filename, strerror(errno));
+#else
+       syslog(LOG_ERR, "Unable to change permissions of \"%s\" - %s", filename, strerror(errno));
+#endif /* HAVE_ASL_H */
 
       return (1);
     }
@@ -429,7 +462,7 @@ cupsdDefaultAuthType(void)
   * to use it...
   */
 
-  if (gss_init_sec_context == NULL)
+  if (&gss_init_sec_context == NULL)
     return (default_auth_type = CUPSD_AUTH_BASIC);
 #  endif /* __APPLE__ */
 
@@ -589,7 +622,6 @@ cupsdReadConfiguration(void)
                  "%p %u %j %T %P %C %{job-billing} "
                 "%{job-originating-host-name} %{job-name} %{media} %{sides}");
   cupsdSetString(&Printcap, CUPS_DEFAULT_PRINTCAP);
-  cupsdSetString(&PrintcapGUI, "/usr/bin/glpoptions");
   cupsdSetString(&FontPath, CUPS_FONTPATH);
   cupsdSetString(&RemoteRoot, "remroot");
   cupsdSetStringf(&ServerHeader, "CUPS/%d.%d IPP/2.1", CUPS_VERSION_MAJOR,
@@ -614,12 +646,13 @@ cupsdReadConfiguration(void)
   ClassifyOverride  = 0;
 
 #ifdef HAVE_SSL
-#  ifdef HAVE_CDSASSL
-  cupsdSetString(&ServerCertificate, "/Library/Keychains/System.keychain");
+#  ifdef HAVE_GNUTLS
+  cupsdSetString(&ServerKeychain, "ssl");
 #  else
-  cupsdSetString(&ServerCertificate, "ssl/server.crt");
-  cupsdSetString(&ServerKey, "ssl/server.key");
-#  endif /* HAVE_CDSASSL */
+  cupsdSetString(&ServerKeychain, "/Library/Keychains/System.keychain");
+#  endif /* HAVE_GNUTLS */
+
+  _httpTLSSetOptions(0);
 #endif /* HAVE_SSL */
 
   language = cupsLangDefault();
@@ -709,7 +742,6 @@ cupsdReadConfiguration(void)
   default_auth_type        = CUPSD_AUTH_BASIC;
 #ifdef HAVE_SSL
   DefaultEncryption        = HTTP_ENCRYPT_REQUIRED;
-  SSLOptions               = CUPSD_SSL_NONE;
 #endif /* HAVE_SSL */
   DirtyCleanInterval       = DEFAULT_KEEPALIVE;
   JobKillDelay             = DEFAULT_TIMEOUT;
@@ -735,6 +767,7 @@ cupsdReadConfiguration(void)
   NumSystemGroups          = 0;
   ReloadTimeout                   = DEFAULT_KEEPALIVE;
   RootCertDuration         = 300;
+  Sandboxing               = CUPSD_SANDBOXING_STRICT;
   StrictConformance        = FALSE;
   SyncOnClose              = FALSE;
   Timeout                  = DEFAULT_TIMEOUT;
@@ -779,9 +812,9 @@ cupsdReadConfiguration(void)
   DefaultLeaseDuration       = 86400;
   MaxLeaseDuration           = 0;
 
-#ifdef HAVE_LAUNCHD
-  LaunchdTimeout = 10;
-#endif /* HAVE_LAUNCHD */
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+  IdleExitTimeout = 60;
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
 
  /*
   * Setup environment variables...
@@ -804,8 +837,20 @@ cupsdReadConfiguration(void)
       if (TestConfigFile)
         printf("\"%s\" contains errors.\n", CupsFilesFile);
       else
-        syslog(LOG_LPR, "Unable to read \"%s\" due to errors.",
-               CupsFilesFile);
+#ifdef HAVE_ASL_H
+      {
+       asl_object_t    m;              /* Log message */
+
+       m = asl_new(ASL_TYPE_MSG);
+       asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+       asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to read \"%s\" due to errors.", CupsFilesFile);
+       asl_release(m);
+      }
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+       sd_journal_print(LOG_ERR, "Unable to read \"%s\" due to errors.", CupsFilesFile);
+#else
+        syslog(LOG_LPR, "Unable to read \"%s\" due to errors.", CupsFilesFile);
+#endif /* HAVE_ASL_H */
 
       return (0);
     }
@@ -814,8 +859,20 @@ cupsdReadConfiguration(void)
     cupsdLogMessage(CUPSD_LOG_INFO, "No %s, using defaults.", CupsFilesFile);
   else
   {
-    syslog(LOG_LPR, "Unable to open \"%s\": %s", CupsFilesFile,
-          strerror(errno));
+#ifdef HAVE_ASL_H
+    asl_object_t       m;              /* Log message */
+
+    m = asl_new(ASL_TYPE_MSG);
+    asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+    asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to open \"%s\" - %s", CupsFilesFile, strerror(errno));
+    asl_release(m);
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+    sd_journal_print(LOG_ERR, "Unable to open \"%s\" - %s", CupsFilesFile, strerror(errno));
+#else
+    syslog(LOG_LPR, "Unable to open \"%s\" - %s", CupsFilesFile, strerror(errno));
+#endif /* HAVE_ASL_H */
+
     return (0);
   }
 
@@ -828,8 +885,19 @@ cupsdReadConfiguration(void)
 
   if ((fp = cupsFileOpen(ConfigurationFile, "r")) == NULL)
   {
-    syslog(LOG_LPR, "Unable to open \"%s\": %s", ConfigurationFile,
-          strerror(errno));
+#ifdef HAVE_ASL_H
+    asl_object_t       m;              /* Log message */
+
+    m = asl_new(ASL_TYPE_MSG);
+    asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+    asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to open \"%s\" - %s", ConfigurationFile, strerror(errno));
+    asl_release(m);
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+    sd_journal_print(LOG_ERR, "Unable to open \"%s\" - %s", ConfigurationFile, strerror(errno));
+#else
+    syslog(LOG_LPR, "Unable to open \"%s\" - %s", ConfigurationFile, strerror(errno));
+#endif /* HAVE_ASL_H */
+
     return (0);
   }
 
@@ -842,8 +910,20 @@ cupsdReadConfiguration(void)
     if (TestConfigFile)
       printf("\"%s\" contains errors.\n", ConfigurationFile);
     else
-      syslog(LOG_LPR, "Unable to read \"%s\" due to errors.",
-            ConfigurationFile);
+#ifdef HAVE_ASL_H
+    {
+      asl_object_t     m;              /* Log message */
+
+      m = asl_new(ASL_TYPE_MSG);
+      asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+      asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to read \"%s\" due to errors.", ConfigurationFile);
+      asl_release(m);
+    }
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+      sd_journal_print(LOG_ERR, "Unable to read \"%s\" due to errors.", ConfigurationFile);
+#else
+      syslog(LOG_LPR, "Unable to read \"%s\" due to errors.", ConfigurationFile);
+#endif /* HAVE_ASL_H */
 
     return (0);
   }
@@ -970,12 +1050,24 @@ cupsdReadConfiguration(void)
   * Open the system log for cupsd if necessary...
   */
 
-#ifdef HAVE_VSYSLOG
+  if (!LogStderr)
+  {
+    if (!strcmp(AccessLog, "stderr"))
+      cupsdSetString(&AccessLog, "syslog");
+
+    if (!strcmp(ErrorLog, "stderr"))
+      cupsdSetString(&ErrorLog, "syslog");
+
+    if (!strcmp(PageLog, "stderr"))
+      cupsdSetString(&PageLog, "syslog");
+  }
+
+#if defined(HAVE_VSYSLOG) && !defined(HAVE_ASL_H) && !defined(HAVE_SYSTEMD_SD_JOURNAL_H)
   if (!strcmp(AccessLog, "syslog") ||
       !strcmp(ErrorLog, "syslog") ||
       !strcmp(PageLog, "syslog"))
     openlog("cupsd", LOG_PID | LOG_NOWAIT | LOG_NDELAY, LOG_LPR);
-#endif /* HAVE_VSYSLOG */
+#endif /* HAVE_VSYSLOG && !HAVE_ASL_H && !HAVE_SYSTEMD_SD_JOURNAL_H */
 
  /*
   * Make sure each of the log files exists and gets rotated as necessary...
@@ -1015,8 +1107,11 @@ cupsdReadConfiguration(void)
       * Log the error and reset the group to a safe value...
       */
 
-      cupsdLogMessage(CUPSD_LOG_NOTICE,
+      cupsdLogMessage(CUPSD_LOG_ERROR,
                       "Group and SystemGroup cannot use the same groups.");
+      if (FatalErrors & (CUPSD_FATAL_CONFIG | CUPSD_FATAL_PERMISSIONS))
+        return (0);
+
       cupsdLogMessage(CUPSD_LOG_INFO, "Resetting Group to \"nobody\"...");
 
       group = getgrnam("nobody");
@@ -1084,24 +1179,11 @@ cupsdReadConfiguration(void)
     cupsdSetStringf(&CacheDir, "%s/%s", ServerRoot, CacheDir);
 
 #ifdef HAVE_SSL
-  if (ServerCertificate[0] != '/')
-    cupsdSetStringf(&ServerCertificate, "%s/%s", ServerRoot, ServerCertificate);
-
-  if (!strncmp(ServerRoot, ServerCertificate, strlen(ServerRoot)) &&
-      cupsdCheckPermissions(ServerCertificate, NULL, 0600, RunUser, Group,
-                            0, 0) < 0 &&
-      (FatalErrors & CUPSD_FATAL_PERMISSIONS))
-    return (0);
+  if (ServerKeychain[0] != '/')
+    cupsdSetStringf(&ServerKeychain, "%s/%s", ServerRoot, ServerKeychain);
 
-#  if defined(HAVE_LIBSSL) || defined(HAVE_GNUTLS)
-  if (ServerKey[0] != '/')
-    cupsdSetStringf(&ServerKey, "%s/%s", ServerRoot, ServerKey);
-
-  if (!strncmp(ServerRoot, ServerKey, strlen(ServerRoot)) &&
-      cupsdCheckPermissions(ServerKey, NULL, 0600, RunUser, Group, 0, 0) < 0 &&
-      (FatalErrors & CUPSD_FATAL_PERMISSIONS))
-    return (0);
-#  endif /* HAVE_LIBSSL || HAVE_GNUTLS */
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "Using keychain \"%s\" for server name \"%s\".", ServerKeychain, ServerName);
+  cupsSetServerCredentials(ServerKeychain, ServerName, 1);
 #endif /* HAVE_SSL */
 
  /*
@@ -1113,7 +1195,7 @@ cupsdReadConfiguration(void)
 
   if ((cupsdCheckPermissions(RequestRoot, NULL, 0710, RunUser,
                             Group, 1, 1) < 0 ||
-       cupsdCheckPermissions(CacheDir, NULL, 0775, RunUser,
+       cupsdCheckPermissions(CacheDir, NULL, 0770, RunUser,
                             Group, 1, 1) < 0 ||
        cupsdCheckPermissions(temp, NULL, 0775, RunUser,
                             Group, 1, 1) < 0 ||
@@ -1189,6 +1271,8 @@ cupsdReadConfiguration(void)
     cupsdSetStringf(&TempDir, "%s/tmp", RequestRoot);
   }
 
+  setenv("TMPDIR", TempDir, 1);
+
  /*
   * Make sure the temporary directory has the right permissions...
   */
@@ -1212,6 +1296,19 @@ cupsdReadConfiguration(void)
 
   cupsdUpdateEnv();
 
+  /*
+   * Validate the default error policy...
+   */
+
+  if (strcmp(ErrorPolicy, "retry-current-job") &&
+      strcmp(ErrorPolicy, "abort-job") &&
+      strcmp(ErrorPolicy, "retry-job") &&
+      strcmp(ErrorPolicy, "stop-printer"))
+  {
+    cupsdLogMessage(CUPSD_LOG_ALERT, "Invalid ErrorPolicy \"%s\", resetting to \"stop-printer\".", ErrorPolicy);
+    cupsdSetString(&ErrorPolicy, "stop-printer");
+  }
+
  /*
   * Update default paper size setting as needed...
   */
@@ -1334,6 +1431,7 @@ cupsdReadConfiguration(void)
       cupsdAddString(&(p->job_attrs), "job-name");
       cupsdAddString(&(p->job_attrs), "job-originating-host-name");
       cupsdAddString(&(p->job_attrs), "job-originating-user-name");
+      cupsdAddString(&(p->job_attrs), "phone");
 
       cupsdLogMessage(CUPSD_LOG_INFO, "SubscriptionPrivateAccess default");
       cupsdAddString(&(p->sub_access), "@OWNER");
@@ -1542,7 +1640,7 @@ cupsdReadConfiguration(void)
     if (!mimeType(MimeDatabase, "application", "octet-stream"))
       NumMimeTypes ++;
 
-    if ((MimeTypes = calloc(NumMimeTypes, sizeof(const char *))) == NULL)
+    if ((MimeTypes = calloc((size_t)NumMimeTypes, sizeof(const char *))) == NULL)
     {
       cupsdLogMessage(CUPSD_LOG_ERROR,
                       "Unable to allocate memory for %d MIME types.",
@@ -1816,7 +1914,8 @@ get_addr_and_mask(const char *value,      /* I - String from config file */
        * Merge everything into a 32-bit IPv4 address in ip[3]...
        */
 
-       ip[3] = (((((val[0] << 8) | val[1]) << 8) | val[2]) << 8) | val[3];
+       ip[3] = ((((((unsigned)val[0] << 8) | (unsigned)val[1]) << 8) |
+                (unsigned)val[2]) << 8) | (unsigned)val[3];
 
        if (ipcount < 4)
          mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff;
@@ -1884,7 +1983,8 @@ get_addr_and_mask(const char *value,      /* I - String from config file */
     * Merge everything into a 32-bit IPv4 address in ip[3]...
     */
 
-    ip[3] = (((((val[0] << 8) | val[1]) << 8) | val[2]) << 8) | val[3];
+    ip[3] = ((((((unsigned)val[0] << 8) | (unsigned)val[1]) << 8) |
+             (unsigned)val[2]) << 8) | (unsigned)val[3];
 
     if (ipcount < 4)
       mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff;
@@ -1911,7 +2011,8 @@ get_addr_and_mask(const char *value,      /* I - String from config file */
                  mask + 3) != 4)
         return (0);
 
-      mask[3] |= ((((mask[0] << 8) | mask[1]) << 8) | mask[2]) << 8;
+      mask[3] |= (((((unsigned)mask[0] << 8) | (unsigned)mask[1]) << 8) |
+                  (unsigned)mask[2]) << 8;
       mask[0] = mask[1] = mask[2] = 0;
     }
     else
@@ -2034,8 +2135,8 @@ parse_aaa(cupsd_location_t *loc,  /* I - Location */
     else if (!_cups_strcasecmp(value, "always"))
     {
       cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "Encryption value \"%s\" on line %d is invalid in this "
-                     "context. Using \"required\" instead.", value, linenum);
+                      "Encryption value \"%s\" on line %d of %s is invalid in this "
+                     "context. Using \"required\" instead.", value, linenum, ConfigurationFile);
 
       loc->encryption = HTTP_ENCRYPT_REQUIRED;
     }
@@ -2046,7 +2147,7 @@ parse_aaa(cupsd_location_t *loc,  /* I - Location */
     else
     {
       cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "Unknown Encryption value %s on line %d.", value, linenum);
+                      "Unknown Encryption value %s on line %d of %s.", value, linenum, ConfigurationFile);
       return (0);
     }
   }
@@ -2062,8 +2163,8 @@ parse_aaa(cupsd_location_t *loc,  /* I - Location */
       loc->order_type = CUPSD_AUTH_DENY;
     else
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown Order value %s on line %d.",
-                     value, linenum);
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown Order value %s on line %d of %s.",
+                     value, linenum, ConfigurationFile);
       return (0);
     }
   }
@@ -2165,8 +2266,8 @@ parse_aaa(cupsd_location_t *loc,  /* I - Location */
 
        if (!get_addr_and_mask(value, ip, mask))
        {
-         cupsdLogMessage(CUPSD_LOG_ERROR, "Bad netmask value %s on line %d.",
-                         value, linenum);
+         cupsdLogMessage(CUPSD_LOG_ERROR, "Bad netmask value %s on line %d of %s.",
+                         value, linenum, ConfigurationFile);
          return (0);
        }
 
@@ -2201,20 +2302,6 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */
       if (loc->level == CUPSD_AUTH_ANON)
        loc->level = CUPSD_AUTH_USER;
     }
-    else if (!_cups_strcasecmp(value, "digest"))
-    {
-      loc->type = CUPSD_AUTH_DIGEST;
-
-      if (loc->level == CUPSD_AUTH_ANON)
-       loc->level = CUPSD_AUTH_USER;
-    }
-    else if (!_cups_strcasecmp(value, "basicdigest"))
-    {
-      loc->type = CUPSD_AUTH_BASICDIGEST;
-
-      if (loc->level == CUPSD_AUTH_ANON)
-       loc->level = CUPSD_AUTH_USER;
-    }
     else if (!_cups_strcasecmp(value, "default"))
     {
       loc->type = CUPSD_AUTH_DEFAULT;
@@ -2234,8 +2321,8 @@ parse_aaa(cupsd_location_t *loc,  /* I - Location */
     else
     {
       cupsdLogMessage(CUPSD_LOG_WARN,
-                      "Unknown authorization type %s on line %d.",
-                     value, linenum);
+                      "Unknown authorization type %s on line %d of %s.",
+                     value, linenum, ConfigurationFile);
       return (0);
     }
   }
@@ -2261,8 +2348,8 @@ parse_aaa(cupsd_location_t *loc,  /* I - Location */
 
       cupsdLogMessage(CUPSD_LOG_WARN,
                       "\"AuthClass %s\" is deprecated; consider using "
-                     "\"Require valid-user\" on line %d.",
-                     value, linenum);
+                     "\"Require valid-user\" on line %d of %s.",
+                     value, linenum, ConfigurationFile);
     }
     else if (!_cups_strcasecmp(value, "group"))
     {
@@ -2270,8 +2357,8 @@ parse_aaa(cupsd_location_t *loc,  /* I - Location */
 
       cupsdLogMessage(CUPSD_LOG_WARN,
                       "\"AuthClass %s\" is deprecated; consider using "
-                     "\"Require user @groupname\" on line %d.",
-                     value, linenum);
+                     "\"Require user @groupname\" on line %d of %s.",
+                     value, linenum, ConfigurationFile);
     }
     else if (!_cups_strcasecmp(value, "system"))
     {
@@ -2281,14 +2368,14 @@ parse_aaa(cupsd_location_t *loc,        /* I - Location */
 
       cupsdLogMessage(CUPSD_LOG_WARN,
                       "\"AuthClass %s\" is deprecated; consider using "
-                     "\"Require user @SYSTEM\" on line %d.",
-                     value, linenum);
+                     "\"Require user @SYSTEM\" on line %d of %s.",
+                     value, linenum, ConfigurationFile);
     }
     else
     {
       cupsdLogMessage(CUPSD_LOG_WARN,
-                      "Unknown authorization class %s on line %d.",
-                     value, linenum);
+                      "Unknown authorization class %s on line %d of %s.",
+                     value, linenum, ConfigurationFile);
       return (0);
     }
   }
@@ -2298,8 +2385,8 @@ parse_aaa(cupsd_location_t *loc,  /* I - Location */
 
     cupsdLogMessage(CUPSD_LOG_WARN,
                     "\"AuthGroupName %s\" directive is deprecated; consider "
-                   "using \"Require user @%s\" on line %d.",
-                   value, value, linenum);
+                   "using \"Require user @%s\" on line %d of %s.",
+                   value, value, linenum, ConfigurationFile);
   }
   else if (!_cups_strcasecmp(line, "Require"))
   {
@@ -2325,8 +2412,8 @@ parse_aaa(cupsd_location_t *loc,  /* I - Location */
       loc->level = CUPSD_AUTH_GROUP;
     else
     {
-      cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Require type %s on line %d.",
-                     value, linenum);
+      cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Require type %s on line %d of %s.",
+                     value, linenum, ConfigurationFile);
       return (0);
     }
 
@@ -2388,8 +2475,8 @@ parse_aaa(cupsd_location_t *loc,  /* I - Location */
       loc->satisfy = CUPSD_AUTH_SATISFY_ANY;
     else
     {
-      cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Satisfy value %s on line %d.",
-                      value, linenum);
+      cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Satisfy value %s on line %d of %s.",
+                      value, linenum, ConfigurationFile);
       return (0);
     }
   }
@@ -2714,6 +2801,41 @@ parse_variable(
        }
        break;
 
+    case CUPSD_VARTYPE_PERM :
+       if (!value)
+       {
+         cupsdLogMessage(CUPSD_LOG_ERROR,
+                         "Missing permissions value for %s on line %d of %s.",
+                         line, linenum, filename);
+          return (0);
+       }
+       else if (!isdigit(*value & 255))
+       {
+        /* TODO: Add chmod UGO syntax support */
+         cupsdLogMessage(CUPSD_LOG_ERROR,
+                         "Bad permissions value for %s on line %d of %s.",
+                         line, linenum, filename);
+          return (0);
+       }
+       else
+       {
+         int n = strtol(value, NULL, 8);
+                                       /* Permissions value */
+
+         if (n < 0)
+         {
+           cupsdLogMessage(CUPSD_LOG_ERROR,
+                           "Bad negative permissions value for %s on line %d of "
+                           "%s.", line, linenum, filename);
+           return (0);
+         }
+         else
+         {
+           *((mode_t *)var->ptr) = (mode_t)n;
+         }
+       }
+       break;
+
     case CUPSD_VARTYPE_TIME :
        if (!value)
        {
@@ -2930,15 +3052,60 @@ read_cupsd_conf(cups_file_t *fp)        /* I - File to read from */
       JobRetryInterval = atoi(value);
       cupsdLogMessage(CUPSD_LOG_WARN,
                      "FaxRetryInterval is deprecated; use "
-                     "JobRetryInterval on line %d.", linenum);
+                     "JobRetryInterval on line %d of %s.", linenum, ConfigurationFile);
     }
     else if (!_cups_strcasecmp(line, "FaxRetryLimit") && value)
     {
       JobRetryLimit = atoi(value);
       cupsdLogMessage(CUPSD_LOG_WARN,
                      "FaxRetryLimit is deprecated; use "
-                     "JobRetryLimit on line %d.", linenum);
+                     "JobRetryLimit on line %d of %s.", linenum, ConfigurationFile);
     }
+#ifdef HAVE_SSL
+    else if (!_cups_strcasecmp(line, "SSLOptions"))
+    {
+     /*
+      * SSLOptions [AllowRC4] [AllowSSL3] [None]
+      */
+
+      int      options = 0;            /* SSL/TLS options */
+
+      if (value)
+      {
+        char   *start,                 /* Start of option */
+               *end;                   /* End of option */
+
+       for (start = value; *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"))
+           options |= _HTTP_TLS_ALLOW_SSL3;
+          else if (!_cups_strcasecmp(start, "None"))
+           options = 0;
+         else if (_cups_strcasecmp(start, "NoEmptyFragments"))
+           cupsdLogMessage(CUPSD_LOG_WARN, "Unknown SSL option %s at line %d.", start, linenum);
+        }
+      }
+
+      _httpTLSSetOptions(options);
+    }
+#endif /* HAVE_SSL */
     else if ((!_cups_strcasecmp(line, "Port") || !_cups_strcasecmp(line, "Listen")
 #ifdef HAVE_SSL
              || !_cups_strcasecmp(line, "SSLPort") || !_cups_strcasecmp(line, "SSLListen")
@@ -2979,14 +3146,20 @@ read_cupsd_conf(cups_file_t *fp)        /* I - File to read from */
             lis;
             lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
           if (httpAddrEqual(&(addr->addr), &(lis->address)) &&
-             _httpAddrPort(&(addr->addr)) == _httpAddrPort(&(lis->address)))
+             httpAddrPort(&(addr->addr)) == httpAddrPort(&(lis->address)))
            break;
 
         if (lis)
        {
-         httpAddrString(&lis->address, temp, sizeof(temp));
-         cupsdLogMessage(CUPSD_LOG_WARN,
-                         "Duplicate listen address \"%s\" ignored.", temp);
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+         if (!lis->on_demand)
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
+         {
+           httpAddrString(&lis->address, temp, sizeof(temp));
+           cupsdLogMessage(CUPSD_LOG_WARN,
+                           "Duplicate listen address \"%s\" ignored.", temp);
+         }
+
           continue;
        }
 
@@ -3035,11 +3208,11 @@ read_cupsd_conf(cups_file_t *fp)        /* I - File to read from */
        else
 #endif /* AF_LOCAL */
        cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s:%d (IPv%d)", temp,
-                        _httpAddrPort(&(lis->address)),
-                       _httpAddrFamily(&(lis->address)) == AF_INET ? 4 : 6);
+                        httpAddrPort(&(lis->address)),
+                       httpAddrFamily(&(lis->address)) == AF_INET ? 4 : 6);
 
         if (!httpAddrLocalhost(&(lis->address)))
-         RemotePort = _httpAddrPort(&(lis->address));
+         RemotePort = httpAddrPort(&(lis->address));
       }
 
      /*
@@ -3061,8 +3234,8 @@ read_cupsd_conf(cups_file_t *fp)  /* I - File to read from */
       if (protocols < 0)
       {
        cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "Unknown browse protocol \"%s\" on line %d.",
-                       value, linenum);
+                       "Unknown browse protocol \"%s\" on line %d of %s.",
+                       value, linenum, ConfigurationFile);
         break;
       }
 
@@ -3078,10 +3251,6 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
        default_auth_type = CUPSD_AUTH_NONE;
       else if (!_cups_strcasecmp(value, "basic"))
        default_auth_type = CUPSD_AUTH_BASIC;
-      else if (!_cups_strcasecmp(value, "digest"))
-       default_auth_type = CUPSD_AUTH_DIGEST;
-      else if (!_cups_strcasecmp(value, "basicdigest"))
-       default_auth_type = CUPSD_AUTH_BASICDIGEST;
 #ifdef HAVE_GSSAPI
       else if (!_cups_strcasecmp(value, "negotiate"))
         default_auth_type = CUPSD_AUTH_NEGOTIATE;
@@ -3091,8 +3260,8 @@ read_cupsd_conf(cups_file_t *fp)  /* I - File to read from */
       else
       {
        cupsdLogMessage(CUPSD_LOG_WARN,
-                       "Unknown default authorization type %s on line %d.",
-                       value, linenum);
+                       "Unknown default authorization type %s on line %d of %s.",
+                       value, linenum, ConfigurationFile);
        if (FatalErrors & CUPSD_FATAL_CONFIG)
          return (0);
       }
@@ -3113,8 +3282,8 @@ read_cupsd_conf(cups_file_t *fp)  /* I - File to read from */
       else
       {
        cupsdLogMessage(CUPSD_LOG_WARN,
-                       "Unknown default encryption %s on line %d.",
-                       value, linenum);
+                       "Unknown default encryption %s on line %d of %s.",
+                       value, linenum, ConfigurationFile);
        if (FatalErrors & CUPSD_FATAL_CONFIG)
          return (0);
       }
@@ -3135,8 +3304,8 @@ read_cupsd_conf(cups_file_t *fp)  /* I - File to read from */
       else if (!_cups_strcasecmp(value, "double"))
         HostNameLookups = 2;
       else
-       cupsdLogMessage(CUPSD_LOG_WARN, "Unknown HostNameLookups %s on line %d.",
-                       value, linenum);
+       cupsdLogMessage(CUPSD_LOG_WARN, "Unknown HostNameLookups %s on line %d of %s.",
+                       value, linenum, ConfigurationFile);
     }
     else if (!_cups_strcasecmp(line, "AccessLogLevel") && value)
     {
@@ -3150,9 +3319,11 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
         AccessLogLevel = CUPSD_ACCESSLOG_ACTIONS;
       else if (!_cups_strcasecmp(value, "config"))
         AccessLogLevel = CUPSD_ACCESSLOG_CONFIG;
+      else if (!_cups_strcasecmp(value, "none"))
+        AccessLogLevel = CUPSD_ACCESSLOG_NONE;
       else
-        cupsdLogMessage(CUPSD_LOG_WARN, "Unknown AccessLogLevel %s on line %d.",
-                       value, linenum);
+        cupsdLogMessage(CUPSD_LOG_WARN, "Unknown AccessLogLevel %s on line %d of %s.",
+                       value, linenum, ConfigurationFile);
     }
     else if (!_cups_strcasecmp(line, "LogLevel") && value)
     {
@@ -3181,8 +3352,8 @@ read_cupsd_conf(cups_file_t *fp)  /* I - File to read from */
       else if (!_cups_strcasecmp(value, "none"))
         LogLevel = CUPSD_LOG_NONE;
       else
-        cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogLevel %s on line %d.",
-                       value, linenum);
+        cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogLevel %s on line %d of %s.",
+                       value, linenum, ConfigurationFile);
     }
     else if (!_cups_strcasecmp(line, "LogTimeFormat") && value)
     {
@@ -3195,8 +3366,8 @@ read_cupsd_conf(cups_file_t *fp)  /* I - File to read from */
       else if (!_cups_strcasecmp(value, "usecs"))
         LogTimeFormat = CUPSD_TIME_USECS;
       else
-        cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogTimeFormat %s on line %d.",
-                       value, linenum);
+        cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogTimeFormat %s on line %d of %s.",
+                       value, linenum, ConfigurationFile);
     }
     else if (!_cups_strcasecmp(line, "ServerTokens") && value)
     {
@@ -3227,8 +3398,8 @@ read_cupsd_conf(cups_file_t *fp)  /* I - File to read from */
       else if (!_cups_strcasecmp(value, "None"))
        cupsdClearString(&ServerHeader);
       else
-       cupsdLogMessage(CUPSD_LOG_WARN, "Unknown ServerTokens %s on line %d.",
-                        value, linenum);
+       cupsdLogMessage(CUPSD_LOG_WARN, "Unknown ServerTokens %s on line %d of %s.",
+                        value, linenum, ConfigurationFile);
     }
     else if (!_cups_strcasecmp(line, "PassEnv") && value)
     {
@@ -3304,26 +3475,9 @@ read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
       }
       else
         cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "Missing value for SetEnv directive on line %d.",
-                       linenum);
+                       "Missing value for SetEnv directive on line %d of %s.",
+                       linenum, ConfigurationFile);
     }
-#ifdef HAVE_SSL
-    else if (!_cups_strcasecmp(line, "SSLOptions"))
-    {
-     /*
-      * SSLOptions options
-      */
-
-      if (!value || !_cups_strcasecmp(value, "none"))
-        SSLOptions = CUPSD_SSL_NONE;
-      else if (!_cups_strcasecmp(value, "noemptyfragments"))
-        SSLOptions = CUPSD_SSL_NOEMPTY;
-      else
-        cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "Unknown value \"%s\" for SSLOptions directive on "
-                       "line %d.", value, linenum);
-    }
-#endif /* HAVE_SSL */
     else if (!_cups_strcasecmp(line, "AccessLog") ||
              !_cups_strcasecmp(line, "CacheDir") ||
              !_cups_strcasecmp(line, "ConfigFilePerm") ||
@@ -3344,6 +3498,7 @@ read_cupsd_conf(cups_file_t *fp)  /* I - File to read from */
              !_cups_strcasecmp(line, "ServerBin") ||
              !_cups_strcasecmp(line, "ServerCertificate") ||
              !_cups_strcasecmp(line, "ServerKey") ||
+             !_cups_strcasecmp(line, "ServerKeychain") ||
              !_cups_strcasecmp(line, "ServerRoot") ||
              !_cups_strcasecmp(line, "SMBConfigFile") ||
              !_cups_strcasecmp(line, "StateDir") ||
@@ -3397,7 +3552,7 @@ read_cups_files_conf(cups_file_t *fp)     /* I - File to read from */
       */
 
       if (isdigit(value[0]))
-        Group = atoi(value);
+        Group = (gid_t)atoi(value);
       else
       {
         endgrent();
@@ -3436,6 +3591,30 @@ read_cups_files_conf(cups_file_t *fp)    /* I - File to read from */
           return (0);
       }
     }
+    else if (!_cups_strcasecmp(line, "Sandboxing") && value)
+    {
+     /*
+      * Level of sandboxing?
+      */
+
+      if (!_cups_strcasecmp(value, "off") && getuid())
+      {
+        Sandboxing = CUPSD_SANDBOXING_OFF;
+        cupsdLogMessage(CUPSD_LOG_WARN, "Disabling sandboxing is not recommended (line %d of %s)", linenum, CupsFilesFile);
+      }
+      else if (!_cups_strcasecmp(value, "relaxed"))
+        Sandboxing = CUPSD_SANDBOXING_RELAXED;
+      else if (!_cups_strcasecmp(value, "strict"))
+        Sandboxing = CUPSD_SANDBOXING_STRICT;
+      else
+      {
+       cupsdLogMessage(CUPSD_LOG_ERROR,
+                       "Unknown Sandboxing \"%s\" on line %d of %s.",
+                       value, linenum, CupsFilesFile);
+        if (FatalErrors & CUPSD_FATAL_CONFIG)
+          return (0);
+      }
+    }
     else if (!_cups_strcasecmp(line, "SystemGroup") && value)
     {
      /*
@@ -3472,7 +3651,7 @@ read_cups_files_conf(cups_file_t *fp)     /* I - File to read from */
             return (0);
         }
         else
-         User = atoi(value);
+         User = (uid_t)atoi(value);
       }
       else
       {
@@ -3506,6 +3685,15 @@ read_cups_files_conf(cups_file_t *fp)    /* I - File to read from */
         }
       }
     }
+    else if (!_cups_strcasecmp(line, "ServerCertificate") ||
+             !_cups_strcasecmp(line, "ServerKey"))
+    {
+      cupsdLogMessage(CUPSD_LOG_INFO,
+                     "The \"%s\" directive on line %d of %s is no longer "
+                     "supported; this will become an error in a future "
+                     "release.",
+                     line, linenum, CupsFilesFile);
+    }
     else if (!parse_variable(CupsFilesFile, linenum, line, value,
                             sizeof(cupsfiles_vars) / sizeof(cupsfiles_vars[0]),
                             cupsfiles_vars) &&
@@ -3535,8 +3723,8 @@ read_location(cups_file_t *fp,            /* I - Configuration file */
 
 
   if ((parent = cupsdFindLocation(location)) != NULL)
-    cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate <Location %s> on line %d.",
-                    location, linenum);
+    cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate <Location %s> on line %d of %s.",
+                    location, linenum, ConfigurationFile);
   else if ((parent = cupsdNewLocation(location)) == NULL)
     return (0);
   else
@@ -3561,7 +3749,7 @@ read_location(cups_file_t *fp,            /* I - Configuration file */
     {
       if (!value)
       {
-        cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d.", linenum);
+        cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d of %s.", linenum, ConfigurationFile);
         if (FatalErrors & CUPSD_FATAL_CONFIG)
          return (0);
         else
@@ -3596,8 +3784,8 @@ read_location(cups_file_t *fp,            /* I - Configuration file */
        else if (!strcmp(value, "TRACE"))
          loc->limit |= CUPSD_AUTH_LIMIT_TRACE;
        else
-         cupsdLogMessage(CUPSD_LOG_WARN, "Unknown request type %s on line %d.",
-                         value, linenum);
+         cupsdLogMessage(CUPSD_LOG_WARN, "Unknown request type %s on line %d of %s.",
+                         value, linenum, ConfigurationFile);
 
         for (value = valptr; isspace(*value & 255); value ++);
       }
@@ -3612,15 +3800,15 @@ read_location(cups_file_t *fp,          /* I - Configuration file */
       loc = parent;
     else if (!value)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d.", linenum);
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d of %s.", linenum, ConfigurationFile);
       if (FatalErrors & CUPSD_FATAL_CONFIG)
        return (0);
     }
     else if (!parse_aaa(loc, line, value, linenum))
     {
       cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "Unknown Location directive %s on line %d.",
-                     line, linenum);
+                      "Unknown Location directive %s on line %d of %s.",
+                     line, linenum, ConfigurationFile);
       if (FatalErrors & CUPSD_FATAL_CONFIG)
        return (0);
     }
@@ -3659,8 +3847,8 @@ read_policy(cups_file_t *fp,              /* I - Configuration file */
   */
 
   if ((pol = cupsdFindPolicy(policy)) != NULL)
-    cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate <Policy %s> on line %d.",
-                    policy, linenum);
+    cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate <Policy %s> on line %d of %s.",
+                    policy, linenum, ConfigurationFile);
   else if ((pol = cupsdAddPolicy(policy)) == NULL)
     return (0);
 
@@ -3681,8 +3869,8 @@ read_policy(cups_file_t *fp,              /* I - Configuration file */
     {
       if (op)
         cupsdLogMessage(CUPSD_LOG_WARN,
-                       "Missing </Limit> before </Policy> on line %d.",
-                       linenum);
+                       "Missing </Limit> before </Policy> on line %d of %s.",
+                       linenum, ConfigurationFile);
 
       set_policy_defaults(pol);
 
@@ -3692,7 +3880,7 @@ read_policy(cups_file_t *fp,              /* I - Configuration file */
     {
       if (!value)
       {
-        cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d.", linenum);
+        cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d of %s.", linenum, ConfigurationFile);
         if (FatalErrors & CUPSD_FATAL_CONFIG)
          return (0);
         else
@@ -3718,15 +3906,15 @@ read_policy(cups_file_t *fp,            /* I - Configuration file */
            ops[num_ops] = IPP_ANY_OPERATION;
          else if ((ops[num_ops] = ippOpValue(value)) == IPP_BAD_OPERATION)
            cupsdLogMessage(CUPSD_LOG_ERROR,
-                           "Bad IPP operation name \"%s\" on line %d.",
-                           value, linenum);
+                           "Bad IPP operation name \"%s\" on line %d of %s.",
+                           value, linenum, ConfigurationFile);
           else
            num_ops ++;
        }
        else
          cupsdLogMessage(CUPSD_LOG_ERROR,
-                         "Too many operations listed on line %d.",
-                         linenum);
+                         "Too many operations listed on line %d of %s.",
+                         linenum, ConfigurationFile);
 
         for (value = valptr; isspace(*value & 255); value ++);
       }
@@ -3767,7 +3955,7 @@ read_policy(cups_file_t *fp,              /* I - Configuration file */
     }
     else if (!value)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d.", linenum);
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d of %s.", linenum, ConfigurationFile);
       if (FatalErrors & CUPSD_FATAL_CONFIG)
        return (0);
     }
@@ -3780,7 +3968,7 @@ read_policy(cups_file_t *fp,              /* I - Configuration file */
       {
         cupsdLogMessage(CUPSD_LOG_ERROR,
                        "%s directive must appear outside <Limit>...</Limit> "
-                       "on line %d.", line, linenum);
+                       "on line %d of %s.", line, linenum, ConfigurationFile);
        if (FatalErrors & CUPSD_FATAL_CONFIG)
          return (0);
       }
@@ -3878,16 +4066,16 @@ read_policy(cups_file_t *fp,            /* I - Configuration file */
     else if (!op)
     {
       cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "Missing <Limit ops> directive before %s on line %d.",
-                      line, linenum);
+                      "Missing <Limit ops> directive before %s on line %d of %s.",
+                      line, linenum, ConfigurationFile);
       if (FatalErrors & CUPSD_FATAL_CONFIG)
        return (0);
     }
     else if (!parse_aaa(op, line, value, linenum))
     {
       cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "Unknown Policy Limit directive %s on line %d.",
-                     line, linenum);
+                     "Unknown Policy Limit directive %s on line %d of %s.",
+                     line, linenum, ConfigurationFile);
 
       if (FatalErrors & CUPSD_FATAL_CONFIG)
        return (0);
@@ -3916,121 +4104,106 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */
   * Verify that we have an explicit policy for Validate-Job, Cancel-Jobs,
   * Cancel-My-Jobs, Close-Job, and CUPS-Get-Document, which ensures that
   * upgrades do not introduce new security issues...
+  *
+  * CUPS STR #4659: Allow a lone <Limit All> policy.
   */
 
-  if ((op = cupsdFindPolicyOp(pol, IPP_VALIDATE_JOB)) == NULL ||
-      op->op == IPP_ANY_OPERATION)
+  if (cupsArrayCount(pol->ops) > 1)
   {
-    if ((op = cupsdFindPolicyOp(pol, IPP_PRINT_JOB)) != NULL &&
-       op->op != IPP_ANY_OPERATION)
+    if ((op = cupsdFindPolicyOp(pol, IPP_VALIDATE_JOB)) == NULL ||
+       op->op == IPP_ANY_OPERATION)
     {
-     /*
-      * Add a new limit for Validate-Job using the Print-Job limit as a
-      * template...
-      */
+      if ((op = cupsdFindPolicyOp(pol, IPP_PRINT_JOB)) != NULL &&
+         op->op != IPP_ANY_OPERATION)
+      {
+       /*
+       * Add a new limit for Validate-Job using the Print-Job limit as a
+       * template...
+       */
 
-      cupsdLogMessage(CUPSD_LOG_WARN,
-                     "No limit for Validate-Job defined in policy %s "
-                     "- using Print-Job's policy.", pol->name);
+       cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Validate-Job defined in policy %s - using Print-Job's policy.", pol->name);
 
-      cupsdAddPolicyOp(pol, op, IPP_VALIDATE_JOB);
+       cupsdAddPolicyOp(pol, op, IPP_VALIDATE_JOB);
+      }
+      else
+       cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Validate-Job defined in policy %s and no suitable template found.", pol->name);
     }
-    else
-      cupsdLogMessage(CUPSD_LOG_WARN,
-                     "No limit for Validate-Job defined in policy %s "
-                     "and no suitable template found.", pol->name);
-  }
 
-  if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_JOBS)) == NULL ||
-      op->op == IPP_ANY_OPERATION)
-  {
-    if ((op = cupsdFindPolicyOp(pol, IPP_PAUSE_PRINTER)) != NULL &&
-       op->op != IPP_ANY_OPERATION)
+    if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_JOBS)) == NULL ||
+       op->op == IPP_ANY_OPERATION)
     {
-     /*
-      * Add a new limit for Cancel-Jobs using the Pause-Printer limit as a
-      * template...
-      */
+      if ((op = cupsdFindPolicyOp(pol, IPP_PAUSE_PRINTER)) != NULL &&
+         op->op != IPP_ANY_OPERATION)
+      {
+       /*
+       * Add a new limit for Cancel-Jobs using the Pause-Printer limit as a
+       * template...
+       */
 
-      cupsdLogMessage(CUPSD_LOG_WARN,
-                     "No limit for Cancel-Jobs defined in policy %s "
-                     "- using Pause-Printer's policy.", pol->name);
+       cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-Jobs defined in policy %s - using Pause-Printer's policy.", pol->name);
 
-      cupsdAddPolicyOp(pol, op, IPP_CANCEL_JOBS);
+       cupsdAddPolicyOp(pol, op, IPP_CANCEL_JOBS);
+      }
+      else
+       cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-Jobs defined in policy %s and no suitable template found.", pol->name);
     }
-    else
-      cupsdLogMessage(CUPSD_LOG_WARN,
-                     "No limit for Cancel-Jobs defined in policy %s "
-                     "and no suitable template found.", pol->name);
-  }
 
-  if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_MY_JOBS)) == NULL ||
-      op->op == IPP_ANY_OPERATION)
-  {
-    if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
-       op->op != IPP_ANY_OPERATION)
+    if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_MY_JOBS)) == NULL ||
+       op->op == IPP_ANY_OPERATION)
     {
-     /*
-      * Add a new limit for Cancel-My-Jobs using the Send-Document limit as
-      * a template...
-      */
+      if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
+         op->op != IPP_ANY_OPERATION)
+      {
+       /*
+       * Add a new limit for Cancel-My-Jobs using the Send-Document limit as
+       * a template...
+       */
 
-      cupsdLogMessage(CUPSD_LOG_WARN,
-                     "No limit for Cancel-My-Jobs defined in policy %s "
-                     "- using Send-Document's policy.", pol->name);
+       cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-My-Jobs defined in policy %s - using Send-Document's policy.", pol->name);
 
-      cupsdAddPolicyOp(pol, op, IPP_CANCEL_MY_JOBS);
+       cupsdAddPolicyOp(pol, op, IPP_CANCEL_MY_JOBS);
+      }
+      else
+       cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-My-Jobs defined in policy %s and no suitable template found.", pol->name);
     }
-    else
-      cupsdLogMessage(CUPSD_LOG_WARN,
-                     "No limit for Cancel-My-Jobs defined in policy %s "
-                     "and no suitable template found.", pol->name);
-  }
 
-  if ((op = cupsdFindPolicyOp(pol, IPP_CLOSE_JOB)) == NULL ||
-      op->op == IPP_ANY_OPERATION)
-  {
-    if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
-       op->op != IPP_ANY_OPERATION)
+    if ((op = cupsdFindPolicyOp(pol, IPP_CLOSE_JOB)) == NULL ||
+       op->op == IPP_ANY_OPERATION)
     {
-     /*
-      * Add a new limit for Close-Job using the Send-Document limit as a
-      * template...
-      */
+      if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
+         op->op != IPP_ANY_OPERATION)
+      {
+       /*
+       * Add a new limit for Close-Job using the Send-Document limit as a
+       * template...
+       */
 
-      cupsdLogMessage(CUPSD_LOG_WARN,
-                     "No limit for Close-Job defined in policy %s "
-                     "- using Send-Document's policy.", pol->name);
+       cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Close-Job defined in policy %s - using Send-Document's policy.", pol->name);
 
-      cupsdAddPolicyOp(pol, op, IPP_CLOSE_JOB);
+       cupsdAddPolicyOp(pol, op, IPP_CLOSE_JOB);
+      }
+      else
+       cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Close-Job defined in policy %s and no suitable template found.", pol->name);
     }
-    else
-      cupsdLogMessage(CUPSD_LOG_WARN,
-                     "No limit for Close-Job defined in policy %s "
-                     "and no suitable template found.", pol->name);
-  }
 
-  if ((op = cupsdFindPolicyOp(pol, CUPS_GET_DOCUMENT)) == NULL ||
-      op->op == IPP_ANY_OPERATION)
-  {
-    if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
-       op->op != IPP_ANY_OPERATION)
+    if ((op = cupsdFindPolicyOp(pol, CUPS_GET_DOCUMENT)) == NULL ||
+       op->op == IPP_ANY_OPERATION)
     {
-     /*
-      * Add a new limit for CUPS-Get-Document using the Send-Document
-      * limit as a template...
-      */
+      if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
+         op->op != IPP_ANY_OPERATION)
+      {
+       /*
+       * Add a new limit for CUPS-Get-Document using the Send-Document
+       * limit as a template...
+       */
 
-      cupsdLogMessage(CUPSD_LOG_WARN,
-                     "No limit for CUPS-Get-Document defined in policy %s "
-                     "- using Send-Document's policy.", pol->name);
+       cupsdLogMessage(CUPSD_LOG_WARN, "No limit for CUPS-Get-Document defined in policy %s - using Send-Document's policy.", pol->name);
 
-      cupsdAddPolicyOp(pol, op, CUPS_GET_DOCUMENT);
+       cupsdAddPolicyOp(pol, op, CUPS_GET_DOCUMENT);
+      }
+      else
+       cupsdLogMessage(CUPSD_LOG_WARN, "No limit for CUPS-Get-Document defined in policy %s and no suitable template found.", pol->name);
     }
-    else
-      cupsdLogMessage(CUPSD_LOG_WARN,
-                     "No limit for CUPS-Get-Document defined in policy %s "
-                     "and no suitable template found.", pol->name);
   }
 
  /*
@@ -4040,18 +4213,14 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */
 
   if (!pol->job_access)
   {
-    cupsdLogMessage(CUPSD_LOG_WARN,
-                   "No JobPrivateAccess defined in policy %s "
-                   "- using defaults.", pol->name);
+    cupsdLogMessage(CUPSD_LOG_WARN, "No JobPrivateAccess defined in policy %s - using defaults.", pol->name);
     cupsdAddString(&(pol->job_access), "@OWNER");
     cupsdAddString(&(pol->job_access), "@SYSTEM");
   }
 
   if (!pol->job_attrs)
   {
-    cupsdLogMessage(CUPSD_LOG_WARN,
-                   "No JobPrivateValues defined in policy %s "
-                   "- using defaults.", pol->name);
+    cupsdLogMessage(CUPSD_LOG_WARN, "No JobPrivateValues defined in policy %s - using defaults.", pol->name);
     cupsdAddString(&(pol->job_attrs), "job-name");
     cupsdAddString(&(pol->job_attrs), "job-originating-host-name");
     cupsdAddString(&(pol->job_attrs), "job-originating-user-name");
@@ -4060,18 +4229,14 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */
 
   if (!pol->sub_access)
   {
-    cupsdLogMessage(CUPSD_LOG_WARN,
-                   "No SubscriptionPrivateAccess defined in policy %s "
-                   "- using defaults.", pol->name);
+    cupsdLogMessage(CUPSD_LOG_WARN, "No SubscriptionPrivateAccess defined in policy %s - using defaults.", pol->name);
     cupsdAddString(&(pol->sub_access), "@OWNER");
     cupsdAddString(&(pol->sub_access), "@SYSTEM");
   }
 
   if (!pol->sub_attrs)
   {
-    cupsdLogMessage(CUPSD_LOG_WARN,
-                   "No SubscriptionPrivateValues defined in policy %s "
-                   "- using defaults.", pol->name);
+    cupsdLogMessage(CUPSD_LOG_WARN, "No SubscriptionPrivateValues defined in policy %s - using defaults.", pol->name);
     cupsdAddString(&(pol->sub_attrs), "notify-events");
     cupsdAddString(&(pol->sub_attrs), "notify-pull-method");
     cupsdAddString(&(pol->sub_attrs), "notify-recipient-uri");
@@ -4082,5 +4247,5 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */
 
 
 /*
- * End of "$Id: conf.c 11221 2013-08-06 16:16:01Z msweet $".
+ * End of "$Id: conf.c 12819 2015-07-31 13:52:00Z msweet $".
  */
index 8bf0749..59cb157 100644 (file)
@@ -1,16 +1,16 @@
 /*
- * "$Id: conf.h 11221 2013-08-06 16:16:01Z msweet $"
+ * "$Id: conf.h 12689 2015-06-03 19:49:54Z msweet $"
  *
- *   Configuration file definitions for the CUPS scheduler.
+ * Configuration file definitions for the CUPS scheduler.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 
 
 typedef enum
 {
-  CUPSD_LOG_PPD = -4,                  /* Used internally for PPD keywords */
+  CUPSD_LOG_PPD = -5,                  /* Used internally for PPD keywords */
   CUPSD_LOG_ATTR,                      /* Used internally for attributes */
-  CUPSD_LOG_STATE,                     /* Used internally for state-reasons */
+  CUPSD_LOG_STATE,                     /* Used internally for printer-state-reasons */
+  CUPSD_LOG_JOBSTATE,                  /* Used internally for job-state-reasons */
   CUPSD_LOG_PAGE,                      /* Used internally for page logging */
   CUPSD_LOG_NONE,
   CUPSD_LOG_EMERG,                     /* Emergency issues */
@@ -38,6 +39,7 @@ typedef enum
 
 typedef enum
 {
+  CUPSD_ACCESSLOG_NONE,                        /* Log no requests */
   CUPSD_ACCESSLOG_CONFIG,              /* Log config requests */
   CUPSD_ACCESSLOG_ACTIONS,             /* Log config, print, and job management requests */
   CUPSD_ACCESSLOG_ALL                  /* Log everything */
@@ -49,6 +51,13 @@ typedef enum
   CUPSD_TIME_USECS                     /* Standard format with microseconds */
 } cupsd_time_t;
 
+typedef enum
+{
+  CUPSD_SANDBOXING_OFF,                        /* No sandboxing */
+  CUPSD_SANDBOXING_RELAXED,            /* Relaxed sandboxing */
+  CUPSD_SANDBOXING_STRICT              /* Strict sandboxing */
+} cupsd_sandboxing_t;
+
 
 /*
  * FatalErrors flags...
@@ -73,14 +82,6 @@ typedef enum
 
 
 /*
- * SSL options (bits)...
- */
-
-#define CUPSD_SSL_NONE         0       /* No special options */
-#define CUPSD_SSL_NOEMPTY      1       /* Do not insert empty fragments */
-
-
-/*
  * ServerAlias data...
  */
 
@@ -149,38 +150,44 @@ VAR char          *AccessLog              VALUE(NULL),
                                        /* Temporary directory */
                        *Printcap               VALUE(NULL),
                                        /* Printcap file */
-                       *PrintcapGUI            VALUE(NULL),
-                                       /* GUI program to use for IRIX */
                        *FontPath               VALUE(NULL),
                                        /* Font search path */
                        *RemoteRoot             VALUE(NULL),
                                        /* Remote root user */
                        *Classification         VALUE(NULL);
                                        /* Classification of system */
-VAR uid_t              User                    VALUE(1);
+VAR uid_t              User                    VALUE(1),
                                        /* User ID for server */
+                       RunUser                 VALUE(0);
+                                       /* User to run as, used for files */
 VAR gid_t              Group                   VALUE(0);
                                        /* Group ID for server */
 VAR cupsd_accesslog_t  AccessLogLevel          VALUE(CUPSD_ACCESSLOG_ACTIONS);
                                        /* Access log level */
 VAR int                        ClassifyOverride        VALUE(0),
                                        /* Allow overrides? */
-                       ConfigFilePerm          VALUE(0640),
-                                       /* Permissions for config files */
                        LogDebugHistory         VALUE(200),
                                        /* Amount of automatic debug history */
                        FatalErrors             VALUE(CUPSD_FATAL_CONFIG),
                                        /* Which errors are fatal? */
                        StrictConformance       VALUE(FALSE),
                                        /* Require strict IPP conformance? */
-                       SyncOnClose             VALUE(FALSE),
+                       SyncOnClose             VALUE(FALSE);
                                        /* Call fsync() when closing files? */
-                       LogFilePerm             VALUE(0644);
+VAR mode_t             ConfigFilePerm          VALUE(0640U),
+                                       /* Permissions for config files */
+                       LogFilePerm             VALUE(0644U);
                                        /* Permissions for log files */
 VAR cupsd_loglevel_t   LogLevel                VALUE(CUPSD_LOG_WARN);
                                        /* Error log level */
 VAR cupsd_time_t       LogTimeFormat           VALUE(CUPSD_TIME_STANDARD);
                                        /* Log file time format */
+VAR cups_file_t                *LogStderr              VALUE(NULL);
+                                       /* Stderr file, if any */
+VAR cupsd_sandboxing_t Sandboxing              VALUE(CUPSD_SANDBOXING_STRICT);
+                                       /* Sandboxing level */
+VAR int                        UseSandboxing   VALUE(1);
+                                       /* Use sandboxing for child procs? */
 VAR int                        MaxClients              VALUE(100),
                                        /* Maximum number of clients */
                        MaxClientsPerHost       VALUE(0),
@@ -211,8 +218,6 @@ VAR int                     MaxClients              VALUE(100),
                                        /* Timeout before reload from SIGHUP */
                        RootCertDuration        VALUE(300),
                                        /* Root certificate update interval */
-                       RunUser                 VALUE(0),
-                                       /* User to run as, used for files */
                        PrintcapFormat          VALUE(PRINTCAP_BSD),
                                        /* Format of printcap file? */
                        DefaultShared           VALUE(TRUE),
@@ -237,20 +242,14 @@ VAR const char            **MimeTypes             VALUE(NULL);
                                        /* Array of MIME types */
 
 #ifdef HAVE_SSL
-VAR char               *ServerCertificate      VALUE(NULL);
-                                       /* Server certificate file */
-#  if defined(HAVE_LIBSSL) || defined(HAVE_GNUTLS)
-VAR char               *ServerKey              VALUE(NULL);
-                                       /* Server key file */
-#  endif /* HAVE_LIBSSL || HAVE_GNUTLS */
-VAR int                        SSLOptions              VALUE(CUPSD_SSL_NONE);
-                                       /* SSL/TLS options */
+VAR char               *ServerKeychain         VALUE(NULL);
+                                       /* Keychain holding cert + key */
 #endif /* HAVE_SSL */
 
-#ifdef HAVE_LAUNCHD
-VAR int                        LaunchdTimeout          VALUE(10);
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+VAR int                        IdleExitTimeout         VALUE(60);
                                        /* Time after which an idle cupsd will exit */
-#endif /* HAVE_LAUNCHD */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
 
 #ifdef HAVE_AUTHORIZATION_H
 VAR char               *SystemGroupAuthKey     VALUE(NULL);
@@ -273,18 +272,21 @@ gss_cred_id_t             ServerCreds;    /* Server's GSS credentials */
 extern void    cupsdAddAlias(cups_array_t *aliases, const char *name);
 extern int     cupsdCheckLogFile(cups_file_t **lf, const char *logname);
 extern int     cupsdCheckPermissions(const char *filename,
-                                     const char *suffix, int mode,
-                                     int user, int group, int is_dir,
+                                     const char *suffix, mode_t mode,
+                                     uid_t user, gid_t group, int is_dir,
                                      int create_dir);
 extern int     cupsdCheckProgram(const char *filename, cupsd_printer_t *p);
 extern int     cupsdDefaultAuthType(void);
 extern void    cupsdFreeAliases(cups_array_t *aliases);
 extern char    *cupsdGetDateTime(struct timeval *t, cupsd_time_t format);
+extern int     cupsdLogClient(cupsd_client_t *con, int level,
+                               const char *message, ...)
+                               __attribute__((__format__(__printf__, 3, 4)));
 extern void    cupsdLogFCMessage(void *context, _cups_fc_result_t result,
                                  const char *message);
 #ifdef HAVE_GSSAPI
-extern int     cupsdLogGSSMessage(int level, int major_status,
-                                  int minor_status,
+extern int     cupsdLogGSSMessage(int level, OM_uint32 major_status,
+                                  OM_uint32 minor_status,
                                   const char *message, ...);
 #endif /* HAVE_GSSAPI */
 extern int     cupsdLogJob(cupsd_job_t *job, int level, const char *message,
@@ -298,5 +300,5 @@ extern int  cupsdWriteErrorLog(int level, const char *message);
 
 
 /*
- * End of "$Id: conf.h 11221 2013-08-06 16:16:01Z msweet $".
+ * End of "$Id: conf.h 12689 2015-06-03 19:49:54Z msweet $".
  */
index 7a5929f..85264ed 100644 (file)
@@ -1,27 +1,16 @@
 /*
- * "$Id: cups-deviced.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cups-deviced.c 11782 2014-03-28 21:03:43Z msweet $"
  *
- *   Device scanning mini-daemon for CUPS.
+ * Device scanning mini-daemon for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()                 - Scan for devices and return an IPP response.
- *   add_device()           - Add a new device to the list.
- *   compare_devices()      - Compare device names to eliminate duplicates.
- *   get_current_time()     - Get the current time as a double value in seconds.
- *   get_device()           - Get a device from a backend.
- *   process_children()     - Process all dead children...
- *   sigchld_handler()      - Handle 'child' signals from old processes.
- *   start_backend()        - Run a backend to gather the available devices.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -82,7 +71,7 @@ static cupsd_backend_t        backends[MAX_BACKENDS];
 static struct pollfd   backend_fds[MAX_BACKENDS];
                                        /* Array for poll() */
 static cups_array_t    *devices;       /* Array of devices */
-static int             normal_user;    /* Normal user ID */
+static uid_t           normal_user;    /* Normal user ID */
 static int             device_limit;   /* Maximum number of devices */
 static int             send_class,     /* Send device-class attribute? */
                        send_info,      /* Send device-info attribute? */
@@ -182,7 +171,7 @@ main(int  argc,                             /* I - Number of command-line args */
     return (1);
   }
 
-  normal_user = atoi(argv[4]);
+  normal_user = (uid_t)atoi(argv[4]);
   if (normal_user <= 0)
   {
     fprintf(stderr, "ERROR: [cups-deviced] Bad user %d!\n", normal_user);
@@ -281,8 +270,7 @@ main(int  argc,                             /* I - Number of command-line args */
     * all others run as the unprivileged user...
     */
 
-    start_backend(dent->filename,
-                  !(dent->fileinfo.st_mode & (S_IRWXG | S_IRWXO)));
+    start_backend(dent->filename, !(dent->fileinfo.st_mode & (S_IWGRP | S_IRWXO)));
   }
 
   cupsDirClose(dir);
@@ -309,7 +297,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
     timeout = (int)(1000 * (end_time - current_time));
 
-    if (poll(backend_fds, num_backends, timeout) > 0)
+    if (poll(backend_fds, (nfds_t)num_backends, timeout) > 0)
     {
       for (i = 0; i < num_backends; i ++)
         if (backend_fds[i].revents && backends[i].pipe)
@@ -326,8 +314,7 @@ main(int  argc,                             /* I - Number of command-line args */
              break;
            }
          }
-         while (bpipe->ptr &&
-                memchr(bpipe->ptr, '\n', bpipe->end - bpipe->ptr));
+         while (bpipe->ptr && memchr(bpipe->ptr, '\n', (size_t)(bpipe->end - bpipe->ptr)));
         }
     }
 
@@ -806,5 +793,5 @@ start_backend(const char *name,             /* I - Backend to run */
 
 
 /*
- * End of "$Id: cups-deviced.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cups-deviced.c 11782 2014-03-28 21:03:43Z msweet $".
  */
index 4a3d34f..7da6572 100644 (file)
@@ -1,48 +1,20 @@
 /*
- * "$Id: cups-driverd.cxx 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cups-driverd.cxx 12733 2015-06-12 01:21:05Z msweet $"
  *
- *   PPD/driver support for CUPS.
+ * PPD/driver support for CUPS.
  *
- *   This program handles listing and installing static PPD files, PPD files
- *   created from driver information files, and dynamically generated PPD files
- *   using driver helper programs.
+ * This program handles listing and installing static PPD files, PPD files
+ * created from driver information files, and dynamically generated PPD files
+ * using driver helper programs.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()        - Scan for drivers and return an IPP response.
- *   add_ppd()        - Add a PPD file.
- *   cat_drv()        - Generate a PPD from a driver info file.
- *   cat_ppd()        - Copy a PPD file to stdout.
- *   copy_static()     - Copy a static PPD file to stdout.
- *   cat_tar()        - Copy an archived PPD file to stdout.
- *   compare_inodes()  - Compare two inodes.
- *   compare_matches() - Compare PPD match scores for sorting.
- *   compare_names()   - Compare PPD filenames for sorting.
- *   compare_ppds()    - Compare PPD file make and model names for sorting.
- *   dump_ppds_dat()   - Dump the contents of the ppds.dat file.
- *   free_array()      - Free an array of strings.
- *   get_file()        - Get the filename associated with a request.
- *   list_ppds()       - List PPD files.
- *   load_drv()        - Load the PPDs from a driver information file.
- *   load_drivers()    - Load driver-generated PPD files.
- *   load_ppd()        - Load a PPD file.
- *   load_ppds()       - Load PPD files recursively.
- *   load_ppds_dat()   - Load the ppds.dat file.
- *   load_tar()        - Load archived PPD files.
- *   read_tar()        - Read a file header from an archive.
- *   regex_device_id() - Compile a regular expression based on the 1284 device
- *                      ID.
- *   regex_string()    - Construct a regular expression to compare a simple
- *                      string.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -61,7 +33,7 @@
  * Constants...
  */
 
-#define PPD_SYNC       0x50504437      /* Sync word for ppds.dat (PPD7) */
+#define PPD_SYNC       0x50504438      /* Sync word for ppds.dat (PPD8) */
 #define PPD_MAX_LANG   32              /* Maximum languages */
 #define PPD_MAX_PROD   32              /* Maximum products */
 #define PPD_MAX_VERS   32              /* Maximum versions */
 #define PPD_TYPE_PDF           1       /* PDF PPD */
 #define PPD_TYPE_RASTER                2       /* CUPS raster PPD */
 #define PPD_TYPE_FAX           3       /* Facsimile/MFD PPD */
-#define PPD_TYPE_UNKNOWN       4       /* Other/hybrid PPD */
-#define PPD_TYPE_DRV           5       /* Driver info file */
-#define PPD_TYPE_ARCHIVE       6       /* Archive file */
+#define PPD_TYPE_OBJECT_ANY    4       /* 3D (AMF/STL/g-code) PPD */
+#define PPD_TYPE_OBJECT_DIRECT 5       /* 3D (AMF/STL/g-code) PPD over any connection */
+#define PPD_TYPE_OBJECT_STORAGE        6       /* 3D (AMF/STL/g-code) PPD for storage to SD card, etc. */
+#define PPD_TYPE_UNKNOWN       7       /* Other/hybrid PPD */
+#define PPD_TYPE_DRV           8       /* Driver info file */
+#define PPD_TYPE_ARCHIVE       9       /* Archive file */
 
 #define TAR_BLOCK      512             /* Number of bytes in a block */
 #define TAR_BLOCKS     10              /* Blocking factor */
@@ -163,6 +138,9 @@ static const char * const PPDTypes[] =      /* ppd-type values */
                          "pdf",
                          "raster",
                          "fax",
+                         "object",
+                         "object-direct",
+                         "object-storage",
                          "unknown",
                          "drv",
                          "archive"
@@ -291,7 +269,7 @@ add_ppd(const char *filename,               /* I - PPD filename */
 
   ppd->found               = 1;
   ppd->record.mtime        = mtime;
-  ppd->record.size         = size;
+  ppd->record.size         = (off_t)size;
   ppd->record.model_number = model_number;
   ppd->record.type         = type;
 
@@ -645,7 +623,7 @@ cat_tar(const char *name,           /* I - PPD name */
   */
 
   if ((fp = get_file(name, request_id, "model", filename, sizeof(filename),
-                     &ppdname)) == NULL)
+                     &ppdname)) == NULL || !ppdname)
     return (1);
 
  /*
@@ -674,7 +652,7 @@ cat_tar(const char *name,           /* I - PPD name */
         if ((size_t)(bytes = (curinfo.st_size - total)) > sizeof(buffer))
           bytes = sizeof(buffer);
 
-        if ((bytes = cupsFileRead(fp, buffer, bytes)) < 0)
+        if ((bytes = cupsFileRead(fp, buffer, (size_t)bytes)) < 0)
         {
           if (errno == EINTR || errno == EAGAIN)
           {
@@ -686,7 +664,7 @@ cat_tar(const char *name,           /* I - PPD name */
             break;
           }
         }
-        else if (bytes > 0 && fwrite(buffer, bytes, 1, stdout) != 1)
+        else if (bytes > 0 && fwrite(buffer, (size_t)bytes, 1, stdout) != 1)
           break;
       }
 
@@ -1053,8 +1031,6 @@ list_ppds(int        request_id,  /* I - Request ID */
                *type_str;              /* ppd-type option */
   int          model_number,           /* ppd-model-number value */
                type,                   /* ppd-type value */
-               make_and_model_len,     /* Length of ppd-make-and-model */
-               product_len,            /* Length of ppd-product */
                send_device_id,         /* Send ppd-device-id? */
                send_make,              /* Send ppd-make? */
                send_make_and_model,    /* Send ppd-make-and-model? */
@@ -1065,6 +1041,8 @@ list_ppds(int        request_id,  /* I - Request ID */
                send_psversion,         /* Send ppd-psversion? */
                send_type,              /* Send ppd-type? */
                sent_header;            /* Sent the IPP header? */
+  size_t       make_and_model_len,     /* Length of ppd-make-and-model */
+               product_len;            /* Length of ppd-product */
   regex_t      *device_id_re,          /* Regular expression for matching device ID */
                *make_and_model_re;     /* Regular expression for matching make and model */
   regmatch_t   re_matches[6];          /* Regular expression matches */
@@ -1349,7 +1327,7 @@ list_ppds(int        request_id,  /* I - Request ID */
 
       if (device_id_re &&
          !regexec(device_id_re, ppd->record.device_id,
-                   (int)(sizeof(re_matches) / sizeof(re_matches[0])),
+                   (size_t)(sizeof(re_matches) / sizeof(re_matches[0])),
                   re_matches, 0))
       {
        /*
@@ -1379,13 +1357,13 @@ list_ppds(int        request_id,        /* I - Request ID */
 
       if (make_and_model_re &&
           !regexec(make_and_model_re, ppd->record.make_and_model,
-                  (int)(sizeof(re_matches) / sizeof(re_matches[0])),
+                  (size_t)(sizeof(re_matches) / sizeof(re_matches[0])),
                   re_matches, 0))
       {
        // See how much of the make-and-model string we matched...
        if (re_matches[0].rm_so == 0)
        {
-         if (re_matches[0].rm_eo == make_and_model_len)
+         if ((size_t)re_matches[0].rm_eo == make_and_model_len)
            ppd->matches += 3;          // Exact match
          else
            ppd->matches += 2;          // Prefix match
@@ -1637,8 +1615,7 @@ load_drv(const char  *filename,           /* I - Actual filename */
   * Add a dummy entry for the file...
   */
 
-  add_ppd(name, name, "", "", "", "", "", "", mtime, size, 0,
-          PPD_TYPE_DRV, "drv");
+  add_ppd(name, name, "", "", "", "", "", "", mtime, (size_t)size, 0, PPD_TYPE_DRV, "drv");
   ChangedPPD = 1;
 
  /*
@@ -1696,14 +1673,10 @@ load_drv(const char  *filename,         /* I - Actual filename */
       if (!strcmp(product->name->value, "Product"))
       {
         if (!products_found)
-         ppd = add_ppd(name, uri, "en", d->manufacturer->value, make_model,
-                       device_id ? device_id->value->value : "",
-                       product->value->value,
-                       ps_version ? ps_version->value->value : "(3010) 0",
-                       mtime, size, d->model_number, type, "drv");
+         ppd = add_ppd(name, uri, "en", d->manufacturer->value, make_model, device_id ? device_id->value->value : "", product->value->value,
+                       ps_version ? ps_version->value->value : "(3010) 0", mtime, (size_t)size, d->model_number, type, "drv");
        else if (products_found < PPD_MAX_PROD)
-         strlcpy(ppd->record.products[products_found], product->value->value,
-                 sizeof(ppd->record.products[0]));
+         strlcpy(ppd->record.products[products_found], product->value->value, sizeof(ppd->record.products[0]));
        else
          break;
 
@@ -1711,11 +1684,7 @@ load_drv(const char  *filename,          /* I - Actual filename */
       }
 
     if (!products_found)
-      add_ppd(name, uri, "en", d->manufacturer->value, make_model,
-             device_id ? device_id->value->value : "",
-             d->model_name->value,
-             ps_version ? ps_version->value->value : "(3010) 0",
-             mtime, size, d->model_number, type, "drv");
+      add_ppd(name, uri, "en", d->manufacturer->value, make_model, device_id ? device_id->value->value : "", d->model_name->value, ps_version ? ps_version->value->value : "(3010) 0", mtime, (size_t)size, d->model_number, type, "drv");
   }
 
   src->release();
@@ -1810,7 +1779,7 @@ load_drivers(cups_array_t *include,       /* I - Drivers to include */
        scheme_end = scheme + strlen(scheme) - 1;
 
        if ((scheme_end > scheme && *scheme_end == '*' &&
-            !strncmp(scheme, dent->filename, scheme_end - scheme)) ||
+            !strncmp(scheme, dent->filename, (size_t)(scheme_end - scheme))) ||
            !strcmp(scheme, dent->filename))
        {
          fputs("DEBUG: [cups-driverd] Yes, exclude!\n", stderr);
@@ -1837,7 +1806,7 @@ load_drivers(cups_array_t *include,       /* I - Drivers to include */
        scheme_end = scheme + strlen(scheme) - 1;
 
        if ((scheme_end > scheme && *scheme_end == '*' &&
-            !strncmp(scheme, dent->filename, scheme_end - scheme)) ||
+            !strncmp(scheme, dent->filename, (size_t)(scheme_end - scheme))) ||
            !strcmp(scheme, dent->filename))
        {
          fputs("DEBUG: [cups-driverd] Yes, include!\n", stderr);
@@ -1877,7 +1846,7 @@ load_drivers(cups_array_t *include,       /* I - Drivers to include */
         device_id[0] = '\0';
        product[0]   = '\0';
        psversion[0] = '\0';
-       strcpy(type_str, "postscript");
+       strlcpy(type_str, "postscript", sizeof(type_str));
 
         if (sscanf(line, "\"%511[^\"]\"%127s%*[ \t]\"%127[^\"]\""
                         "%*[ \t]\"%127[^\"]\"%*[ \t]\"%255[^\"]\""
@@ -2043,7 +2012,7 @@ load_ppd(const char  *filename,           /* I - Real filename */
   manufacturer[0]  = '\0';
   device_id[0]     = '\0';
   lang_encoding[0] = '\0';
-  strcpy(lang_version, "en");
+  strlcpy(lang_version, "en", sizeof(lang_version));
   model_number     = 0;
   install_group    = 0;
   type             = PPD_TYPE_POSTSCRIPT;
@@ -2132,12 +2101,28 @@ load_ppd(const char  *filename,         /* I - Real filename */
       if (!_cups_strncasecmp(ptr, "true", 4))
        type = PPD_TYPE_FAX;
     }
-    else if (!strncmp(line, "*cupsFilter:", 12) && type == PPD_TYPE_POSTSCRIPT)
+    else if ((!strncmp(line, "*cupsFilter:", 12) || !strncmp(line, "*cupsFilter2:", 13)) && type == PPD_TYPE_POSTSCRIPT)
     {
       if (strstr(line + 12, "application/vnd.cups-raster"))
        type = PPD_TYPE_RASTER;
       else if (strstr(line + 12, "application/vnd.cups-pdf"))
        type = PPD_TYPE_PDF;
+      else if (strstr(line + 12, "application/amf") ||
+               strstr(line + 12, "application/g-code") ||
+               strstr(line + 12, "application/sla"))
+       type = PPD_TYPE_OBJECT_ANY;
+    }
+    else if (!strncmp(line, "*cups3DWorkflows:", 17))
+    {
+      int is_direct = strstr(line + 17, "direct") != NULL;
+      int is_storage = strstr(line + 17, "storage") != NULL;
+
+      if (is_direct && !is_storage)
+        type = PPD_TYPE_OBJECT_DIRECT;
+      if (!is_direct && is_storage)
+        type = PPD_TYPE_OBJECT_STORAGE;
+      else
+        type = PPD_TYPE_OBJECT_ANY;
     }
     else if (!strncmp(line, "*cupsModelNumber:", 17))
       sscanf(line, "*cupsModelNumber:%d", &model_number);
@@ -2166,7 +2151,7 @@ load_ppd(const char  *filename,           /* I - Real filename */
     cupsCharsetToUTF8((cups_utf8_t *)make_model, nick_name,
                      sizeof(make_model), _ppdGetEncoding(lang_encoding));
   else
-    strcpy(make_model, model_name);
+    strlcpy(make_model, model_name, sizeof(make_model));
 
   while (isspace(make_model[0] & 255))
     _cups_strcpy(make_model, make_model + 1);
@@ -2236,13 +2221,13 @@ load_ppd(const char  *filename,         /* I - Real filename */
     if (*ptr && ptr > manufacturer)
       *ptr = '\0';
     else
-      strcpy(manufacturer, "Other");
+      strlcpy(manufacturer, "Other", sizeof(manufacturer));
   }
   else if (!_cups_strncasecmp(manufacturer, "LHAG", 4) ||
           !_cups_strncasecmp(manufacturer, "linotype", 8))
-    strcpy(manufacturer, "LHAG");
+    strlcpy(manufacturer, "LHAG", sizeof(manufacturer));
   else if (!_cups_strncasecmp(manufacturer, "Hewlett", 7))
-    strcpy(manufacturer, "HP");
+    strlcpy(manufacturer, "HP", sizeof(manufacturer));
 
  /*
   * Fix the lang_version as needed...
@@ -2290,7 +2275,7 @@ load_ppd(const char  *filename,           /* I - Real filename */
     * Unknown language; use "xx"...
     */
 
-    strcpy(lang_version, "xx");
+    strlcpy(lang_version, "xx", sizeof(lang_version));
   }
 
  /*
@@ -2307,11 +2292,7 @@ load_ppd(const char  *filename,          /* I - Real filename */
 
     fprintf(stderr, "DEBUG2: [cups-driverd] Adding ppd \"%s\"...\n", name);
 
-    ppd = add_ppd(name, name, lang_version, manufacturer, make_model,
-                 device_id, (char *)cupsArrayFirst(products),
-                 (char *)cupsArrayFirst(psversions),
-                 fileinfo->st_mtime, fileinfo->st_size,
-                 model_number, type, scheme);
+    ppd = add_ppd(name, name, lang_version, manufacturer, make_model, device_id, (char *)cupsArrayFirst(products), (char *)cupsArrayFirst(psversions), fileinfo->st_mtime, (size_t)fileinfo->st_size, model_number, type, scheme);
 
     if (!ppd)
       return;
@@ -2519,8 +2500,8 @@ load_ppds(const char *d,          /* I - Actual directory */
     * See if this file has been scanned before...
     */
 
-    strcpy(key.record.filename, name);
-    strcpy(key.record.name, name);
+    strlcpy(key.record.filename, name, sizeof(key.record.filename));
+    strlcpy(key.record.name, name, sizeof(key.record.name));
 
     ppd = (ppd_info_t *)cupsArrayFind(PPDsByName, &key);
 
@@ -2634,13 +2615,11 @@ load_ppds_dat(char   *filename,         /* I - Filename buffer */
     unsigned ppdsync;                  /* Sync word */
     int      num_ppds;                 /* Number of PPDs */
 
-    if (cupsFileRead(fp, (char *)&ppdsync, sizeof(ppdsync))
-            == sizeof(ppdsync) &&
+    if (cupsFileRead(fp, (char *)&ppdsync, sizeof(ppdsync)) == sizeof(ppdsync) &&
         ppdsync == PPD_SYNC &&
         !stat(filename, &fileinfo) &&
-       ((fileinfo.st_size - sizeof(ppdsync)) % sizeof(ppd_rec_t)) == 0 &&
-       (num_ppds = (fileinfo.st_size - sizeof(ppdsync)) /
-                   sizeof(ppd_rec_t)) > 0)
+       (((size_t)fileinfo.st_size - sizeof(ppdsync)) % sizeof(ppd_rec_t)) == 0 &&
+       (num_ppds = ((size_t)fileinfo.st_size - sizeof(ppdsync)) / sizeof(ppd_rec_t)) > 0)
     {
      /*
       * We have a ppds.dat file, so read it!
@@ -2702,8 +2681,7 @@ load_tar(const char  *filename,           /* I - Actual filename */
 
   (void)filename;
 
-  add_ppd(name, name, "", "", "", "", "", "", mtime, size, 0,
-          PPD_TYPE_ARCHIVE, "file");
+  add_ppd(name, name, "", "", "", "", "", "", mtime, (size_t)size, 0, PPD_TYPE_ARCHIVE, "file");
   ChangedPPD = 1;
 
  /*
@@ -2947,5 +2925,5 @@ regex_string(const char *s)               /* I - String to compare */
 
 
 /*
- * End of "$Id: cups-driverd.cxx 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cups-driverd.cxx 12733 2015-06-12 01:21:05Z msweet $".
  */
index 6d0d3d8..e63b163 100644 (file)
@@ -1,23 +1,19 @@
 /*
- * "$Id: cups-exec.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cups-exec.c 11817 2014-04-15 16:31:11Z msweet $"
  *
- *   Sandbox helper for CUPS.
+ * Sandbox helper for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
+ * Copyright 2007-2014 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
  * Usage:
  *
- *     cups-exec /path/to/profile /path/to/program argv0 argv1 ... argvN
- *
- * Contents:
- *
- *   main() - Apply sandbox profile and execute program.
+ *     cups-exec /path/to/profile [-u UID] [-g GID] [-n NICE] /path/to/program argv0 argv1 ... argvN
  */
 
 /*
  */
 
 #include <cups/string-private.h>
+#include <cups/file.h>
 #include <unistd.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <sys/stat.h>
 #ifdef HAVE_SANDBOX_H
 #  include <sandbox.h>
 #  ifndef SANDBOX_NAMED_EXTERNAL
 
 
 /*
+ * Local functions...
+ */
+
+static void    usage(void) __attribute__((noreturn));
+
+
+/*
  * 'main()' - Apply sandbox profile and execute program.
  */
 
@@ -43,67 +50,157 @@ int                                        /* O - Exit status */
 main(int  argc,                                /* I - Number of command-line args */
      char *argv[])                     /* I - Command-line arguments */
 {
-  int  i;                              /* Looping var */
+  int          i;                      /* Looping var */
+  const char   *opt;                   /* Current option character */
+  uid_t                uid = getuid();         /* UID */
+  gid_t                gid = getgid();         /* GID */
+  int          niceval = 0;            /* Nice value */
 #ifdef HAVE_SANDBOX_H
-  char *sandbox_error = NULL;          /* Sandbox error, if any */
+  char         *sandbox_error = NULL;  /* Sandbox error, if any */
 #endif /* HAVE_SANDBOX_H */
 
 
  /*
+  * Parse command-line...
+  */
+
+  for (i = 1; i < argc; i ++)
+  {
+    if (argv[i][0] == '-')
+    {
+      for (opt = argv[i] + 1; *opt; opt ++)
+      {
+        switch (*opt)
+        {
+          case 'g' : /* -g gid */
+              i ++;
+              if (i >= argc)
+                usage();
+
+              gid = (gid_t)atoi(argv[i]);
+              break;
+
+          case 'n' : /* -n nice-value */
+              i ++;
+              if (i >= argc)
+                usage();
+
+              niceval = atoi(argv[i]);
+              break;
+
+          case 'u' : /* -g gid */
+              i ++;
+              if (i >= argc)
+                usage();
+
+              uid = (uid_t)atoi(argv[i]);
+              break;
+
+         default :
+             fprintf(stderr, "cups-exec: Unknown option '-%c'.\n", *opt);
+             usage();
+        }
+      }
+    }
+    else
+      break;
+  }
+
+ /*
   * Check that we have enough arguments...
   */
 
-  if (argc < 4)
+  if ((i + 3) > argc)
+  {
+    fputs("cups-exec: Insufficient arguments.\n", stderr);
+    usage();
+  }
+
+ /*
+  * Make sure side and back channel FDs are non-blocking...
+  */
+
+  fcntl(3, F_SETFL, O_NDELAY);
+  fcntl(4, F_SETFL, O_NDELAY);
+
+ /*
+  * Change UID, GID, and nice value...
+  */
+
+  if (uid)
+    nice(niceval);
+
+  if (!getuid())
   {
-    puts("Usage: cups-exec /path/to/profile /path/to/program argv0 argv1 ... "
-         "argvN");
-    return (1);
+    if (setgid(gid))
+      exit(errno + 100);
+
+    if (setgroups(1, &gid))
+      exit(errno + 100);
+
+    if (uid && setuid(uid))
+      exit(errno + 100);
   }
 
+  umask(077);
+
 #ifdef HAVE_SANDBOX_H
  /*
   * Run in a separate security profile...
   */
 
-  if (strcmp(argv[1], "none") &&
-      sandbox_init(argv[1], SANDBOX_NAMED_EXTERNAL, &sandbox_error))
+  if (strcmp(argv[i], "none") &&
+      sandbox_init(argv[i], SANDBOX_NAMED_EXTERNAL, &sandbox_error))
   {
+    cups_file_t        *fp;                    /* File */
+    char       line[1024];             /* Line from file */
+    int                linenum = 0;            /* Line number in file */
+
     fprintf(stderr, "DEBUG: sandbox_init failed: %s (%s)\n", sandbox_error,
            strerror(errno));
     sandbox_free_error(sandbox_error);
-    return (1);
+
+    if ((fp = cupsFileOpen(argv[i], "r")) != NULL)
+    {
+      while (cupsFileGets(fp, line, sizeof(line)))
+      {
+        linenum ++;
+        fprintf(stderr, "DEBUG: %4d  %s\n", linenum, line);
+      }
+      cupsFileClose(fp);
+    }
+
+    return (100 + EINVAL);
   }
 #endif /* HAVE_SANDBOX_H */
 
  /*
-  * Close file descriptors we don't need (insurance):
-  *
-  * 0   = stdin
-  * 1   = stdout
-  * 2   = stderr
-  * 3   = back-channel
-  * 4   = side-channel
-  * 5-N = unused
-  */
-
-  for (i = 5; i < 1024; i ++)
-    close(i);
-
- /*
   * Execute the program...
   */
 
-  execv(argv[2], argv + 3);
+  execv(argv[i + 1], argv + i + 2);
 
  /*
   * If we get here, execv() failed...
   */
 
   fprintf(stderr, "DEBUG: execv failed: %s\n", strerror(errno));
-  return (1);
+  return (errno + 100);
+}
+
+
+/*
+ * 'usage()' - Show program usage.
+ */
+
+static void
+usage(void)
+{
+  fputs("Usage: cups-exec [-g gid] [-n nice-value] [-u uid] /path/to/profile /path/to/program argv0 argv1 ... argvN\n", stderr);
+  exit(1);
 }
 
 
 /*
- * End of "$Id: cups-exec.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cups-exec.c 11817 2014-04-15 16:31:11Z msweet $".
  */
index bd6757b..4748ce0 100644 (file)
@@ -1,27 +1,16 @@
 /*
- * "$Id: cups-lpd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cups-lpd.c 12611 2015-05-06 15:30:36Z msweet $"
  *
- *   Line Printer Daemon interface for CUPS.
+ * Line Printer Daemon interface for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()           - Process an incoming LPD request...
- *   create_job()     - Create a new print job.
- *   get_printer()    - Get the named printer and its options.
- *   print_file()     - Add a file to the current job.
- *   recv_print_job() - Receive a print job from the client.
- *   remove_jobs()    - Cancel one or more jobs.
- *   send_state()     - Send the queue state.
- *   smart_gets()     - Get a line of text, removing the trailing CR and/or LF.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -40,6 +29,9 @@
 #ifdef HAVE_INTTYPES_H
 #  include <inttypes.h>
 #endif /* HAVE_INTTYPES_H */
+#ifdef __APPLE__
+#  include <vproc.h>
+#endif /* __APPLE__ */
 
 
 /*
@@ -70,7 +62,7 @@ static int    create_job(http_t *http, const char *dest, const char *title,
                            const char *docname, const char *user,
                           int num_options, cups_option_t *options);
 static int     get_printer(http_t *http, const char *name, char *dest,
-                           int destsize, cups_option_t **options,
+                           size_t destsize, cups_option_t **options,
                            int *accepting, int *shared, ipp_pstate_t *state);
 static int     print_file(http_t *http, int id, const char *filename,
                           const char *docname, const char *user,
@@ -107,6 +99,9 @@ main(int  argc,                              /* I - Number of command-line arguments */
                hostip[256],            /* IP address */
                *hostfamily;            /* Address family */
   int          hostlookups;            /* Do hostname lookups? */
+#ifdef __APPLE__
+  vproc_transaction_t vtran = vproc_transaction_begin(NULL);
+#endif /* __APPLE__ */
 
 
  /*
@@ -184,7 +179,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
   if (getpeername(0, (struct sockaddr *)&hostaddr, &hostlen))
   {
     syslog(LOG_WARNING, "Unable to get client address - %s", strerror(errno));
-    strcpy(hostname, "unknown");
+    strlcpy(hostname, "unknown", sizeof(hostname));
   }
   else
   {
@@ -222,6 +217,11 @@ main(int  argc,                            /* I - Number of command-line arguments */
 
     syslog(LOG_ERR, "Unable to get command line from client!");
     putchar(1);
+
+#ifdef __APPLE__
+    vproc_transaction_end(NULL, vtran);
+#endif /* __APPLE__ */
+
     return (1);
   }
 
@@ -230,8 +230,10 @@ main(int  argc,                            /* I - Number of command-line arguments */
   * resource list, and/or user name.
   */
 
-  command = line[0];
-  dest    = line + 1;
+  if ((command = line[0]) == '\0')
+    dest = line;
+  else
+    dest = line + 1;
 
   if (command == 0x02)
     list = NULL;
@@ -268,21 +270,21 @@ main(int  argc,                           /* I - Number of command-line arguments */
         syslog(LOG_INFO, "Receive print job for %s", dest);
         /* recv_print_job() sends initial status byte */
 
-        status = recv_print_job(dest, num_defaults, defaults);
+        status = (char)recv_print_job(dest, num_defaults, defaults);
        break;
 
     case 0x03 : /* Send queue state (short) */
         syslog(LOG_INFO, "Send queue state (short) for %s %s", dest, list);
        /* no status byte for this command */
 
-        status = send_state(dest, list, 0);
+        status = (char)send_state(dest, list, 0);
        break;
 
     case 0x04 : /* Send queue state (long) */
         syslog(LOG_INFO, "Send queue state (long) for %s %s", dest, list);
        /* no status byte for this command */
 
-        status = send_state(dest, list, 1);
+        status = (char)send_state(dest, list, 1);
        break;
 
     case 0x05 : /* Remove jobs */
@@ -300,7 +302,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
          syslog(LOG_INFO, "Remove jobs %s on %s by %s", list, dest, agent);
 
-         status = remove_jobs(dest, agent, list);
+         status = (char)remove_jobs(dest, agent, list);
         }
        else
          status = 1;
@@ -312,6 +314,10 @@ main(int  argc,                            /* I - Number of command-line arguments */
   syslog(LOG_INFO, "Closing connection");
   closelog();
 
+#ifdef __APPLE__
+  vproc_transaction_end(NULL, vtran);
+#endif /* __APPLE__ */
+
   return (status);
 }
 
@@ -409,7 +415,7 @@ static int                          /* O - Number of options or -1 on error */
 get_printer(http_t        *http,       /* I - HTTP connection */
             const char    *name,       /* I - Printer name from request */
            char          *dest,        /* I - Destination buffer */
-            int           destsize,    /* I - Size of destination buffer */
+            size_t        destsize,    /* I - Size of destination buffer */
            cups_option_t **options,    /* O - Printer options */
            int           *accepting,   /* O - printer-is-accepting-jobs value */
            int           *shared,      /* O - printer-is-shared value */
@@ -744,7 +750,7 @@ print_file(http_t     *http,                /* I - HTTP connection */
     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE,
                  "document-format", NULL, format);
 
-  ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", last);
+  ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", (char)last);
 
  /*
   * Do the request...
@@ -781,7 +787,8 @@ recv_print_job(
   int          fd;                     /* Temporary file */
   FILE         *fp;                    /* File pointer */
   char         filename[1024];         /* Temporary filename */
-  int          bytes;                  /* Bytes received */
+  ssize_t      bytes;                  /* Bytes received */
+  size_t       total;                  /* Total bytes */
   char         line[256],              /* Line from file/stdin */
                command,                /* Command from line */
                *count,                 /* Number of bytes */
@@ -914,7 +921,7 @@ recv_print_job(
              break;
            }
 
-           strcpy(filename, control);
+           strlcpy(filename, control, sizeof(filename));
          }
          break;
 
@@ -950,7 +957,7 @@ recv_print_job(
            break;
          }
 
-         strcpy(filename, temp[num_data]);
+         strlcpy(filename, temp[num_data], sizeof(filename));
 
           num_data ++;
          break;
@@ -965,15 +972,15 @@ recv_print_job(
     * Copy the data or control file from the client...
     */
 
-    for (i = atoi(count); i > 0; i -= bytes)
+    for (total = (size_t)strtoll(count, NULL, 10); total > 0; total -= (size_t)bytes)
     {
-      if (i > sizeof(line))
-        bytes = sizeof(line);
+      if (total > sizeof(line))
+        bytes = (ssize_t)sizeof(line);
       else
-        bytes = i;
+        bytes = (ssize_t)total;
 
-      if ((bytes = fread(line, 1, bytes, stdin)) > 0)
-        bytes = write(fd, line, bytes);
+      if ((bytes = (ssize_t)fread(line, 1, (size_t)bytes, stdin)) > 0)
+        bytes = write(fd, line, (size_t)bytes);
 
       if (bytes < 1)
       {
@@ -1116,7 +1123,7 @@ recv_print_job(
       {
        syslog(LOG_WARNING, "No username specified by client! "
                            "Using \"anonymous\"...");
-       strcpy(user, "anonymous");
+       strlcpy(user, "anonymous", sizeof(user));
       }
 
      /*
@@ -1528,7 +1535,7 @@ send_state(const char *queue,             /* I - Destination */
     */
 
     if (jobstate == IPP_JOB_PROCESSING)
-      strcpy(rankstr, "active");
+      strlcpy(rankstr, "active", sizeof(rankstr));
     else
     {
       snprintf(rankstr, sizeof(rankstr), "%d%s", rank, ranks[rank % 10]);
@@ -1609,7 +1616,7 @@ smart_gets(char *s,                       /* I - Pointer to line buffer */
       break;
     }
     else if (ptr < end)
-      *ptr++ = ch;
+      *ptr++ = (char)ch;
   }
 
   *ptr = '\0';
@@ -1622,5 +1629,5 @@ smart_gets(char *s,                       /* I - Pointer to line buffer */
 
 
 /*
- * End of "$Id: cups-lpd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cups-lpd.c 12611 2015-05-06 15:30:36Z msweet $".
  */
index ff72c1c..c50e893 100644 (file)
@@ -1,17 +1,17 @@
 #!/bin/sh
 #
-# "$Id: cups.sh.in 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: cups.sh.in 11342 2013-10-18 20:36:01Z msweet $"
 #
-#   Startup/shutdown script for CUPS.
+# Startup/shutdown script for CUPS.
 #
-#   Copyright 2007-2011 by Apple Inc.
-#   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2013 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products, all rights reserved.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 #### OS-Dependent Information
 #### OS-Dependent Configuration
 
 case "`uname`" in
-       IRIX*)
-               IS_ON=/sbin/chkconfig
-
-               if $IS_ON verbose; then
-                       ECHO=echo
-               else
-                       ECHO=:
-               fi
-               ECHO_OK=:
-               ECHO_ERROR=:
-               ;;
-
        *BSD*)
                IS_ON=:
                ECHO=echo
@@ -127,8 +115,7 @@ unset TMPDIR
 
 #
 # Make sure we have the standard program directories in the path
-# since some operating systems (this means YOU HP-UX!) don't
-# provide a standard path on boot-up...
+# since some operating systems don't provide a standard path on boot-up...
 #
 
 if test "x$PATH" = x; then
@@ -144,19 +131,9 @@ export PATH
 #
 
 case "`uname`" in
-       HP-UX* | AIX* | SINIX*)
-               pid=`ps -e | awk '{if (match($4, ".*/cupsd$") || $4 == "cupsd") print $1}'`
-               ;;
-       IRIX* | SunOS*)
+       SunOS*)
                pid=`ps -e | nawk '{if (match($4, ".*/cupsd$") || $4 == "cupsd") print $1}'`
                ;;
-       UnixWare*)
-               pid=`ps -e | awk '{if (match($6, ".*/cupsd$") || $6 == "cupsd") print $1}'`
-               . /etc/TIMEZONE
-               ;;
-       OSF1*)
-               pid=`ps -e | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print $1}'`
-               ;;
        Linux* | *BSD* | Darwin*)
                pid=`ps ax | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print $1}'`
                ;;
@@ -209,16 +186,6 @@ case $1 in
                fi
                ;;
 
-       start_msg)
-               # HP-UX non-standard...
-               echo "Starting CUPS Server"
-               ;;
-
-       stop_msg)
-               # HP-UX non-standard...
-               echo "Starting CUPS Server"
-               ;;
-
        *)
                echo "Usage: cups {reload|restart|start|status|stop}"
                exit 1
@@ -233,5 +200,5 @@ exit 0
 
 
 #
-# End of "$Id: cups.sh.in 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: cups.sh.in 11342 2013-10-18 20:36:01Z msweet $".
 #
index b76ad02..ac63585 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
 <!--
-    $Id: cups.xml.in 11173 2013-07-23 12:31:34Z msweet $
+    $Id: cups.xml.in 2309 2010-07-08 20:45:48Z msweet $
 
     Service manifest for CUPS.
 
index 48ea1d7..f8b2c11 100644 (file)
@@ -1,16 +1,16 @@
 /*
- * "$Id: cupsd.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupsd.h 11717 2014-03-21 16:42:53Z msweet $"
  *
- *   Main header file for the CUPS scheduler.
+ * Main header file for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 
@@ -144,10 +144,8 @@ typedef void (*cupsd_selfunc_t)(void *data);
  * Globals...
  */
 
-VAR int                        TestConfigFile  VALUE(0),
+VAR int                        TestConfigFile  VALUE(0);
                                        /* Test the cupsd.conf file? */
-                       UseProfiles     VALUE(1);
-                                       /* Use security profiles for child procs? */
 VAR int                        MaxFDs          VALUE(0);
                                        /* Maximum number of files */
 
@@ -160,10 +158,10 @@ VAR int                   NeedReload      VALUE(RELOAD_ALL),
 VAR void               *DefaultProfile VALUE(0);
                                        /* Default security profile */
 
-#ifdef HAVE_LAUNCH_H
-VAR int                        Launchd         VALUE(0);
-                                       /* Running from launchd */
-#endif /* HAVE_LAUNCH_H */
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+VAR int                        OnDemand        VALUE(0);
+                                       /* Launched on demand */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
 
 
 /*
@@ -187,6 +185,7 @@ extern cups_file_t  *cupsdCreateConfFile(const char *filename, mode_t mode);
 extern cups_file_t     *cupsdOpenConfFile(const char *filename);
 extern int             cupsdOpenPipe(int *fds);
 extern int             cupsdRemoveFile(const char *filename);
+extern int             cupsdUnlinkOrRemoveFile(const char *filename);
 
 /* main.c */
 extern int             cupsdAddString(cups_array_t **a, const char *s);
@@ -202,11 +201,10 @@ extern void               cupsdSetStringf(char **s, const char *f, ...)
                        __attribute__ ((__format__ (__printf__, 2, 3)));
 
 /* process.c */
-extern void            *cupsdCreateProfile(int job_id);
+extern void            *cupsdCreateProfile(int job_id, int allow_networking);
 extern void            cupsdDestroyProfile(void *profile);
 extern int             cupsdEndProcess(int pid, int force);
-extern const char      *cupsdFinishProcess(int pid, char *name, int namelen,
-                                           int *job_id);
+extern const char      *cupsdFinishProcess(int pid, char *name, size_t namelen, int *job_id);
 extern int             cupsdStartProcess(const char *command, char *argv[],
                                          char *envp[], int infd, int outfd,
                                          int errfd, int backfd, int sidefd,
@@ -230,5 +228,5 @@ extern void         cupsdStopServer(void);
 
 
 /*
- * End of "$Id: cupsd.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupsd.h 11717 2014-03-21 16:42:53Z msweet $".
  */
index 4b471d5..81e159d 100644 (file)
@@ -1,34 +1,16 @@
 /*
- * "$Id: cupsfilter.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupsfilter.c 12304 2014-12-09 16:16:28Z msweet $"
  *
- *   Filtering program for CUPS.
+ * Filtering program for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()                - Main entry for the test program.
- *   add_printer_filter()  - Add a single filters from a PPD file.
- *   add_printer_filters() - Add filters from a PPD file.
- *   check_cb()            - Callback function for _cupsFileCheck.
- *   compare_pids()        - Compare two filter PIDs...
- *   escape_options()      - Convert an options array to a string.
- *   exec_filter()         - Execute a single filter.
- *   exec_filters()        - Execute filters for the given file and options.
- *   get_job_file()        - Get the specified job file.
- *   open_pipe()           - Create a pipe which is closed on exec.
- *   read_cupsd_conf()     - Read the cupsd.conf file to get the filter
- *                           settings.
- *   set_string()          - Copy and set a string.
- *   sighandler()          - Signal catcher for when we print from stdin...
- *   usage()               - Show program usage...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -99,7 +81,7 @@ static int            exec_filters(mime_type_t *srctype,
                                     cups_option_t *options);
 static void            get_job_file(const char *job);
 static int             open_pipe(int *fds);
-static int             read_cupsd_conf(const char *filename);
+static int             read_cups_files_conf(const char *filename);
 static void            set_string(char **s, const char *val);
 static void            sighandler(int sig);
 static void            usage(const char *opt) __attribute__((noreturn));
@@ -113,7 +95,8 @@ int                                  /* O - Exit status */
 main(int  argc,                                /* I - Number of command-line args */
      char *argv[])                     /* I - Command-line arguments */
 {
-  int          i;                      /* Looping vars */
+  int          i,                      /* Looping vars */
+               list_filters = 0;       /* Just list the filters? */
   const char   *command,               /* Command name */
                *opt,                   /* Current option */
                *printer;               /* Printer name */
@@ -129,7 +112,7 @@ main(int  argc,                             /* I - Number of command-line args */
   char         mimedir[1024];          /* MIME directory */
   char         *infile,                /* File to filter */
                *outfile;               /* File to create */
-  char         cupsdconf[1024];        /* cupsd.conf file */
+  char         cupsfilesconf[1024];    /* cups-files.conf file */
   const char   *server_root;           /* CUPS_SERVERROOT environment variable */
   mime_type_t  *src,                   /* Source type */
                *dst;                   /* Destination type */
@@ -173,7 +156,7 @@ main(int  argc,                             /* I - Number of command-line args */
   if ((server_root = getenv("CUPS_SERVERROOT")) == NULL)
     server_root = CUPS_SERVERROOT;
 
-  snprintf(cupsdconf, sizeof(cupsdconf), "%s/cupsd.conf", server_root);
+  snprintf(cupsfilesconf, sizeof(cupsfilesconf), "%s/cups-files.conf", server_root);
 
  /*
   * Process command-line arguments...
@@ -182,168 +165,175 @@ main(int  argc,                         /* I - Number of command-line args */
   _cupsSetLocale(argv);
 
   for (i = 1; i < argc; i ++)
+  {
     if (argv[i][0] == '-')
     {
-      for (opt = argv[i] + 1; *opt; opt ++)
-        switch (*opt)
+      if (!strcmp(argv[i], "--list-filters"))
+      {
+        list_filters = 1;
+      }
+      else if (!strcmp(argv[i], "--"))
+      {
+       i ++;
+       if (i < argc && !infile)
+         infile = argv[i];
+       else
+         usage(NULL);
+      }
+      else
+      {
+       for (opt = argv[i] + 1; *opt; opt ++)
        {
-         case '-' : /* Next argument is a filename... */
-             i ++;
-             if (i < argc && !infile)
-               infile = argv[i];
-             else
-               usage(opt);
-             break;
-
-          case 'a' : /* Specify option... */
-             i ++;
-             if (i < argc)
-               num_options = cupsParseOptions(argv[i], num_options, &options);
-             else
-               usage(opt);
-             break;
-
-          case 'c' : /* Specify cupsd.conf file location... */
-             i ++;
-             if (i < argc)
-             {
-               if (!strcmp(command, "convert"))
-                 num_options = cupsAddOption("copies", argv[i], num_options,
-                                             &options);
+         switch (*opt)
+         {
+           case 'a' : /* Specify option... */
+               i ++;
+               if (i < argc)
+                 num_options = cupsParseOptions(argv[i], num_options, &options);
                else
-                 strlcpy(cupsdconf, argv[i], sizeof(cupsdconf));
-             }
-             else
-               usage(opt);
-             break;
-
-          case 'd' : /* Specify the real printer name */
-             i ++;
-             if (i < argc)
-               printer = argv[i];
-             else
-               usage(opt);
-             break;
-
-         case 'D' : /* Delete input file after conversion */
-             removeinfile = 1;
-             break;
-
-          case 'e' : /* Use every filter from the PPD file */
-             all_filters = 1;
-             break;
-
-          case 'f' : /* Specify input file... */
-             i ++;
-             if (i < argc && !infile)
-               infile = argv[i];
-             else
-               usage(opt);
-             break;
-
-          case 'i' : /* Specify source MIME type... */
-             i ++;
-             if (i < argc)
-             {
-               if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2)
                  usage(opt);
+               break;
 
-                srctype = argv[i];
-             }
-             else
-               usage(opt);
-             break;
+           case 'c' : /* Specify cups-files.conf file location... */
+               i ++;
+               if (i < argc)
+               {
+                 if (!strcmp(command, "convert"))
+                   num_options = cupsAddOption("copies", argv[i], num_options, &options);
+                 else
+                   strlcpy(cupsfilesconf, argv[i], sizeof(cupsfilesconf));
+               }
+               else
+                 usage(opt);
+               break;
 
-          case 'j' : /* Get job file or specify destination MIME type... */
-              if (strcmp(command, "convert"))
-             {
-               i ++;
+           case 'd' : /* Specify the real printer name */
+               i ++;
+               if (i < argc)
+                 printer = argv[i];
+               else
+                 usage(opt);
+               break;
+
+           case 'D' : /* Delete input file after conversion */
+               removeinfile = 1;
+               break;
+
+           case 'e' : /* Use every filter from the PPD file */
+               all_filters = 1;
+               break;
+
+           case 'f' : /* Specify input file... */
+               i ++;
+               if (i < argc && !infile)
+                 infile = argv[i];
+               else
+                 usage(opt);
+               break;
+
+           case 'i' : /* Specify source MIME type... */
+               i ++;
                if (i < argc)
                {
-                 get_job_file(argv[i]);
-                 infile = TempFile;
+                 if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2)
+                   usage(opt);
+
+                 srctype = argv[i];
                }
                else
                  usage(opt);
+               break;
+
+           case 'j' : /* Get job file or specify destination MIME type... */
+               if (strcmp(command, "convert"))
+               {
+                 i ++;
+                 if (i < argc)
+                 {
+                   get_job_file(argv[i]);
+                   infile = TempFile;
+                 }
+                 else
+                   usage(opt);
 
-                break;
-             }
+                 break;
+               }
+
+           case 'm' : /* Specify destination MIME type... */
+               i ++;
+               if (i < argc)
+               {
+                 if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2)
+                   usage(opt);
 
-          case 'm' : /* Specify destination MIME type... */
-             i ++;
-             if (i < argc)
-             {
-               if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2)
+                 dsttype = argv[i];
+               }
+               else
                  usage(opt);
+               break;
 
-                dsttype = argv[i];
-             }
-             else
-               usage(opt);
-             break;
-
-          case 'n' : /* Specify number of copies... */
-             i ++;
-             if (i < argc)
-               num_options = cupsAddOption("copies", argv[i], num_options,
-                                           &options);
-             else
-               usage(opt);
-             break;
-
-          case 'o' : /* Specify option(s) or output filename */
-             i ++;
-             if (i < argc)
-             {
-               if (!strcmp(command, "convert"))
+           case 'n' : /* Specify number of copies... */
+               i ++;
+               if (i < argc)
+                 num_options = cupsAddOption("copies", argv[i], num_options, &options);
+               else
+                 usage(opt);
+               break;
+
+           case 'o' : /* Specify option(s) or output filename */
+               i ++;
+               if (i < argc)
                {
-                 if (outfile)
-                   usage(NULL);
+                 if (!strcmp(command, "convert"))
+                 {
+                   if (outfile)
+                     usage(NULL);
+                   else
+                     outfile = argv[i];
+                 }
                  else
-                   outfile = argv[i];
+                   num_options = cupsParseOptions(argv[i], num_options, &options);
                }
                else
-                 num_options = cupsParseOptions(argv[i], num_options,
-                                                &options);
-             }
-             else
-               usage(opt);
-             break;
-
-          case 'p' : /* Specify PPD file... */
-          case 'P' : /* Specify PPD file... */
-             i ++;
-             if (i < argc)
-               ppdfile = argv[i];
-             else
-               usage(opt);
-             break;
-
-          case 't' : /* Specify title... */
-          case 'J' : /* Specify title... */
-             i ++;
-             if (i < argc)
-               title = argv[i];
-             else
-               usage(opt);
-             break;
-
-         case 'u' : /* Delete PPD file after conversion */
-             removeppd = 1;
-             break;
-
-          case 'U' : /* Specify username... */
-             i ++;
-             if (i < argc)
-               user = argv[i];
-             else
-               usage(opt);
-             break;
-
-         default : /* Something we don't understand... */
-             usage(opt);
-             break;
+                 usage(opt);
+               break;
+
+           case 'p' : /* Specify PPD file... */
+           case 'P' : /* Specify PPD file... */
+               i ++;
+               if (i < argc)
+                 ppdfile = argv[i];
+               else
+                 usage(opt);
+               break;
+
+           case 't' : /* Specify title... */
+           case 'J' : /* Specify title... */
+               i ++;
+               if (i < argc)
+                 title = argv[i];
+               else
+                 usage(opt);
+               break;
+
+           case 'u' : /* Delete PPD file after conversion */
+               removeppd = 1;
+               break;
+
+           case 'U' : /* Specify username... */
+               i ++;
+               if (i < argc)
+                 user = argv[i];
+               else
+                 usage(opt);
+               break;
+
+           default : /* Something we don't understand... */
+               usage(opt);
+               break;
+         }
        }
+      }
     }
     else if (!infile)
     {
@@ -358,6 +348,7 @@ main(int  argc,                             /* I - Number of command-line args */
                     _("cupsfilter: Only one filename can be specified."));
       usage(NULL);
     }
+  }
 
   if (!infile && !srctype)
     usage(NULL);
@@ -373,10 +364,10 @@ main(int  argc,                           /* I - Number of command-line args */
   }
 
  /*
-  * Load the cupsd.conf file and create the MIME database...
+  * Load the cups-files.conf file and create the MIME database...
   */
 
-  if (read_cupsd_conf(cupsdconf))
+  if (read_cups_files_conf(cupsfilesconf))
     return (1);
 
   snprintf(mimedir, sizeof(mimedir), "%s/mime", DataDir);
@@ -491,12 +482,31 @@ main(int  argc,                           /* I - Number of command-line args */
     filters = prefilters;
   }
 
- /*
-  * Do it!
-  */
+  if (list_filters)
+  {
+   /*
+    * List filters...
+    */
+
+    mime_filter_t      *filter;        /* Current filter */
 
-  status = exec_filters(src, filters, infile, outfile, ppdfile, printer, user,
-                        title, num_options, options);
+    for (filter = (mime_filter_t *)cupsArrayFirst(filters);
+        filter;
+        filter = (mime_filter_t *)cupsArrayNext(filters))
+      if (strcmp(filter->filter, "-"))
+        _cupsLangPuts(stdout, filter->filter);
+
+    status = 0;
+  }
+  else
+  {
+   /*
+    * Run filters...
+    */
+
+    status = exec_filters(src, filters, infile, outfile, ppdfile, printer, user,
+                         title, num_options, options);
+  }
 
  /*
   * Remove files as needed, then exit...
@@ -576,7 +586,7 @@ add_printer_filter(
   {
     char       *ptr;                   /* Pointer into maxsize(nnnn) program */
 
-    maxsize = strtoll(program + 8, &ptr, 10);
+    maxsize = (size_t)strtoll(program + 8, &ptr, 10);
 
     if (*ptr != ')')
     {
@@ -745,7 +755,7 @@ escape_options(
 {
   int          i;                      /* Looping var */
   cups_option_t        *option;                /* Current option */
-  int          bytes;                  /* Number of bytes needed */
+  size_t       bytes;                  /* Number of bytes needed */
   char         *s,                     /* Option string */
                *sptr,                  /* Pointer into string */
                *vptr;                  /* Pointer into value */
@@ -773,7 +783,7 @@ escape_options(
     if (sptr > s)
       *sptr++ = ' ';
 
-    strcpy(sptr, option->name);
+    strlcpy(sptr, option->name, bytes - (size_t)(sptr - s));
     sptr += strlen(sptr);
     *sptr++ = '=';
 
@@ -917,7 +927,7 @@ exec_filters(mime_type_t   *srctype,        /* I - Source type */
 {
   int          i;                      /* Looping var */
   const char   *argv[8],               /* Command-line arguments */
-               *envp[16],              /* Environment variables */
+               *envp[17],              /* Environment variables */
                *temp;                  /* Temporary string */
   char         *optstr,                /* Filter options */
                content_type[1024],     /* CONTENT_TYPE */
@@ -925,6 +935,8 @@ exec_filters(mime_type_t   *srctype,        /* I - Source type */
                cups_fontpath[1024],    /* CUPS_FONTPATH */
                cups_serverbin[1024],   /* CUPS_SERVERBIN */
                cups_serverroot[1024],  /* CUPS_SERVERROOT */
+               final_content_type[1024] = "",
+                                       /* FINAL_CONTENT_TYPE */
                lang[1024],             /* LANG */
                path[1024],             /* PATH */
                ppd[1024],              /* PPD */
@@ -948,6 +960,39 @@ exec_filters(mime_type_t   *srctype,       /* I - Source type */
 
 
  /*
+  * Figure out the final content type...
+  */
+
+  for (filter = (mime_filter_t *)cupsArrayLast(filters);
+       filter && filter->dst;
+       filter = (mime_filter_t *)cupsArrayPrev(filters))
+    if (strcmp(filter->dst->super, "printer"))
+      break;
+
+  if (filter && filter->dst)
+  {
+    const char *ptr;                   /* Pointer in type name */
+
+    if ((ptr = strchr(filter->dst->type, '/')) != NULL)
+      snprintf(final_content_type, sizeof(final_content_type),
+              "FINAL_CONTENT_TYPE=%s", ptr + 1);
+    else
+      snprintf(final_content_type, sizeof(final_content_type),
+              "FINAL_CONTENT_TYPE=%s/%s", filter->dst->super,
+              filter->dst->type);
+  }
+
+ /*
+  * Remove NULL ("-") filters...
+  */
+
+  for (filter = (mime_filter_t *)cupsArrayFirst(filters);
+       filter;
+       filter = (mime_filter_t *)cupsArrayNext(filters))
+    if (!strcmp(filter->filter, "-"))
+      cupsArrayRemove(filters, filter);
+
+ /*
   * Setup the filter environment and command-line...
   */
 
@@ -1041,7 +1086,13 @@ exec_filters(mime_type_t   *srctype,     /* I - Source type */
   envp[12] = rip_max_cache;
   envp[13] = userenv;
   envp[14] = "CHARSET=utf-8";
-  envp[15] = NULL;
+  if (final_content_type[0])
+  {
+    envp[15] = final_content_type;
+    envp[16] = NULL;
+  }
+  else
+    envp[15] = NULL;
 
   for (i = 0; argv[i]; i ++)
     fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]);
@@ -1313,13 +1364,14 @@ open_pipe(int *fds)                     /* O - Pipe file descriptors (2) */
 
 
 /*
- * 'read_cupsd_conf()' - Read the cupsd.conf file to get the filter settings.
+ * 'read_cups_files_conf()' - Read the cups-files.conf file to get the filter settings.
  */
 
 static int                             /* O - 0 on success, 1 on error */
-read_cupsd_conf(const char *filename)  /* I - File to read */
+read_cups_files_conf(
+    const char *filename)              /* I - File to read */
 {
-  cups_file_t  *fp;                    /* cupsd.conf file */
+  cups_file_t  *fp;                    /* cups-files.conf file */
   const char   *temp;                  /* Temporary string */
   char         line[1024],             /* Line from file */
                *ptr;                   /* Pointer into line */
@@ -1372,9 +1424,7 @@ read_cupsd_conf(const char *filename)     /* I - File to read */
     cupsFileClose(fp);
   }
 
-  snprintf(line, sizeof(line),
-           "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR ":/bin:/usr/bin",
-          ServerBin);
+  snprintf(line, sizeof(line), "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR ":/bin:/usr/bin", ServerBin);
   set_string(&Path, line);
 
   return (0);
@@ -1426,38 +1476,30 @@ static void
 usage(const char *opt)                 /* I - Incorrect option, if any */
 {
   if (opt)
-    _cupsLangPrintf(stderr, _("%s: Unknown option \"%c\"."), "cupsfilter",
-                    *opt);
+    _cupsLangPrintf(stderr, _("%s: Unknown option \"%c\"."), "cupsfilter", *opt);
 
-  _cupsLangPuts(stdout, _("Usage: cupsfilter [ options ] filename"));
+  _cupsLangPuts(stdout, _("Usage: cupsfilter [ options ] [ -- ] filename"));
   _cupsLangPuts(stdout, _("Options:"));
-  _cupsLangPuts(stdout, _("  -D                      Remove the input file "
-                         "when finished."));
+  _cupsLangPuts(stdout, _("  --list-filters          List filters that will be used."));
+  _cupsLangPuts(stdout, _("  -D                      Remove the input file when finished."));
   _cupsLangPuts(stdout, _("  -P filename.ppd         Set PPD file."));
   _cupsLangPuts(stdout, _("  -U username             Specify username."));
-  _cupsLangPuts(stdout, _("  -c cupsd.conf           Set cupsd.conf file to "
-                         "use."));
-  _cupsLangPuts(stdout, _("  -d printer              Use the named "
-                         "printer."));
-  _cupsLangPuts(stdout, _("  -e                      Use every filter from "
-                         "the PPD file."));
-  _cupsLangPuts(stdout, _("  -i mime/type            Set input MIME type "
-                         "(otherwise auto-typed)."));
-  _cupsLangPuts(stdout, _("  -j job-id[,N]           Filter file N from the "
-                         "specified job (default is file 1)."));
-  _cupsLangPuts(stdout, _("  -m mime/type            Set output MIME type "
-                         "(otherwise application/pdf)."));
+  _cupsLangPuts(stdout, _("  -c cups-files.conf      Set cups-files.conf file to use."));
+  _cupsLangPuts(stdout, _("  -d printer              Use the named printer."));
+  _cupsLangPuts(stdout, _("  -e                      Use every filter from the PPD file."));
+  _cupsLangPuts(stdout, _("  -i mime/type            Set input MIME type (otherwise auto-typed)."));
+  _cupsLangPuts(stdout, _("  -j job-id[,N]           Filter file N from the specified job (default is file 1)."));
+  _cupsLangPuts(stdout, _("  -m mime/type            Set output MIME type (otherwise application/pdf)."));
   _cupsLangPuts(stdout, _("  -n copies               Set number of copies."));
   _cupsLangPuts(stdout, _("  -o name=value           Set option(s)."));
   _cupsLangPuts(stdout, _("  -p filename.ppd         Set PPD file."));
   _cupsLangPuts(stdout, _("  -t title                Set title."));
-  _cupsLangPuts(stdout, _("  -u                      Remove the PPD file "
-                         "when finished."));
+  _cupsLangPuts(stdout, _("  -u                      Remove the PPD file when finished."));
 
   exit(1);
 }
 
 
 /*
- * End of "$Id: cupsfilter.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupsfilter.c 12304 2014-12-09 16:16:28Z msweet $".
  */
index bce0d64..54a08e2 100644 (file)
@@ -1,46 +1,16 @@
 /*
- * "$Id: dirsvc.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dirsvc.c 12458 2015-01-30 16:15:53Z msweet $"
  *
- *   Directory services routines for the CUPS scheduler.
+ * Directory services routines for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdDeregisterPrinter()  - Stop sending broadcast information for a local
- *                              printer and remove any pending references to
- *                              remote printers.
- *   cupsdRegisterPrinter()    - Start sending broadcast information for a
- *                              printer or update the broadcast contents.
- *   cupsdStartBrowsing()      - Start sending and receiving broadcast
- *                              information.
- *   cupsdStopBrowsing()       - Stop sending and receiving broadcast
- *                              information.
- *   cupsdUpdateDNSSDName()    - Update the computer name we use for
- *                              browsing...
- *   dnssdAddAlias()          - Add a DNS-SD alias name.
- *   dnssdBuildTxtRecord()     - Build a TXT record from printer info.
- *   dnssdDeregisterInstance() - Deregister a DNS-SD service instance.
- *   dnssdDeregisterPrinter()  - Deregister all services for a printer.
- *   dnssdErrorString()        - Return an error string for an error code.
- *   dnssdRegisterCallback()   - Free a TXT record.
- *   dnssdRegisterCallback()   - DNSServiceRegister callback.
- *   dnssdRegisterInstance()   - Register an instance of a printer service.
- *   dnssdRegisterPrinter()    - Start sending broadcast information for a
- *                              printer or update the broadcast contents.
- *   dnssdStop()              - Stop all DNS-SD registrations.
- *   dnssdUpdate()            - Handle DNS-SD queries.
- *   get_auth_info_required()  - Get the auth-info-required value to advertise.
- *   get_hostconfig()         - Get an /etc/hostconfig service setting.
- *   update_lpd()             - Update the LPD configuration as needed.
- *   update_smb()             - Update the SMB configuration as needed.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
 
 
 /*
+ * Local globals...
+ */
+
+#ifdef HAVE_AVAHI
+static int     avahi_running = 0;
+#endif /* HAVE_AVAHI */
+
+
+/*
  * Local functions...
  */
 
@@ -78,11 +57,15 @@ static void         dnssdAddAlias(const void *key, const void *value,
                                      void *context);
 #  endif /* __APPLE__ */
 static cupsd_txt_t     dnssdBuildTxtRecord(cupsd_printer_t *p, int for_lpd);
-static void            dnssdDeregisterInstance(cupsd_srv_t *srv);
-static void            dnssdDeregisterPrinter(cupsd_printer_t *p,
-                                              int clear_name);
+#  ifdef HAVE_AVAHI
+static void            dnssdClientCallback(AvahiClient *c, AvahiClientState state, void *userdata);
+#  endif /* HAVE_AVAHI */
+static void            dnssdDeregisterAllPrinters(int from_callback);
+static void            dnssdDeregisterInstance(cupsd_srv_t *srv, int from_callback);
+static void            dnssdDeregisterPrinter(cupsd_printer_t *p, int clear_name, int from_callback);
 static const char      *dnssdErrorString(int error);
 static void            dnssdFreeTxtRecord(cupsd_txt_t *txt);
+static void            dnssdRegisterAllPrinters(int from_callback);
 #  ifdef HAVE_DNSSD
 static void            dnssdRegisterCallback(DNSServiceRef sdRef,
                                              DNSServiceFlags flags,
@@ -96,16 +79,13 @@ static void         dnssdRegisterCallback(AvahiEntryGroup *p,
                                              AvahiEntryGroupState state,
                                              void *context);
 #  endif /* HAVE_DNSSD */
-static int             dnssdRegisterInstance(cupsd_srv_t *srv,
-                                             cupsd_printer_t *p,
-                                             char *name, const char *type,
-                                             const char *subtypes, int port,
-                                             cupsd_txt_t *txt, int commit);
-static void            dnssdRegisterPrinter(cupsd_printer_t *p);
+static int             dnssdRegisterInstance(cupsd_srv_t *srv, cupsd_printer_t *p, char *name, const char *type, const char *subtypes, int port, cupsd_txt_t *txt, int commit, int from_callback);
+static void            dnssdRegisterPrinter(cupsd_printer_t *p, int from_callback);
 static void            dnssdStop(void);
 #  ifdef HAVE_DNSSD
 static void            dnssdUpdate(void);
 #  endif /* HAVE_DNSSD */
+static void            dnssdUpdateDNSSDName(int from_callback);
 #endif /* HAVE_DNSSD || HAVE_AVAHI */
 
 
@@ -138,7 +118,7 @@ cupsdDeregisterPrinter(
 
 #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
   if (removeit && (BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDMaster)
-    dnssdDeregisterPrinter(p, 1);
+    dnssdDeregisterPrinter(p, 1, 0);
 #endif /* HAVE_DNSSD || HAVE_AVAHI */
 }
 
@@ -160,7 +140,7 @@ cupsdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
 
 #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
   if ((BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDMaster)
-    dnssdRegisterPrinter(p);
+    dnssdRegisterPrinter(p, 0);
 #endif /* HAVE_DNSSD || HAVE_AVAHI */
 }
 
@@ -172,16 +152,12 @@ cupsdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
 void
 cupsdStartBrowsing(void)
 {
-  cupsd_printer_t      *p;             /* Current printer */
-
-
   if (!Browsing || !BrowseLocalProtocols)
     return;
 
 #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
   if (BrowseLocalProtocols & BROWSE_DNSSD)
   {
-    cupsd_listener_t   *lis;           /* Current listening socket */
 #  ifdef HAVE_DNSSD
     DNSServiceErrorType error;         /* Error from service creation */
 
@@ -211,6 +187,13 @@ cupsdStartBrowsing(void)
       cupsdAddSelect(fd, (cupsd_selfunc_t)dnssdUpdate, NULL, NULL);
     }
 
+   /*
+    * Set the computer name and register the web interface...
+    */
+
+    DNSSDPort = 0;
+    cupsdUpdateDNSSDName();
+
 #  else /* HAVE_AVAHI */
     if ((DNSSDMaster = avahi_threaded_poll_new()) == NULL)
     {
@@ -223,8 +206,7 @@ cupsdStartBrowsing(void)
     {
       int error;                       /* Error code, if any */
 
-      DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), 0,
-                                     NULL, NULL, &error);
+      DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssdClientCallback, NULL, &error);
 
       if (DNSSDClient == NULL)
       {
@@ -242,31 +224,6 @@ cupsdStartBrowsing(void)
        avahi_threaded_poll_start(DNSSDMaster);
     }
 #  endif /* HAVE_DNSSD */
-
-   /*
-    * Then get the port we use for registrations.  If we are not listening
-    * on any non-local ports, there is no sense sharing local printers via
-    * Bonjour...
-    */
-
-    DNSSDPort = 0;
-
-    for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
-        lis;
-        lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
-    {
-      if (httpAddrLocalhost(&(lis->address)))
-       continue;
-
-      DNSSDPort = _httpAddrPort(&(lis->address));
-      break;
-    }
-
-   /*
-    * Set the computer name and register the web interface...
-    */
-
-    cupsdUpdateDNSSDName();
   }
 #endif /* HAVE_DNSSD || HAVE_AVAHI */
 
@@ -280,15 +237,13 @@ cupsdStartBrowsing(void)
   if (BrowseLocalProtocols & BROWSE_SMB)
     update_smb(1);
 
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
  /*
   * Register the individual printers
   */
 
-  for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
-       p;
-       p = (cupsd_printer_t *)cupsArrayNext(Printers))
-    if (!(p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_SCANNER)))
-      cupsdRegisterPrinter(p);
+  dnssdRegisterAllPrinters(0);
+#endif /* HAVE_DNSSD || HAVE_AVAHI */
 }
 
 
@@ -299,27 +254,20 @@ cupsdStartBrowsing(void)
 void
 cupsdStopBrowsing(void)
 {
-  cupsd_printer_t      *p;             /* Current printer */
-
-
   if (!Browsing || !BrowseLocalProtocols)
     return;
 
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
  /*
   * De-register the individual printers
   */
 
-  for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
-       p;
-       p = (cupsd_printer_t *)cupsArrayNext(Printers))
-    if (!(p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_SCANNER)))
-      cupsdDeregisterPrinter(p, 1);
+  dnssdDeregisterAllPrinters(0);
 
  /*
   * Shut down browsing sockets...
   */
 
-#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
   if ((BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDMaster)
     dnssdStop();
 #endif /* HAVE_DNSSD || HAVE_AVAHI */
@@ -344,161 +292,7 @@ cupsdStopBrowsing(void)
 void
 cupsdUpdateDNSSDName(void)
 {
-  char         webif[1024];            /* Web interface share name */
-#  ifdef __APPLE__
-  SCDynamicStoreRef sc;                        /* Context for dynamic store */
-  CFDictionaryRef btmm;                        /* Back-to-My-Mac domains */
-  CFStringEncoding nameEncoding;       /* Encoding of computer name */
-  CFStringRef  nameRef;                /* Host name CFString */
-  char         nameBuffer[1024];       /* C-string buffer */
-#  endif /* __APPLE__ */
-
-
- /*
-  * Only share the web interface and printers when non-local listening is
-  * enabled...
-  */
-
-  if (!DNSSDPort)
-    return;
-
- /*
-  * Get the computer name as a c-string...
-  */
-
-#  ifdef __APPLE__
-  sc = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("cupsd"), NULL, NULL);
-
-  if (sc)
-  {
-   /*
-    * Get the computer name from the dynamic store...
-    */
-
-    cupsdClearString(&DNSSDComputerName);
-
-    if ((nameRef = SCDynamicStoreCopyComputerName(sc, &nameEncoding)) != NULL)
-    {
-      if (CFStringGetCString(nameRef, nameBuffer, sizeof(nameBuffer),
-                            kCFStringEncodingUTF8))
-      {
-        cupsdLogMessage(CUPSD_LOG_DEBUG,
-                       "Dynamic store computer name is \"%s\".", nameBuffer);
-       cupsdSetString(&DNSSDComputerName, nameBuffer);
-      }
-
-      CFRelease(nameRef);
-    }
-
-    if (!DNSSDComputerName)
-    {
-     /*
-      * Use the ServerName instead...
-      */
-
-      cupsdLogMessage(CUPSD_LOG_DEBUG,
-                      "Using ServerName \"%s\" as computer name.", ServerName);
-      cupsdSetString(&DNSSDComputerName, ServerName);
-    }
-
-   /*
-    * Get the local hostname from the dynamic store...
-    */
-
-    cupsdClearString(&DNSSDHostName);
-
-    if ((nameRef = SCDynamicStoreCopyLocalHostName(sc)) != NULL)
-    {
-      if (CFStringGetCString(nameRef, nameBuffer, sizeof(nameBuffer),
-                            kCFStringEncodingUTF8))
-      {
-        cupsdLogMessage(CUPSD_LOG_DEBUG,
-                       "Dynamic store host name is \"%s\".", nameBuffer);
-       cupsdSetString(&DNSSDHostName, nameBuffer);
-      }
-
-      CFRelease(nameRef);
-    }
-
-    if (!DNSSDHostName)
-    {
-     /*
-      * Use the ServerName instead...
-      */
-
-      cupsdLogMessage(CUPSD_LOG_DEBUG,
-                      "Using ServerName \"%s\" as host name.", ServerName);
-      cupsdSetString(&DNSSDHostName, ServerName);
-    }
-
-   /*
-    * Get any Back-to-My-Mac domains and add them as aliases...
-    */
-
-    cupsdFreeAliases(DNSSDAlias);
-    DNSSDAlias = NULL;
-
-    btmm = SCDynamicStoreCopyValue(sc, CFSTR("Setup:/Network/BackToMyMac"));
-    if (btmm && CFGetTypeID(btmm) == CFDictionaryGetTypeID())
-    {
-      cupsdLogMessage(CUPSD_LOG_DEBUG, "%d Back to My Mac aliases to add.",
-                     (int)CFDictionaryGetCount(btmm));
-      CFDictionaryApplyFunction(btmm, dnssdAddAlias, NULL);
-    }
-    else if (btmm)
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "Bad Back to My Mac data in dynamic store!");
-    else
-      cupsdLogMessage(CUPSD_LOG_DEBUG, "No Back to My Mac aliases to add.");
-
-    if (btmm)
-      CFRelease(btmm);
-
-    CFRelease(sc);
-  }
-  else
-#  endif /* __APPLE__ */
-#  ifdef HAVE_AVAHI
-  if (DNSSDClient)
-  {
-    const char *host_name = avahi_client_get_host_name(DNSSDClient);
-    const char *host_fqdn = avahi_client_get_host_name_fqdn(DNSSDClient);
-
-    cupsdSetString(&DNSSDComputerName, host_name ? host_name : ServerName);
-
-    if (host_fqdn)
-      cupsdSetString(&DNSSDHostName, host_fqdn);
-    else if (strchr(ServerName, '.'))
-      cupsdSetString(&DNSSDHostName, ServerName);
-    else
-      cupsdSetStringf(&DNSSDHostName, "%s.local", ServerName);
-  }
-  else
-#  endif /* HAVE_AVAHI */
-  {
-    cupsdSetString(&DNSSDComputerName, ServerName);
-
-    if (strchr(ServerName, '.'))
-      cupsdSetString(&DNSSDHostName, ServerName);
-    else
-      cupsdSetStringf(&DNSSDHostName, "%s.local", ServerName);
-  }
-
- /*
-  * Then (re)register the web interface if enabled...
-  */
-
-  if (BrowseWebIF)
-  {
-    if (DNSSDComputerName)
-      snprintf(webif, sizeof(webif), "CUPS @ %s", DNSSDComputerName);
-    else
-      strlcpy(webif, "CUPS", sizeof(webif));
-
-    dnssdDeregisterInstance(&WebIFSrv);
-    dnssdRegisterInstance(&WebIFSrv, NULL, webif, "_http._tcp", "_printer",
-                          DNSSDPort, NULL, 1);
-  }
+  dnssdUpdateDNSSDName(0);
 }
 
 
@@ -639,7 +433,9 @@ dnssdBuildTxtRecord(
     if (p->type & CUPS_PRINTER_FAX)
     {
       keyvalue[count  ][0] = "Fax";
-      keyvalue[count++][1] = (p->type & CUPS_PRINTER_FAX) ? "T" : "F";
+      keyvalue[count++][1] = "T";
+      keyvalue[count  ][0] = "rfo";
+      keyvalue[count++][1] = rp_str;
     }
 
     if (p->type & CUPS_PRINTER_COLOR)
@@ -731,24 +527,158 @@ dnssdBuildTxtRecord(
 }
 
 
+#  ifdef HAVE_AVAHI
+/*
+ * 'dnssdClientCallback()' - Client callback for Avahi.
+ *
+ * Called whenever the client or server state changes...
+ */
+
+static void
+dnssdClientCallback(
+    AvahiClient      *c,               /* I - Client */
+    AvahiClientState state,            /* I - Current state */
+    void             *userdata)                /* I - User data (unused) */
+{
+  int  error;                          /* Error code, if any */
+
+
+  (void)userdata;
+
+  if (!c)
+    return;
+
+ /*
+  * Make sure DNSSDClient is already set also if this callback function is
+  * already running before avahi_client_new() in dnssdStartBrowsing()
+  * finishes.
+  */
+
+  if (!DNSSDClient)
+    DNSSDClient = c;
+
+  switch (state)
+  {
+    case AVAHI_CLIENT_S_REGISTERING:
+    case AVAHI_CLIENT_S_RUNNING:
+    case AVAHI_CLIENT_S_COLLISION:
+       cupsdLogMessage(CUPSD_LOG_DEBUG, "Avahi server connection now available, registering printers for Bonjour broadcasting.");
+
+       /*
+       * Mark that Avahi server is running...
+       */
+
+       avahi_running = 1;
+
+       /*
+       * Set the computer name and register the web interface...
+       */
+
+       DNSSDPort = 0;
+       dnssdUpdateDNSSDName(1);
+
+       /*
+       * Register the individual printers
+       */
+
+       dnssdRegisterAllPrinters(1);
+       break;
+
+    case AVAHI_CLIENT_FAILURE:
+       if (avahi_client_errno(c) == AVAHI_ERR_DISCONNECTED)
+       {
+         cupsdLogMessage(CUPSD_LOG_DEBUG, "Avahi server disappeared, unregistering printers for Bonjour broadcasting.");
+
+        /*
+         * Unregister everything and close the client...
+         */
+
+         dnssdDeregisterAllPrinters(1);
+         dnssdDeregisterInstance(&WebIFSrv, 1);
+         avahi_client_free(DNSSDClient);
+         DNSSDClient = NULL;
+
+        /*
+         * Mark that Avahi server is not running...
+         */
+
+         avahi_running = 0;
+
+        /*
+         * Renew Avahi client...
+         */
+
+         DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssdClientCallback, NULL, &error);
+
+         if (!DNSSDClient)
+         {
+           cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to communicate with avahi-daemon: %s", dnssdErrorString(error));
+           if (FatalErrors & CUPSD_FATAL_BROWSE)
+             cupsdEndProcess(getpid(), 0);
+         }
+       }
+       else
+       {
+         cupsdLogMessage(CUPSD_LOG_ERROR, "Communication with avahi-daemon has failed: %s", avahi_strerror(avahi_client_errno(c)));
+         if (FatalErrors & CUPSD_FATAL_BROWSE)
+           cupsdEndProcess(getpid(), 0);
+       }
+       break;
+
+    default:
+        break;
+  }
+}
+#  endif /* HAVE_AVAHI */
+
+
+/*
+ * 'dnssdDeregisterAllPrinters()' - Deregister all printers.
+ */
+
+static void
+dnssdDeregisterAllPrinters(
+    int             from_callback)     /* I - Deregistering because of callback? */
+{
+  cupsd_printer_t      *p;             /* Current printer */
+
+
+  if (!DNSSDMaster)
+    return;
+
+  for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
+       p;
+       p = (cupsd_printer_t *)cupsArrayNext(Printers))
+    if (!(p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_SCANNER)))
+      dnssdDeregisterPrinter(p, 1, from_callback);
+}
+
+
 /*
  * 'dnssdDeregisterInstance()' - Deregister a DNS-SD service instance.
  */
 
 static void
 dnssdDeregisterInstance(
-    cupsd_srv_t     *srv)              /* I - Service */
+    cupsd_srv_t     *srv,              /* I - Service */
+    int             from_callback)     /* I - Called from callback? */
 {
   if (!srv || !*srv)
     return;
 
 #  ifdef HAVE_DNSSD
+  (void)from_callback;
+
   DNSServiceRefDeallocate(*srv);
 
 #  else /* HAVE_AVAHI */
-  avahi_threaded_poll_lock(DNSSDMaster);
+  if (!from_callback)
+    avahi_threaded_poll_lock(DNSSDMaster);
+
   avahi_entry_group_free(*srv);
-  avahi_threaded_poll_unlock(DNSSDMaster);
+
+  if (!from_callback)
+    avahi_threaded_poll_unlock(DNSSDMaster);
 #  endif /* HAVE_DNSSD */
 
   *srv = NULL;
@@ -762,7 +692,8 @@ dnssdDeregisterInstance(
 static void
 dnssdDeregisterPrinter(
     cupsd_printer_t *p,                        /* I - Printer */
-    int             clear_name)                /* I - Clear the name? */
+    int             clear_name,                /* I - Clear the name? */
+    int             from_callback)     /* I - Called from callback? */
 
 {
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
@@ -771,13 +702,13 @@ dnssdDeregisterPrinter(
 
   if (p->ipp_srv)
   {
-    dnssdDeregisterInstance(&p->ipp_srv);
+    dnssdDeregisterInstance(&p->ipp_srv, from_callback);
 
 #  ifdef HAVE_DNSSD
 #    ifdef HAVE_SSL
-    dnssdDeregisterInstance(&p->ipps_srv);
+    dnssdDeregisterInstance(&p->ipps_srv, from_callback);
 #    endif /* HAVE_SSL */
-    dnssdDeregisterInstance(&p->printer_srv);
+    dnssdDeregisterInstance(&p->printer_srv, from_callback);
 #  endif /* HAVE_DNSSD */
   }
 
@@ -929,6 +860,27 @@ dnssdFreeTxtRecord(cupsd_txt_t *txt)       /* I - TXT record */
 
 
 /*
+ * 'dnssdRegisterAllPrinters()' - Register all printers.
+ */
+
+static void
+dnssdRegisterAllPrinters(int from_callback)    /* I - Called from callback? */
+{
+  cupsd_printer_t      *p;                     /* Current printer */
+
+
+  if (!DNSSDMaster)
+    return;
+
+  for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
+       p;
+       p = (cupsd_printer_t *)cupsArrayNext(Printers))
+    if (!(p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_SCANNER)))
+      dnssdRegisterPrinter(p, from_callback);
+}
+
+
+/*
  * 'dnssdRegisterCallback()' - DNSServiceRegister callback.
  */
 
@@ -1008,15 +960,19 @@ dnssdRegisterInstance(
     const char      *subtypes,         /* I - Subtypes to register or NULL */
     int             port,              /* I - Port number or 0 */
     cupsd_txt_t     *txt,              /* I - TXT record */
-    int             commit)            /* I - Commit registration? */
+    int             commit,            /* I - Commit registration? */
+    int             from_callback)     /* I - Called from callback? */
 {
   char temp[256],                      /* Temporary string */
        *ptr;                           /* Pointer into string */
   int  error;                          /* Any error */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG,
-                 "Registering \"%s\" with DNS-SD type \"%s\".", name, type);
+#  ifdef HAVE_DNSSD
+  (void)from_callback;
+#  endif /* HAVE_DNSSD */
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "Registering \"%s\" with DNS-SD type \"%s\".", name, type);
 
   if (p && !srv)
   {
@@ -1043,13 +999,15 @@ dnssdRegisterInstance(
   (void)commit;
 
 #  else /* HAVE_AVAHI */
-  avahi_threaded_poll_lock(DNSSDMaster);
+  if (!from_callback)
+    avahi_threaded_poll_lock(DNSSDMaster);
 
   if (!*srv)
     *srv = avahi_entry_group_new(DNSSDClient, dnssdRegisterCallback, NULL);
   if (!*srv)
   {
-    avahi_threaded_poll_unlock(DNSSDMaster);
+    if (!from_callback)
+      avahi_threaded_poll_unlock(DNSSDMaster);
 
     cupsdLogMessage(CUPSD_LOG_WARN, "DNS-SD registration of \"%s\" failed: %s",
                     name, dnssdErrorString(avahi_client_errno(DNSSDClient)));
@@ -1166,7 +1124,8 @@ dnssdRegisterInstance(
                       name);
   }
 
-  avahi_threaded_poll_unlock(DNSSDMaster);
+  if (!from_callback)
+    avahi_threaded_poll_unlock(DNSSDMaster);
 #  endif /* HAVE_DNSSD */
 
   if (error)
@@ -1188,7 +1147,9 @@ dnssdRegisterInstance(
  */
 
 static void
-dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
+dnssdRegisterPrinter(
+    cupsd_printer_t *p,                        /* I - Printer */
+    int             from_callback)     /* I - Called from callback? */
 {
   char         name[256];              /* Service name */
   int          printer_port;           /* LPD port number */
@@ -1196,15 +1157,21 @@ dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
   cupsd_txt_t  ipp_txt,                /* IPP(S) TXT record */
                printer_txt;            /* LPD TXT record */
 
+
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name,
                   !p->ipp_srv ? "new" : "update");
 
+#  ifdef HAVE_AVAHI
+  if (!avahi_running)
+    return;
+#  endif /* HAVE_AVAHI */
+
  /*
   * Remove the current registrations if we have them and then return if
   * per-printer sharing was just disabled...
   */
 
-  dnssdDeregisterPrinter(p, 0);
+  dnssdDeregisterPrinter(p, 0, from_callback);
 
   if (!p->shared)
     return;
@@ -1247,13 +1214,11 @@ dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
   else
     printer_port = 0;
 
-  status = dnssdRegisterInstance(NULL, p, name, "_printer._tcp", NULL,
-                                 printer_port, &printer_txt, 0);
+  status = dnssdRegisterInstance(NULL, p, name, "_printer._tcp", NULL, printer_port, &printer_txt, 0, from_callback);
 
 #  ifdef HAVE_SSL
   if (status)
-    dnssdRegisterInstance(NULL, p, name, "_ipps._tcp", DNSSDSubTypes,
-                         DNSSDPort, &ipp_txt, 0);
+    dnssdRegisterInstance(NULL, p, name, "_ipps._tcp", DNSSDSubTypes, DNSSDPort, &ipp_txt, 0, from_callback);
 #  endif /* HAVE_SSL */
 
   if (status)
@@ -1263,11 +1228,9 @@ dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
     */
 
     if (p->type & CUPS_PRINTER_FAX)
-      status = dnssdRegisterInstance(NULL, p, name, "_fax-ipp._tcp",
-                                     DNSSDSubTypes, DNSSDPort, &ipp_txt, 1);
+      status = dnssdRegisterInstance(NULL, p, name, "_fax-ipp._tcp", DNSSDSubTypes, DNSSDPort, &ipp_txt, 1, from_callback);
     else
-      status = dnssdRegisterInstance(NULL, p, name, "_ipp._tcp", DNSSDSubTypes,
-                                     DNSSDPort, &ipp_txt, 1);
+      status = dnssdRegisterInstance(NULL, p, name, "_ipp._tcp", DNSSDSubTypes, DNSSDPort, &ipp_txt, 1, from_callback);
   }
 
   dnssdFreeTxtRecord(&ipp_txt);
@@ -1289,13 +1252,13 @@ dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */
     * Registration failed for this printer...
     */
 
-    dnssdDeregisterInstance(&p->ipp_srv);
+    dnssdDeregisterInstance(&p->ipp_srv, from_callback);
 
 #  ifdef HAVE_DNSSD
 #    ifdef HAVE_SSL
-    dnssdDeregisterInstance(&p->ipps_srv);
+    dnssdDeregisterInstance(&p->ipps_srv, from_callback);
 #    endif /* HAVE_SSL */
-    dnssdDeregisterInstance(&p->printer_srv);
+    dnssdDeregisterInstance(&p->printer_srv, from_callback);
 #  endif /* HAVE_DNSSD */
   }
 }
@@ -1318,13 +1281,13 @@ dnssdStop(void)
   for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
        p;
        p = (cupsd_printer_t *)cupsArrayNext(Printers))
-    dnssdDeregisterPrinter(p, 1);
+    dnssdDeregisterPrinter(p, 1, 0);
 
  /*
   * Shutdown the rest of the service refs...
   */
 
-  dnssdDeregisterInstance(&WebIFSrv);
+  dnssdDeregisterInstance(&WebIFSrv, 0);
 
 #  ifdef HAVE_DNSSD
   cupsdRemoveSelect(DNSServiceRefSockFD(DNSSDMaster));
@@ -1333,11 +1296,20 @@ dnssdStop(void)
   DNSSDMaster = NULL;
 
 #  else /* HAVE_AVAHI */
-  avahi_client_free(DNSSDClient);
-  DNSSDClient = NULL;
+  if (DNSSDMaster)
+    avahi_threaded_poll_stop(DNSSDMaster);
 
-  avahi_threaded_poll_free(DNSSDMaster);
-  DNSSDMaster = NULL;
+  if (DNSSDClient)
+  {
+    avahi_client_free(DNSSDClient);
+    DNSSDClient = NULL;
+  }
+
+  if (DNSSDMaster)
+  {
+    avahi_threaded_poll_free(DNSSDMaster);
+    DNSSDMaster = NULL;
+  }
 #  endif /* HAVE_DNSSD */
 
   cupsArrayDelete(DNSSDPrinters);
@@ -1370,6 +1342,191 @@ dnssdUpdate(void)
 
 
 /*
+ * 'dnssdUpdateDNSSDName()' - Update the listen port, computer name, and web interface registration.
+ */
+
+static void
+dnssdUpdateDNSSDName(int from_callback)        /* I - Called from callback? */
+{
+  char         webif[1024];            /* Web interface share name */
+#  ifdef __APPLE__
+  SCDynamicStoreRef sc;                        /* Context for dynamic store */
+  CFDictionaryRef btmm;                        /* Back-to-My-Mac domains */
+  CFStringEncoding nameEncoding;       /* Encoding of computer name */
+  CFStringRef  nameRef;                /* Host name CFString */
+  char         nameBuffer[1024];       /* C-string buffer */
+#  endif /* __APPLE__ */
+
+
+ /*
+  * Only share the web interface and printers when non-local listening is
+  * enabled...
+  */
+
+  if (!DNSSDPort)
+  {
+   /*
+    * Get the port we use for registrations.  If we are not listening on any
+    * non-local ports, there is no sense sharing local printers via Bonjour...
+    */
+
+    cupsd_listener_t   *lis;           /* Current listening socket */
+
+    for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
+        lis;
+        lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
+    {
+      if (httpAddrLocalhost(&(lis->address)))
+       continue;
+
+      DNSSDPort = httpAddrPort(&(lis->address));
+      break;
+    }
+  }
+
+  if (!DNSSDPort)
+    return;
+
+ /*
+  * Get the computer name as a c-string...
+  */
+
+#  ifdef __APPLE__
+  sc = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("cupsd"), NULL, NULL);
+
+  if (sc)
+  {
+   /*
+    * Get the computer name from the dynamic store...
+    */
+
+    cupsdClearString(&DNSSDComputerName);
+
+    if ((nameRef = SCDynamicStoreCopyComputerName(sc, &nameEncoding)) != NULL)
+    {
+      if (CFStringGetCString(nameRef, nameBuffer, sizeof(nameBuffer),
+                            kCFStringEncodingUTF8))
+      {
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
+                       "Dynamic store computer name is \"%s\".", nameBuffer);
+       cupsdSetString(&DNSSDComputerName, nameBuffer);
+      }
+
+      CFRelease(nameRef);
+    }
+
+    if (!DNSSDComputerName)
+    {
+     /*
+      * Use the ServerName instead...
+      */
+
+      cupsdLogMessage(CUPSD_LOG_DEBUG,
+                      "Using ServerName \"%s\" as computer name.", ServerName);
+      cupsdSetString(&DNSSDComputerName, ServerName);
+    }
+
+   /*
+    * Get the local hostname from the dynamic store...
+    */
+
+    cupsdClearString(&DNSSDHostName);
+
+    if ((nameRef = SCDynamicStoreCopyLocalHostName(sc)) != NULL)
+    {
+      if (CFStringGetCString(nameRef, nameBuffer, sizeof(nameBuffer),
+                            kCFStringEncodingUTF8))
+      {
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
+                       "Dynamic store host name is \"%s\".", nameBuffer);
+       cupsdSetString(&DNSSDHostName, nameBuffer);
+      }
+
+      CFRelease(nameRef);
+    }
+
+    if (!DNSSDHostName)
+    {
+     /*
+      * Use the ServerName instead...
+      */
+
+      cupsdLogMessage(CUPSD_LOG_DEBUG,
+                      "Using ServerName \"%s\" as host name.", ServerName);
+      cupsdSetString(&DNSSDHostName, ServerName);
+    }
+
+   /*
+    * Get any Back-to-My-Mac domains and add them as aliases...
+    */
+
+    cupsdFreeAliases(DNSSDAlias);
+    DNSSDAlias = NULL;
+
+    btmm = SCDynamicStoreCopyValue(sc, CFSTR("Setup:/Network/BackToMyMac"));
+    if (btmm && CFGetTypeID(btmm) == CFDictionaryGetTypeID())
+    {
+      cupsdLogMessage(CUPSD_LOG_DEBUG, "%d Back to My Mac aliases to add.",
+                     (int)CFDictionaryGetCount(btmm));
+      CFDictionaryApplyFunction(btmm, dnssdAddAlias, NULL);
+    }
+    else if (btmm)
+      cupsdLogMessage(CUPSD_LOG_ERROR,
+                     "Bad Back to My Mac data in dynamic store!");
+    else
+      cupsdLogMessage(CUPSD_LOG_DEBUG, "No Back to My Mac aliases to add.");
+
+    if (btmm)
+      CFRelease(btmm);
+
+    CFRelease(sc);
+  }
+  else
+#  endif /* __APPLE__ */
+#  ifdef HAVE_AVAHI
+  if (DNSSDClient)
+  {
+    const char *host_name = avahi_client_get_host_name(DNSSDClient);
+    const char *host_fqdn = avahi_client_get_host_name_fqdn(DNSSDClient);
+
+    cupsdSetString(&DNSSDComputerName, host_name ? host_name : ServerName);
+
+    if (host_fqdn)
+      cupsdSetString(&DNSSDHostName, host_fqdn);
+    else if (strchr(ServerName, '.'))
+      cupsdSetString(&DNSSDHostName, ServerName);
+    else
+      cupsdSetStringf(&DNSSDHostName, "%s.local", ServerName);
+  }
+  else
+#  endif /* HAVE_AVAHI */
+  {
+    cupsdSetString(&DNSSDComputerName, ServerName);
+
+    if (strchr(ServerName, '.'))
+      cupsdSetString(&DNSSDHostName, ServerName);
+    else
+      cupsdSetStringf(&DNSSDHostName, "%s.local", ServerName);
+  }
+
+ /*
+  * Then (re)register the web interface if enabled...
+  */
+
+  if (BrowseWebIF)
+  {
+    if (DNSSDComputerName)
+      snprintf(webif, sizeof(webif), "CUPS @ %s", DNSSDComputerName);
+    else
+      strlcpy(webif, "CUPS", sizeof(webif));
+
+    dnssdDeregisterInstance(&WebIFSrv, from_callback);
+    dnssdRegisterInstance(&WebIFSrv, NULL, webif, "_http._tcp", "_printer", DNSSDPort, NULL, 1, from_callback);
+  }
+}
+
+
+/*
  * 'get_auth_info_required()' - Get the auth-info-required value to advertise.
  */
 
@@ -1400,7 +1557,7 @@ get_auth_info_required(
       if (i)
        *bufptr++ = ',';
 
-      strlcpy(bufptr, p->auth_info_required[i], bufsize - (bufptr - buffer));
+      strlcpy(bufptr, p->auth_info_required[i], bufsize - (size_t)(bufptr - buffer));
       bufptr += strlen(bufptr);
     }
 
@@ -1666,5 +1823,5 @@ update_smb(int onoff)                     /* I - 1 = turn on, 0 = turn off */
 
 
 /*
- * End of "$Id: dirsvc.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dirsvc.c 12458 2015-01-30 16:15:53Z msweet $".
  */
index edc5ad3..1326f8a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: dirsvc.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: dirsvc.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Directory services definitions for the CUPS scheduler.
  *
@@ -80,5 +80,5 @@ extern void   cupsdUpdateDNSSDName(void);
 
 
 /*
- * End of "$Id: dirsvc.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: dirsvc.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index ba11aad..59eab27 100644 (file)
@@ -1,27 +1,16 @@
 /*
- * "$Id: env.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: env.c 12700 2015-06-08 18:32:35Z msweet $"
  *
- *   Environment management routines for the CUPS scheduler.
+ * Environment management routines for the CUPS scheduler.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdInitEnv()   - Initialize the current environment with standard
- *                      variables.
- *   cupsdLoadEnv()   - Copy common environment variables into an array.
- *   cupsdSetEnv()    - Set a common environment variable.
- *   cupsdSetEnvf()   - Set a formatted common environment variable.
- *   cupsdUpdateEnv() - Update the environment for the configured directories.
- *   clear_env()      - Clear common environment variables.
- *   find_env()       - Find a common environment variable.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -131,6 +120,13 @@ cupsdSetEnv(const char *name,              /* I - Name of variable */
     return;
 
  /*
+  * Do not allow dynamic linker variables when running as root...
+  */
+
+  if (!RunUser && (!strncmp(name, "DYLD_", 5) || !strncmp(name, "LD_", 3)))
+    return;
+
+ /*
   * See if this variable has already been defined...
   */
 
@@ -269,5 +265,5 @@ find_env(const char *name)          /* I - Variable name */
 
 
 /*
- * End of "$Id: env.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: env.c 12700 2015-06-08 18:32:35Z msweet $".
  */
index 84ceef1..ae91b9e 100644 (file)
@@ -1,28 +1,16 @@
 /*
- * "$Id: file.c 11221 2013-08-06 16:16:01Z msweet $"
+ * "$Id: file.c 11594 2014-02-14 20:09:01Z msweet $"
  *
- *   File functions for the CUPS scheduler.
+ * File functions for the CUPS scheduler.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdCleanFiles()           - Clean out old files.
- *   cupsdCloseCreatedConfFile() - Close a created configuration file and move
- *                                 into place.
- *   cupsdClosePipe()            - Close a pipe as necessary.
- *   cupsdCreateConfFile()       - Create a configuration file safely.
- *   cupsdOpenConfFile()         - Open a configuration file.
- *   cupsdOpenPipe()             - Create a pipe which is closed on exec.
- *   cupsdRemoveFile()           - Remove a file using the 7-pass US DoD method.
- *   overwrite_data()            - Overwrite the data in a file.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -43,7 +31,7 @@ static int    overwrite_data(int fd, const char *buffer, int bufsize,
 /*
  * 'cupsdCleanFiles()' - Clean out old files.
  */
+
 void
 cupsdCleanFiles(const char *path,      /* I - Directory to clean */
                 const char *pattern)   /* I - Filename pattern or NULL */
@@ -65,7 +53,7 @@ cupsdCleanFiles(const char *path,     /* I - Directory to clean */
     return;
   }
 
-  cupsdLogMessage(CUPSD_LOG_INFO, "Cleaning out old files in \"%s\"...", path);
+  cupsdLogMessage(CUPSD_LOG_INFO, "Cleaning out old files in \"%s\".", path);
 
   while ((dent = cupsDirRead(dir)) != NULL)
   {
@@ -81,13 +69,11 @@ cupsdCleanFiles(const char *path,   /* I - Directory to clean */
       status = rmdir(filename);
     }
     else
-      status = unlink(filename);
+      status = cupsdUnlinkOrRemoveFile(filename);
 
     if (status)
       cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to remove \"%s\" - %s", filename,
                      strerror(errno));
-    else
-      cupsdLogMessage(CUPSD_LOG_DEBUG, "Removed \"%s\"...", filename);
   }
 
   cupsDirClose(dir);
@@ -146,7 +132,7 @@ cupsdCloseCreatedConfFile(
   snprintf(newfile, sizeof(newfile), "%s.N", filename);
   snprintf(oldfile, sizeof(oldfile), "%s.O", filename);
 
-  if ((cupsdRemoveFile(oldfile) && errno != ENOENT) ||
+  if ((cupsdUnlinkOrRemoveFile(oldfile) && errno != ENOENT) ||
       (rename(filename, oldfile) && errno != ENOENT) ||
       rename(newfile, filename))
   {
@@ -308,14 +294,27 @@ cupsdOpenPipe(int *fds)                   /* O - Pipe file descriptors (2) */
 
 
 /*
- * 'cupsdRemoveFile()' - Remove a file using the 7-pass US DoD method.
+ * 'cupsdRemoveFile()' - Remove a file securely.
  */
 
 int                                    /* O - 0 on success, -1 on error */
 cupsdRemoveFile(const char *filename)  /* I - File to remove */
 {
 #ifdef HAVE_REMOVEFILE
-  return (removefile(filename, NULL, REMOVEFILE_SECURE_7_PASS));
+ /*
+  * See if the file exists...
+  */
+
+  if (access(filename, 0))
+    return (0);
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "Securely removing \"%s\".", filename);
+
+ /*
+  * Remove the file...
+  */
+
+  return (removefile(filename, NULL, REMOVEFILE_SECURE_1_PASS));
 
 #else
   int                  fd;             /* File descriptor */
@@ -325,6 +324,15 @@ cupsdRemoveFile(const char *filename)      /* I - File to remove */
 
 
  /*
+  * See if the file exists...
+  */
+
+  if (access(filename, 0))
+    return (0);
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "Securely removing \"%s\".", filename);
+
+ /*
   * First open the file for writing in exclusive mode.
   */
 
@@ -353,31 +361,9 @@ cupsdRemoveFile(const char *filename)      /* I - File to remove */
   }
 
  /*
-  * Overwrite the file 7 times with 0xF6, 0x00, 0xFF, random, 0x00, 0xFF,
-  * and more random data.
+  * Overwrite the file with random data.
   */
 
-  memset(buffer, 0xF6, sizeof(buffer));
-  if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
-  {
-    close(fd);
-    return (-1);
-  }
-
-  memset(buffer, 0x00, sizeof(buffer));
-  if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
-  {
-    close(fd);
-    return (-1);
-  }
-
-  memset(buffer, 0xFF, sizeof(buffer));
-  if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
-  {
-    close(fd);
-    return (-1);
-  }
-
   CUPS_SRAND(time(NULL));
 
   for (i = 0; i < sizeof(buffer); i ++)
@@ -388,39 +374,31 @@ cupsdRemoveFile(const char *filename)     /* I - File to remove */
     return (-1);
   }
 
-  memset(buffer, 0x00, sizeof(buffer));
-  if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
-  {
-    close(fd);
-    return (-1);
-  }
-
-  memset(buffer, 0xFF, sizeof(buffer));
-  if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
-  {
-    close(fd);
-    return (-1);
-  }
-
-  for (i = 0; i < sizeof(buffer); i ++)
-    buffer[i] = CUPS_RAND();
-  if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
-  {
-    close(fd);
-    return (-1);
-  }
-
  /*
-  * Whew!  Close the file (which will lead to the actual deletion) and
-  * return success...
+  * Close the file, which will lead to the actual deletion, and return...
   */
 
-  close(fd);
-  return (0);
+  return (close(fd));
 #endif /* HAVE_REMOVEFILE */
 }
 
 
+/*
+ * 'cupsdUnlinkOrRemoveFile()' - Unlink or securely remove a file depending
+ *                               on the configuration.
+ */
+
+int                                    /* O - 0 on success, -1 on error */
+cupsdUnlinkOrRemoveFile(
+    const char *filename)              /* I - Filename */
+{
+  if (Classification)
+    return (cupsdRemoveFile(filename));
+  else
+    return (unlink(filename));
+}
+
+
 #ifndef HAVE_REMOVEFILE
 /*
  * 'overwrite_data()' - Overwrite the data in a file.
@@ -453,7 +431,7 @@ overwrite_data(int        fd,               /* I - File descriptor */
     else
       bytes = filesize;
 
-    if ((bytes = write(fd, buffer, bytes)) < 0)
+    if ((bytes = write(fd, buffer, (size_t)bytes)) < 0)
       return (-1);
 
     filesize -= bytes;
@@ -469,5 +447,5 @@ overwrite_data(int        fd,               /* I - File descriptor */
 
 
 /*
- * End of "$Id: file.c 11221 2013-08-06 16:16:01Z msweet $".
+ * End of "$Id: file.c 11594 2014-02-14 20:09:01Z msweet $".
  */
index 6979b5c..eec9611 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: filter.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: filter.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   File type conversion routines for CUPS.
  *
@@ -500,5 +500,5 @@ mime_find_filters(
 
 
 /*
- * End of "$Id: filter.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: filter.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 6968cd5..763dc96 100644 (file)
 /*
- * "$Id: ipp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ipp.c 12978 2015-11-17 19:29:52Z msweet $"
  *
- *   IPP routines for the CUPS scheduler.
+ * IPP routines for the CUPS scheduler.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   This file contains Kerberos support code, copyright 2006 by
- *   Jelmer Vernooij.
+ * This file contains Kerberos support code, copyright 2006 by
+ * Jelmer Vernooij.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdProcessIPPRequest()    - Process an incoming IPP request.
- *   cupsdTimeoutJob()           - Timeout a job waiting on job files.
- *   accept_jobs()               - Accept print jobs to a printer.
- *   add_class()                 - Add a class to the system.
- *   add_file()                  - Add a file to a job.
- *   add_job()                   - Add a job to a print queue.
- *   add_job_subscriptions()     - Add any subscriptions for a job.
- *   add_job_uuid()              - Add job-uuid attribute to a job.
- *   add_printer()               - Add a printer to the system.
- *   add_printer_state_reasons() - Add the "printer-state-reasons" attribute
- *                                 based upon the printer state...
- *   add_queued_job_count()      - Add the "queued-job-count" attribute for the
- *                                 specified printer or class.
- *   apply_printer_defaults()    - Apply printer default options to a job.
- *   authenticate_job()          - Set job authentication info.
- *   cancel_all_jobs()           - Cancel all or selected print jobs.
- *   cancel_job()                - Cancel a print job.
- *   cancel_subscription()       - Cancel a subscription.
- *   check_rss_recipient()       - Check that we do not have a duplicate RSS
- *                                 feed URI.
- *   check_quotas()              - Check quotas for a printer and user.
- *   close_job()                 - Close a multi-file job.
- *   copy_attrs()                - Copy attributes from one request to another.
- *   copy_banner()               - Copy a banner file to the requests directory
- *                                 for the specified job.
- *   copy_file()                 - Copy a PPD file or interface script...
- *   copy_model()                - Copy a PPD model file, substituting default
- *                                 values as needed...
- *   copy_job_attrs()            - Copy job attributes.
- *   copy_printer_attrs()        - Copy printer attributes.
- *   copy_subscription_attrs()   - Copy subscription attributes.
- *   create_job()                - Print a file to a printer or class.
- *   create_requested_array()    - Create an array for the requested-attributes.
- *   create_subscription()       - Create a notification subscription.
- *   delete_printer()            - Remove a printer or class from the system.
- *   get_default()               - Get the default destination.
- *   get_devices()               - Get the list of available devices on the
- *                                 local system.
- *   get_document()              - Get a copy of a job file.
- *   get_job_attrs()             - Get job attributes.
- *   get_jobs()                  - Get a list of jobs for the specified printer.
- *   get_notifications()         - Get events for a subscription.
- *   get_ppd()                   - Get a named PPD from the local system.
- *   get_ppds()                  - Get the list of PPD files on the local
- *                                 system.
- *   get_printer_attrs()         - Get printer attributes.
- *   get_printer_supported()     - Get printer supported values.
- *   get_printers()              - Get a list of printers or classes.
- *   get_subscription_attrs()    - Get subscription attributes.
- *   get_subscriptions()         - Get subscriptions.
- *   get_username()              - Get the username associated with a request.
- *   hold_job()                  - Hold a print job.
- *   hold_new_jobs()             - Hold pending/new jobs on a printer or class.
- *   move_job()                  - Move a job to a new destination.
- *   ppd_parse_line()            - Parse a PPD default line.
- *   print_job()                 - Print a file to a printer or class.
- *   read_job_ticket()           - Read a job ticket embedded in a print file.
- *   reject_jobs()               - Reject print jobs to a printer.
- *   release_held_new_jobs()     - Release pending/new jobs on a printer or
- *                                 class.
- *   release_job()               - Release a held print job.
- *   renew_subscription()        - Renew an existing subscription...
- *   restart_job()               - Restart an old print job.
- *   save_auth_info()            - Save authentication information for a job.
- *   send_document()             - Send a file to a printer or class.
- *   send_http_error()           - Send a HTTP error back to the IPP client.
- *   send_ipp_status()           - Send a status back to the IPP client.
- *   set_default()               - Set the default destination...
- *   set_job_attrs()             - Set job attributes.
- *   set_printer_attrs()         - Set printer attributes.
- *   set_printer_defaults()      - Set printer default options from a request.
- *   start_printer()             - Start a printer.
- *   stop_printer()              - Stop a printer.
- *   url_encode_attr()           - URL-encode a string attribute.
- *   url_encode_string()         - URL-encode a string.
- *   user_allowed()              - See if a user is allowed to print to a queue.
- *   validate_job()              - Validate printer options and destination.
- *   validate_name()             - Make sure the printer name only contains
- *                                 valid chars.
- *   validate_user()             - Validate the user for the request.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -153,7 +70,7 @@ static void  copy_attrs(ipp_t *to, ipp_t *from, cups_array_t *ra,
                           cups_array_t *exclude);
 static int     copy_banner(cupsd_client_t *con, cupsd_job_t *job,
                            const char *name);
-static int     copy_file(const char *from, const char *to);
+static int     copy_file(const char *from, const char *to, mode_t mode);
 static int     copy_model(cupsd_client_t *con, const char *from,
                           const char *to);
 static void    copy_job_attrs(cupsd_client_t *con,
@@ -168,7 +85,7 @@ static void  copy_subscription_attrs(cupsd_client_t *con,
                                        cups_array_t *exclude);
 static void    create_job(cupsd_client_t *con, ipp_attribute_t *uri);
 static cups_array_t *create_requested_array(ipp_t *request);
-static void    create_subscription(cupsd_client_t *con, ipp_attribute_t *uri);
+static void    create_subscriptions(cupsd_client_t *con, ipp_attribute_t *uri);
 static void    delete_printer(cupsd_client_t *con, ipp_attribute_t *uri);
 static void    get_default(cupsd_client_t *con);
 static void    get_devices(cupsd_client_t *con);
@@ -212,15 +129,12 @@ static void       set_printer_defaults(cupsd_client_t *con,
                                     cupsd_printer_t *printer);
 static void    start_printer(cupsd_client_t *con, ipp_attribute_t *uri);
 static void    stop_printer(cupsd_client_t *con, ipp_attribute_t *uri);
-static void    url_encode_attr(ipp_attribute_t *attr, char *buffer,
-                               int bufsize);
-static char    *url_encode_string(const char *s, char *buffer, int bufsize);
+static void    url_encode_attr(ipp_attribute_t *attr, char *buffer, size_t bufsize);
+static char    *url_encode_string(const char *s, char *buffer, size_t bufsize);
 static int     user_allowed(cupsd_printer_t *p, const char *username);
 static void    validate_job(cupsd_client_t *con, ipp_attribute_t *uri);
 static int     validate_name(const char *name);
-static int     validate_user(cupsd_job_t *job, cupsd_client_t *con,
-                             const char *owner, char *username,
-                             int userlen);
+static int     validate_user(cupsd_job_t *job, cupsd_client_t *con, const char *owner, char *username, size_t userlen);
 
 
 /*
@@ -242,7 +156,7 @@ cupsdProcessIPPRequest(
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                   "cupsdProcessIPPRequest(%p[%d]): operation_id = %04x",
-                  con, con->http.fd, con->request->request.op.operation_id);
+                  con, con->number, con->request->request.op.operation_id);
 
  /*
   * First build an empty response message for this request...
@@ -270,7 +184,7 @@ cupsdProcessIPPRequest(
 
     cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
                   "%04X %s Bad request version number %d.%d",
-                 IPP_VERSION_NOT_SUPPORTED, con->http.hostname,
+                 IPP_VERSION_NOT_SUPPORTED, con->http->hostname,
                   con->request->request.any.version[0],
                  con->request->request.any.version[1]);
 
@@ -287,7 +201,7 @@ cupsdProcessIPPRequest(
 
     cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
                   "%04X %s Bad request ID %d",
-                 IPP_BAD_REQUEST, con->http.hostname,
+                 IPP_BAD_REQUEST, con->http->hostname,
                   con->request->request.any.request_id);
 
     send_ipp_status(con, IPP_BAD_REQUEST, _("Bad request ID %d."),
@@ -297,7 +211,7 @@ cupsdProcessIPPRequest(
   {
     cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
                   "%04X %s No attributes in request",
-                 IPP_BAD_REQUEST, con->http.hostname);
+                 IPP_BAD_REQUEST, con->http->hostname);
 
     send_ipp_status(con, IPP_BAD_REQUEST, _("No attributes in request."));
   }
@@ -319,7 +233,7 @@ cupsdProcessIPPRequest(
 
        cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
                       "%04X %s Attribute groups are out of order",
-                     IPP_BAD_REQUEST, con->http.hostname);
+                     IPP_BAD_REQUEST, con->http->hostname);
 
        send_ipp_status(con, IPP_BAD_REQUEST,
                        _("Attribute groups are out of order (%x < %x)."),
@@ -353,7 +267,20 @@ cupsdProcessIPPRequest(
       if (attr && attr->name &&
           !strcmp(attr->name, "attributes-natural-language") &&
          (attr->value_tag & IPP_TAG_MASK) == IPP_TAG_LANGUAGE)
+      {
        language = attr;
+
+       /*
+        * Reset language for this request if different from Accept-Language.
+        */
+
+       if (!con->language ||
+           strcmp(attr->values[0].string.text, con->language->language))
+       {
+         cupsLangFree(con->language);
+         con->language = cupsLangGet(attr->values[0].string.text);
+       }
+      }
       else
        language = NULL;
 
@@ -396,7 +323,7 @@ cupsdProcessIPPRequest(
                        charset->values[0].string.text);
        cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
                      "%04X %s Unsupported attributes-charset value \"%s\"",
-                     IPP_CHARSET, con->http.hostname,
+                     IPP_CHARSET, con->http->hostname,
                      charset->values[0].string.text);
        send_ipp_status(con, IPP_BAD_REQUEST,
                        _("Unsupported character set \"%s\"."),
@@ -423,7 +350,7 @@ cupsdProcessIPPRequest(
 
          cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
                        "%04X %s Missing attributes-charset attribute",
-                       IPP_BAD_REQUEST, con->http.hostname);
+                       IPP_BAD_REQUEST, con->http->hostname);
         }
 
         if (!language)
@@ -433,7 +360,7 @@ cupsdProcessIPPRequest(
 
          cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
                        "%04X %s Missing attributes-natural-language attribute",
-                       IPP_BAD_REQUEST, con->http.hostname);
+                       IPP_BAD_REQUEST, con->http->hostname);
         }
 
         if (!uri)
@@ -444,7 +371,7 @@ cupsdProcessIPPRequest(
 
          cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
                        "%04X %s Missing printer-uri, job-uri, or ppd-name "
-                       "attribute", IPP_BAD_REQUEST, con->http.hostname);
+                       "attribute", IPP_BAD_REQUEST, con->http->hostname);
         }
 
        cupsdLogMessage(CUPSD_LOG_DEBUG, "Request attributes follow...");
@@ -475,15 +402,14 @@ cupsdProcessIPPRequest(
          */
 
          if (!strcmp(username->values[0].string.text, "root") &&
-             _cups_strcasecmp(con->http.hostname, "localhost") &&
+             _cups_strcasecmp(con->http->hostname, "localhost") &&
              strcmp(con->username, "root"))
          {
           /*
            * Remote unauthenticated user masquerading as local root...
            */
 
-           _cupsStrFree(username->values[0].string.text);
-           username->values[0].string.text = _cupsStrAlloc(RemoteRoot);
+            ippSetString(con->request, &username, 0, RemoteRoot);
          }
        }
 
@@ -507,183 +433,183 @@ cupsdProcessIPPRequest(
 
        switch (con->request->request.op.operation_id)
        {
-         case IPP_PRINT_JOB :
+         case IPP_OP_PRINT_JOB :
               print_job(con, uri);
               break;
 
-         case IPP_VALIDATE_JOB :
+         case IPP_OP_VALIDATE_JOB :
               validate_job(con, uri);
               break;
 
-         case IPP_CREATE_JOB :
+         case IPP_OP_CREATE_JOB :
               create_job(con, uri);
               break;
 
-         case IPP_SEND_DOCUMENT :
+         case IPP_OP_SEND_DOCUMENT :
               send_document(con, uri);
               break;
 
-         case IPP_CANCEL_JOB :
+         case IPP_OP_CANCEL_JOB :
               cancel_job(con, uri);
               break;
 
-         case IPP_GET_JOB_ATTRIBUTES :
+         case IPP_OP_GET_JOB_ATTRIBUTES :
               get_job_attrs(con, uri);
               break;
 
-         case IPP_GET_JOBS :
+         case IPP_OP_GET_JOBS :
               get_jobs(con, uri);
               break;
 
-         case IPP_GET_PRINTER_ATTRIBUTES :
+         case IPP_OP_GET_PRINTER_ATTRIBUTES :
               get_printer_attrs(con, uri);
               break;
 
-         case IPP_GET_PRINTER_SUPPORTED_VALUES :
+         case IPP_OP_GET_PRINTER_SUPPORTED_VALUES :
               get_printer_supported(con, uri);
               break;
 
-         case IPP_HOLD_JOB :
+         case IPP_OP_HOLD_JOB :
               hold_job(con, uri);
               break;
 
-         case IPP_RELEASE_JOB :
+         case IPP_OP_RELEASE_JOB :
               release_job(con, uri);
               break;
 
-         case IPP_RESTART_JOB :
+         case IPP_OP_RESTART_JOB :
               restart_job(con, uri);
               break;
 
-         case IPP_PAUSE_PRINTER :
+         case IPP_OP_PAUSE_PRINTER :
               stop_printer(con, uri);
              break;
 
-         case IPP_RESUME_PRINTER :
+         case IPP_OP_RESUME_PRINTER :
               start_printer(con, uri);
              break;
 
-         case IPP_PURGE_JOBS :
-         case IPP_CANCEL_JOBS :
-         case IPP_CANCEL_MY_JOBS :
+         case IPP_OP_PURGE_JOBS :
+         case IPP_OP_CANCEL_JOBS :
+         case IPP_OP_CANCEL_MY_JOBS :
               cancel_all_jobs(con, uri);
               break;
 
-         case IPP_SET_JOB_ATTRIBUTES :
+         case IPP_OP_SET_JOB_ATTRIBUTES :
               set_job_attrs(con, uri);
               break;
 
-         case IPP_SET_PRINTER_ATTRIBUTES :
+         case IPP_OP_SET_PRINTER_ATTRIBUTES :
               set_printer_attrs(con, uri);
               break;
 
-         case IPP_HOLD_NEW_JOBS :
+         case IPP_OP_HOLD_NEW_JOBS :
               hold_new_jobs(con, uri);
               break;
 
-         case IPP_RELEASE_HELD_NEW_JOBS :
+         case IPP_OP_RELEASE_HELD_NEW_JOBS :
               release_held_new_jobs(con, uri);
               break;
 
-         case IPP_CLOSE_JOB :
+         case IPP_OP_CLOSE_JOB :
               close_job(con, uri);
               break;
 
-         case CUPS_GET_DEFAULT :
+         case IPP_OP_CUPS_GET_DEFAULT :
               get_default(con);
               break;
 
-         case CUPS_GET_PRINTERS :
+         case IPP_OP_CUPS_GET_PRINTERS :
               get_printers(con, 0);
               break;
 
-         case CUPS_GET_CLASSES :
+         case IPP_OP_CUPS_GET_CLASSES :
               get_printers(con, CUPS_PRINTER_CLASS);
               break;
 
-         case CUPS_ADD_PRINTER :
+         case IPP_OP_CUPS_ADD_MODIFY_PRINTER :
               add_printer(con, uri);
               break;
 
-         case CUPS_DELETE_PRINTER :
+         case IPP_OP_CUPS_DELETE_PRINTER :
               delete_printer(con, uri);
               break;
 
-         case CUPS_ADD_CLASS :
+         case IPP_OP_CUPS_ADD_MODIFY_CLASS :
               add_class(con, uri);
               break;
 
-         case CUPS_DELETE_CLASS :
+         case IPP_OP_CUPS_DELETE_CLASS :
               delete_printer(con, uri);
               break;
 
-         case CUPS_ACCEPT_JOBS :
-         case IPP_ENABLE_PRINTER :
+         case IPP_OP_CUPS_ACCEPT_JOBS :
+         case IPP_OP_ENABLE_PRINTER :
               accept_jobs(con, uri);
               break;
 
-         case CUPS_REJECT_JOBS :
-         case IPP_DISABLE_PRINTER :
+         case IPP_OP_CUPS_REJECT_JOBS :
+         case IPP_OP_DISABLE_PRINTER :
               reject_jobs(con, uri);
               break;
 
-         case CUPS_SET_DEFAULT :
+         case IPP_OP_CUPS_SET_DEFAULT :
               set_default(con, uri);
               break;
 
-         case CUPS_GET_DEVICES :
+         case IPP_OP_CUPS_GET_DEVICES :
               get_devices(con);
               break;
 
-          case CUPS_GET_DOCUMENT :
+          case IPP_OP_CUPS_GET_DOCUMENT :
              get_document(con, uri);
              break;
 
-         case CUPS_GET_PPD :
+         case IPP_OP_CUPS_GET_PPD :
               get_ppd(con, uri);
               break;
 
-         case CUPS_GET_PPDS :
+         case IPP_OP_CUPS_GET_PPDS :
               get_ppds(con);
               break;
 
-         case CUPS_MOVE_JOB :
+         case IPP_OP_CUPS_MOVE_JOB :
               move_job(con, uri);
               break;
 
-         case CUPS_AUTHENTICATE_JOB :
+         case IPP_OP_CUPS_AUTHENTICATE_JOB :
               authenticate_job(con, uri);
               break;
 
-          case IPP_CREATE_PRINTER_SUBSCRIPTION :
-         case IPP_CREATE_JOB_SUBSCRIPTION :
-             create_subscription(con, uri);
+          case IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS :
+         case IPP_OP_CREATE_JOB_SUBSCRIPTIONS :
+             create_subscriptions(con, uri);
              break;
 
-          case IPP_GET_SUBSCRIPTION_ATTRIBUTES :
+          case IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES :
              get_subscription_attrs(con, sub_id);
              break;
 
-         case IPP_GET_SUBSCRIPTIONS :
+         case IPP_OP_GET_SUBSCRIPTIONS :
              get_subscriptions(con, uri);
              break;
 
-         case IPP_RENEW_SUBSCRIPTION :
+         case IPP_OP_RENEW_SUBSCRIPTION :
              renew_subscription(con, sub_id);
              break;
 
-         case IPP_CANCEL_SUBSCRIPTION :
+         case IPP_OP_CANCEL_SUBSCRIPTION :
              cancel_subscription(con, sub_id);
              break;
 
-          case IPP_GET_NOTIFICATIONS :
+          case IPP_OP_GET_NOTIFICATIONS :
              get_notifications(con);
              break;
 
          default :
              cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL,
                            "%04X %s Operation %04X (%s) not supported",
-                           IPP_OPERATION_NOT_SUPPORTED, con->http.hostname,
+                           IPP_OPERATION_NOT_SUPPORTED, con->http->hostname,
                            con->request->request.op.operation_id,
                            ippOpString(con->request->request.op.operation_id));
 
@@ -707,78 +633,63 @@ cupsdProcessIPPRequest(
                         >= IPP_BAD_REQUEST &&
                     con->response->request.status.status_code
                        != IPP_NOT_FOUND ? CUPSD_LOG_ERROR : CUPSD_LOG_DEBUG,
-                    "Returning IPP %s for %s (%s) from %s",
+                    "[Client %d] Returning IPP %s for %s (%s) from %s",
+                   con->number,
                    ippErrorString(con->response->request.status.status_code),
                    ippOpString(con->request->request.op.operation_id),
                    uri ? uri->values[0].string.text : "no URI",
-                   con->http.hostname);
+                   con->http->hostname);
 
-    if (LogLevel == CUPSD_LOG_DEBUG2)
-      cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                     "cupsdProcessIPPRequest: ippLength(response)=%ld",
-                     (long)ippLength(con->response));
+    httpClearFields(con->http);
 
-    if (cupsdSendHeader(con, HTTP_OK, "application/ipp", CUPSD_AUTH_NONE))
-    {
 #ifdef CUPSD_USE_CHUNKING
-     /*
-      * Because older versions of CUPS (1.1.17 and older) and some IPP
-      * clients do not implement chunking properly, we cannot use
-      * chunking by default.  This may become the default in future
-      * CUPS releases, or we might add a configuration directive for
-      * it.
-      */
-
-      if (con->http.version == HTTP_1_1)
-      {
-       if (httpPrintf(HTTP(con), "Transfer-Encoding: chunked\r\n\r\n") < 0)
-         return (0);
+   /*
+    * Because older versions of CUPS (1.1.17 and older) and some IPP
+    * clients do not implement chunking properly, we cannot use
+    * chunking by default.  This may become the default in future
+    * CUPS releases, or we might add a configuration directive for
+    * it.
+    */
 
-       if (cupsdFlushHeader(con) < 0)
-         return (0);
+    if (con->http->version == HTTP_1_1)
+    {
+      cupsdLogMessage(CUPSD_LOG_DEBUG,
+                     "[Client %d] Transfer-Encoding: chunked",
+                     con->number);
 
-       con->http.data_encoding = HTTP_ENCODE_CHUNKED;
-      }
-      else
+      cupsdSetLength(con->http, 0);
+    }
+    else
 #endif /* CUPSD_USE_CHUNKING */
-      {
-        size_t length;                 /* Length of response */
-
-
-       length = ippLength(con->response);
-
-       if (con->file >= 0 && !con->pipe_pid)
-       {
-         struct stat   fileinfo;       /* File information */
-
-
-          if (!fstat(con->file, &fileinfo))
-           length += fileinfo.st_size;
-       }
+    {
+      size_t   length;                 /* Length of response */
 
-       if (httpPrintf(HTTP(con), "Content-Length: " CUPS_LLFMT "\r\n\r\n",
-                      CUPS_LLCAST length) < 0)
-         return (0);
 
-       if (cupsdFlushHeader(con) < 0)
-         return (0);
+      length = ippLength(con->response);
 
-       con->http.data_encoding  = HTTP_ENCODE_LENGTH;
-       con->http.data_remaining = length;
+      if (con->file >= 0 && !con->pipe_pid)
+      {
+       struct stat     fileinfo;       /* File information */
 
-       if (con->http.data_remaining <= INT_MAX)
-         con->http._data_remaining = con->http.data_remaining;
-       else
-         con->http._data_remaining = INT_MAX;
+       if (!fstat(con->file, &fileinfo))
+         length += (size_t)fileinfo.st_size;
       }
 
-      cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient,
-                     (cupsd_selfunc_t)cupsdWriteClient, con);
+      cupsdLogMessage(CUPSD_LOG_DEBUG,
+                     "[Client %d] Content-Length: " CUPS_LLFMT,
+                     con->number, CUPS_LLCAST length);
+      httpSetLength(con->http, length);
+    }
 
+    if (cupsdSendHeader(con, HTTP_OK, "application/ipp", CUPSD_AUTH_NONE))
+    {
      /*
       * Tell the caller the response header was sent successfully...
       */
 
+      cupsdAddSelect(httpGetFd(con->http), (cupsd_selfunc_t)cupsdReadClient,
+                    (cupsd_selfunc_t)cupsdWriteClient, con);
+
       return (1);
     }
     else
@@ -860,7 +771,7 @@ accept_jobs(cupsd_client_t  *con,   /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "accept_jobs(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Is the destination valid?
@@ -945,7 +856,7 @@ add_class(cupsd_client_t  *con,             /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_class(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Do we have a valid URI?
@@ -1034,10 +945,18 @@ add_class(cupsd_client_t  *con,          /* I - Client connection */
 
   need_restart_job = 0;
 
-  if ((attr = ippFindAttribute(con->request, "printer-location",
-                               IPP_TAG_TEXT)) != NULL)
+  if ((attr = ippFindAttribute(con->request, "printer-location", IPP_TAG_TEXT)) != NULL)
     cupsdSetString(&pclass->location, attr->values[0].string.text);
 
+  if ((attr = ippFindAttribute(con->request, "printer-geo-location", IPP_TAG_URI)) != NULL && !strncmp(attr->values[0].string.text, "geo:", 4))
+    cupsdSetString(&pclass->geo_location, attr->values[0].string.text);
+
+  if ((attr = ippFindAttribute(con->request, "printer-organization", IPP_TAG_TEXT)) != NULL)
+    cupsdSetString(&pclass->organization, attr->values[0].string.text);
+
+  if ((attr = ippFindAttribute(con->request, "printer-organizational-unit", IPP_TAG_TEXT)) != NULL)
+    cupsdSetString(&pclass->organizational_unit, attr->values[0].string.text);
+
   if ((attr = ippFindAttribute(con->request, "printer-info",
                                IPP_TAG_TEXT)) != NULL)
     cupsdSetString(&pclass->info, attr->values[0].string.text);
@@ -1059,6 +978,16 @@ add_class(cupsd_client_t  *con,           /* I - Client connection */
   if ((attr = ippFindAttribute(con->request, "printer-is-shared",
                                IPP_TAG_BOOLEAN)) != NULL)
   {
+    if (pclass->type & CUPS_PRINTER_REMOTE)
+    {
+     /*
+      * Cannot re-share remote printers.
+      */
+
+      send_ipp_status(con, IPP_BAD_REQUEST, _("Cannot change printer-is-shared for remote queues."));
+      return;
+    }
+
     if (pclass->shared && !attr->values[0].boolean)
       cupsdDeregisterPrinter(pclass, 1);
 
@@ -1157,6 +1086,8 @@ add_class(cupsd_client_t  *con,           /* I - Client connection */
                                IPP_TAG_KEYWORD)) != NULL)
     cupsdSetAuthInfoRequired(pclass, NULL, attr);
 
+  pclass->config_time = time(NULL);
+
  /*
   * Update the printer class attributes and return...
   */
@@ -1215,7 +1146,7 @@ add_file(cupsd_client_t *con,             /* I - Connection to client */
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                  "add_file(con=%p[%d], job=%d, filetype=%s/%s, "
-                 "compression=%d)", con, con ? con->http.fd : -1, job->id,
+                 "compression=%d)", con, con ? con->number : -1, job->id,
                  filetype->super, filetype->type, compression);
 
  /*
@@ -1230,12 +1161,18 @@ add_file(cupsd_client_t *con,           /* I - Connection to client */
   else
   {
     compressions = (int *)realloc(job->compressions,
-                                  (job->num_files + 1) * sizeof(int));
+                                  (size_t)(job->num_files + 1) * sizeof(int));
     filetypes    = (mime_type_t **)realloc(job->filetypes,
-                                           (job->num_files + 1) *
+                                           (size_t)(job->num_files + 1) *
                                           sizeof(mime_type_t *));
   }
 
+  if (compressions)
+    job->compressions = compressions;
+
+  if (filetypes)
+    job->filetypes = filetypes;
+
   if (!compressions || !filetypes)
   {
     cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE,
@@ -1248,9 +1185,7 @@ add_file(cupsd_client_t *con,             /* I - Connection to client */
     return (-1);
   }
 
-  job->compressions                 = compressions;
   job->compressions[job->num_files] = compression;
-  job->filetypes                    = filetypes;
   job->filetypes[job->num_files]    = filetype;
 
   job->num_files ++;
@@ -1274,6 +1209,7 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
   http_status_t        status;                 /* Policy status */
   ipp_attribute_t *attr,               /* Current attribute */
                *auth_info;             /* auth-info attribute */
+  const char   *mandatory;             /* Current mandatory job attribute */
   const char   *val;                   /* Default option value */
   int          priority;               /* Job priority */
   cupsd_job_t  *job;                   /* Current job */
@@ -1287,15 +1223,25 @@ add_job(cupsd_client_t  *con,           /* I - Client connection */
   ipp_t                *unsup_col;             /* media-col in unsupported response */
   static const char * const readonly[] =/* List of read-only attributes */
   {
+    "date-time-at-completed",
+    "date-time-at-creation",
+    "date-time-at-processing",
+    "job-detailed-status-messages",
+    "job-document-access-errors",
     "job-id",
-    "job-k-octets",
-    /*"job-impressions",*/             /* For now we allow this since cupsd can't count */
     "job-impressions-completed",
-    "job-media-sheets",
+    "job-k-octets-completed",
     "job-media-sheets-completed",
+    "job-pages-completed",
+    "job-printer-up-time",
+    "job-printer-uri",
     "job-state",
     "job-state-message",
     "job-state-reasons",
+    "job-uri",
+    "number-of-documents",
+    "number-of-intervening-jobs",
+    "output-device-assigned",
     "time-at-completed",
     "time-at-creation",
     "time-at-processing"
@@ -1303,7 +1249,7 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job(%p[%d], %p(%s), %p(%s/%s))",
-                  con, con->http.fd, printer, printer->name,
+                  con, con->number, printer, printer->name,
                  filetype, filetype ? filetype->super : "none",
                  filetype ? filetype->type : "none");
 
@@ -1312,8 +1258,8 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
   */
 
   if (!printer->shared &&
-      _cups_strcasecmp(con->http.hostname, "localhost") &&
-      _cups_strcasecmp(con->http.hostname, ServerName))
+      _cups_strcasecmp(con->http->hostname, "localhost") &&
+      _cups_strcasecmp(con->http->hostname, ServerName))
   {
     send_ipp_status(con, IPP_NOT_AUTHORIZED,
                     _("The printer or class is not shared."));
@@ -1339,8 +1285,8 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
     return (NULL);
   }
 #ifdef HAVE_SSL
-  else if (auth_info && !con->http.tls &&
-           !httpAddrLocalhost(con->http.hostaddr))
+  else if (auth_info && !con->http->tls &&
+           !httpAddrLocalhost(con->http->hostaddr))
   {
    /*
     * Require encryption of auth-info over non-local connections...
@@ -1365,27 +1311,43 @@ add_job(cupsd_client_t  *con,           /* I - Client connection */
 
  /*
   * Validate job template attributes; for now just document-format,
-  * copies, number-up, and page-ranges...
+  * copies, job-sheets, number-up, page-ranges, mandatory attributes, and
+  * media...
   */
 
   for (i = 0; i < (int)(sizeof(readonly) / sizeof(readonly[0])); i ++)
   {
-    if ((attr = ippFindAttribute(con->request, readonly[i],
-                                 IPP_TAG_ZERO)) != NULL)
+    if ((attr = ippFindAttribute(con->request, readonly[i], IPP_TAG_ZERO)) != NULL)
     {
       ippDeleteAttribute(con->request, attr);
 
       if (StrictConformance)
       {
-       send_ipp_status(con, IPP_BAD_REQUEST,
-                       _("The '%s' Job Description attribute cannot be "
-                         "supplied in a job creation request."), readonly[i]);
+       send_ipp_status(con, IPP_BAD_REQUEST, _("The '%s' Job Status attribute cannot be supplied in a job creation request."), readonly[i]);
        return (NULL);
       }
 
-      cupsdLogMessage(CUPSD_LOG_WARN,
-                      "Unexpected '%s' Job Description attribute in a job "
-                      "creation request.", readonly[i]);
+      cupsdLogMessage(CUPSD_LOG_INFO, "Unexpected '%s' Job Status attribute in a job creation request.", readonly[i]);
+    }
+  }
+
+  if (printer->pc)
+  {
+    for (mandatory = (char *)cupsArrayFirst(printer->pc->mandatory);
+        mandatory;
+        mandatory = (char *)cupsArrayNext(printer->pc->mandatory))
+    {
+      if (!ippFindAttribute(con->request, mandatory, IPP_TAG_ZERO))
+      {
+       /*
+       * Missing a required attribute...
+       */
+
+       send_ipp_status(con, IPP_CONFLICT,
+                       _("The \"%s\" attribute is required for print jobs."),
+                       mandatory);
+       return (NULL);
+      }
     }
   }
 
@@ -1575,8 +1537,7 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
   }
 
   if ((attr = ippFindAttribute(con->request, "job-name", IPP_TAG_ZERO)) == NULL)
-    ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL,
-                 "Untitled");
+    ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL, "Untitled");
   else if ((attr->value_tag != IPP_TAG_NAME &&
             attr->value_tag != IPP_TAG_NAMELANG) ||
            attr->num_values != 1)
@@ -1587,57 +1548,13 @@ add_job(cupsd_client_t  *con,           /* I - Client connection */
       attr->group_tag = IPP_TAG_UNSUPPORTED_GROUP;
     return (NULL);
   }
-  else
+  else if (!ippValidateAttribute(attr))
   {
-    const char *ptr;                   /* Pointer into string */
-
-    for (ptr = attr->values[0].string.text; *ptr; ptr ++)
-    {
-      if ((*ptr & 0xe0) == 0xc0)
-      {
-       ptr ++;
-       if ((*ptr & 0xc0) != 0x80)
-         break;
-      }
-      else if ((*ptr & 0xf0) == 0xe0)
-      {
-       ptr ++;
-       if ((*ptr & 0xc0) != 0x80)
-         break;
-       ptr ++;
-       if ((*ptr & 0xc0) != 0x80)
-         break;
-      }
-      else if ((*ptr & 0xf8) == 0xf0)
-      {
-       ptr ++;
-       if ((*ptr & 0xc0) != 0x80)
-         break;
-       ptr ++;
-       if ((*ptr & 0xc0) != 0x80)
-         break;
-       ptr ++;
-       if ((*ptr & 0xc0) != 0x80)
-         break;
-      }
-      else if (*ptr & 0x80)
-       break;
-    }
-
-    if (*ptr || (ptr - attr->values[0].string.text) > (IPP_MAX_NAME - 1))
-    {
-      if (*ptr)
-       send_ipp_status(con, IPP_ATTRIBUTES,
-                       _("Bad job-name value: Bad UTF-8 sequence."));
-      else
-       send_ipp_status(con, IPP_ATTRIBUTES,
-                       _("Bad job-name value: Name too long."));
-
-      if ((attr = ippCopyAttribute(con->response, attr, 0)) != NULL)
-       attr->group_tag = IPP_TAG_UNSUPPORTED_GROUP;
-
-      return (NULL);
-    }
+    send_ipp_status(con, IPP_ATTRIBUTES, _("Bad job-name value: %s"),
+                    cupsLastErrorString());
+    if ((attr = ippCopyAttribute(con->response, attr, 0)) != NULL)
+      attr->group_tag = IPP_TAG_UNSUPPORTED_GROUP;
+    return (NULL);
   }
 
   if ((job = cupsdAddJob(priority, printer->name)) == NULL)
@@ -1665,7 +1582,7 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
     cupsdSetString(&job->username, con->username);
 
     if (attr)
-      cupsdSetString(&attr->values[0].string.text, con->username);
+      ippSetString(job->attrs, &attr, 0, con->username);
   }
   else if (attr)
   {
@@ -1683,9 +1600,8 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
                  "job-originating-user-name", NULL, job->username);
   else
   {
-    attr->group_tag = IPP_TAG_JOB;
-    _cupsStrFree(attr->name);
-    attr->name = _cupsStrAlloc("job-originating-user-name");
+    ippSetGroupTag(job->attrs, &attr, IPP_TAG_JOB);
+    ippSetName(job->attrs, &attr, "job-originating-user-name");
   }
 
   if (con->username[0] || auth_info)
@@ -1700,6 +1616,9 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
       ippDeleteAttribute(job->attrs, auth_info);
   }
 
+  if ((attr = ippFindAttribute(con->request, "job-name", IPP_TAG_NAME)) != NULL)
+    cupsdSetString(&(job->name), attr->values[0].string.text);
+
   if ((attr = ippFindAttribute(job->attrs, "job-originating-host-name",
                                IPP_TAG_ZERO)) != NULL)
   {
@@ -1709,55 +1628,18 @@ add_job(cupsd_client_t  *con,           /* I - Client connection */
 
     if (attr->value_tag != IPP_TAG_NAME ||
         attr->num_values != 1 ||
-        strcmp(con->http.hostname, "localhost"))
+        strcmp(con->http->hostname, "localhost"))
     {
      /*
       * Can't override the value if we aren't connected via localhost.
       * Also, we can only have 1 value and it must be a name value.
       */
 
-      switch (attr->value_tag)
-      {
-        case IPP_TAG_STRING :
-       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 :
-          /*
-           * Free old strings...
-           */
-
-           for (i = 0; i < attr->num_values; i ++)
-           {
-             _cupsStrFree(attr->values[i].string.text);
-             attr->values[i].string.text = NULL;
-             if (attr->values[i].string.language)
-             {
-               _cupsStrFree(attr->values[i].string.language);
-               attr->values[i].string.language = NULL;
-             }
-            }
-
-       default :
-            break;
-      }
-
-     /*
-      * Use the default connection hostname instead...
-      */
-
-      attr->value_tag             = IPP_TAG_NAME;
-      attr->num_values            = 1;
-      attr->values[0].string.text = _cupsStrAlloc(con->http.hostname);
+      ippDeleteAttribute(job->attrs, attr);
+      ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-originating-host-name", NULL, con->http->hostname);
     }
-
-    attr->group_tag = IPP_TAG_JOB;
+    else
+      ippSetGroupTag(job->attrs, &attr, IPP_TAG_JOB);
   }
   else
   {
@@ -1767,17 +1649,15 @@ add_job(cupsd_client_t  *con,           /* I - Client connection */
     */
 
     ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME,
-                "job-originating-host-name", NULL, con->http.hostname);
+                "job-originating-host-name", NULL, con->http->hostname);
   }
 
-  ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation",
-                time(NULL));
-  attr = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER,
-                       "time-at-processing", 0);
-  attr->value_tag = IPP_TAG_NOVALUE;
-  attr = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER,
-                       "time-at-completed", 0);
-  attr->value_tag = IPP_TAG_NOVALUE;
+  ippAddOutOfBand(job->attrs, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-completed");
+  ippAddDate(job->attrs, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(time(NULL)));
+  ippAddOutOfBand(job->attrs, IPP_TAG_JOB, IPP_TAG_NOVALUE, "date-time-at-processing");
+  ippAddOutOfBand(job->attrs, IPP_TAG_JOB, IPP_TAG_NOVALUE, "time-at-completed");
+  ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", time(NULL));
+  ippAddOutOfBand(job->attrs, IPP_TAG_JOB, IPP_TAG_NOVALUE, "time-at-processing");
 
  /*
   * Add remaining job attributes...
@@ -1789,13 +1669,13 @@ add_job(cupsd_client_t  *con,           /* I - Client connection */
   job->state_value = (ipp_jstate_t)job->state->values[0].integer;
   job->reasons = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD,
                               "job-state-reasons", NULL, "job-incoming");
+  job->impressions = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions-completed", 0);
   job->sheets = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER,
                               "job-media-sheets-completed", 0);
   ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL,
                printer->uri);
 
-  if ((attr = ippFindAttribute(job->attrs, "job-k-octets",
-                               IPP_TAG_INTEGER)) != NULL)
+  if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL)
     attr->values[0].integer = 0;
   else
     ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-k-octets", 0);
@@ -1854,8 +1734,8 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
 
       attr = ippAddStrings(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-sheets",
                            2, NULL, NULL);
-      attr->values[0].string.text = _cupsStrRetain(printer->job_sheets[0]);
-      attr->values[1].string.text = _cupsStrRetain(printer->job_sheets[1]);
+      ippSetString(job->attrs, &attr, 0, printer->job_sheets[0]);
+      ippSetString(job->attrs, &attr, 1, printer->job_sheets[1]);
     }
 
     job->job_sheets = attr;
@@ -1881,7 +1761,7 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
           * Force the leading banner to have the classification on it...
          */
 
-          cupsdSetString(&attr->values[0].string.text, Classification);
+          ippSetString(job->attrs, &attr, 0, Classification);
 
          cupsdLogJob(job, CUPSD_LOG_NOTICE, "CLASSIFICATION FORCED "
                                             "job-sheets=\"%s,none\", "
@@ -1898,7 +1778,7 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
          * Can't put two different security markings on the same document!
          */
 
-          cupsdSetString(&attr->values[1].string.text, attr->values[0].string.text);
+          ippSetString(job->attrs, &attr, 1, attr->values[0].string.text);
 
          cupsdLogJob(job, CUPSD_LOG_NOTICE, "CLASSIFICATION FORCED "
                                             "job-sheets=\"%s,%s\", "
@@ -1938,18 +1818,18 @@ add_job(cupsd_client_t  *con,           /* I - Client connection */
         if (attr->num_values > 1 &&
            !strcmp(attr->values[0].string.text, attr->values[1].string.text))
        {
-          cupsdSetString(&(attr->values[0].string.text), Classification);
-          cupsdSetString(&(attr->values[1].string.text), Classification);
+          ippSetString(job->attrs, &attr, 0, Classification);
+          ippSetString(job->attrs, &attr, 1, Classification);
        }
         else
        {
           if (attr->num_values == 1 ||
              strcmp(attr->values[0].string.text, "none"))
-            cupsdSetString(&(attr->values[0].string.text), Classification);
+            ippSetString(job->attrs, &attr, 0, Classification);
 
           if (attr->num_values > 1 &&
              strcmp(attr->values[1].string.text, "none"))
-            cupsdSetString(&(attr->values[1].string.text), Classification);
+           ippSetString(job->attrs, &attr, 1, Classification);
         }
 
         if (attr->num_values > 1)
@@ -1997,7 +1877,7 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
   */
 
   httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
-                   con->servername, con->serverport, "/jobs/%d", job->id);
+                   con->clientname, con->clientport, "/jobs/%d", job->id);
   ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL,
                job_uri);
 
@@ -2005,6 +1885,7 @@ add_job(cupsd_client_t  *con,             /* I - Client connection */
 
   ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state",
                 job->state_value);
+  ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_TEXT, "job-state-message", NULL, "");
   ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons",
                NULL, job->reasons->values[0].string.text);
 
@@ -2220,7 +2101,7 @@ add_job_subscriptions(
       {
        sub->user_data_len = user_data->values[0].unknown.length;
        memcpy(sub->user_data, user_data->values[0].unknown.data,
-              sub->user_data_len);
+              (size_t)sub->user_data_len);
       }
 
       ippAddSeparator(con->response);
@@ -2289,8 +2170,8 @@ add_job_uuid(cupsd_job_t *job)            /* I - Job */
 
   if (!ippFindAttribute(job->attrs, "job-uuid", IPP_TAG_URI))
     ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uuid", NULL,
-                _httpAssembleUUID(ServerName, RemotePort, job->dest, job->id,
-                                  uuid, sizeof(uuid)));
+                httpAssembleUUID(ServerName, RemotePort, job->dest, job->id,
+                                 uuid, sizeof(uuid)));
 }
 
 
@@ -2323,7 +2204,7 @@ add_printer(cupsd_client_t  *con, /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_printer(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Do we have a valid URI?
@@ -2416,6 +2297,15 @@ add_printer(cupsd_client_t  *con,        /* I - Client connection */
                                IPP_TAG_TEXT)) != NULL)
     cupsdSetString(&printer->location, attr->values[0].string.text);
 
+  if ((attr = ippFindAttribute(con->request, "printer-geo-location", IPP_TAG_URI)) != NULL && !strncmp(attr->values[0].string.text, "geo:", 4))
+    cupsdSetString(&printer->geo_location, attr->values[0].string.text);
+
+  if ((attr = ippFindAttribute(con->request, "printer-organization", IPP_TAG_TEXT)) != NULL)
+    cupsdSetString(&printer->organization, attr->values[0].string.text);
+
+  if ((attr = ippFindAttribute(con->request, "printer-organizational-unit", IPP_TAG_TEXT)) != NULL)
+    cupsdSetString(&printer->organizational_unit, attr->values[0].string.text);
+
   if ((attr = ippFindAttribute(con->request, "printer-info",
                                IPP_TAG_TEXT)) != NULL)
     cupsdSetString(&printer->info, attr->values[0].string.text);
@@ -2460,7 +2350,7 @@ add_printer(cupsd_client_t  *con, /* I - Client connection */
 
     cupsdLogMessage(CUPSD_LOG_DEBUG,
                    "%s device-uri: %s", printer->name,
-                   uri_status_strings[uri_status - HTTP_URI_OVERFLOW]);
+                   uri_status_strings[uri_status - HTTP_URI_STATUS_OVERFLOW]);
 
     if (uri_status < HTTP_URI_OK)
     {
@@ -2591,6 +2481,16 @@ add_printer(cupsd_client_t  *con,        /* I - Client connection */
       return;
     }
 
+    if (printer->type & CUPS_PRINTER_REMOTE)
+    {
+     /*
+      * Cannot re-share remote printers.
+      */
+
+      send_ipp_status(con, IPP_BAD_REQUEST, _("Cannot change printer-is-shared for remote queues."));
+      return;
+    }
+
     if (printer->shared && !attr->values[0].boolean)
       cupsdDeregisterPrinter(printer, 1);
 
@@ -2735,7 +2635,7 @@ add_printer(cupsd_client_t  *con, /* I - Client connection */
        * interfaces directory and make it executable...
        */
 
-       if (copy_file(srcfile, dstfile))
+       if (copy_file(srcfile, dstfile, ConfigFilePerm | 0110))
        {
           send_ipp_status(con, IPP_INTERNAL_ERROR,
                          _("Unable to copy interface script - %s"),
@@ -2745,7 +2645,6 @@ add_printer(cupsd_client_t  *con, /* I - Client connection */
 
        cupsdLogMessage(CUPSD_LOG_DEBUG,
                        "Copied interface script successfully");
-       chmod(dstfile, 0755);
       }
 
       snprintf(dstfile, sizeof(dstfile), "%s/ppd/%s.ppd", ServerRoot,
@@ -2758,7 +2657,7 @@ add_printer(cupsd_client_t  *con, /* I - Client connection */
        * ppd directory and make it readable by all...
        */
 
-       if (copy_file(srcfile, dstfile))
+       if (copy_file(srcfile, dstfile, ConfigFilePerm))
        {
           send_ipp_status(con, IPP_INTERNAL_ERROR,
                          _("Unable to copy PPD file - %s"),
@@ -2768,7 +2667,6 @@ add_printer(cupsd_client_t  *con, /* I - Client connection */
 
        cupsdLogMessage(CUPSD_LOG_DEBUG,
                        "Copied PPD file successfully");
-       chmod(dstfile, 0644);
       }
       else
       {
@@ -2822,7 +2720,6 @@ add_printer(cupsd_client_t  *con, /* I - Client connection */
 
       cupsdLogMessage(CUPSD_LOG_DEBUG,
                      "Copied PPD file successfully");
-      chmod(dstfile, 0644);
     }
   }
 
@@ -2890,6 +2787,8 @@ add_printer(cupsd_client_t  *con, /* I - Client connection */
     }
   }
 
+  printer->config_time = time(NULL);
+
  /*
   * Update the printer attributes and return...
   */
@@ -2944,7 +2843,7 @@ add_printer_state_reasons(
 {
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                   "add_printer_state_reasons(%p[%d], %p[%s])",
-                  con, con->http.fd, p, p->name);
+                  con, con->number, p, p->name);
 
   if (p->num_reasons == 0)
     ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
@@ -2970,7 +2869,7 @@ add_queued_job_count(
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_queued_job_count(%p[%d], %p[%s])",
-                  con, con->http.fd, p, p->name);
+                  con, con->number, p, p->name);
 
   count = cupsdGetPrinterJobCount(p->name);
 
@@ -3042,7 +2941,7 @@ authenticate_job(cupsd_client_t  *con,    /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "authenticate_job(%p[%d], %s)",
-                  con, con->http.fd, uri->values[0].string.text);
+                  con, con->number, uri->values[0].string.text);
 
  /*
   * Start with "everything is OK" status...
@@ -3177,8 +3076,8 @@ authenticate_job(cupsd_client_t  *con,    /* I - Client connection */
 
   if (attr)
   {
-    attr->value_tag = IPP_TAG_KEYWORD;
-    cupsdSetString(&(attr->values[0].string.text), "no-hold");
+    ippSetValueTag(job->attrs, &attr, IPP_TAG_KEYWORD);
+    ippSetString(job->attrs, &attr, 0, "no-hold");
   }
 
  /*
@@ -3221,7 +3120,7 @@ cancel_all_jobs(cupsd_client_t  *con,     /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_all_jobs(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Get the jobs to cancel/purge...
@@ -3328,8 +3227,12 @@ cancel_all_jobs(cupsd_client_t  *con,    /* I - Client connection */
     {
       for (i = 0; i < job_ids->num_values; i ++)
       {
-       if (!cupsdFindJob(job_ids->values[i].integer))
+       if ((job = cupsdFindJob(job_ids->values[i].integer)) == NULL)
          break;
+
+        if (con->request->request.op.operation_id == IPP_CANCEL_MY_JOBS &&
+            _cups_strcasecmp(job->username, username))
+          break;
       }
 
       if (i < job_ids->num_values)
@@ -3385,6 +3288,10 @@ cancel_all_jobs(cupsd_client_t  *con,    /* I - Client connection */
        if ((job = cupsdFindJob(job_ids->values[i].integer)) == NULL ||
            _cups_strcasecmp(job->dest, printer->name))
          break;
+
+        if (con->request->request.op.operation_id == IPP_CANCEL_MY_JOBS &&
+            _cups_strcasecmp(job->username, username))
+          break;
       }
 
       if (i < job_ids->num_values)
@@ -3423,6 +3330,8 @@ cancel_all_jobs(cupsd_client_t  *con,     /* I - Client connection */
   }
 
   con->response->request.status.status_code = IPP_OK;
+
+  cupsdCheckJobs();
 }
 
 
@@ -3448,7 +3357,7 @@ cancel_job(cupsd_client_t  *con,  /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_job(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * See if we have a job URI or a printer URI...
@@ -3648,7 +3557,7 @@ cancel_subscription(
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                   "cancel_subscription(con=%p[%d], sub_id=%d)",
-                  con, con->http.fd, sub_id);
+                  con, con->number, sub_id);
 
  /*
   * Is the subscription ID valid?
@@ -3754,7 +3663,7 @@ check_quotas(cupsd_client_t  *con,        /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "check_quotas(%p[%d], %p[%s])",
-                  con, con->http.fd, p, p->name);
+                  con, con->number, p, p->name);
 
  /*
   * Figure out who is printing...
@@ -3977,7 +3886,7 @@ close_job(cupsd_client_t  *con,           /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "close_job(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * See if we have a job URI or a printer URI...
@@ -4061,7 +3970,7 @@ close_job(cupsd_client_t  *con,           /* I - Client connection */
   */
 
   httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
-                   con->servername, con->serverport, "/jobs/%d", job->id);
+                   con->clientname, con->clientport, "/jobs/%d", job->id);
   ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL,
                job_uri);
 
@@ -4112,7 +4021,11 @@ copy_attrs(ipp_t        *to,             /* I - Destination request */
          fromattr->group_tag != IPP_TAG_ZERO) || !fromattr->name)
       continue;
 
-    if (!strcmp(fromattr->name, "job-printer-uri"))
+    if (!strcmp(fromattr->name, "document-password") ||
+        !strcmp(fromattr->name, "job-authorization-uri") ||
+        !strcmp(fromattr->name, "job-password") ||
+        !strcmp(fromattr->name, "job-password-encryption") ||
+        !strcmp(fromattr->name, "job-printer-uri"))
       continue;
 
     if (exclude &&
@@ -4177,7 +4090,7 @@ copy_banner(cupsd_client_t *con,  /* I - Client connection */
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                   "copy_banner(con=%p[%d], job=%p[%d], name=\"%s\")",
-                  con, con ? con->http.fd : -1, job, job->id,
+                  con, con ? con->number : -1, job, job->id,
                  name ? name : "(null)");
 
  /*
@@ -4222,8 +4135,8 @@ copy_banner(cupsd_client_t *con,  /* I - Client connection */
     */
 
     attrname[2] = '_';
-    attrname[3] = toupper(attrname[3] & 255);
-    attrname[4] = toupper(attrname[4] & 255);
+    attrname[3] = (char)toupper(attrname[3] & 255);
+    attrname[4] = (char)toupper(attrname[4] & 255);
   }
 
   snprintf(filename, sizeof(filename), "%s/banners/%s/%s", DataDir,
@@ -4277,7 +4190,7 @@ copy_banner(cupsd_client_t *con,  /* I - Client connection */
         if (!isalpha(ch & 255) && ch != '-' && ch != '?')
           break;
        else if (s < (attrname + sizeof(attrname) - 1))
-          *s++ = ch;
+          *s++ = (char)ch;
        else
          break;
 
@@ -4424,8 +4337,9 @@ copy_banner(cupsd_client_t *con,  /* I - Client connection */
 
   kbytes = (cupsFileTell(out) + 1023) / 1024;
 
-  if ((attr = ippFindAttribute(job->attrs, "job-k-octets",
-                               IPP_TAG_INTEGER)) != NULL)
+  job->koctets += kbytes;
+
+  if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL)
     attr->values[0].integer += kbytes;
 
   cupsFileClose(out);
@@ -4440,7 +4354,8 @@ copy_banner(cupsd_client_t *con,  /* I - Client connection */
 
 static int                             /* O - 0 = success, -1 = error */
 copy_file(const char *from,            /* I - Source file */
-          const char *to)              /* I - Destination file */
+          const char *to,              /* I - Destination file */
+         mode_t     mode)              /* I - Permissions */
 {
   cups_file_t  *src,                   /* Source file */
                *dst;                   /* Destination file */
@@ -4457,7 +4372,7 @@ copy_file(const char *from,               /* I - Source file */
   if ((src = cupsFileOpen(from, "rb")) == NULL)
     return (-1);
 
-  if ((dst = cupsFileOpen(to, "wb")) == NULL)
+  if ((dst = cupsdCreateConfFile(to, mode)) == NULL)
   {
     cupsFileClose(src);
     return (-1);
@@ -4468,7 +4383,7 @@ copy_file(const char *from,               /* I - Source file */
   */
 
   while ((bytes = cupsFileRead(src, buffer, sizeof(buffer))) > 0)
-    if (cupsFileWrite(dst, buffer, bytes) < bytes)
+    if (cupsFileWrite(dst, buffer, (size_t)bytes) < bytes)
     {
       cupsFileClose(src);
       cupsFileClose(dst);
@@ -4481,7 +4396,7 @@ copy_file(const char *from,               /* I - Source file */
 
   cupsFileClose(src);
 
-  return (cupsFileClose(dst));
+  return (cupsdCloseCreatedConfFile(dst, to));
 }
 
 
@@ -4536,7 +4451,7 @@ copy_model(cupsd_client_t *con,           /* I - Client connection */
   cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0])));
 
   snprintf(buffer, sizeof(buffer), "%s/daemon/cups-driverd", ServerBin);
-  snprintf(tempfile, sizeof(tempfile), "%s/%d.ppd", TempDir, con->http.fd);
+  snprintf(tempfile, sizeof(tempfile), "%s/%d.ppd", TempDir, con->number);
   tempfd = open(tempfile, O_WRONLY | O_CREAT | O_TRUNC, 0600);
   if (tempfd < 0 || cupsdOpenPipe(temppipe))
     return (-1);
@@ -4603,7 +4518,7 @@ copy_model(cupsd_client_t *con,           /* I - Client connection */
 
       if ((bytes = read(temppipe[0], buffer, sizeof(buffer))) > 0)
       {
-       if (write(tempfd, buffer, bytes) < bytes)
+       if (write(tempfd, buffer, (size_t)bytes) < bytes)
           break;
 
        total += bytes;
@@ -4717,7 +4632,7 @@ copy_model(cupsd_client_t *con,           /* I - Client connection */
   * Open the destination file for a copy...
   */
 
-  if ((dst = cupsFileOpen(to, "wb")) == NULL)
+  if ((dst = cupsdCreateConfFile(to, ConfigFilePerm)) == NULL)
   {
     cupsFreeOptions(num_defaults, defaults);
     cupsFileClose(src);
@@ -4772,7 +4687,7 @@ copy_model(cupsd_client_t *con,           /* I - Client connection */
 
   unlink(tempfile);
 
-  return (cupsFileClose(dst));
+  return (cupsdCloseCreatedConfFile(dst, to));
 }
 
 
@@ -4809,7 +4724,7 @@ copy_job_attrs(cupsd_client_t *con,       /* I - Client connection */
         (!ra || cupsArrayFind(ra, "job-more-info")))
     {
       httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "http",
-                       NULL, con->servername, con->serverport, "/jobs/%d",
+                       NULL, con->clientname, con->clientport, "/jobs/%d",
                       job->id);
       ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI,
                   "job-more-info", NULL, job_uri);
@@ -4830,7 +4745,7 @@ copy_job_attrs(cupsd_client_t *con,       /* I - Client connection */
   if (!ra || cupsArrayFind(ra, "job-printer-uri"))
   {
     httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
-                    con->servername, con->serverport,
+                    con->clientname, con->clientport,
                     (job->dtype & CUPS_PRINTER_CLASS) ? "/classes/%s" :
                                                         "/printers/%s",
                     job->dest);
@@ -4841,13 +4756,67 @@ copy_job_attrs(cupsd_client_t *con,     /* I - Client connection */
   if (!ra || cupsArrayFind(ra, "job-uri"))
   {
     httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
-                    con->servername, con->serverport, "/jobs/%d",
+                    con->clientname, con->clientport, "/jobs/%d",
                     job->id);
     ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI,
                 "job-uri", NULL, job_uri);
   }
 
-  copy_attrs(con->response, job->attrs, ra, IPP_TAG_JOB, 0, exclude);
+  if (job->attrs)
+  {
+    copy_attrs(con->response, job->attrs, ra, IPP_TAG_JOB, 0, exclude);
+  }
+  else
+  {
+   /*
+    * Generate attributes from the job structure...
+    */
+
+    if (job->completed_time && (!ra || cupsArrayFind(ra, "date-time-at-completed")))
+      ippAddDate(con->response, IPP_TAG_JOB, "date-time-at-completed", ippTimeToDate(job->completed_time));
+
+    if (job->creation_time && (!ra || cupsArrayFind(ra, "date-time-at-creation")))
+      ippAddDate(con->response, IPP_TAG_JOB, "date-time-at-creation", ippTimeToDate(job->creation_time));
+
+    if (!ra || cupsArrayFind(ra, "job-id"))
+      ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id);
+
+    if (!ra || cupsArrayFind(ra, "job-k-octets"))
+      ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-k-octets", job->koctets);
+
+    if (job->name && (!ra || cupsArrayFind(ra, "job-name")))
+      ippAddString(con->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_NAME), "job-name", NULL, job->name);
+
+    if (job->username && (!ra || cupsArrayFind(ra, "job-originating-user-name")))
+      ippAddString(con->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_NAME), "job-originating-user-name", NULL, job->username);
+
+    if (!ra || cupsArrayFind(ra, "job-state"))
+      ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", (int)job->state_value);
+
+    if (!ra || cupsArrayFind(ra, "job-state-reasons"))
+    {
+      switch (job->state_value)
+      {
+        default : /* Should never get here for processing, pending, held, or stopped jobs since they don't get unloaded... */
+           break;
+        case IPP_JSTATE_ABORTED :
+           ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-aborted-by-system");
+           break;
+        case IPP_JSTATE_CANCELED :
+           ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-canceled-by-user");
+           break;
+        case IPP_JSTATE_COMPLETED :
+           ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-completed-successfully");
+           break;
+      }
+    }
+
+    if (job->completed_time && (!ra || cupsArrayFind(ra, "time-at-completed")))
+      ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-completed", (int)job->completed_time);
+
+    if (job->creation_time && (!ra || cupsArrayFind(ra, "time-at-creation")))
+      ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", (int)job->creation_time);
+  }
 }
 
 
@@ -4904,8 +4873,8 @@ copy_printer_attrs(
         else
        {
          httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri,
-                          sizeof(printer_uri), "ipp", NULL, con->servername,
-                          con->serverport,
+                          sizeof(printer_uri), "ipp", NULL, con->clientname,
+                          con->clientport,
                           (p2->type & CUPS_PRINTER_CLASS) ?
                               "/classes/%s" : "/printers/%s", p2->name);
          member_uris->values[i].string.text = _cupsStrAlloc(printer_uri);
@@ -4924,6 +4893,13 @@ copy_printer_attrs(
                  "printer-alert-description", NULL,
                 printer->alert_description);
 
+  if (!ra || cupsArrayFind(ra, "printer-config-change-date-time"))
+    ippAddDate(con->response, IPP_TAG_PRINTER, "printer-config-change-date-time", ippTimeToDate(printer->config_time));
+
+  if (!ra || cupsArrayFind(ra, "printer-config-change-time"))
+    ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+                  "printer-config-change-time", printer->config_time);
+
   if (!ra || cupsArrayFind(ra, "printer-current-time"))
     ippAddDate(con->response, IPP_TAG_PRINTER, "printer-current-time",
                ippTimeToDate(curtime));
@@ -4966,7 +4942,7 @@ copy_printer_attrs(
   if (!ra || cupsArrayFind(ra, "printer-icons"))
   {
     httpAssembleURIf(HTTP_URI_CODING_ALL, printer_icons, sizeof(printer_icons),
-                     "http", NULL, con->servername, con->serverport,
+                     "http", NULL, con->clientname, con->clientport,
                     "/icons/%s.png", printer->name);
     ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-icons",
                  NULL, printer_icons);
@@ -4974,17 +4950,15 @@ copy_printer_attrs(
   }
 
   if (!ra || cupsArrayFind(ra, "printer-is-accepting-jobs"))
-    ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-accepting-jobs",
-                  printer->accepting);
+    ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-accepting-jobs", (char)printer->accepting);
 
   if (!ra || cupsArrayFind(ra, "printer-is-shared"))
-    ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-shared",
-                  printer->shared);
+    ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-shared", (char)printer->shared);
 
   if (!ra || cupsArrayFind(ra, "printer-more-info"))
   {
     httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri),
-                     "http", NULL, con->servername, con->serverport,
+                     "http", NULL, con->clientname, con->clientport,
                     (printer->type & CUPS_PRINTER_CLASS) ?
                         "/classes/%s" : "/printers/%s", printer->name);
     ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI,
@@ -4999,6 +4973,9 @@ copy_printer_attrs(
     ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state",
                   printer->state);
 
+  if (!ra || cupsArrayFind(ra, "printer-state-change-date-time"))
+    ippAddDate(con->response, IPP_TAG_PRINTER, "printer-state-change-date-time", ippTimeToDate(printer->state_time));
+
   if (!ra || cupsArrayFind(ra, "printer-state-change-time"))
     ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
                   "printer-state-change-time", printer->state_time);
@@ -5012,7 +4989,7 @@ copy_printer_attrs(
 
   if (!ra || cupsArrayFind(ra, "printer-type"))
   {
-    int type;                          /* printer-type value */
+    cups_ptype_t type;                 /* printer-type value */
 
    /*
     * Add the CUPS-specific printer-type attribute...
@@ -5029,8 +5006,7 @@ copy_printer_attrs(
     if (!printer->shared)
       type |= CUPS_PRINTER_NOT_SHARED;
 
-    ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-type",
-                 type);
+    ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-type", (int)type);
   }
 
   if (!ra || cupsArrayFind(ra, "printer-up-time"))
@@ -5040,7 +5016,7 @@ copy_printer_attrs(
   if (!ra || cupsArrayFind(ra, "printer-uri-supported"))
   {
     httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri),
-                     "ipp", NULL, con->servername, con->serverport,
+                     "ipp", NULL, con->clientname, con->clientport,
                     (printer->type & CUPS_PRINTER_CLASS) ?
                         "/classes/%s" : "/printers/%s", printer->name);
     ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI,
@@ -5167,7 +5143,7 @@ copy_subscription_attrs(
   if (sub->dest && (!ra || cupsArrayFind(ra, "notify-printer-uri")))
   {
     httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri),
-                     "ipp", NULL, con->servername, con->serverport,
+                     "ipp", NULL, con->clientname, con->clientport,
                     "/printers/%s", sub->dest->name);
     ippAddString(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI,
                 "notify-printer-uri", NULL, printer_uri);
@@ -5200,7 +5176,7 @@ create_job(cupsd_client_t  *con,  /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "create_job(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Is the destination valid?
@@ -5265,251 +5241,34 @@ create_job(cupsd_client_t  *con,       /* I - Client connection */
 static cups_array_t *                  /* O - Array of attributes or NULL */
 create_requested_array(ipp_t *request) /* I - IPP request */
 {
-  int                  i;              /* Looping var */
-  ipp_attribute_t      *requested;     /* requested-attributes attribute */
   cups_array_t         *ra;            /* Requested attributes array */
-  char                 *value;         /* Current value */
 
 
  /*
-  * Get the requested-attributes attribute, and return NULL if we don't
-  * have one...
+  * Create the array for standard attributes...
   */
 
-  if ((requested = ippFindAttribute(request, "requested-attributes",
-                                    IPP_TAG_KEYWORD)) == NULL)
-    return (NULL);
+  ra = ippCreateRequestedArray(request);
 
  /*
-  * If the attribute contains a single "all" keyword, return NULL...
+  * Add CUPS defaults as needed...
   */
 
-  if (requested->num_values == 1 &&
-      !strcmp(requested->values[0].string.text, "all"))
-    return (NULL);
+  if (cupsArrayFind(ra, "printer-defaults"))
+  {
+   /*
+    * Include user-set defaults...
+    */
 
- /*
-  * Create an array using "strcmp" as the comparison function...
-  */
-
-  ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
-
-  for (i = 0; i < requested->num_values; i ++)
-  {
-    value = requested->values[i].string.text;
-
-    if (!strcmp(value, "job-template"))
-    {
-      /* Only includes the set of Job Template attributes supported by CUPS */
-      cupsArrayAdd(ra, "copies");
-      cupsArrayAdd(ra, "copies-default");
-      cupsArrayAdd(ra, "copies-supported");
-      cupsArrayAdd(ra, "finishings");
-      cupsArrayAdd(ra, "finishings-default");
-      cupsArrayAdd(ra, "finishings-supported");
-      cupsArrayAdd(ra, "job-hold-until");
-      cupsArrayAdd(ra, "job-hold-until-default");
-      cupsArrayAdd(ra, "job-hold-until-supported");
-      cupsArrayAdd(ra, "job-priority");
-      cupsArrayAdd(ra, "job-priority-default");
-      cupsArrayAdd(ra, "job-priority-supported");
-      cupsArrayAdd(ra, "job-sheets");
-      cupsArrayAdd(ra, "job-sheets-default");
-      cupsArrayAdd(ra, "job-sheets-supported");
-      cupsArrayAdd(ra, "media");
-      cupsArrayAdd(ra, "media-col");
-      cupsArrayAdd(ra, "media-col-default");
-      cupsArrayAdd(ra, "media-default");
-      cupsArrayAdd(ra, "media-supported");
-      cupsArrayAdd(ra, "multiple-document-handling");
-      cupsArrayAdd(ra, "multiple-document-handling-default");
-      cupsArrayAdd(ra, "multiple-document-handling-supported");
-      cupsArrayAdd(ra, "number-up");
-      cupsArrayAdd(ra, "number-up-default");
-      cupsArrayAdd(ra, "number-up-layout");
-      cupsArrayAdd(ra, "number-up-layout-default");
-      cupsArrayAdd(ra, "number-up-layout-supported");
-      cupsArrayAdd(ra, "number-up-supported");
-      cupsArrayAdd(ra, "orientation-requested");
-      cupsArrayAdd(ra, "orientation-requested-default");
-      cupsArrayAdd(ra, "orientation-requested-supported");
-      cupsArrayAdd(ra, "output-bin");
-      cupsArrayAdd(ra, "output-bin-default");
-      cupsArrayAdd(ra, "output-bin-supported");
-      cupsArrayAdd(ra, "page-delivery");
-      cupsArrayAdd(ra, "page-delivery-default");
-      cupsArrayAdd(ra, "page-delivery-supported");
-      cupsArrayAdd(ra, "page-order-received");
-      cupsArrayAdd(ra, "page-order-received-default");
-      cupsArrayAdd(ra, "page-order-received-supported");
-      cupsArrayAdd(ra, "page-ranges");
-      cupsArrayAdd(ra, "page-ranges-supported");
-      cupsArrayAdd(ra, "presentation-direction-number-up");
-      cupsArrayAdd(ra, "presentation-direction-number-up-default");
-      cupsArrayAdd(ra, "presentation-direction-number-up-supported");
-      cupsArrayAdd(ra, "print-color-mode");
-      cupsArrayAdd(ra, "print-color-mode-default");
-      cupsArrayAdd(ra, "print-color-mode-supported");
-      cupsArrayAdd(ra, "print-content-optimize");
-      cupsArrayAdd(ra, "print-content-optimize-default");
-      cupsArrayAdd(ra, "print-content-optimize-supported");
-      cupsArrayAdd(ra, "print-quality");
-      cupsArrayAdd(ra, "print-quality-default");
-      cupsArrayAdd(ra, "print-quality-supported");
-      cupsArrayAdd(ra, "printer-resolution");
-      cupsArrayAdd(ra, "printer-resolution-default");
-      cupsArrayAdd(ra, "printer-resolution-supported");
-      cupsArrayAdd(ra, "sheet-collate");
-      cupsArrayAdd(ra, "sheet-collate-default");
-      cupsArrayAdd(ra, "sheet-collate-supported");
-      cupsArrayAdd(ra, "sides");
-      cupsArrayAdd(ra, "sides-default");
-      cupsArrayAdd(ra, "sides-supported");
-    }
-    else if (!strcmp(value, "job-description"))
-    {
-      /* Only includes the set of Job Description attributes supported by CUPS */
-      cupsArrayAdd(ra, "date-time-at-completed");
-      cupsArrayAdd(ra, "date-time-at-creation");
-      cupsArrayAdd(ra, "date-time-at-processing");
-      cupsArrayAdd(ra, "job-detailed-status-message");
-      cupsArrayAdd(ra, "job-document-access-errors");
-      cupsArrayAdd(ra, "job-id");
-      cupsArrayAdd(ra, "job-impressions");
-      cupsArrayAdd(ra, "job-impressions-completed");
-      cupsArrayAdd(ra, "job-k-octets");
-      cupsArrayAdd(ra, "job-k-octets-processed");
-      cupsArrayAdd(ra, "job-mandatory-attributes");
-      cupsArrayAdd(ra, "job-media-progress");
-      cupsArrayAdd(ra, "job-media-sheets");
-      cupsArrayAdd(ra, "job-media-sheets-completed");
-      cupsArrayAdd(ra, "job-message-from-operator");
-      cupsArrayAdd(ra, "job-more-info");
-      cupsArrayAdd(ra, "job-name");
-      cupsArrayAdd(ra, "job-originating-user-name");
-      cupsArrayAdd(ra, "job-printer-up-time");
-      cupsArrayAdd(ra, "job-printer-uri");
-      cupsArrayAdd(ra, "job-state");
-      cupsArrayAdd(ra, "job-state-message");
-      cupsArrayAdd(ra, "job-state-reasons");
-      cupsArrayAdd(ra, "job-uri");
-      cupsArrayAdd(ra, "number-of-documents");
-      cupsArrayAdd(ra, "number-of-intervening-jobs");
-      cupsArrayAdd(ra, "output-device-assigned");
-      cupsArrayAdd(ra, "time-at-completed");
-      cupsArrayAdd(ra, "time-at-creation");
-      cupsArrayAdd(ra, "time-at-processing");
-    }
-    else if (!strcmp(value, "printer-description"))
-    {
-      /* Only includes the set of Printer Description attributes supported by CUPS */
-      cupsArrayAdd(ra, "charset-configured");
-      cupsArrayAdd(ra, "charset-supported");
-      cupsArrayAdd(ra, "color-supported");
-      cupsArrayAdd(ra, "compression-supported");
-      cupsArrayAdd(ra, "document-format-default");
-      cupsArrayAdd(ra, "document-format-supported");
-      cupsArrayAdd(ra, "generated-natural-language-supported");
-      cupsArrayAdd(ra, "ipp-versions-supported");
-      cupsArrayAdd(ra, "job-creation-attributes-supported");
-      cupsArrayAdd(ra, "job-ids-supported");
-      cupsArrayAdd(ra, "job-impressions-supported");
-      cupsArrayAdd(ra, "job-k-octets-supported");
-      cupsArrayAdd(ra, "job-media-sheets-supported");
-      cupsArrayAdd(ra, "job-settable-attributes-supported");
-      cupsArrayAdd(ra, "jpeg-k-octets-supported");
-      cupsArrayAdd(ra, "jpeg-x-dimension-supported");
-      cupsArrayAdd(ra, "jpeg-y-dimension-supported");
-      cupsArrayAdd(ra, "media-bottom-margin-supported");
-      cupsArrayAdd(ra, "media-col-supported");
-      cupsArrayAdd(ra, "media-key-supported");
-      cupsArrayAdd(ra, "media-left-margin-supported");
-      cupsArrayAdd(ra, "media-right-margin-supported");
-      cupsArrayAdd(ra, "media-size-supported");
-      cupsArrayAdd(ra, "media-source-supported");
-      cupsArrayAdd(ra, "media-top-margin-supported");
-      cupsArrayAdd(ra, "media-type-supported");
-      cupsArrayAdd(ra, "multiple-document-jobs-supported");
-      cupsArrayAdd(ra, "multiple-operation-time-out");
-      cupsArrayAdd(ra, "natural-language-configured");
-      cupsArrayAdd(ra, "notify-max-events-supported");
-      cupsArrayAdd(ra, "notify-schemes-supported");
-      cupsArrayAdd(ra, "operations-supported");
-      cupsArrayAdd(ra, "pages-per-minute");
-      cupsArrayAdd(ra, "pages-per-minute-color");
-      cupsArrayAdd(ra, "pdf-k-octets-supported");
-      cupsArrayAdd(ra, "pdl-override-supported");
-      cupsArrayAdd(ra, "printer-alert");
-      cupsArrayAdd(ra, "printer-alert-description");
-      cupsArrayAdd(ra, "printer-commands");
-      cupsArrayAdd(ra, "printer-current-time");
-      cupsArrayAdd(ra, "printer-dns-sd-name");
-      cupsArrayAdd(ra, "printer-info");
-      cupsArrayAdd(ra, "printer-is-accepting-jobs");
-      cupsArrayAdd(ra, "printer-is-shared");
-      cupsArrayAdd(ra, "printer-location");
-      cupsArrayAdd(ra, "printer-make-and-model");
-      cupsArrayAdd(ra, "printer-message-from-operator");
-      cupsArrayAdd(ra, "printer-more-info");
-      cupsArrayAdd(ra, "printer-more-info-manufacturer");
-      cupsArrayAdd(ra, "printer-name");
-      cupsArrayAdd(ra, "printer-settable-attributes-supported");
-      cupsArrayAdd(ra, "printer-state");
-      cupsArrayAdd(ra, "printer-state-change-date-time");
-      cupsArrayAdd(ra, "printer-state-change-time");
-      cupsArrayAdd(ra, "printer-state-message");
-      cupsArrayAdd(ra, "printer-state-reasons");
-      cupsArrayAdd(ra, "printer-type");
-      cupsArrayAdd(ra, "printer-up-time");
-      cupsArrayAdd(ra, "printer-uri-supported");
-      cupsArrayAdd(ra, "queued-job-count");
-      cupsArrayAdd(ra, "reference-uri-schemes-supported");
-      cupsArrayAdd(ra, "uri-authentication-supported");
-      cupsArrayAdd(ra, "uri-security-supported");
-      cupsArrayAdd(ra, "which-jobs-supported");
-    }
-    else if (!strcmp(value, "printer-defaults"))
-    {
-      char     *name;                  /* Option name */
-
-
-      for (name = (char *)cupsArrayFirst(CommonDefaults);
-           name;
-          name = (char *)cupsArrayNext(CommonDefaults))
+    char       *name;                  /* Option name */
+
+    cupsArrayRemove(ra, "printer-defaults");
+
+    for (name = (char *)cupsArrayFirst(CommonDefaults);
+        name;
+        name = (char *)cupsArrayNext(CommonDefaults))
+      if (!cupsArrayFind(ra, name))
         cupsArrayAdd(ra, name);
-    }
-    else if (!strcmp(value, "subscription-description"))
-    {
-      /* Only includes the set of Subscription Description attributes supported by CUPS */
-      cupsArrayAdd(ra, "notify-job-id");
-      cupsArrayAdd(ra, "notify-lease-expiration-time");
-      cupsArrayAdd(ra, "notify-printer-up-time");
-      cupsArrayAdd(ra, "notify-printer-uri");
-      cupsArrayAdd(ra, "notify-sequence-number");
-      cupsArrayAdd(ra, "notify-subscriber-user-name");
-      cupsArrayAdd(ra, "notify-subscription-id");
-    }
-    else if (!strcmp(value, "subscription-template"))
-    {
-      /* Only includes the set of Subscription Template attributes supported by CUPS */
-      cupsArrayAdd(ra, "notify-attributes");
-      cupsArrayAdd(ra, "notify-attributes-supported");
-      cupsArrayAdd(ra, "notify-charset");
-      cupsArrayAdd(ra, "notify-events");
-      cupsArrayAdd(ra, "notify-events-default");
-      cupsArrayAdd(ra, "notify-events-supported");
-      cupsArrayAdd(ra, "notify-lease-duration");
-      cupsArrayAdd(ra, "notify-lease-duration-default");
-      cupsArrayAdd(ra, "notify-lease-duration-supported");
-      cupsArrayAdd(ra, "notify-natural-language");
-      cupsArrayAdd(ra, "notify-pull-method");
-      cupsArrayAdd(ra, "notify-pull-method-supported");
-      cupsArrayAdd(ra, "notify-recipient-uri");
-      cupsArrayAdd(ra, "notify-time-interval");
-      cupsArrayAdd(ra, "notify-user-data");
-    }
-    else
-      cupsArrayAdd(ra, value);
   }
 
   return (ra);
@@ -5517,11 +5276,11 @@ create_requested_array(ipp_t *request)  /* I - IPP request */
 
 
 /*
- * 'create_subscription()' - Create a notification subscription.
+ * 'create_subscriptions()' - Create one or more notification subscriptions.
  */
 
 static void
-create_subscription(
+create_subscriptions(
     cupsd_client_t  *con,              /* I - Client connection */
     ipp_attribute_t *uri)              /* I - Printer URI */
 {
@@ -5569,9 +5328,7 @@ create_subscription(
   * Is the destination valid?
   */
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG,
-                  "cupsdCreateSubscription(con=%p(%d), uri=\"%s\")",
-                  con, con->http.fd, uri->values[0].string.text);
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "create_subscriptions(con=%p(%d), uri=\"%s\")", con, con->number, uri->values[0].string.text);
 
   httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme,
                   sizeof(scheme), userpass, sizeof(userpass), host,
@@ -5822,7 +5579,7 @@ create_subscription(
     if (MaxLeaseDuration && (lease == 0 || lease > MaxLeaseDuration))
     {
       cupsdLogMessage(CUPSD_LOG_INFO,
-                      "create_subscription: Limiting notify-lease-duration to "
+                      "create_subscriptions: Limiting notify-lease-duration to "
                      "%d seconds.",
                      MaxLeaseDuration);
       lease = MaxLeaseDuration;
@@ -5868,7 +5625,7 @@ create_subscription(
     {
       sub->user_data_len = user_data->values[0].unknown.length;
       memcpy(sub->user_data, user_data->values[0].unknown.data,
-             sub->user_data_len);
+             (size_t)sub->user_data_len);
     }
 
     ippAddSeparator(con->response);
@@ -5900,7 +5657,7 @@ delete_printer(cupsd_client_t  *con,      /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "delete_printer(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Do we have a valid URI?
@@ -5951,10 +5708,16 @@ delete_printer(cupsd_client_t  *con,    /* I - Client connection */
   snprintf(filename, sizeof(filename), "%s/interfaces/%s", ServerRoot,
            printer->name);
   unlink(filename);
+  snprintf(filename, sizeof(filename), "%s/interfaces/%s.O", ServerRoot,
+           printer->name);
+  unlink(filename);
 
   snprintf(filename, sizeof(filename), "%s/ppd/%s.ppd", ServerRoot,
            printer->name);
   unlink(filename);
+  snprintf(filename, sizeof(filename), "%s/ppd/%s.ppd.O", ServerRoot,
+           printer->name);
+  unlink(filename);
 
   snprintf(filename, sizeof(filename), "%s/%s.png", CacheDir, printer->name);
   unlink(filename);
@@ -6008,7 +5771,7 @@ get_default(cupsd_client_t *con)  /* I - Client connection */
   cups_array_t *ra;                    /* Requested attributes array */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_default(%p[%d])", con, con->http.fd);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_default(%p[%d])", con, con->number);
 
  /*
   * Check policy...
@@ -6058,7 +5821,7 @@ get_devices(cupsd_client_t *con)  /* I - Client connection */
                                        /* String for included schemes */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_devices(%p[%d])", con, con->http.fd);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_devices(%p[%d])", con, con->number);
 
  /*
   * Check policy...
@@ -6152,7 +5915,7 @@ get_document(cupsd_client_t  *con,        /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_document(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * See if we have a job URI or a printer URI...
@@ -6299,7 +6062,7 @@ get_job_attrs(cupsd_client_t  *con,       /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_job_attrs(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * See if we have a job URI or a printer URI...
@@ -6413,19 +6176,24 @@ get_jobs(cupsd_client_t  *con,          /* I - Client connection */
   int          port;                   /* Port portion of URI */
   int          job_comparison;         /* Job comparison */
   ipp_jstate_t job_state;              /* job-state value */
-  int          first_job_id;           /* First job ID */
-  int          limit;                  /* Maximum number of jobs to return */
+  int          first_job_id = 1,       /* First job ID */
+               first_index = 1,        /* First index */
+               current_index = 0;      /* Current index */
+  int          limit = 0;              /* Maximum number of jobs to return */
   int          count;                  /* Number of jobs that match */
+  int          need_load_job = 0;      /* Do we need to load the job? */
+  const char   *job_attr;              /* Job attribute requested */
   ipp_attribute_t *job_ids;            /* job-ids attribute */
   cupsd_job_t  *job;                   /* Current job pointer */
   cupsd_printer_t *printer;            /* Printer */
   cups_array_t *list;                  /* Which job list... */
+  int          delete_list = 0;        /* Delete the list afterwards? */
   cups_array_t *ra,                    /* Requested attributes array */
                *exclude;               /* Private attributes array */
   cupsd_policy_t *policy;              /* Current policy */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs(%p[%d], %s)", con, con->http.fd,
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs(%p[%d], %s)", con, con->number,
                   uri->values[0].string.text);
 
  /*
@@ -6513,19 +6281,21 @@ get_jobs(cupsd_client_t  *con,          /* I - Client connection */
   {
     job_comparison = -1;
     job_state      = IPP_JOB_STOPPED;
-    list           = Jobs;
+    list           = ActiveJobs;
   }
   else if (!strcmp(attr->values[0].string.text, "completed"))
   {
     job_comparison = 1;
     job_state      = IPP_JOB_CANCELED;
-    list           = Jobs;
+    list           = cupsdGetCompletedJobs(printer);
+    delete_list    = 1;
   }
   else if (!strcmp(attr->values[0].string.text, "aborted"))
   {
     job_comparison = 0;
     job_state      = IPP_JOB_ABORTED;
-    list           = Jobs;
+    list           = cupsdGetCompletedJobs(printer);
+    delete_list    = 1;
   }
   else if (!strcmp(attr->values[0].string.text, "all"))
   {
@@ -6537,7 +6307,8 @@ get_jobs(cupsd_client_t  *con,            /* I - Client connection */
   {
     job_comparison = 0;
     job_state      = IPP_JOB_CANCELED;
-    list           = Jobs;
+    list           = cupsdGetCompletedJobs(printer);
+    delete_list    = 1;
   }
   else if (!strcmp(attr->values[0].string.text, "pending"))
   {
@@ -6577,8 +6348,7 @@ get_jobs(cupsd_client_t  *con,            /* I - Client connection */
   * See if they want to limit the number of jobs reported...
   */
 
-  if ((attr = ippFindAttribute(con->request, "limit",
-                               IPP_TAG_INTEGER)) != NULL)
+  if ((attr = ippFindAttribute(con->request, "limit", IPP_TAG_INTEGER)) != NULL)
   {
     if (job_ids)
     {
@@ -6590,11 +6360,20 @@ get_jobs(cupsd_client_t  *con,          /* I - Client connection */
 
     limit = attr->values[0].integer;
   }
-  else
-    limit = 0;
 
-  if ((attr = ippFindAttribute(con->request, "first-job-id",
-                               IPP_TAG_INTEGER)) != NULL)
+  if ((attr = ippFindAttribute(con->request, "first-index", IPP_TAG_INTEGER)) != NULL)
+  {
+    if (job_ids)
+    {
+      send_ipp_status(con, IPP_CONFLICT,
+                     _("The %s attribute cannot be provided with job-ids."),
+                     "first-index");
+      return;
+    }
+
+    first_index = attr->values[0].integer;
+  }
+  else if ((attr = ippFindAttribute(con->request, "first-job-id", IPP_TAG_INTEGER)) != NULL)
   {
     if (job_ids)
     {
@@ -6606,15 +6385,12 @@ get_jobs(cupsd_client_t  *con,          /* I - Client connection */
 
     first_job_id = attr->values[0].integer;
   }
-  else
-    first_job_id = 1;
 
  /*
   * See if we only want to see jobs for a specific user...
   */
 
-  if ((attr = ippFindAttribute(con->request, "my-jobs",
-                               IPP_TAG_BOOLEAN)) != NULL && job_ids)
+  if ((attr = ippFindAttribute(con->request, "my-jobs", IPP_TAG_BOOLEAN)) != NULL && job_ids)
   {
     send_ipp_status(con, IPP_CONFLICT,
                     _("The %s attribute cannot be provided with job-ids."),
@@ -6626,17 +6402,42 @@ get_jobs(cupsd_client_t  *con,          /* I - Client connection */
   else
     username[0] = '\0';
 
-  if ((ra = create_requested_array(con->request)) == NULL &&
-      !ippFindAttribute(con->request, "requested-attributes", IPP_TAG_KEYWORD))
+  ra = create_requested_array(con->request);
+  for (job_attr = (char *)cupsArrayFirst(ra); job_attr; job_attr = (char *)cupsArrayNext(ra))
+    if (strcmp(job_attr, "job-id") &&
+       strcmp(job_attr, "job-k-octets") &&
+       strcmp(job_attr, "job-media-progress") &&
+       strcmp(job_attr, "job-more-info") &&
+       strcmp(job_attr, "job-name") &&
+       strcmp(job_attr, "job-originating-user-name") &&
+       strcmp(job_attr, "job-preserved") &&
+       strcmp(job_attr, "job-printer-up-time") &&
+        strcmp(job_attr, "job-printer-uri") &&
+       strcmp(job_attr, "job-state") &&
+       strcmp(job_attr, "job-state-reasons") &&
+       strcmp(job_attr, "job-uri") &&
+       strcmp(job_attr, "time-at-completed") &&
+       strcmp(job_attr, "time-at-creation") &&
+       strcmp(job_attr, "number-of-documents"))
+    {
+      need_load_job = 1;
+      break;
+    }
+
+  if (need_load_job && (limit == 0 || limit > 500) && (list == Jobs || delete_list))
   {
    /*
-    * IPP conformance - Get-Jobs has a default requested-attributes value of
-    * "job-id" and "job-uri".
+    * Limit expensive Get-Jobs for job history to 500 jobs...
     */
 
-    ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
-    cupsArrayAdd(ra, "job-id");
-    cupsArrayAdd(ra, "job-uri");
+    ippAddInteger(con->response, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "limit", 500);
+
+    if (limit)
+      ippAddInteger(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_INTEGER, "limit", limit);
+
+    limit = 500;
+
+    cupsdLogClient(con, CUPSD_LOG_INFO, "Limiting Get-Jobs response to %d jobs.", limit);
   }
 
  /*
@@ -6664,13 +6465,15 @@ get_jobs(cupsd_client_t  *con,          /* I - Client connection */
     {
       job = cupsdFindJob(job_ids->values[i].integer);
 
-      cupsdLoadJob(job);
-
-      if (!job->attrs)
+      if (need_load_job && !job->attrs)
       {
-       cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: No attributes for job %d",
-                       job->id);
-       continue;
+        cupsdLoadJob(job);
+
+       if (!job->attrs)
+       {
+         cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: No attributes for job %d", job->id);
+         continue;
+       }
       }
 
       if (i > 0)
@@ -6720,13 +6523,19 @@ get_jobs(cupsd_client_t  *con,          /* I - Client connection */
       if (job->id < first_job_id)
        continue;
 
-      cupsdLoadJob(job);
+      current_index ++;
+      if (current_index < first_index)
+        continue;
 
-      if (!job->attrs)
+      if (need_load_job && !job->attrs)
       {
-       cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: No attributes for job %d",
-                       job->id);
-       continue;
+        cupsdLoadJob(job);
+
+       if (!job->attrs)
+       {
+         cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: No attributes for job %d", job->id);
+         continue;
+       }
       }
 
       if (username[0] && _cups_strcasecmp(username, job->username))
@@ -6750,6 +6559,9 @@ get_jobs(cupsd_client_t  *con,            /* I - Client connection */
 
   cupsArrayDelete(ra);
 
+  if (delete_list)
+    cupsArrayDelete(list);
+
   con->response->request.status.status_code = IPP_OK;
 }
 
@@ -6771,7 +6583,7 @@ get_notifications(cupsd_client_t *con)    /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_notifications(con=%p[%d])",
-                  con, con->http.fd);
+                  con, con->number);
 
  /*
   * Get subscription attributes...
@@ -6905,7 +6717,7 @@ get_ppd(cupsd_client_t  *con,             /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppd(%p[%d], %p[%s=%s])", con,
-                  con->http.fd, uri, uri->name, uri->values[0].string.text);
+                  con->number, uri, uri->name, uri->values[0].string.text);
 
   if (!strcmp(uri->name, "ppd-name"))
   {
@@ -7078,7 +6890,7 @@ get_ppds(cupsd_client_t *con)             /* I - Client connection */
                                        /* String for included schemes */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppds(%p[%d])", con, con->http.fd);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppds(%p[%d])", con, con->number);
 
  /*
   * Check policy...
@@ -7223,7 +7035,7 @@ get_printer_attrs(cupsd_client_t  *con,   /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_attrs(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Is the destination valid?
@@ -7279,7 +7091,7 @@ get_printer_supported(
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_supported(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Is the destination valid?
@@ -7311,9 +7123,15 @@ get_printer_supported(
   */
 
   ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE,
+                "printer-geo-location", 0);
+  ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE,
                 "printer-info", 0);
   ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE,
                 "printer-location", 0);
+  ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE,
+                "printer-organization", 0);
+  ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE,
+                "printer-organizational-unit", 0);
 
   con->response->request.status.status_code = IPP_OK;
 }
@@ -7332,7 +7150,7 @@ get_printers(cupsd_client_t *con, /* I - Client connection */
   int          limit;                  /* Max number of printers to return */
   int          count;                  /* Number of printers that match */
   cupsd_printer_t *printer;            /* Current printer pointer */
-  int          printer_type,           /* printer-type attribute */
+  cups_ptype_t printer_type,           /* printer-type attribute */
                printer_mask;           /* printer-type-mask attribute */
   char         *location;              /* Location string */
   const char   *username;              /* Current user */
@@ -7342,7 +7160,7 @@ get_printers(cupsd_client_t *con, /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printers(%p[%d], %x)", con,
-                  con->http.fd, type);
+                  con->number, type);
 
  /*
   * Check policy...
@@ -7386,15 +7204,15 @@ get_printers(cupsd_client_t *con,       /* I - Client connection */
 
   if ((attr = ippFindAttribute(con->request, "printer-type",
                                IPP_TAG_ENUM)) != NULL)
-    printer_type = attr->values[0].integer;
+    printer_type = (cups_ptype_t)attr->values[0].integer;
   else
-    printer_type = 0;
+    printer_type = (cups_ptype_t)0;
 
   if ((attr = ippFindAttribute(con->request, "printer-type-mask",
                                IPP_TAG_ENUM)) != NULL)
-    printer_mask = attr->values[0].integer;
+    printer_mask = (cups_ptype_t)attr->values[0].integer;
   else
-    printer_mask = 0;
+    printer_mask = (cups_ptype_t)0;
 
   local = httpAddrLocalhost(&(con->clientaddr));
 
@@ -7488,7 +7306,7 @@ get_subscription_attrs(
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                   "get_subscription_attrs(con=%p[%d], sub_id=%d)",
-                  con, con->http.fd, sub_id);
+                  con, con->number, sub_id);
 
  /*
   * Is the subscription ID valid?
@@ -7569,7 +7387,7 @@ get_subscriptions(cupsd_client_t  *con,   /* I - Client connection */
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                   "get_subscriptions(con=%p[%d], uri=%s)",
-                  con, con->http.fd, uri->values[0].string.text);
+                  con, con->number, uri->values[0].string.text);
 
  /*
   * Is the destination valid?
@@ -7730,7 +7548,7 @@ hold_job(cupsd_client_t  *con,            /* I - Client connection */
   cupsd_job_t  *job;                   /* Job information */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_job(%p[%d], %s)", con, con->http.fd,
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_job(%p[%d], %s)", con, con->number,
                   uri->values[0].string.text);
 
  /*
@@ -7859,7 +7677,7 @@ hold_new_jobs(cupsd_client_t  *con,       /* I - Connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_new_jobs(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Is the destination valid?
@@ -7935,7 +7753,7 @@ move_job(cupsd_client_t  *con,            /* I - Client connection */
                *dprinter;              /* Destination printer */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "move_job(%p[%d], %s)", con, con->http.fd,
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "move_job(%p[%d], %s)", con, con->number,
                   uri->values[0].string.text);
 
  /*
@@ -8248,6 +8066,7 @@ print_job(cupsd_client_t  *con,           /* I - Client connection */
          ipp_attribute_t *uri)         /* I - Printer URI */
 {
   ipp_attribute_t *attr;               /* Current attribute */
+  ipp_attribute_t *doc_name;           /* document-name attribute */
   ipp_attribute_t *format;             /* Document-format attribute */
   const char   *default_format;        /* document-format-default value */
   cupsd_job_t  *job;                   /* New job */
@@ -8263,7 +8082,7 @@ print_job(cupsd_client_t  *con,           /* I - Client connection */
   int          compression;            /* Document compression */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "print_job(%p[%d], %s)", con, con->http.fd,
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "print_job(%p[%d], %s)", con, con->number,
                   uri->values[0].string.text);
 
  /*
@@ -8325,6 +8144,10 @@ print_job(cupsd_client_t  *con,          /* I - Client connection */
   * Is it a format we support?
   */
 
+  doc_name = ippFindAttribute(con->request, "document-name", IPP_TAG_NAME);
+  if (doc_name)
+    ippSetName(con->request, &doc_name, "document-name-supplied");
+
   if ((format = ippFindAttribute(con->request, "document-format",
                                  IPP_TAG_MIMETYPE)) != NULL)
   {
@@ -8340,6 +8163,8 @@ print_job(cupsd_client_t  *con,           /* I - Client connection */
                      format->values[0].string.text);
       return;
     }
+
+    ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-supplied", NULL, ippGetString(format, 0, NULL));
   }
   else if ((default_format = cupsGetOption("document-format",
                                            printer->num_options,
@@ -8363,8 +8188,8 @@ print_job(cupsd_client_t  *con,           /* I - Client connection */
     * Auto-type it!
     */
 
-    strcpy(super, "application");
-    strcpy(type, "octet-stream");
+    strlcpy(super, "application", sizeof(super));
+    strlcpy(type, "octet-stream", sizeof(type));
   }
 
   if (!strcmp(super, "application") && !strcmp(type, "octet-stream"))
@@ -8373,12 +8198,9 @@ print_job(cupsd_client_t  *con,          /* I - Client connection */
     * Auto-type the file...
     */
 
-    ipp_attribute_t    *doc_name;      /* document-name attribute */
-
-
     cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job ???] Auto-typing file...");
 
-    doc_name = ippFindAttribute(con->request, "document-name", IPP_TAG_NAME);
+
     filetype = mimeFileType(MimeDatabase, con->filename,
                             doc_name ? doc_name->values[0].string.text : NULL,
                            &compression);
@@ -8388,6 +8210,9 @@ print_job(cupsd_client_t  *con,           /* I - Client connection */
 
     cupsdLogMessage(CUPSD_LOG_INFO, "[Job ???] Request file type is %s/%s.",
                    filetype->super, filetype->type);
+
+    snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, filetype->type);
+    ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-detected", NULL, mimetype);
   }
   else
     filetype = mimeType(MimeDatabase, super, type);
@@ -8405,11 +8230,7 @@ print_job(cupsd_client_t  *con,          /* I - Client connection */
              filetype->type);
 
     if (format)
-    {
-      _cupsStrFree(format->values[0].string.text);
-
-      format->values[0].string.text = _cupsStrAlloc(mimetype);
-    }
+      ippSetString(con->request, &format, 0, mimetype);
     else
       ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE,
                   "document-format", NULL, mimetype);
@@ -8457,8 +8278,9 @@ print_job(cupsd_client_t  *con,           /* I - Client connection */
 
   cupsdUpdateQuota(printer, job->username, 0, kbytes);
 
-  if ((attr = ippFindAttribute(job->attrs, "job-k-octets",
-                               IPP_TAG_INTEGER)) != NULL)
+  job->koctets += kbytes;
+
+  if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL)
     attr->values[0].integer += kbytes;
 
  /*
@@ -8468,9 +8290,15 @@ print_job(cupsd_client_t  *con,          /* I - Client connection */
   if (add_file(con, job, filetype, compression))
     return;
 
-  snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id,
-           job->num_files);
-  rename(con->filename, filename);
+  snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id, job->num_files);
+  if (rename(con->filename, filename))
+  {
+    cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to rename job document file \"%s\": %s", filename, strerror(errno));
+
+    send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to rename job document file."));
+    return;
+  }
+
   cupsdClearString(&con->filename);
 
  /*
@@ -8629,12 +8457,17 @@ read_job_ticket(cupsd_client_t *con)    /* I - Client connection */
     if (attr->group_tag != IPP_TAG_JOB || !attr->name)
       continue;
 
-    if (!strcmp(attr->name, "job-originating-host-name") ||
-        !strcmp(attr->name, "job-originating-user-name") ||
+    if (!strncmp(attr->name, "date-time-at-", 13) ||
+        !strcmp(attr->name, "job-impressions-completed") ||
        !strcmp(attr->name, "job-media-sheets-completed") ||
-       !strcmp(attr->name, "job-k-octets") ||
+       !strncmp(attr->name, "job-k-octets", 12) ||
        !strcmp(attr->name, "job-id") ||
+       !strcmp(attr->name, "job-originating-host-name") ||
+        !strcmp(attr->name, "job-originating-user-name") ||
+       !strcmp(attr->name, "job-pages-completed") ||
+       !strcmp(attr->name, "job-printer-uri") ||
        !strncmp(attr->name, "job-state", 9) ||
+       !strcmp(attr->name, "job-uri") ||
        !strncmp(attr->name, "time-at-", 8))
       continue; /* Read-only attrs */
 
@@ -8697,7 +8530,7 @@ reject_jobs(cupsd_client_t  *con, /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "reject_jobs(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Is the destination valid?
@@ -8732,7 +8565,8 @@ reject_jobs(cupsd_client_t  *con, /* I - Client connection */
 
   if ((attr = ippFindAttribute(con->request, "printer-state-message",
                                IPP_TAG_TEXT)) == NULL)
-    strcpy(printer->state_message, "Rejecting Jobs");
+    strlcpy(printer->state_message, "Rejecting Jobs",
+            sizeof(printer->state_message));
   else
     strlcpy(printer->state_message, attr->values[0].string.text,
             sizeof(printer->state_message));
@@ -8778,7 +8612,7 @@ release_held_new_jobs(
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_held_new_jobs(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Is the destination valid?
@@ -8849,7 +8683,7 @@ release_job(cupsd_client_t  *con, /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_job(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * See if we have a job URI or a printer URI...
@@ -8944,10 +8778,8 @@ release_job(cupsd_client_t  *con,        /* I - Client connection */
 
   if (attr)
   {
-    _cupsStrFree(attr->values[0].string.text);
-
-    attr->value_tag = IPP_TAG_KEYWORD;
-    attr->values[0].string.text = _cupsStrAlloc("no-hold");
+    ippSetValueTag(job->attrs, &attr, IPP_TAG_KEYWORD);
+    ippSetString(job->attrs, &attr, 0, "no-hold");
 
     cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, cupsdFindDest(job->dest), job,
                   "Job job-hold-until value changed by user.");
@@ -8987,7 +8819,7 @@ renew_subscription(
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                   "renew_subscription(con=%p[%d], sub_id=%d)",
-                  con, con->http.fd, sub_id);
+                  con, con->number, sub_id);
 
  /*
   * Is the subscription ID valid?
@@ -9075,7 +8907,7 @@ restart_job(cupsd_client_t  *con, /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "restart_job(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * See if we have a job URI or a printer URI...
@@ -9299,8 +9131,7 @@ save_auth_info(
     {
       if (strcmp(dest->auth_info_required[i], "negotiate"))
       {
-       httpEncode64_2(line, sizeof(line), auth_info->values[i].string.text,
-                      strlen(auth_info->values[i].string.text));
+       httpEncode64_2(line, sizeof(line), auth_info->values[i].string.text, (int)strlen(auth_info->values[i].string.text));
        cupsFilePutConf(fp, dest->auth_info_required[i], line);
       }
       else
@@ -9331,15 +9162,13 @@ save_auth_info(
     * Allow fallback to username+password for Kerberized queues...
     */
 
-    httpEncode64_2(line, sizeof(line), auth_info->values[0].string.text,
-                   strlen(auth_info->values[0].string.text));
+    httpEncode64_2(line, sizeof(line), auth_info->values[0].string.text, (int)strlen(auth_info->values[0].string.text));
     cupsFilePutConf(fp, "username", line);
 
     cupsdSetStringf(job->auth_env + 0, "AUTH_USERNAME=%s",
                     auth_info->values[0].string.text);
 
-    httpEncode64_2(line, sizeof(line), auth_info->values[1].string.text,
-                   strlen(auth_info->values[1].string.text));
+    httpEncode64_2(line, sizeof(line), auth_info->values[1].string.text, (int)strlen(auth_info->values[1].string.text));
     cupsFilePutConf(fp, "password", line);
 
     cupsdSetStringf(job->auth_env + 1, "AUTH_PASSWORD=%s",
@@ -9351,7 +9180,7 @@ save_auth_info(
     * Write the authenticated username...
     */
 
-    httpEncode64_2(line, sizeof(line), con->username, strlen(con->username));
+    httpEncode64_2(line, sizeof(line), con->username, (int)strlen(con->username));
     cupsFilePutConf(fp, "username", line);
 
     cupsdSetStringf(job->auth_env + 0, "AUTH_USERNAME=%s", con->username);
@@ -9360,7 +9189,7 @@ save_auth_info(
     * Write the authenticated password...
     */
 
-    httpEncode64_2(line, sizeof(line), con->password, strlen(con->password));
+    httpEncode64_2(line, sizeof(line), con->password, (int)strlen(con->password));
     cupsFilePutConf(fp, "password", line);
 
     cupsdSetStringf(job->auth_env + 1, "AUTH_PASSWORD=%s", con->password);
@@ -9430,7 +9259,7 @@ send_document(cupsd_client_t  *con,       /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_document(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * See if we have a job URI or a printer URI...
@@ -9562,6 +9391,8 @@ send_document(cupsd_client_t  *con,       /* I - Client connection */
   * Is it a format we support?
   */
 
+  cupsdLoadJob(job);
+
   if ((format = ippFindAttribute(con->request, "document-format",
                                  IPP_TAG_MIMETYPE)) != NULL)
   {
@@ -9576,6 +9407,8 @@ send_document(cupsd_client_t  *con,       /* I - Client connection */
                      format->values[0].string.text);
       return;
     }
+
+    ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-supplied", NULL, ippGetString(format, 0, NULL));
   }
   else if ((default_format = cupsGetOption("document-format",
                                            printer->num_options,
@@ -9598,8 +9431,8 @@ send_document(cupsd_client_t  *con,       /* I - Client connection */
     * No document format attribute?  Auto-type it!
     */
 
-    strcpy(super, "application");
-    strcpy(type, "octet-stream");
+    strlcpy(super, "application", sizeof(super));
+    strlcpy(type, "octet-stream", sizeof(type));
   }
 
   if (!strcmp(super, "application") && !strcmp(type, "octet-stream"))
@@ -9624,6 +9457,9 @@ send_document(cupsd_client_t  *con,       /* I - Client connection */
     if (filetype)
       cupsdLogJob(job, CUPSD_LOG_DEBUG, "Request file type is %s/%s.",
                  filetype->super, filetype->type);
+
+    snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, filetype->type);
+    ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-detected", NULL, mimetype);
   }
   else
     filetype = mimeType(MimeDatabase, super, type);
@@ -9640,11 +9476,7 @@ send_document(cupsd_client_t  *con,      /* I - Client connection */
 
     if ((jformat = ippFindAttribute(job->attrs, "document-format",
                                     IPP_TAG_MIMETYPE)) != NULL)
-    {
-      _cupsStrFree(jformat->values[0].string.text);
-
-      jformat->values[0].string.text = _cupsStrAlloc(mimetype);
-    }
+      ippSetString(job->attrs, &jformat, 0, mimetype);
     else
       ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_MIMETYPE,
                   "document-format", NULL, mimetype);
@@ -9681,11 +9513,12 @@ send_document(cupsd_client_t  *con,     /* I - Client connection */
   * Add the file to the job...
   */
 
-  cupsdLoadJob(job);
-
   if (add_file(con, job, filetype, compression))
     return;
 
+  if ((attr = ippFindAttribute(con->request, "document-name", IPP_TAG_NAME)) != NULL)
+    ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "document-name-supplied", NULL, ippGetString(attr, 0, NULL));
+
   if (stat(con->filename, &fileinfo))
     kbytes = 0;
   else
@@ -9693,13 +9526,19 @@ send_document(cupsd_client_t  *con,     /* I - Client connection */
 
   cupsdUpdateQuota(printer, job->username, 0, kbytes);
 
-  if ((attr = ippFindAttribute(job->attrs, "job-k-octets",
-                               IPP_TAG_INTEGER)) != NULL)
+  job->koctets += kbytes;
+
+  if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL)
     attr->values[0].integer += kbytes;
 
-  snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id,
-           job->num_files);
-  rename(con->filename, filename);
+  snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id, job->num_files);
+  if (rename(con->filename, filename))
+  {
+    cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to rename job document file \"%s\": %s", filename, strerror(errno));
+
+    send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to rename job document file."));
+    return;
+  }
 
   cupsdClearString(&con->filename);
 
@@ -9778,7 +9617,7 @@ send_document(cupsd_client_t  *con,       /* I - Client connection */
   */
 
   httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
-                   con->servername, con->serverport, "/jobs/%d", jobid);
+                   con->clientname, con->clientport, "/jobs/%d", jobid);
   ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL,
                job_uri);
 
@@ -9818,13 +9657,13 @@ send_http_error(
     uri = ippFindAttribute(con->request, "job-uri", IPP_TAG_URI);
 
   cupsdLogMessage(status == HTTP_FORBIDDEN ? CUPSD_LOG_ERROR : CUPSD_LOG_DEBUG,
-                  "Returning HTTP %s for %s (%s) from %s",
-                  httpStatus(status),
+                  "[Client %d] Returning HTTP %s for %s (%s) from %s",
+                  con->number, httpStatus(status),
                  con->request ?
                      ippOpString(con->request->request.op.operation_id) :
                      "no operation-id",
                  uri ? uri->values[0].string.text : "no URI",
-                 con->http.hostname);
+                 con->http->hostname);
 
   if (printer)
   {
@@ -9945,7 +9784,7 @@ set_default(cupsd_client_t  *con, /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_default(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Is the destination valid?
@@ -10027,7 +9866,7 @@ set_job_attrs(cupsd_client_t  *con,      /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_job_attrs(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Start with "everything is OK" status...
@@ -10135,15 +9974,18 @@ set_job_attrs(cupsd_client_t  *con,    /* I - Client connection */
 
     if (!strcmp(attr->name, "attributes-charset") ||
        !strcmp(attr->name, "attributes-natural-language") ||
-       !strcmp(attr->name, "document-compression") ||
-       !strcmp(attr->name, "document-format") ||
+       !strncmp(attr->name, "date-time-at-", 13) ||
+       !strncmp(attr->name, "document-compression", 20) ||
+       !strncmp(attr->name, "document-format", 15) ||
        !strcmp(attr->name, "job-detailed-status-messages") ||
        !strcmp(attr->name, "job-document-access-errors") ||
        !strcmp(attr->name, "job-id") ||
        !strcmp(attr->name, "job-impressions-completed") ||
-       !strcmp(attr->name, "job-k-octets") ||
+       !strcmp(attr->name, "job-k-octets-completed") ||
+       !strcmp(attr->name, "job-media-sheets-completed") ||
         !strcmp(attr->name, "job-originating-host-name") ||
         !strcmp(attr->name, "job-originating-user-name") ||
+       !strcmp(attr->name, "job-pages-completed") ||
        !strcmp(attr->name, "job-printer-up-time") ||
        !strcmp(attr->name, "job-printer-uri") ||
        !strcmp(attr->name, "job-sheets") ||
@@ -10153,9 +9995,6 @@ set_job_attrs(cupsd_client_t  *con,      /* I - Client connection */
        !strcmp(attr->name, "number-of-documents") ||
        !strcmp(attr->name, "number-of-intervening-jobs") ||
        !strcmp(attr->name, "output-device-assigned") ||
-       !strncmp(attr->name, "date-time-at-", 13) ||
-       !strncmp(attr->name, "job-k-octets", 12) ||
-       !strncmp(attr->name, "job-media-sheets", 16) ||
        !strncmp(attr->name, "time-at-", 8))
     {
      /*
@@ -10229,9 +10068,7 @@ set_job_attrs(cupsd_client_t  *con,     /* I - Client connection */
              {
                cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-state to %d",
                            attr->values[0].integer);
-                cupsdSetJobState(job, attr->values[0].integer,
-                                CUPSD_JOB_DEFAULT,
-                                "Job state changed by \"%s\"", username);
+                cupsdSetJobState(job, (ipp_jstate_t)attr->values[0].integer, CUPSD_JOB_DEFAULT, "Job state changed by \"%s\"", username);
                check_jobs = 1;
              }
              break;
@@ -10399,7 +10236,7 @@ set_printer_attrs(cupsd_client_t  *con, /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_printer_attrs(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Is the destination valid?
@@ -10437,6 +10274,24 @@ set_printer_attrs(cupsd_client_t  *con,        /* I - Client connection */
     changed = 1;
   }
 
+  if ((attr = ippFindAttribute(con->request, "printer-geo-location", IPP_TAG_URI)) != NULL && !strncmp(attr->values[0].string.text, "geo:", 4))
+  {
+    cupsdSetString(&printer->geo_location, attr->values[0].string.text);
+    changed = 1;
+  }
+
+  if ((attr = ippFindAttribute(con->request, "printer-organization", IPP_TAG_TEXT)) != NULL)
+  {
+    cupsdSetString(&printer->organization, attr->values[0].string.text);
+    changed = 1;
+  }
+
+  if ((attr = ippFindAttribute(con->request, "printer-organizational-unit", IPP_TAG_TEXT)) != NULL)
+  {
+    cupsdSetString(&printer->organizational_unit, attr->values[0].string.text);
+    changed = 1;
+  }
+
   if ((attr = ippFindAttribute(con->request, "printer-info",
                                IPP_TAG_TEXT)) != NULL)
   {
@@ -10450,6 +10305,8 @@ set_printer_attrs(cupsd_client_t  *con, /* I - Client connection */
 
   if (changed)
   {
+    printer->config_time = time(NULL);
+
     cupsdSetPrinterAttrs(printer);
     cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
 
@@ -10477,7 +10334,7 @@ set_printer_defaults(
 {
   int                  i;              /* Looping var */
   ipp_attribute_t      *attr;          /* Current attribute */
-  int                  namelen;        /* Length of attribute name */
+  size_t               namelen;        /* Length of attribute name */
   char                 name[256],      /* New attribute name */
                        value[256];     /* String version of integer attrs */
 
@@ -10652,6 +10509,7 @@ set_printer_defaults(
           break;
 
       case IPP_TAG_NAME :
+      case IPP_TAG_TEXT :
       case IPP_TAG_KEYWORD :
       case IPP_TAG_URI :
           printer->num_options = cupsAddOption(name,
@@ -10729,7 +10587,7 @@ start_printer(cupsd_client_t  *con,     /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_printer(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Is the destination valid?
@@ -10811,7 +10669,7 @@ stop_printer(cupsd_client_t  *con,      /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "stop_printer(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * Is the destination valid?
@@ -10844,7 +10702,7 @@ stop_printer(cupsd_client_t  *con,      /* I - Client connection */
 
   if ((attr = ippFindAttribute(con->request, "printer-state-message",
                                IPP_TAG_TEXT)) == NULL)
-    strcpy(printer->state_message, "Paused");
+    strlcpy(printer->state_message, "Paused", sizeof(printer->state_message));
   else
   {
     strlcpy(printer->state_message, attr->values[0].string.text,
@@ -10875,7 +10733,7 @@ stop_printer(cupsd_client_t  *con,      /* I - Client connection */
 static void
 url_encode_attr(ipp_attribute_t *attr, /* I - Attribute */
                 char            *buffer,/* I - String buffer */
-               int             bufsize)/* I - Size of buffer */
+               size_t          bufsize)/* I - Size of buffer */
 {
   int  i;                              /* Looping var */
   char *bufptr,                        /* Pointer into buffer */
@@ -10901,8 +10759,7 @@ url_encode_attr(ipp_attribute_t *attr,  /* I - Attribute */
 
     *bufptr++ = '\'';
 
-    bufptr = url_encode_string(attr->values[i].string.text,
-                               bufptr, bufend - bufptr + 1);
+    bufptr = url_encode_string(attr->values[i].string.text, bufptr, (size_t)(bufend - bufptr + 1));
 
     if (bufptr >= bufend)
       break;
@@ -10921,7 +10778,7 @@ url_encode_attr(ipp_attribute_t *attr,  /* I - Attribute */
 static char *                          /* O - End of string */
 url_encode_string(const char *s,       /* I - String */
                   char       *buffer,  /* I - String buffer */
-                 int        bufsize)   /* I - Size of buffer */
+                 size_t     bufsize)   /* I - Size of buffer */
 {
   char *bufptr,                        /* Pointer into buffer */
        *bufend;                        /* End of buffer */
@@ -11039,8 +10896,10 @@ validate_job(cupsd_client_t  *con,     /* I - Client connection */
             ipp_attribute_t *uri)      /* I - Printer URI */
 {
   http_status_t                status;         /* Policy status */
-  ipp_attribute_t      *attr,          /* Current attribute */
-                       *auth_info;     /* auth-info attribute */
+  ipp_attribute_t      *attr;          /* Current attribute */
+#ifdef HAVE_SSL
+  ipp_attribute_t      *auth_info;     /* auth-info attribute */
+#endif /* HAVE_SSL */
   ipp_attribute_t      *format,        /* Document-format attribute */
                        *name;          /* Job-name attribute */
   cups_ptype_t         dtype;          /* Destination type (printer/class) */
@@ -11052,7 +10911,7 @@ validate_job(cupsd_client_t  *con,      /* I - Client connection */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_job(%p[%d], %s)", con,
-                  con->http.fd, uri->values[0].string.text);
+                  con->number, uri->values[0].string.text);
 
  /*
   * OK, see if the client is sending the document compressed - CUPS
@@ -11206,7 +11065,9 @@ validate_job(cupsd_client_t  *con,      /* I - Client connection */
   * Check policy...
   */
 
+#ifdef HAVE_SSL
   auth_info = ippFindAttribute(con->request, "auth-info", IPP_TAG_TEXT);
+#endif /* HAVE_SSL */
 
   if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK)
   {
@@ -11221,8 +11082,8 @@ validate_job(cupsd_client_t  *con,      /* I - Client connection */
     return;
   }
 #ifdef HAVE_SSL
-  else if (auth_info && !con->http.tls &&
-           !httpAddrLocalhost(con->http.hostaddr))
+  else if (auth_info && !con->http->tls &&
+           !httpAddrLocalhost(con->http->hostaddr))
   {
    /*
     * Require encryption of auth-info over non-local connections...
@@ -11276,16 +11137,12 @@ validate_user(cupsd_job_t    *job,    /* I - Job */
               cupsd_client_t *con,     /* I - Client connection */
               const char     *owner,   /* I - Owner of job/resource */
               char           *username,        /* O - Authenticated username */
-             int            userlen)   /* I - Length of username */
+             size_t         userlen)   /* I - Length of username */
 {
   cupsd_printer_t      *printer;       /* Printer for job */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "validate_user(job=%d, con=%d, owner=\"%s\", username=%p, "
-                 "userlen=%d)",
-                 job->id, con ? con->http.fd : 0,
-                 owner ? owner : "(null)", username, userlen);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_user(job=%d, con=%d, owner=\"%s\", username=%p, userlen=" CUPS_LLFMT ")", job->id, con ? con->number : 0, owner ? owner : "(null)", username, CUPS_LLCAST userlen);
 
  /*
   * Validate input...
@@ -11312,5 +11169,5 @@ validate_user(cupsd_job_t    *job,      /* I - Job */
 
 
 /*
- * End of "$Id: ipp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ipp.c 12978 2015-11-17 19:29:52Z msweet $".
  */
index d8f56b5..54ee4ed 100644 (file)
@@ -1,71 +1,16 @@
 /*
- * "$Id: job.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: job.c 12856 2015-08-31 14:27:39Z msweet $"
  *
- *   Job management routines for the CUPS scheduler.
+ * Job management routines for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdAddJob()             - Add a new job to the job queue.
- *   cupsdCancelJobs()         - Cancel all jobs for the given
- *                               destination/user.
- *   cupsdCheckJobs()          - Check the pending jobs and start any if the
- *                               destination is available.
- *   cupsdCleanJobs()          - Clean out old jobs.
- *   cupsdContinueJob()        - Continue printing with the next file in a
- *                               job.
- *   cupsdDeleteJob()          - Free all memory used by a job.
- *   cupsdFreeAllJobs()        - Free all jobs from memory.
- *   cupsdFindJob()            - Find the specified job.
- *   cupsdGetPrinterJobCount() - Get the number of pending, processing, or
- *                               held jobs in a printer or class.
- *   cupsdGetUserJobCount()    - Get the number of pending, processing, or
- *                               held jobs for a user.
- *   cupsdLoadAllJobs()        - Load all jobs from disk.
- *   cupsdLoadJob()            - Load a single job.
- *   cupsdMoveJob()            - Move the specified job to a different
- *                               destination.
- *   cupsdReleaseJob()         - Release the specified job.
- *   cupsdRestartJob()         - Restart the specified job.
- *   cupsdSaveAllJobs()        - Save a summary of all jobs to disk.
- *   cupsdSaveJob()            - Save a job to disk.
- *   cupsdSetJobHoldUntil()    - Set the hold time for a job.
- *   cupsdSetJobPriority()     - Set the priority of a job, moving it up/down
- *                               in the list as needed.
- *   cupsdSetJobState()        - Set the state of the specified print job.
- *   cupsdStopAllJobs()        - Stop all print jobs.
- *   cupsdUnloadCompletedJobs() - Flush completed job history from memory.
- *   cupsdUpdateJobs()          - Update the history/file files for all jobs.
- *   compare_active_jobs()     - Compare the job IDs and priorities of two
- *                               jobs.
- *   compare_jobs()            - Compare the job IDs of two jobs.
- *   dump_job_history()        - Dump any debug messages for a job.
- *   free_job_history()        - Free any log history.
- *   finalize_job()            - Cleanup after job filter processes and
- *                               support data.
- *   get_options()             - Get a string containing the job options.
- *   ipp_length()              - Compute the size of the buffer needed to hold
- *                               the textual IPP attributes.
- *   load_job_cache()          - Load jobs from the job.cache file.
- *   load_next_job_id()        - Load the NextJobId value from the job.cache
- *                               file.
- *   load_request_root()       - Load jobs from the RequestRoot directory.
- *   remove_job_files()        - Remove the document files for a job.
- *   remove_job_history()      - Remove the control file for a job.
- *   set_time()                - Set one of the "time-at-xyz" attributes.
- *   start_job()               - Start a print job.
- *   stop_job()                - Stop a print job.
- *   unload_job()              - Unload a job from memory.
- *   update_job()              - Read a status update from a job's filters.
- *   update_job_attrs()        - Update the job-printer-* attributes.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -174,6 +119,7 @@ static mime_filter_t        gziptoany_filter =
  */
 
 static int     compare_active_jobs(void *first, void *second, void *data);
+static int     compare_completed_jobs(void *first, void *second, void *data);
 static int     compare_jobs(void *first, void *second, void *data);
 static void    dump_job_history(cupsd_job_t *job);
 static void    finalize_job(cupsd_job_t *job, int set_job_state);
@@ -267,8 +213,6 @@ cupsdCancelJobs(const char *dest,   /* I - Destination to cancel */
                         "Job canceled by user.");
     }
   }
-
-  cupsdCheckJobs();
 }
 
 
@@ -289,10 +233,7 @@ cupsdCheckJobs(void)
 
   curtime = time(NULL);
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "cupsdCheckJobs: %d active jobs, sleeping=%d, reload=%d, "
-                  "curtime=%ld", cupsArrayCount(ActiveJobs), Sleeping,
-                  NeedReload, (long)curtime);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckJobs: %d active jobs, sleeping=%d, ac-power=%d, reload=%d, curtime=%ld", cupsArrayCount(ActiveJobs), Sleeping, ACPower, NeedReload, (long)curtime);
 
   for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs);
        job;
@@ -312,8 +253,8 @@ cupsdCheckJobs(void)
 
     if (job->kill_time && job->kill_time <= curtime)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR, "[Job %d] Stopping unresponsive job.",
-                     job->id);
+      if (!job->completed)
+        cupsdLogJob(job, CUPSD_LOG_ERROR, "Stopping unresponsive job.");
 
       stop_job(job, CUPSD_JOB_FORCE);
       continue;
@@ -325,8 +266,15 @@ cupsdCheckJobs(void)
 
     if (job->cancel_time && job->cancel_time <= curtime)
     {
-      cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_DEFAULT,
-                       "Canceling stuck job after %d seconds.", MaxJobTime);
+      int cancel_after;                        /* job-cancel-after value */
+
+      attr         = ippFindAttribute(job->attrs, "job-cancel-after", IPP_TAG_INTEGER);
+      cancel_after = attr ? ippGetInteger(attr, 0) : MaxJobTime;
+
+      if (job->completed)
+       cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_FORCE, "Marking stuck job as completed after %d seconds.", cancel_after);
+      else
+       cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_DEFAULT, "Canceling stuck job after %d seconds.", cancel_after);
       continue;
     }
 
@@ -379,10 +327,7 @@ cupsdCheckJobs(void)
     */
 
     if (job->state_value == IPP_JOB_PENDING && !NeedReload &&
-#ifndef kIOPMAssertionTypeDenySystemSleep
-        !Sleeping &&
-#endif /* !kIOPMAssertionTypeDenySystemSleep */
-        !DoingShutdown && !job->printer)
+        (!Sleeping || ACPower) && !DoingShutdown && !job->printer)
     {
       printer = cupsdFindDest(job->dest);
       pclass  = NULL;
@@ -430,7 +375,7 @@ cupsdCheckJobs(void)
 
           if ((attr = ippFindAttribute(job->attrs, "job-actual-printer-uri",
                                       IPP_TAG_URI)) != NULL)
-            cupsdSetString(&attr->values[0].string.text, printer->uri);
+            ippSetString(job->attrs, &attr, 0, printer->uri);
          else
            ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI,
                         "job-actual-printer-uri", NULL, printer->uri);
@@ -445,7 +390,9 @@ cupsdCheckJobs(void)
          * Start the job...
          */
 
+         cupsArraySave(ActiveJobs);
          start_job(job, printer);
+         cupsArrayRestore(ActiveJobs);
        }
       }
     }
@@ -495,6 +442,8 @@ cupsdCleanJobs(void)
         cupsdLogJob(job, CUPSD_LOG_DEBUG, "Removing document files.");
         remove_job_files(job);
 
+        cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+
         if (job->history_time < JobHistoryUpdate || !JobHistoryUpdate)
          JobHistoryUpdate = job->history_time;
       }
@@ -542,6 +491,7 @@ cupsdContinueJob(cupsd_job_t *job)  /* I - Job */
                                        /* Pipes used between filters */
   int                  envc;           /* Number of environment variables */
   struct stat          fileinfo;       /* Job file information */
+  int                  argc = 0;       /* Number of arguments */
   char                 **argv = NULL,  /* Filter command-line arguments */
                        filename[1024], /* Job filename */
                        command[1024],  /* Full path to command */
@@ -598,7 +548,6 @@ cupsdContinueJob(cupsd_job_t *job)  /* I - Job */
 
   memset(job->filters, 0, sizeof(job->filters));
 
-
   if (job->printer->raw)
   {
    /*
@@ -614,14 +563,37 @@ cupsdContinueJob(cupsd_job_t *job)        /* I - Job */
     * Local jobs get filtered...
     */
 
+    mime_type_t        *dst = job->printer->filetype;
+                                       /* Destination file type */
+
     snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
              job->id, job->current_file + 1);
     if (stat(filename, &fileinfo))
       fileinfo.st_size = 0;
 
-    filters = mimeFilter2(MimeDatabase, job->filetypes[job->current_file],
-                          fileinfo.st_size, job->printer->filetype,
-                          &(job->cost));
+    if (job->retry_as_raster)
+    {
+     /*
+      * Need to figure out whether the printer supports image/pwg-raster or
+      * image/urf, and use the corresponding type...
+      */
+
+      char     type[MIME_MAX_TYPE];    /* MIME media type for printer */
+
+      snprintf(type, sizeof(type), "%s/image/urf", job->printer->name);
+      if ((dst = mimeType(MimeDatabase, "printer", type)) == NULL)
+      {
+       snprintf(type, sizeof(type), "%s/image/pwg-raster", job->printer->name);
+       dst = mimeType(MimeDatabase, "printer", type);
+      }
+
+      if (dst)
+        cupsdLogJob(job, CUPSD_LOG_DEBUG, "Retrying job as \"%s\".", strchr(dst->type, '/') + 1);
+      else
+        cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to retry job using a supported raster format.");
+    }
+
+    filters = mimeFilter2(MimeDatabase, job->filetypes[job->current_file], (size_t)fileinfo.st_size, dst, &(job->cost));
 
     if (!filters)
     {
@@ -672,6 +644,9 @@ cupsdContinueJob(cupsd_job_t *job)  /* I - Job */
                   "FINAL_CONTENT_TYPE=%s/%s", filter->dst->super,
                   filter->dst->type);
       }
+      else
+        snprintf(final_content_type, sizeof(final_content_type),
+                 "FINAL_CONTENT_TYPE=printer/%s", job->printer->name);
     }
 
    /*
@@ -757,9 +732,8 @@ cupsdContinueJob(cupsd_job_t *job)  /* I - Job */
   * Add decompression/raw filter as needed...
   */
 
-  if ((!job->printer->raw && job->compressions[job->current_file]) ||
-      (!filters && !job->printer->remote &&
-       (job->num_files > 1 || !strncmp(job->printer->device_uri, "file:", 5))))
+  if (job->compressions[job->current_file] &&
+      (!job->printer->remote || job->num_files == 1))
   {
    /*
     * Add gziptoany filter to the front of the list...
@@ -891,11 +865,11 @@ cupsdContinueJob(cupsd_job_t *job)        /* I - Job */
   */
 
   if (job->printer->remote)
-    argv = calloc(7 + job->num_files, sizeof(char *));
+    argc = 6 + job->num_files;
   else
-    argv = calloc(8, sizeof(char *));
+    argc = 7;
 
-  if (!argv)
+  if ((argv = calloc((size_t)argc + 1, sizeof(char *))) == NULL)
   {
     cupsdLogMessage(CUPSD_LOG_DEBUG, "Unable to allocate argument array - %s",
                     strerror(errno));
@@ -927,7 +901,7 @@ cupsdContinueJob(cupsd_job_t *job)  /* I - Job */
   {
     snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
              job->id, job->current_file + 1);
-    argv[6] = filename;
+    argv[6] = strdup(filename);
   }
 
   for (i = 0; argv[i]; i ++)
@@ -941,7 +915,7 @@ cupsdContinueJob(cupsd_job_t *job)  /* I - Job */
                           IPP_TAG_LANGUAGE);
 
 #ifdef __APPLE__
-  strcpy(apple_language, "APPLE_LANGUAGE=");
+  strlcpy(apple_language, "APPLE_LANGUAGE=", sizeof(apple_language));
   _cupsAppleLanguage(attr->values[0].string.text,
                     apple_language + 15, sizeof(apple_language) - 15);
 #endif /* __APPLE__ */
@@ -954,7 +928,7 @@ cupsdContinueJob(cupsd_job_t *job)  /* I - Job */
        * the POSIX locale...
        */
 
-       strcpy(lang, "LANG=C");
+       strlcpy(lang, "LANG=C", sizeof(lang));
        break;
 
     case 2 :
@@ -1012,14 +986,14 @@ cupsdContinueJob(cupsd_job_t *job)       /* I - Job */
       * All of these strcpy's are safe because we allocated the psr string...
       */
 
-      strcpy(printer_state_reasons, "PRINTER_STATE_REASONS=");
+      strlcpy(printer_state_reasons, "PRINTER_STATE_REASONS=", psrlen);
       for (psrptr = printer_state_reasons + 22, i = 0;
            i < job->printer->num_reasons;
           i ++)
       {
         if (i)
          *psrptr++ = ',';
-       strcpy(psrptr, job->printer->reasons[i]);
+       strlcpy(psrptr, job->printer->reasons[i], psrlen - (size_t)(psrptr - printer_state_reasons));
        psrptr += strlen(psrptr);
       }
     }
@@ -1131,9 +1105,6 @@ cupsdContinueJob(cupsd_job_t *job)        /* I - Job */
   * Now create processes for all of the filters...
   */
 
-  cupsdSetPrinterReasons(job->printer, "-cups-missing-filter-warning,"
-                                      "cups-insecure-filter-warning");
-
   for (i = 0, slot = 0, filter = (mime_filter_t *)cupsArrayFirst(filters);
        filter;
        i ++, filter = (mime_filter_t *)cupsArrayNext(filters))
@@ -1229,8 +1200,13 @@ cupsdContinueJob(cupsd_job_t *job)       /* I - Job */
     cupsdLogJob(job, CUPSD_LOG_INFO, "Started filter %s (PID %d)", command,
                 pid);
 
-    argv[6] = NULL;
-    slot    = !slot;
+    if (argv[6])
+    {
+      free(argv[6]);
+      argv[6] = NULL;
+    }
+
+    slot = !slot;
   }
 
   cupsArrayDelete(filters);
@@ -1257,7 +1233,7 @@ cupsdContinueJob(cupsd_job_t *job)        /* I - Job */
       else if (stat(command, &backinfo))
        backroot = 0;
       else
-        backroot = !(backinfo.st_mode & (S_IRWXG | S_IRWXO));
+        backroot = !(backinfo.st_mode & (S_IWGRP | S_IRWXO));
 
       argv[0] = job->printer->sanitized_device_uri;
 
@@ -1267,7 +1243,7 @@ cupsdContinueJob(cupsd_job_t *job)        /* I - Job */
       pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
                              filterfds[slot][1], job->status_pipes[1],
                              job->back_pipes[1], job->side_pipes[1],
-                             backroot, job->profile, job, &(job->backend));
+                             backroot, job->bprofile, job, &(job->backend));
 
       if (pid == 0)
       {
@@ -1314,13 +1290,12 @@ cupsdContinueJob(cupsd_job_t *job)      /* I - Job */
 
   cupsdClosePipe(filterfds[slot]);
 
-  if (job->printer->remote && job->num_files > 1)
-  {
-    for (i = 0; i < job->num_files; i ++)
-      free(argv[i + 6]);
-  }
+  for (i = 6; i < argc; i ++)
+    if (argv[i])
+      free(argv[i]);
 
   free(argv);
+
   if (printer_state_reasons)
     free(printer_state_reasons);
 
@@ -1350,13 +1325,9 @@ cupsdContinueJob(cupsd_job_t *job)       /* I - Job */
 
   if (argv)
   {
-    if (job->printer->remote && job->num_files > 1)
-    {
-      for (i = 0; i < job->num_files; i ++)
-       free(argv[i + 6]);
-    }
-
-    free(argv);
+    for (i = 6; i < argc; i ++)
+      if (argv[i])
+       free(argv[i]);
   }
 
   if (printer_state_reasons)
@@ -1485,6 +1456,30 @@ cupsdFindJob(int id)                     /* I - Job ID */
 
 
 /*
+ * 'cupsdGetCompletedJobs()'- Generate a completed jobs list.
+ */
+
+cups_array_t *                         /* O - Array of jobs */
+cupsdGetCompletedJobs(
+    cupsd_printer_t *p)                        /* I - Printer */
+{
+  cups_array_t *list;                  /* Array of jobs */
+  cupsd_job_t  *job;                   /* Current job */
+
+
+  list = cupsArrayNew(compare_completed_jobs, NULL);
+
+  for (job = (cupsd_job_t *)cupsArrayFirst(Jobs);
+       job;
+       job = (cupsd_job_t *)cupsArrayNext(Jobs))
+    if ((!p || !_cups_strcasecmp(p->name, job->dest)) && job->state_value >= IPP_JOB_STOPPED && job->completed_time)
+      cupsArrayAdd(list, job);
+
+  return (list);
+}
+
+
+/*
  * 'cupsdGetPrinterJobCount()' - Get the number of pending, processing,
  *                               or held jobs in a printer or class.
  */
@@ -1538,9 +1533,10 @@ void
 cupsdLoadAllJobs(void)
 {
   char         filename[1024];         /* Full filename of job.cache file */
-  struct stat  fileinfo,               /* Information on job.cache file */
-               dirinfo;                /* Information on RequestRoot dir */
-
+  struct stat  fileinfo;               /* Information on job.cache file */
+  cups_dir_t   *dir;                   /* RequestRoot dir */
+  cups_dentry_t        *dent;                  /* Entry in RequestRoot */
+  int          load_cache = 1;         /* Load the job.cache file? */
 
 
  /*
@@ -1564,36 +1560,65 @@ cupsdLoadAllJobs(void)
 
   if (stat(filename, &fileinfo))
   {
-    fileinfo.st_mtime = 0;
+   /*
+    * No job.cache file...
+    */
+
+    load_cache = 0;
 
     if (errno != ENOENT)
       cupsdLogMessage(CUPSD_LOG_ERROR,
                       "Unable to get file information for \"%s\" - %s",
                      filename, strerror(errno));
   }
+  else if ((dir = cupsDirOpen(RequestRoot)) == NULL)
+  {
+   /*
+    * No spool directory...
+    */
 
-  if (stat(RequestRoot, &dirinfo))
+    load_cache = 0;
+  }
+  else
   {
-    dirinfo.st_mtime = 0;
+    while ((dent = cupsDirRead(dir)) != NULL)
+    {
+      if (strlen(dent->filename) >= 6 && dent->filename[0] == 'c' && dent->fileinfo.st_mtime > fileinfo.st_mtime)
+      {
+       /*
+        * Job history file is newer than job.cache file...
+       */
 
-    if (errno != ENOENT)
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "Unable to get directory information for \"%s\" - %s",
-                     RequestRoot, strerror(errno));
+        load_cache = 0;
+       break;
+      }
+    }
+
+    cupsDirClose(dir);
   }
 
  /*
   * Load the most recent source for job data...
   */
 
-  if (dirinfo.st_mtime > fileinfo.st_mtime)
+  if (load_cache)
   {
+   /*
+    * Load the job.cache file...
+    */
+
+    load_job_cache(filename);
+  }
+  else
+  {
+   /*
+    * Load the job history files...
+    */
+
     load_request_root();
 
     load_next_job_id(filename);
   }
-  else
-    load_job_cache(filename);
 
  /*
   * Clean out old jobs as needed...
@@ -1640,7 +1665,7 @@ cupsdLoadJob(cupsd_job_t *job)            /* I - Job */
   * Load job attributes...
   */
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading attributes...", job->id);
+  cupsdLogJob(job, CUPSD_LOG_DEBUG, "Loading attributes...");
 
   snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, job->id);
   if ((fp = cupsdOpenConfFile(jobfile)) == NULL)
@@ -1648,9 +1673,8 @@ cupsdLoadJob(cupsd_job_t *job)            /* I - Job */
 
   if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, job->attrs) != IPP_DATA)
   {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                   "[Job %d] Unable to read job control file \"%s\".", job->id,
-                   jobfile);
+    cupsdLogJob(job, CUPSD_LOG_ERROR,
+               "Unable to read job control file \"%s\".", jobfile);
     cupsFileClose(fp);
     goto error;
   }
@@ -1663,18 +1687,16 @@ cupsdLoadJob(cupsd_job_t *job)          /* I - Job */
 
   if (!ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER))
   {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                   "[Job %d] Missing or bad time-at-creation attribute in "
-                   "control file.", job->id);
+    cupsdLogJob(job, CUPSD_LOG_ERROR,
+               "Missing or bad time-at-creation attribute in control file.");
     goto error;
   }
 
   if ((job->state = ippFindAttribute(job->attrs, "job-state",
                                      IPP_TAG_ENUM)) == NULL)
   {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                   "[Job %d] Missing or bad job-state attribute in control "
-                   "file.", job->id);
+    cupsdLogJob(job, CUPSD_LOG_ERROR,
+               "Missing or bad job-state attribute in control file.");
     goto error;
   }
 
@@ -1682,10 +1704,13 @@ cupsdLoadJob(cupsd_job_t *job)          /* I - Job */
   job->file_time    = 0;
   job->history_time = 0;
 
-  if (job->state_value >= IPP_JOB_CANCELED &&
-      (attr = ippFindAttribute(job->attrs, "time-at-completed",
-                              IPP_TAG_INTEGER)) != NULL)
+  if ((attr = ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER)) != NULL)
+    job->creation_time = attr->values[0].integer;
+
+  if (job->state_value >= IPP_JOB_CANCELED && (attr = ippFindAttribute(job->attrs, "time-at-completed", IPP_TAG_INTEGER)) != NULL)
   {
+    job->completed_time = attr->values[0].integer;
+
     if (JobHistory < INT_MAX)
       job->history_time = attr->values[0].integer + JobHistory;
     else
@@ -1714,18 +1739,17 @@ cupsdLoadJob(cupsd_job_t *job)          /* I - Job */
     if ((attr = ippFindAttribute(job->attrs, "job-printer-uri",
                                  IPP_TAG_URI)) == NULL)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "[Job %d] No job-printer-uri attribute in control file.",
-                     job->id);
+      cupsdLogJob(job, CUPSD_LOG_ERROR,
+                 "No job-printer-uri attribute in control file.");
       goto error;
     }
 
     if ((dest = cupsdValidateDest(attr->values[0].string.text, &(job->dtype),
                                   &destptr)) == NULL)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "[Job %d] Unable to queue job for destination \"%s\".",
-                     job->id, attr->values[0].string.text);
+      cupsdLogJob(job, CUPSD_LOG_ERROR,
+                 "Unable to queue job for destination \"%s\".",
+                 attr->values[0].string.text);
       goto error;
     }
 
@@ -1733,9 +1757,9 @@ cupsdLoadJob(cupsd_job_t *job)            /* I - Job */
   }
   else if ((destptr = cupsdFindDest(job->dest)) == NULL)
   {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                   "[Job %d] Unable to queue job for destination \"%s\".",
-                   job->id, job->dest);
+    cupsdLogJob(job, CUPSD_LOG_ERROR,
+               "Unable to queue job for destination \"%s\".",
+               job->dest);
     goto error;
   }
 
@@ -1744,9 +1768,8 @@ cupsdLoadJob(cupsd_job_t *job)            /* I - Job */
   {
     const char *reason;                /* job-state-reason keyword */
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                   "[Job %d] Adding missing job-state-reasons attribute to "
-                   " control file.", job->id);
+    cupsdLogJob(job, CUPSD_LOG_DEBUG,
+               "Adding missing job-state-reasons attribute to  control file.");
 
     switch (job->state_value)
     {
@@ -1802,18 +1825,20 @@ cupsdLoadJob(cupsd_job_t *job)          /* I - Job */
       ippSetString(job->attrs, &job->reasons, 0, "none");
   }
 
-  job->sheets     = ippFindAttribute(job->attrs, "job-media-sheets-completed",
-                                     IPP_TAG_INTEGER);
-  job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME);
+  job->impressions = ippFindAttribute(job->attrs, "job-impressions-completed", IPP_TAG_INTEGER);
+  job->sheets      = ippFindAttribute(job->attrs, "job-media-sheets-completed", IPP_TAG_INTEGER);
+  job->job_sheets  = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME);
+
+  if (!job->impressions)
+    job->impressions = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions-completed", 0);
 
   if (!job->priority)
   {
     if ((attr = ippFindAttribute(job->attrs, "job-priority",
                                 IPP_TAG_INTEGER)) == NULL)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "[Job %d] Missing or bad job-priority attribute in "
-                     "control file.", job->id);
+      cupsdLogJob(job, CUPSD_LOG_ERROR,
+                 "Missing or bad job-priority attribute in control file.");
       goto error;
     }
 
@@ -1825,15 +1850,21 @@ cupsdLoadJob(cupsd_job_t *job)          /* I - Job */
     if ((attr = ippFindAttribute(job->attrs, "job-originating-user-name",
                                 IPP_TAG_NAME)) == NULL)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "[Job %d] Missing or bad job-originating-user-name "
-                     "attribute in control file.", job->id);
+      cupsdLogJob(job, CUPSD_LOG_ERROR,
+                 "Missing or bad job-originating-user-name "
+                 "attribute in control file.");
       goto error;
     }
 
     cupsdSetString(&job->username, attr->values[0].string.text);
   }
 
+  if (!job->name)
+  {
+    if ((attr = ippFindAttribute(job->attrs, "job-name", IPP_TAG_NAME)) != NULL)
+      cupsdSetString(&job->name, attr->values[0].string.text);
+  }
+
  /*
   * Set the job hold-until time and state...
   */
@@ -1858,6 +1889,9 @@ cupsdLoadJob(cupsd_job_t *job)            /* I - Job */
     job->state_value              = IPP_JOB_PENDING;
   }
 
+  if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL)
+    job->koctets = attr->values[0].integer;
+
   if (!job->num_files)
   {
    /*
@@ -1872,41 +1906,36 @@ cupsdLoadJob(cupsd_job_t *job)          /* I - Job */
       if (access(jobfile, 0))
         break;
 
-      cupsdLogMessage(CUPSD_LOG_DEBUG,
-                     "[Job %d] Auto-typing document file \"%s\"...", job->id,
-                     jobfile);
+      cupsdLogJob(job, CUPSD_LOG_DEBUG,
+                 "Auto-typing document file \"%s\"...", jobfile);
 
       if (fileid > job->num_files)
       {
         if (job->num_files == 0)
        {
-         compressions = (int *)calloc(fileid, sizeof(int));
-         filetypes    = (mime_type_t **)calloc(fileid, sizeof(mime_type_t *));
+         compressions = (int *)calloc((size_t)fileid, sizeof(int));
+         filetypes    = (mime_type_t **)calloc((size_t)fileid, sizeof(mime_type_t *));
        }
        else
        {
-         compressions = (int *)realloc(job->compressions,
-                                       sizeof(int) * fileid);
-         filetypes    = (mime_type_t **)realloc(job->filetypes,
-                                                sizeof(mime_type_t *) *
-                                                fileid);
+         compressions = (int *)realloc(job->compressions, sizeof(int) * (size_t)fileid);
+         filetypes    = (mime_type_t **)realloc(job->filetypes, sizeof(mime_type_t *) * (size_t)fileid);
         }
 
+       if (compressions)
+         job->compressions = compressions;
+
+       if (filetypes)
+         job->filetypes = filetypes;
+
         if (!compressions || !filetypes)
        {
-          cupsdLogMessage(CUPSD_LOG_ERROR,
-                         "[Job %d] Ran out of memory for job file types.",
-                         job->id);
+          cupsdLogJob(job, CUPSD_LOG_ERROR,
+                     "Ran out of memory for job file types.");
 
          ippDelete(job->attrs);
          job->attrs = NULL;
 
-         if (compressions)
-           free(compressions);
-
-         if (filetypes)
-           free(filetypes);
-
          if (job->compressions)
          {
            free(job->compressions);
@@ -1923,9 +1952,7 @@ cupsdLoadJob(cupsd_job_t *job)            /* I - Job */
          return (0);
        }
 
-        job->compressions = compressions;
-        job->filetypes    = filetypes;
-       job->num_files    = fileid;
+       job->num_files = fileid;
       }
 
       job->filetypes[fileid - 1] = mimeFileType(MimeDatabase, jobfile, NULL,
@@ -2074,7 +2101,7 @@ cupsdMoveJob(cupsd_job_t     *job,        /* I - Job */
 
   if ((attr = ippFindAttribute(job->attrs, "job-printer-uri",
                                IPP_TAG_URI)) != NULL)
-    cupsdSetString(&(attr->values[0].string.text), p->uri);
+    ippSetString(job->attrs, &attr, 0, p->uri);
 
   cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, p, job,
                 "Job #%d moved from %s to %s.", job->id, olddest,
@@ -2170,11 +2197,18 @@ cupsdSaveAllJobs(void)
   {
     cupsFilePrintf(fp, "<Job %d>\n", job->id);
     cupsFilePrintf(fp, "State %d\n", job->state_value);
+    cupsFilePrintf(fp, "Created %ld\n", (long)job->creation_time);
+    if (job->completed_time)
+      cupsFilePrintf(fp, "Completed %ld\n", (long)job->completed_time);
     cupsFilePrintf(fp, "Priority %d\n", job->priority);
-    cupsFilePrintf(fp, "HoldUntil %d\n", (int)job->hold_until);
+    if (job->hold_until)
+      cupsFilePrintf(fp, "HoldUntil %ld\n", (long)job->hold_until);
     cupsFilePrintf(fp, "Username %s\n", job->username);
+    if (job->name)
+      cupsFilePutConf(fp, "Name", job->name);
     cupsFilePrintf(fp, "Destination %s\n", job->dest);
     cupsFilePrintf(fp, "DestType %d\n", job->dtype);
+    cupsFilePrintf(fp, "KOctets %d\n", job->koctets);
     cupsFilePrintf(fp, "NumFiles %d\n", job->num_files);
     for (i = 0; i < job->num_files; i ++)
       cupsFilePrintf(fp, "File %d %s/%s %d\n", i + 1, job->filetypes[i]->super,
@@ -2212,8 +2246,7 @@ cupsdSaveJob(cupsd_job_t *job)            /* I - Job */
   if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL,
                  job->attrs) != IPP_DATA)
   {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "[Job %d] Unable to write job control file.", job->id);
+    cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to write job control file.");
     cupsFileClose(fp);
     return;
   }
@@ -2265,7 +2298,7 @@ cupsdSetJobHoldUntil(cupsd_job_t *job,    /* I - Job */
       attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
 
     if (attr)
-      cupsdSetString(&(attr->values[0].string.text), when);
+      ippSetString(job->attrs, &attr, 0, when);
     else
       attr = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD,
                           "job-hold-until", NULL, when);
@@ -2281,9 +2314,10 @@ cupsdSetJobHoldUntil(cupsd_job_t *job,   /* I - Job */
       cupsdMarkDirty(CUPSD_DIRTY_JOBS);
     }
 
-    ippSetString(job->attrs, &job->reasons, 0, "job-hold-until-specified");
   }
 
+  ippSetString(job->attrs, &job->reasons, 0, "job-hold-until-specified");
+
  /*
   * Update the hold time...
   */
@@ -2519,8 +2553,8 @@ cupsdSetJobState(
 
        if (attr)
        {
-         attr->value_tag = IPP_TAG_KEYWORD;
-         cupsdSetString(&(attr->values[0].string.text), "no-hold");
+         ippSetValueTag(job->attrs, &attr, IPP_TAG_KEYWORD);
+         ippSetString(job->attrs, &attr, 0, "no-hold");
        }
 
     default :
@@ -2715,10 +2749,17 @@ cupsdStopAllJobs(
        job;
        job = (cupsd_job_t *)cupsArrayNext(PrintingJobs))
   {
-    if (kill_delay)
-      job->kill_time = time(NULL) + kill_delay;
+    if (job->completed)
+    {
+      cupsdSetJobState(job, IPP_JOB_COMPLETED, CUPSD_JOB_FORCE, NULL);
+    }
+    else
+    {
+      if (kill_delay)
+        job->kill_time = time(NULL) + kill_delay;
 
-    cupsdSetJobState(job, IPP_JOB_PENDING, action, NULL);
+      cupsdSetJobState(job, IPP_JOB_PENDING, action, NULL);
+    }
   }
 }
 
@@ -2829,6 +2870,28 @@ compare_active_jobs(void *first, /* I - First job */
 
 
 /*
+ * 'compare_completed_jobs()' - Compare the job IDs and completion times of two jobs.
+ */
+
+static int                             /* O - Difference */
+compare_completed_jobs(void *first,    /* I - First job */
+                       void *second,   /* I - Second job */
+                      void *data)      /* I - App data (not used) */
+{
+  int  diff;                           /* Difference */
+
+
+  (void)data;
+
+  if ((diff = ((cupsd_job_t *)second)->completed_time -
+              ((cupsd_job_t *)first)->completed_time) != 0)
+    return (diff);
+  else
+    return (((cupsd_job_t *)first)->id - ((cupsd_job_t *)second)->id);
+}
+
+
+/*
  * 'compare_jobs()' - Compare the job IDs of two jobs.
  */
 
@@ -2923,7 +2986,7 @@ dump_job_history(cupsd_job_t *job)        /* I - Job */
     snprintf(temp, sizeof(temp), "[Job %d] printer-state-reasons=", job->id);
     ptr = temp + strlen(temp);
     if (printer->num_reasons == 0)
-      strlcpy(ptr, "none", sizeof(temp) - (ptr - temp));
+      strlcpy(ptr, "none", sizeof(temp) - (size_t)(ptr - temp));
     else
     {
       for (i = 0;
@@ -2933,7 +2996,7 @@ dump_job_history(cupsd_job_t *job)        /* I - Job */
         if (i)
          *ptr++ = ',';
 
-       strlcpy(ptr, printer->reasons[i], sizeof(temp) - (ptr - temp));
+       strlcpy(ptr, printer->reasons[i], sizeof(temp) - (size_t)(ptr - temp));
        ptr += strlen(ptr);
       }
     }
@@ -2994,11 +3057,13 @@ finalize_job(cupsd_job_t *job,          /* I - Job */
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "finalize_job(job=%p(%d))", job, job->id);
 
  /*
-  * Clear the "connecting-to-device" reason, which is only valid when a printer
-  * is processing, along with any remote printing job state...
+  * Clear the "connecting-to-device" and "cups-waiting-for-job-completed"
+  * reasons, which are only valid when a printer is processing, along with any
+  * remote printing job state...
   */
 
   cupsdSetPrinterReasons(job->printer, "-connecting-to-device,"
+                                       "cups-waiting-for-job-completed,"
                                       "cups-remote-pending,"
                                       "cups-remote-pending-held,"
                                       "cups-remote-processing,"
@@ -3022,6 +3087,8 @@ finalize_job(cupsd_job_t *job,            /* I - Job */
 
   cupsdDestroyProfile(job->profile);
   job->profile = NULL;
+  cupsdDestroyProfile(job->bprofile);
+  job->bprofile = NULL;
 
  /*
   * Clear the unresponsive job watchdog timers...
@@ -3068,8 +3135,9 @@ finalize_job(cupsd_job_t *job,            /* I - Job */
        job_state = IPP_JOB_COMPLETED;
        message   = "Job completed.";
 
-       ippSetString(job->attrs, &job->reasons, 0,
-                    "job-completed-successfully");
+        if (!job->status)
+         ippSetString(job->attrs, &job->reasons, 0,
+                      "job-completed-successfully");
         break;
 
     case IPP_JOB_STOPPED :
@@ -3255,13 +3323,48 @@ finalize_job(cupsd_job_t *job,          /* I - Job */
            * Hold the job...
            */
 
-           cupsdSetJobHoldUntil(job, "indefinite", 1);
-           ippSetString(job->attrs, &job->reasons, 0,
-                        "job-hold-until-specified");
+           const char *reason = ippGetString(job->reasons, 0, NULL);
 
-           job_state = IPP_JOB_HELD;
-           message   = "Job held indefinitely due to backend errors; please "
+           cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-state-reasons=\"%s\"",
+                       reason);
+
+           if (!reason || strncmp(reason, "account-", 8))
+           {
+             cupsdSetJobHoldUntil(job, "indefinite", 1);
+
+             ippSetString(job->attrs, &job->reasons, 0,
+                          "job-hold-until-specified");
+             message = "Job held indefinitely due to backend errors; please "
                        "consult the error_log file for details.";
+            }
+            else if (!strcmp(reason, "account-info-needed"))
+            {
+             cupsdSetJobHoldUntil(job, "indefinite", 0);
+
+             message = "Job held indefinitely - account information is "
+                       "required.";
+            }
+            else if (!strcmp(reason, "account-closed"))
+            {
+             cupsdSetJobHoldUntil(job, "indefinite", 0);
+
+             message = "Job held indefinitely - account has been closed.";
+           }
+            else if (!strcmp(reason, "account-limit-reached"))
+            {
+             cupsdSetJobHoldUntil(job, "indefinite", 0);
+
+             message = "Job held indefinitely - account limit has been "
+                       "reached.";
+           }
+            else
+            {
+             cupsdSetJobHoldUntil(job, "indefinite", 0);
+
+             message = "Job held indefinitely - account authorization failed.";
+           }
+
+           job_state = IPP_JOB_HELD;
           }
           break;
 
@@ -3295,8 +3398,9 @@ finalize_job(cupsd_job_t *job,            /* I - Job */
            job_state = IPP_JOB_HELD;
            message   = "Job held for authentication.";
 
-           ippSetString(job->attrs, &job->reasons, 0,
-                        "cups-held-for-authentication");
+            if (strncmp(job->reasons->values[0].string.text, "account-", 8))
+             ippSetString(job->attrs, &job->reasons, 0,
+                          "cups-held-for-authentication");
           }
           break;
 
@@ -3422,13 +3526,6 @@ finalize_job(cupsd_job_t *job,           /* I - Job */
 
   job->printer->job = NULL;
   job->printer      = NULL;
-
- /*
-  * Try printing another job...
-  */
-
-  if (printer_state != IPP_PRINTER_STOPPED)
-    cupsdCheckJobs();
 }
 
 
@@ -3480,19 +3577,16 @@ get_options(cupsd_job_t *job,           /* I - Job */
                         "com.apple.print.DocumentTicket.PMSpoolFormat",
                        IPP_TAG_ZERO) &&
       !ippFindAttribute(job->attrs, "APPrinterPreset", IPP_TAG_ZERO) &&
-      (ippFindAttribute(job->attrs, "output-mode", IPP_TAG_ZERO) ||
-       ippFindAttribute(job->attrs, "print-color-mode", IPP_TAG_ZERO) ||
+      (ippFindAttribute(job->attrs, "print-color-mode", IPP_TAG_ZERO) ||
        ippFindAttribute(job->attrs, "print-quality", IPP_TAG_ZERO)))
   {
    /*
-    * Map output-mode and print-quality to a preset...
+    * Map print-color-mode and print-quality to a preset...
     */
 
     if ((attr = ippFindAttribute(job->attrs, "print-color-mode",
-                                IPP_TAG_KEYWORD)) == NULL)
-      attr = ippFindAttribute(job->attrs, "output-mode", IPP_TAG_KEYWORD);
-
-    if (attr && !strcmp(attr->values[0].string.text, "monochrome"))
+                                IPP_TAG_KEYWORD)) != NULL &&
+        !strcmp(attr->values[0].string.text, "monochrome"))
       print_color_mode = _PWG_PRINT_COLOR_MODE_MONOCHROME;
     else
       print_color_mode = _PWG_PRINT_COLOR_MODE_COLOR;
@@ -3679,7 +3773,8 @@ get_options(cupsd_job_t *job,             /* I - Job */
           attr->value_tag == IPP_TAG_MIMETYPE ||
          attr->value_tag == IPP_TAG_NAMELANG ||
          attr->value_tag == IPP_TAG_TEXTLANG ||
-         (attr->value_tag == IPP_TAG_URI && strcmp(attr->name, "job-uuid")) ||
+         (attr->value_tag == IPP_TAG_URI && strcmp(attr->name, "job-uuid") &&
+          strcmp(attr->name, "job-authorization-uri")) ||
          attr->value_tag == IPP_TAG_URISCHEME ||
          attr->value_tag == IPP_TAG_BEGIN_COLLECTION) /* Not yet supported */
        continue;
@@ -3694,9 +3789,14 @@ get_options(cupsd_job_t *job,            /* I - Job */
        continue;
 
       if (!strncmp(attr->name, "job-", 4) &&
+          strcmp(attr->name, "job-account-id") &&
+          strcmp(attr->name, "job-accounting-user-id") &&
+          strcmp(attr->name, "job-authorization-uri") &&
           strcmp(attr->name, "job-billing") &&
           strcmp(attr->name, "job-impressions") &&
           strcmp(attr->name, "job-originating-host-name") &&
+          strcmp(attr->name, "job-password") &&
+          strcmp(attr->name, "job-password-encryption") &&
           strcmp(attr->name, "job-uuid") &&
           !(job->printer->type & CUPS_PRINTER_REMOTE))
        continue;
@@ -3721,18 +3821,18 @@ get_options(cupsd_job_t *job,           /* I - Job */
       */
 
       if (optptr > options)
-       strlcat(optptr, " ", optlength - (optptr - options));
+       strlcat(optptr, " ", optlength - (size_t)(optptr - options));
 
       if (attr->value_tag != IPP_TAG_BOOLEAN)
       {
-       strlcat(optptr, attr->name, optlength - (optptr - options));
-       strlcat(optptr, "=", optlength - (optptr - options));
+       strlcat(optptr, attr->name, optlength - (size_t)(optptr - options));
+       strlcat(optptr, "=", optlength - (size_t)(optptr - options));
       }
 
       for (i = 0; i < attr->num_values; i ++)
       {
        if (i)
-         strlcat(optptr, ",", optlength - (optptr - options));
+         strlcat(optptr, ",", optlength - (size_t)(optptr - options));
 
        optptr += strlen(optptr);
 
@@ -3740,30 +3840,29 @@ get_options(cupsd_job_t *job,           /* I - Job */
        {
          case IPP_TAG_INTEGER :
          case IPP_TAG_ENUM :
-             snprintf(optptr, optlength - (optptr - options),
+             snprintf(optptr, optlength - (size_t)(optptr - options),
                       "%d", attr->values[i].integer);
              break;
 
          case IPP_TAG_BOOLEAN :
              if (!attr->values[i].boolean)
-               strlcat(optptr, "no", optlength - (optptr - options));
+               strlcat(optptr, "no", optlength - (size_t)(optptr - options));
 
-             strlcat(optptr, attr->name,
-                     optlength - (optptr - options));
+             strlcat(optptr, attr->name, optlength - (size_t)(optptr - options));
              break;
 
          case IPP_TAG_RANGE :
              if (attr->values[i].range.lower == attr->values[i].range.upper)
-               snprintf(optptr, optlength - (optptr - options) - 1,
+               snprintf(optptr, optlength - (size_t)(optptr - options) - 1,
                         "%d", attr->values[i].range.lower);
               else
-               snprintf(optptr, optlength - (optptr - options) - 1,
+               snprintf(optptr, optlength - (size_t)(optptr - options) - 1,
                         "%d-%d", attr->values[i].range.lower,
                         attr->values[i].range.upper);
              break;
 
          case IPP_TAG_RESOLUTION :
-             snprintf(optptr, optlength - (optptr - options) - 1,
+             snprintf(optptr, optlength - (size_t)(optptr - options) - 1,
                       "%dx%d%s", attr->values[i].resolution.xres,
                       attr->values[i].resolution.yres,
                       attr->values[i].resolution.units == IPP_RES_PER_INCH ?
@@ -3803,10 +3902,10 @@ get_options(cupsd_job_t *job,           /* I - Job */
   for (i = num_pwgppds, pwgppd = pwgppds; i > 0; i --, pwgppd ++)
   {
     *optptr++ = ' ';
-    strcpy(optptr, pwgppd->name);
+    strlcpy(optptr, pwgppd->name, optlength - (size_t)(optptr - options));
     optptr += strlen(optptr);
     *optptr++ = '=';
-    strcpy(optptr, pwgppd->value);
+    strlcpy(optptr, pwgppd->value, optlength - (size_t)(optptr - options));
     optptr += strlen(optptr);
   }
 
@@ -3860,7 +3959,7 @@ ipp_length(ipp_t *ipp)                    /* I - IPP request */
     */
 
     bytes ++;                          /* " " separator */
-    bytes += attr->num_values;         /* "," separators */
+    bytes += (size_t)attr->num_values; /* "," separators */
 
    /*
     * Boolean attributes appear as "foo,nofoo,foo,nofoo", while
@@ -3870,7 +3969,7 @@ ipp_length(ipp_t *ipp)                    /* I - IPP request */
     if (attr->value_tag != IPP_TAG_BOOLEAN)
       bytes += strlen(attr->name);
     else
-      bytes += attr->num_values * strlen(attr->name);
+      bytes += (size_t)attr->num_values * strlen(attr->name);
 
    /*
     * Now add the size required for each value in the attribute...
@@ -3884,7 +3983,7 @@ ipp_length(ipp_t *ipp)                    /* I - IPP request */
          * Minimum value of a signed integer is -2147483647, or 11 digits.
          */
 
-         bytes += attr->num_values * 11;
+         bytes += (size_t)attr->num_values * 11;
          break;
 
       case IPP_TAG_BOOLEAN :
@@ -3903,7 +4002,7 @@ ipp_length(ipp_t *ipp)                    /* I - IPP request */
          * 23 characters max.
          */
 
-         bytes += attr->num_values * 23;
+         bytes += (size_t)attr->num_values * 23;
          break;
 
       case IPP_TAG_RESOLUTION :
@@ -3912,7 +4011,7 @@ ipp_length(ipp_t *ipp)                    /* I - IPP request */
          * suffixed by the units, or 26 characters max.
          */
 
-         bytes += attr->num_values * 26;
+         bytes += (size_t)attr->num_values * 26;
          break;
 
       case IPP_TAG_STRING :
@@ -3988,14 +4087,13 @@ load_job_cache(const char *filename)    /* I - job.cache filename */
     {
       if (job)
       {
-        cupsdLogMessage(CUPSD_LOG_ERROR, "Missing </Job> directive on line %d.",
-                       linenum);
+        cupsdLogMessage(CUPSD_LOG_ERROR, "Missing </Job> directive on line %d of %s.", linenum, filename);
         continue;
       }
 
       if (!value)
       {
-        cupsdLogMessage(CUPSD_LOG_ERROR, "Missing job ID on line %d.", linenum);
+        cupsdLogMessage(CUPSD_LOG_ERROR, "Missing job ID on line %d of %s.", linenum, filename);
        continue;
       }
 
@@ -4003,8 +4101,7 @@ load_job_cache(const char *filename)      /* I - job.cache filename */
 
       if (jobid < 1)
       {
-        cupsdLogMessage(CUPSD_LOG_ERROR, "Bad job ID %d on line %d.", jobid,
-                       linenum);
+        cupsdLogMessage(CUPSD_LOG_ERROR, "Bad job ID %d on line %d of %s.", jobid, linenum, filename);
         continue;
       }
 
@@ -4038,13 +4135,12 @@ load_job_cache(const char *filename)    /* I - job.cache filename */
       job->status_pipes[0] = -1;
       job->status_pipes[1] = -1;
 
-      cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading from cache...",
-                      job->id);
+      cupsdLogJob(job, CUPSD_LOG_DEBUG, "Loading from cache...");
     }
     else if (!job)
     {
       cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "Missing <Job #> directive on line %d.", linenum);
+                     "Missing <Job #> directive on line %d of %s.", linenum, filename);
       continue;
     }
     else if (!_cups_strcasecmp(line, "</Job>"))
@@ -4053,12 +4149,20 @@ load_job_cache(const char *filename)    /* I - job.cache filename */
 
       if (job->state_value <= IPP_JOB_STOPPED && cupsdLoadJob(job))
        cupsArrayAdd(ActiveJobs, job);
+      else if (job->state_value > IPP_JOB_STOPPED)
+      {
+        if (!job->completed_time || !job->creation_time || !job->name || !job->koctets)
+       {
+         cupsdLoadJob(job);
+         unload_job(job);
+       }
+      }
 
       job = NULL;
     }
     else if (!value)
     {
-      cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d.", linenum);
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d of %s.", linenum, filename);
       continue;
     }
     else if (!_cups_strcasecmp(line, "State"))
@@ -4070,9 +4174,21 @@ load_job_cache(const char *filename)     /* I - job.cache filename */
       else if (job->state_value > IPP_JOB_COMPLETED)
         job->state_value = IPP_JOB_COMPLETED;
     }
+    else if (!_cups_strcasecmp(line, "Name"))
+    {
+      cupsdSetString(&(job->name), value);
+    }
+    else if (!_cups_strcasecmp(line, "Created"))
+    {
+      job->creation_time = strtol(value, NULL, 10);
+    }
+    else if (!_cups_strcasecmp(line, "Completed"))
+    {
+      job->completed_time = strtol(value, NULL, 10);
+    }
     else if (!_cups_strcasecmp(line, "HoldUntil"))
     {
-      job->hold_until = atoi(value);
+      job->hold_until = strtol(value, NULL, 10);
     }
     else if (!_cups_strcasecmp(line, "Priority"))
     {
@@ -4090,14 +4206,17 @@ load_job_cache(const char *filename)    /* I - job.cache filename */
     {
       job->dtype = (cups_ptype_t)atoi(value);
     }
+    else if (!_cups_strcasecmp(line, "KOctets"))
+    {
+      job->koctets = atoi(value);
+    }
     else if (!_cups_strcasecmp(line, "NumFiles"))
     {
       job->num_files = atoi(value);
 
       if (job->num_files < 0)
       {
-       cupsdLogMessage(CUPSD_LOG_ERROR, "Bad NumFiles value %d on line %d.",
-                       job->num_files, linenum);
+       cupsdLogMessage(CUPSD_LOG_ERROR, "Bad NumFiles value %d on line %d of %s.", job->num_files, linenum, filename);
         job->num_files = 0;
        continue;
       }
@@ -4108,20 +4227,19 @@ load_job_cache(const char *filename)    /* I - job.cache filename */
                 job->id);
         if (access(jobfile, 0))
        {
-         cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Data files have gone away.",
-                         job->id);
+         cupsdLogJob(job, CUPSD_LOG_INFO, "Data files have gone away.");
           job->num_files = 0;
          continue;
        }
 
-        job->filetypes    = calloc(job->num_files, sizeof(mime_type_t *));
-       job->compressions = calloc(job->num_files, sizeof(int));
+        job->filetypes    = calloc((size_t)job->num_files, sizeof(mime_type_t *));
+       job->compressions = calloc((size_t)job->num_files, sizeof(int));
 
         if (!job->filetypes || !job->compressions)
        {
-         cupsdLogMessage(CUPSD_LOG_EMERG,
-                         "[Job %d] Unable to allocate memory for %d files.",
-                         job->id, job->num_files);
+         cupsdLogJob(job, CUPSD_LOG_EMERG,
+                     "Unable to allocate memory for %d files.",
+                     job->num_files);
           break;
        }
       }
@@ -4137,14 +4255,13 @@ load_job_cache(const char *filename)    /* I - job.cache filename */
       if (sscanf(value, "%d%*[ \t]%15[^/]/%255s%d", &number, super, type,
                  &compression) != 4)
       {
-        cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File on line %d.", linenum);
+        cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File on line %d of %s.", linenum, filename);
        continue;
       }
 
       if (number < 1 || number > job->num_files)
       {
-        cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File number %d on line %d.",
-                       number, linenum);
+        cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File number %d on line %d of %s.", number, linenum, filename);
         continue;
       }
 
@@ -4159,9 +4276,9 @@ load_job_cache(const char *filename)      /* I - job.cache filename */
         * If the original MIME type is unknown, auto-type it!
        */
 
-        cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "[Job %d] Unknown MIME type %s/%s for file %d.",
-                       job->id, super, type, number + 1);
+        cupsdLogJob(job, CUPSD_LOG_ERROR,
+                   "Unknown MIME type %s/%s for file %d.",
+                   super, type, number + 1);
 
         snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot,
                 job->id, number + 1);
@@ -4178,8 +4295,14 @@ load_job_cache(const char *filename)     /* I - job.cache filename */
       }
     }
     else
-      cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown %s directive on line %d.",
-                      line, linenum);
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown %s directive on line %d of %s.", line, linenum, filename);
+  }
+
+  if (job)
+  {
+    cupsdLogMessage(CUPSD_LOG_ERROR,
+                   "Missing </Job> directive on line %d of %s.", linenum, filename);
+    cupsdDeleteJob(job, CUPSD_JOB_PURGE);
   }
 
   cupsFileClose(fp);
@@ -4343,10 +4466,7 @@ remove_job_files(cupsd_job_t *job)       /* I - Job */
   {
     snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
             job->id, i);
-    if (Classification)
-      cupsdRemoveFile(filename);
-    else
-      unlink(filename);
+    cupsdUnlinkOrRemoveFile(filename);
   }
 
   free(job->filetypes);
@@ -4377,10 +4497,7 @@ remove_job_history(cupsd_job_t *job)     /* I - Job */
 
   snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot,
           job->id);
-  if (Classification)
-    cupsdRemoveFile(filename);
-  else
-    unlink(filename);
+  cupsdUnlinkOrRemoveFile(filename);
 
   LastEvent |= CUPSD_EVENT_PRINTER_STATE_CHANGED;
 }
@@ -4394,6 +4511,7 @@ static void
 set_time(cupsd_job_t *job,             /* I - Job to update */
          const char  *name)            /* I - Name of attribute */
 {
+  char                 date_name[128]; /* date-time-at-xxx */
   ipp_attribute_t      *attr;          /* Time attribute */
   time_t               curtime;        /* Current time */
 
@@ -4408,8 +4526,18 @@ set_time(cupsd_job_t *job,               /* I - Job to update */
     attr->values[0].integer = curtime;
   }
 
+  snprintf(date_name, sizeof(date_name), "date-%s", name);
+
+  if ((attr = ippFindAttribute(job->attrs, date_name, IPP_TAG_ZERO)) != NULL)
+  {
+    attr->value_tag = IPP_TAG_DATE;
+    ippSetDate(job->attrs, &attr, 0, ippTimeToDate(curtime));
+  }
+
   if (!strcmp(name, "time-at-completed"))
   {
+    job->completed_time = curtime;
+
     if (JobHistory < INT_MAX && attr)
       job->history_time = attr->values[0].integer + JobHistory;
     else
@@ -4440,6 +4568,13 @@ static void
 start_job(cupsd_job_t     *job,                /* I - Job ID */
           cupsd_printer_t *printer)    /* I - Printer to print job */
 {
+  const char   *filename;              /* Support filename */
+  ipp_attribute_t *cancel_after = ippFindAttribute(job->attrs,
+                                                  "job-cancel-after",
+                                                  IPP_TAG_INTEGER);
+                                       /* job-cancel-after attribute */
+
+
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job(job=%p(%d), printer=%p(%s))",
                   job, job->id, printer, printer->name);
 
@@ -4467,7 +4602,7 @@ start_job(cupsd_job_t     *job,           /* I - Job ID */
                                             "job-printer-state-message",
                                             IPP_TAG_TEXT);
   if (job->printer_message)
-    cupsdSetString(&(job->printer_message->values[0].string.text), "");
+    ippSetString(job->attrs, &job->printer_message, 0, "");
 
   ippSetString(job->attrs, &job->reasons, 0, "job-printing");
   cupsdSetJobState(job, IPP_JOB_PROCESSING, CUPSD_JOB_DEFAULT, NULL);
@@ -4488,17 +4623,39 @@ start_job(cupsd_job_t     *job,         /* I - Job ID */
   job->printer      = printer;
   printer->job      = job;
 
-  if (MaxJobTime > 0)
+  if (cancel_after)
+    job->cancel_time = time(NULL) + ippGetInteger(cancel_after, 0);
+  else if (MaxJobTime > 0)
     job->cancel_time = time(NULL) + MaxJobTime;
   else
     job->cancel_time = 0;
 
  /*
+  * Check for support files...
+  */
+
+  cupsdSetPrinterReasons(job->printer, "-cups-missing-filter-warning,"
+                                      "cups-insecure-filter-warning");
+
+  if (printer->pc)
+  {
+    for (filename = (const char *)cupsArrayFirst(printer->pc->support_files);
+         filename;
+         filename = (const char *)cupsArrayNext(printer->pc->support_files))
+    {
+      if (_cupsFileCheck(filename, _CUPS_FILE_CHECK_FILE, !RunUser,
+                        cupsdLogFCMessage, printer))
+        break;
+    }
+  }
+
+ /*
   * Setup the last exit status and security profiles...
   */
 
-  job->status  = 0;
-  job->profile = cupsdCreateProfile(job->id);
+  job->status   = 0;
+  job->profile  = cupsdCreateProfile(job->id, 0);
+  job->bprofile = cupsdCreateProfile(job->id, 1);
 
  /*
   * Create the status pipes and buffer...
@@ -4515,6 +4672,8 @@ start_job(cupsd_job_t     *job,           /* I - Job ID */
 
     cupsdDestroyProfile(job->profile);
     job->profile = NULL;
+    cupsdDestroyProfile(job->bprofile);
+    job->bprofile = NULL;
     return;
   }
 
@@ -4540,6 +4699,8 @@ start_job(cupsd_job_t     *job,           /* I - Job ID */
 
     cupsdDestroyProfile(job->profile);
     job->profile = NULL;
+    cupsdDestroyProfile(job->bprofile);
+    job->bprofile = NULL;
     return;
   }
 
@@ -4569,6 +4730,8 @@ start_job(cupsd_job_t     *job,           /* I - Job ID */
 
     cupsdDestroyProfile(job->profile);
     job->profile = NULL;
+    cupsdDestroyProfile(job->bprofile);
+    job->bprofile = NULL;
     return;
   }
 
@@ -4607,7 +4770,7 @@ stop_job(cupsd_job_t       *job,  /* I - Job */
   FilterLevel -= job->cost;
   job->cost   = 0;
 
-  if (action == CUPSD_JOB_DEFAULT && !job->kill_time)
+  if (action == CUPSD_JOB_DEFAULT && !job->kill_time && job->backend > 0)
     job->kill_time = time(NULL) + JobKillDelay;
   else if (action >= CUPSD_JOB_FORCE)
     job->kill_time = 0;
@@ -4650,13 +4813,14 @@ unload_job(cupsd_job_t *job)            /* I - Job */
   if (!job->attrs)
     return;
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Unloading...", job->id);
+  cupsdLogJob(job, CUPSD_LOG_DEBUG, "Unloading...");
 
   ippDelete(job->attrs);
 
   job->attrs           = NULL;
   job->state           = NULL;
   job->reasons         = NULL;
+  job->impressions     = NULL;
   job->sheets          = NULL;
   job->job_sheets      = NULL;
   job->printer_message = NULL;
@@ -4678,6 +4842,8 @@ update_job(cupsd_job_t *job)              /* I - Job to check */
                *ptr;                   /* Pointer update... */
   int          loglevel,               /* Log level for message */
                event = 0;              /* Events? */
+  cupsd_printer_t *printer = job->printer;
+                                       /* Printer */
   static const char * const levels[] = /* Log levels */
                {
                  "NONE",
@@ -4715,6 +4881,25 @@ update_job(cupsd_job_t *job)             /* I - Job to check */
 
       cupsdLogJob(job, CUPSD_LOG_DEBUG, "PAGE: %s", message);
 
+      if (job->impressions)
+      {
+        if (!_cups_strncasecmp(message, "total ", 6))
+       {
+        /*
+         * Got a total count of pages from a backend or filter...
+         */
+
+         copies = atoi(message + 6);
+         copies -= ippGetInteger(job->impressions, 0); /* Just track the delta */
+       }
+       else if (!sscanf(message, "%*d%d", &copies))
+         copies = 1;
+
+        ippSetInteger(job->attrs, &job->impressions, 0, ippGetInteger(job->impressions, 0) + copies);
+        job->dirty = 1;
+       cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+      }
+
       if (job->sheets)
       {
         if (!_cups_strncasecmp(message, "total ", 6))
@@ -4724,12 +4909,14 @@ update_job(cupsd_job_t *job)            /* I - Job to check */
          */
 
          copies = atoi(message + 6);
-         copies -= job->sheets->values[0].integer; /* Just track the delta */
+         copies -= ippGetInteger(job->sheets, 0); /* Just track the delta */
        }
        else if (!sscanf(message, "%*d%d", &copies))
          copies = 1;
 
-        job->sheets->values[0].integer += copies;
+        ippSetInteger(job->attrs, &job->sheets, 0, ippGetInteger(job->sheets, 0) + copies);
+        job->dirty = 1;
+       cupsdMarkDirty(CUPSD_DIRTY_JOBS);
 
        if (job->printer->page_limit)
          cupsdUpdateQuota(job->printer, job->username, copies, 0);
@@ -4738,8 +4925,21 @@ update_job(cupsd_job_t *job)             /* I - Job to check */
       cupsdLogPage(job, message);
 
       if (job->sheets)
-       cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job,
-                     "Printed %d page(s).", job->sheets->values[0].integer);
+       cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job, "Printed %d page(s).", ippGetInteger(job->sheets, 0));
+    }
+    else if (loglevel == CUPSD_LOG_JOBSTATE)
+    {
+     /*
+      * Support "keyword" to set job-state-reasons to the specified keyword.
+      * This is sufficient for the current paid printing stuff.
+      */
+
+      cupsdLogJob(job, CUPSD_LOG_DEBUG, "JOBSTATE: %s", message);
+
+      if (!strcmp(message, "cups-retry-as-raster"))
+        job->retry_as_raster = 1;
+      else
+        ippSetString(job->attrs, &job->reasons, 0, message);
     }
     else if (loglevel == CUPSD_LOG_STATE)
     {
@@ -4754,7 +4954,7 @@ update_job(cupsd_job_t *job)              /* I - Job to check */
       {
        event |= CUPSD_EVENT_PRINTER_STATE;
 
-        if (MaxJobTime > 0 && strstr(message, "connecting-to-device") != NULL)
+        if (MaxJobTime > 0)
         {
          /*
           * Reset cancel time after connecting to the device...
@@ -4765,7 +4965,17 @@ update_job(cupsd_job_t *job)             /* I - Job to check */
               break;
 
           if (i >= job->printer->num_reasons)
-           job->cancel_time = time(NULL) + MaxJobTime;
+          {
+           ipp_attribute_t *cancel_after = ippFindAttribute(job->attrs,
+                                                            "job-cancel-after",
+                                                            IPP_TAG_INTEGER);
+                                       /* job-cancel-after attribute */
+
+            if (cancel_after)
+             job->cancel_time = time(NULL) + ippGetInteger(cancel_after, 0);
+           else
+             job->cancel_time = time(NULL) + MaxJobTime;
+         }
         }
       }
 
@@ -4781,11 +4991,21 @@ update_job(cupsd_job_t *job)            /* I - Job to check */
       cups_option_t    *attrs;         /* Attributes */
       const char       *attr;          /* Attribute */
 
-
       cupsdLogJob(job, CUPSD_LOG_DEBUG, "ATTR: %s", message);
 
       num_attrs = cupsParseOptions(message, 0, &attrs);
 
+      if ((attr = cupsGetOption("auth-info-default", num_attrs,
+                                attrs)) != NULL)
+      {
+        job->printer->num_options = cupsAddOption("auth-info", attr,
+                                                 job->printer->num_options,
+                                                 &(job->printer->options));
+       cupsdSetPrinterAttrs(job->printer);
+
+       cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
+      }
+
       if ((attr = cupsGetOption("auth-info-required", num_attrs,
                                 attrs)) != NULL)
       {
@@ -4997,10 +5217,11 @@ update_job(cupsd_job_t *job)            /* I - Job to check */
     finalize_job(job, 1);
 
    /*
-    * Check for new jobs...
+    * Try printing another job...
     */
 
-    cupsdCheckJobs();
+    if (printer->state != IPP_PRINTER_STOPPED)
+      cupsdCheckJobs();
   }
 }
 
@@ -5045,15 +5266,14 @@ update_job_attrs(cupsd_job_t *job,      /* I - Job to update */
   if (job->state_value != IPP_JOB_PROCESSING &&
       job->status_level == CUPSD_LOG_INFO)
   {
-    cupsdSetString(&(job->printer_message->values[0].string.text), "");
+    ippSetString(job->attrs, &job->printer_message, 0, "");
 
     job->dirty = 1;
     cupsdMarkDirty(CUPSD_DIRTY_JOBS);
   }
   else if (job->printer->state_message[0] && do_message)
   {
-    cupsdSetString(&(job->printer_message->values[0].string.text),
-                  job->printer->state_message);
+    ippSetString(job->attrs, &job->printer_message, 0, job->printer->state_message);
 
     job->dirty = 1;
     cupsdMarkDirty(CUPSD_DIRTY_JOBS);
@@ -5121,5 +5341,5 @@ update_job_attrs(cupsd_job_t *job,        /* I - Job to update */
 
 
 /*
- * End of "$Id: job.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: job.c 12856 2015-08-31 14:27:39Z msweet $".
  */
index 6fb5ab8..2e3edc8 100644 (file)
@@ -1,16 +1,16 @@
 /*
- * "$Id: job.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: job.h 12668 2015-05-27 19:30:32Z msweet $"
  *
- *   Print job definitions for the CUPS scheduler.
+ * Print job definitions for the CUPS scheduler.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -39,14 +39,19 @@ struct cupsd_job_s                  /**** Job request ****/
                                         * waiting on files */
   char                 *username;      /* Printing user */
   char                 *dest;          /* Destination printer or class */
+  char                 *name;          /* Job name/title */
+  int                  koctets;        /* job-k-octets */
   cups_ptype_t         dtype;          /* Destination type */
   cupsd_printer_t      *printer;       /* Printer this job is assigned to */
   int                  num_files;      /* Number of files in job */
   mime_type_t          **filetypes;    /* File types */
   int                  *compressions;  /* Compression status of each file */
-  ipp_attribute_t      *sheets;        /* job-media-sheets-completed */
+  ipp_attribute_t      *impressions,   /* job-impressions-completed */
+                       *sheets;        /* job-media-sheets-completed */
   time_t               access_time,    /* Last access time */
                        cancel_time,    /* When to cancel/send SIGTERM */
+                       creation_time,  /* When job was created */
+                       completed_time, /* When job was completed (0 if not) */
                        file_time,      /* Job file retain time */
                        history_time,   /* Job history retain time */
                        hold_until,     /* Hold expiration date/time */
@@ -74,10 +79,13 @@ struct cupsd_job_s                  /**** Job request ****/
   int                  backend;        /* Backend process ID */
   int                  status;         /* Status code from filters */
   int                  tries;          /* Number of tries for this job */
+  int                  completed;      /* cups-waiting-for-job-completed seen */
+  int                  retry_as_raster;/* Need to retry the job as raster */
   char                 *auth_env[3],   /* AUTH_xxx environment variables,
                                          * if any */
                        *auth_uid;      /* AUTH_UID environment variable */
-  void                 *profile;       /* Security profile */
+  void                 *profile,       /* Security profile for filters */
+                       *bprofile;      /* Security profile for backend */
   cups_array_t         *history;       /* Debug log history */
   int                  progress;       /* Printing progress */
   int                  num_keywords;   /* Number of PPD keywords */
@@ -145,6 +153,7 @@ extern void         cupsdDeleteJob(cupsd_job_t *job,
                                       cupsd_jobaction_t action);
 extern cupsd_job_t     *cupsdFindJob(int id);
 extern void            cupsdFreeAllJobs(void);
+extern cups_array_t    *cupsdGetCompletedJobs(cupsd_printer_t *p);
 extern int             cupsdGetPrinterJobCount(const char *dest);
 extern int             cupsdGetUserJobCount(const char *username);
 extern void            cupsdLoadAllJobs(void);
@@ -171,5 +180,5 @@ extern void         cupsdUpdateJobs(void);
 
 
 /*
- * End of "$Id: job.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: job.h 12668 2015-05-27 19:30:32Z msweet $".
  */
index a4c19c0..9fcc631 100644 (file)
@@ -1,24 +1,16 @@
 /*
- * "$Id: listen.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: listen.c 12178 2014-09-30 18:56:48Z msweet $"
  *
- *   Server listening routines for the CUPS scheduler.
+ * Server listening routines for the CUPS scheduler.
  *
- *   Copyright 2007-2010 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdDeleteAllListeners() - Delete all listeners.
- *   cupsdPauseListening()     - Clear input polling on all listening sockets...
- *   cupsdResumeListening()    - Set input polling on all listening sockets...
- *   cupsdStartListening()     - Create all listening sockets...
- *   cupsdStopListening()      - Close all listening sockets...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -51,10 +43,19 @@ cupsdDeleteAllListeners(void)
   for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
        lis;
        lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
-    free(lis);
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+    if (!lis->on_demand)
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
+    {
+      cupsArrayRemove(Listeners, lis);
+      free(lis);
+    }
 
-  cupsArrayDelete(Listeners);
-  Listeners = NULL;
+  if (cupsArrayCount(Listeners) == 0)
+  {
+    cupsArrayDelete(Listeners);
+    Listeners = NULL;
+  }
 }
 
 
@@ -123,9 +124,7 @@ cupsdResumeListening(void)
 void
 cupsdStartListening(void)
 {
-  int                  status;         /* Bind result */
-  int                  p,              /* Port number */
-                       val;            /* Parameter value */
+  int                  p;              /* Port number */
   cupsd_listener_t     *lis;           /* Current listening socket */
   char                 s[256];         /* String addresss */
   const char           *have_domain;   /* Have a domain socket? */
@@ -151,7 +150,7 @@ cupsdStartListening(void)
        lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
   {
     httpAddrString(&(lis->address), s, sizeof(s));
-    p = _httpAddrPort(&(lis->address));
+    p = httpAddrPort(&(lis->address));
 
    /*
     * If needed, create a socket for listening...
@@ -163,7 +162,7 @@ cupsdStartListening(void)
       * Create a socket for listening...
       */
 
-      lis->fd = socket(lis->address.addr.sa_family, SOCK_STREAM, 0);
+      lis->fd = httpAddrListen(&(lis->address), p);
 
       if (lis->fd == -1)
       {
@@ -186,132 +185,15 @@ cupsdStartListening(void)
 
        continue;
       }
-
-     /*
-      * Set things up to reuse the local address for this port.
-      */
-
-      val = 1;
-#ifdef __sun
-      setsockopt(lis->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
-#else
-      setsockopt(lis->fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
-#endif /* __sun */
-
-     /*
-      * Bind to the port we found...
-      */
-
-#ifdef AF_INET6
-      if (lis->address.addr.sa_family == AF_INET6)
-      {
-#  ifdef IPV6_V6ONLY
-       /*
-       * Accept only IPv6 connections on this socket, to avoid
-       * potential security issues and to make all platforms behave
-       * the same.
-       */
-
-       val = 1;
-#    ifdef __sun
-       setsockopt(lis->fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&val, sizeof(val));
-#    else
-       setsockopt(lis->fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val));
-#    endif /* __sun */
-#  endif /* IPV6_V6ONLY */
-
-       status = bind(lis->fd, (struct sockaddr *)&(lis->address),
-                     httpAddrLength(&(lis->address)));
-      }
-      else
-#endif /* AF_INET6 */
-#ifdef AF_LOCAL
-      if (lis->address.addr.sa_family == AF_LOCAL)
-      {
-       mode_t  mask;                   /* Umask setting */
-
-
-       /*
-       * Remove any existing domain socket file...
-       */
-
-       unlink(lis->address.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(lis->fd, (struct sockaddr *)&(lis->address),
-                     httpAddrLength(&(lis->address)));
-
-       /*
-       * Restore the umask...
-       */
-
-       umask(mask);
-      }
-      else
-#endif /* AF_LOCAL */
-      status = bind(lis->fd, (struct sockaddr *)&(lis->address),
-                   sizeof(lis->address.ipv4));
-
-      if (status < 0)
-      {
-       cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "Unable to bind socket for address %s:%d - %s.",
-                       s, p, strerror(errno));
-       close(lis->fd);
-       lis->fd = -1;
-
-       if (FatalErrors & CUPSD_FATAL_LISTEN)
-         cupsdEndProcess(getpid(), 0);
-
-       continue;
-      }
-
-     /*
-      * Listen for new clients.
-      */
-
-      if (listen(lis->fd, ListenBackLog) < 0)
-      {
-       cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "Unable to listen for clients on address %s:%d - %s.",
-                       s, p, strerror(errno));
-
-       close(lis->fd);
-       lis->fd = -1;
-
-       if (FatalErrors & CUPSD_FATAL_LISTEN)
-         cupsdEndProcess(getpid(), 0);
-
-        continue;
-      }
     }
 
-    fcntl(lis->fd, F_SETFD, fcntl(lis->fd, F_GETFD) | FD_CLOEXEC);
-
     if (p)
       cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s:%d on fd %d...",
                      s, p, lis->fd);
     else
-    {
       cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s on fd %d...",
                      s, lis->fd);
 
-      if (chmod(s, 0140777))
-       cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "Unable to change permisssions on domain socket "
-                       "\"%s\" - %s", s, strerror(errno));
-    }
-
    /*
     * Save the first port that is bound to the local loopback or
     * "any" address...
@@ -339,7 +221,7 @@ cupsdStartListening(void)
   {
     cupsdLogMessage(CUPSD_LOG_EMERG,
                     "No Listen or Port lines were found to allow access via "
-                   "localhost!");
+                   "localhost.");
 
     if (FatalErrors & (CUPSD_FATAL_CONFIG | CUPSD_FATAL_LISTEN))
       cupsdEndProcess(getpid(), 0);
@@ -401,31 +283,24 @@ cupsdStopListening(void)
        lis;
        lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
   {
-    if (lis->fd != -1)
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+    if (!lis->on_demand && lis->fd != -1)
     {
-#ifdef WIN32
-      closesocket(lis->fd);
-#else
-      close(lis->fd);
-#endif /* WIN32 */
-
-#ifdef AF_LOCAL
-     /*
-      * Remove domain sockets...
-      */
+      httpAddrClose(&(lis->address), lis->fd);
+      lis->fd = -1;
+    }
 
-#  ifdef HAVE_LAUNCH_H
-      if (lis->address.addr.sa_family == AF_LOCAL && !Launchd)
-#  else
-      if (lis->address.addr.sa_family == AF_LOCAL)
-#  endif /* HAVE_LAUNCH_H */
-       unlink(lis->address.un.sun_path);
-#endif /* AF_LOCAL */
+#else
+    if (lis->fd != -1)
+    {
+      httpAddrClose(&(lis->address), lis->fd);
+      lis->fd = -1;
     }
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
   }
 }
 
 
 /*
- * End of "$Id: listen.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: listen.c 12178 2014-09-30 18:56:48Z msweet $".
  */
index d739b58..55e8036 100644 (file)
@@ -1,28 +1,16 @@
 /*
- * "$Id: log.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: log.c 12928 2015-10-23 21:31:58Z msweet $"
  *
- *   Log file routines for the CUPS scheduler.
+ * Log file routines for the CUPS scheduler.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdCheckLogFile()     - Open/rotate a log file if it needs it.
- *   cupsdGetDateTime()   - Returns a pointer to a date/time string.
- *   cupsdLogGSSMessage() - Log a GSSAPI error...
- *   cupsdLogJob()        - Log a job message.
- *   cupsdLogMessage()    - Log a message to the error log file.
- *   cupsdLogPage()       - Log a page to the page log file.
- *   cupsdLogRequest()    - Log an HTTP request in Common Log Format.
- *   cupsdWriteErrorLog() - Write a line to the ErrorLog.
- *   format_log_line()    - Format a line for a log file.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
 
 #include "cupsd.h"
 #include <stdarg.h>
+#ifdef HAVE_ASL_H
+#  include <asl.h>
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+#  define SD_JOURNAL_SUPPRESS_LOCATION
+#  include <systemd/sd-journal.h>
+#endif /* HAVE_ASL_H */
 #include <syslog.h>
 
 
 /*
+ * Constants for log keys from PWG 5110.3 (PWG Common Log Format)...
+ */
+
+#define PWG_DeviceUUID                 "DUU"
+#define PWG_Event                      "E"
+#define PWG_LogNaturalLanguage         "NL"
+#define PWG_Status                     "S"
+#define PWG_ServiceURI                 "URI"
+#define PWG_UserHost                   "UH"
+#define PWG_UserName                   "UN"
+#define PWG_UserURI                    "UU"
+#define PWG_ServiceIsAcceptingJobs     "IAJ"
+#define PWG_ServiceState               "ST"
+#define PWG_ServiceStateReasons                "SR"
+#define PWG_ServiceUUID                        "SUU"
+#define PWG_JobID                      "JID"
+#define PWG_JobUUID                    "JUU"
+#define PWG_JobImagesCompleted         "JIM"
+#define PWG_JobImpressionsCompleted    "JIC"
+#define PWG_JobDestinationURI          "JD"
+#define PWG_JobState                   "JS"
+#define PWG_JobStateReasons            "JR"
+#define PWG_JobAccountingID            "JA"
+#define PWG_JobAcountingUserName       "JAUN"
+#define PWG_JobAccountingUserURI       "JAUU"
+
+
+/*
  * Local globals...
  */
 
-static int     log_linesize = 0;       /* Size of line for output file */
+static _cups_mutex_t log_mutex = _CUPS_MUTEX_INITIALIZER;
+                                       /* Mutex for logging */
+static size_t  log_linesize = 0;       /* Size of line for output file */
 static char    *log_line = NULL;       /* Line for output file */
 
-#ifdef HAVE_VSYSLOG
-static const int syslevels[] =         /* SYSLOG levels... */
+#ifdef HAVE_ASL_H
+static const int log_levels[] =                /* ASL levels... */
+               {
+                 ASL_LEVEL_EMERG,
+                 ASL_LEVEL_EMERG,
+                 ASL_LEVEL_ALERT,
+                 ASL_LEVEL_CRIT,
+                 ASL_LEVEL_ERR,
+                 ASL_LEVEL_WARNING,
+                 ASL_LEVEL_NOTICE,
+                 ASL_LEVEL_INFO,
+                 ASL_LEVEL_DEBUG,
+                 ASL_LEVEL_DEBUG
+               };
+#elif defined(HAVE_VSYSLOG) || defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+static const int log_levels[] =                /* SYSLOG levels... */
                {
                  0,
                  LOG_EMERG,
@@ -55,7 +93,7 @@ static const int syslevels[] =                /* SYSLOG levels... */
                  LOG_DEBUG,
                  LOG_DEBUG
                };
-#endif /* HAVE_VSYSLOG */
+#endif /* HAVE_ASL_H */
 
 
 /*
@@ -87,6 +125,16 @@ cupsdCheckLogFile(cups_file_t **lf, /* IO - Log file */
     return (1);
 
  /*
+  * Handle logging to stderr...
+  */
+
+  if (!strcmp(logname, "stderr"))
+  {
+    *lf = LogStderr;
+    return (1);
+  }
+
+ /*
   * Format the filename as needed...
   */
 
@@ -124,7 +172,7 @@ cupsdCheckLogFile(cups_file_t **lf, /* IO - Log file */
          * Insert the server name...
          */
 
-         strlcpy(ptr, ServerName, sizeof(filename) - (ptr - filename));
+         strlcpy(ptr, ServerName, sizeof(filename) - (size_t)(ptr - filename));
          ptr += strlen(ptr);
        }
         else
@@ -165,23 +213,34 @@ cupsdCheckLogFile(cups_file_t **lf,       /* IO - Log file */
        * the log file permissions as a basis...
        */
 
-        int log_dir_perm = 0300 | LogFilePerm;
+        mode_t log_dir_perm = (mode_t)(0300 | LogFilePerm);
                                        /* LogFilePerm + owner write/search */
        if (log_dir_perm & 0040)
          log_dir_perm |= 0010;         /* Add group search */
        if (log_dir_perm & 0004)
          log_dir_perm |= 0001;         /* Add other search */
 
-        cupsdCheckPermissions(CUPS_LOGDIR, NULL, log_dir_perm, RunUser, Group,
-                             1, -1);
+        cupsdCheckPermissions(CUPS_LOGDIR, NULL, log_dir_perm, RunUser, Group, 1, -1);
 
         *lf = cupsFileOpen(filename, "a");
       }
 
       if (*lf == NULL)
       {
-       syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename,
-              strerror(errno));
+#ifdef HAVE_ASL_H
+       asl_object_t    m;              /* Log message */
+
+       m = asl_new(ASL_TYPE_MSG);
+       asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+       asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
+       asl_release(m);
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+        sd_journal_print(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
+
+#else
+       syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
+#endif /* HAVE_ASL_H */
 
         if (FatalErrors & CUPSD_FATAL_LOG)
          cupsdEndProcess(getpid(), 0);
@@ -214,7 +273,7 @@ cupsdCheckLogFile(cups_file_t **lf, /* IO - Log file */
 
     cupsFileClose(*lf);
 
-    strcpy(backname, filename);
+    strlcpy(backname, filename, sizeof(backname));
     strlcat(backname, ".O", sizeof(backname));
 
     unlink(backname);
@@ -222,8 +281,20 @@ cupsdCheckLogFile(cups_file_t **lf,        /* IO - Log file */
 
     if ((*lf = cupsFileOpen(filename, "a")) == NULL)
     {
-      syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename,
-             strerror(errno));
+#ifdef HAVE_ASL_H
+       asl_object_t    m;              /* Log message */
+
+       m = asl_new(ASL_TYPE_MSG);
+       asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+       asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
+       asl_release(m);
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+        sd_journal_print(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
+
+#else
+       syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, strerror(errno));
+#endif /* HAVE_ASL_H */
 
       if (FatalErrors & CUPSD_FATAL_LOG)
        cupsdEndProcess(getpid(), 0);
@@ -382,8 +453,8 @@ cupsdLogFCMessage(
 int                                    /* O - 1 on success, 0 on error */
 cupsdLogGSSMessage(
     int        level,                  /* I - Log level */
-    int               major_status,            /* I - Major GSSAPI status */
-    int               minor_status,            /* I - Minor GSSAPI status */
+    OM_uint32  major_status,           /* I - Major GSSAPI status */
+    OM_uint32  minor_status,           /* I - Minor GSSAPI status */
     const char *message,               /* I - printf-style message string */
     ...)                               /* I - Additional args as needed */
 {
@@ -437,6 +508,61 @@ cupsdLogGSSMessage(
 
 
 /*
+ * 'cupsdLogClient()' - Log a client message.
+ */
+
+int                                    /* O - 1 on success, 0 on error */
+cupsdLogClient(cupsd_client_t *con,    /* I - Client connection */
+               int            level,   /* I - Log level */
+               const char     *message,        /* I - Printf-style message string */
+               ...)                    /* I - Additional arguments as needed */
+{
+  va_list              ap, ap2;        /* Argument pointers */
+  char                 clientmsg[1024];/* Format string for client message */
+  int                  status;         /* Formatting status */
+
+
+ /*
+  * See if we want to log this message...
+  */
+
+  if (TestConfigFile || !ErrorLog)
+    return (1);
+
+  if (level > LogLevel)
+    return (1);
+
+ /*
+  * Format and write the log message...
+  */
+
+  if (con)
+    snprintf(clientmsg, sizeof(clientmsg), "[Client %d] %s", con->number,
+             message);
+  else
+    strlcpy(clientmsg, message, sizeof(clientmsg));
+
+  va_start(ap, message);
+
+  do
+  {
+    va_copy(ap2, ap);
+    status = format_log_line(clientmsg, ap2);
+    va_end(ap2);
+  }
+  while (status == 0);
+
+  va_end(ap);
+
+  if (status > 0)
+    return (cupsdWriteErrorLog(level, log_line));
+  else
+    return (cupsdWriteErrorLog(CUPSD_LOG_ERROR,
+                               "Unable to allocate memory for log line."));
+}
+
+
+/*
  * 'cupsdLogJob()' - Log a job message.
  */
 
@@ -463,6 +589,96 @@ cupsdLogJob(cupsd_job_t *job,              /* I - Job */
       LogDebugHistory <= 0)
     return (1);
 
+#ifdef HAVE_ASL_H
+  if (!strcmp(ErrorLog, "syslog"))
+  {
+    asl_object_t       m;              /* Log message */
+    char               job_id[32],     /* job-id string */
+                       completed[32];  /* job-impressions-completed string */
+    cupsd_printer_t *printer = job ? (job->printer ? job->printer : (job->dest ? cupsdFindDest(job->dest) : NULL)) : NULL;
+    static const char * const job_states[] =
+    {                                  /* job-state strings */
+      "Pending",
+      "PendingHeld",
+      "Processing",
+      "ProcessingStopped",
+      "Canceled",
+      "Aborted",
+      "Completed"
+    };
+
+    m = asl_new(ASL_TYPE_MSG);
+    asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+    if (printer)
+      asl_set(m, PWG_ServiceURI, printer->uri);
+    if (job)
+    {
+      snprintf(job_id, sizeof(job_id), "%d", job->id);
+
+      asl_set(m, PWG_Event, "JobStateChanged");
+      asl_set(m, PWG_JobID, job_id);
+      asl_set(m, PWG_JobState, job->state_value < IPP_JSTATE_PENDING ? "" : job_states[job->state_value - IPP_JSTATE_PENDING]);
+
+      if (job->impressions)
+      {
+       snprintf(completed, sizeof(completed), "%d", ippGetInteger(job->impressions, 0));
+       asl_set(m, PWG_JobImpressionsCompleted, completed);
+      }
+    }
+
+    va_start(ap, message);
+    asl_vlog(NULL, m, log_levels[level], message, ap);
+    va_end(ap);
+
+    asl_release(m);
+    return (1);
+  }
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+  if (!strcmp(ErrorLog, "syslog"))
+  {
+    cupsd_printer_t *printer = job ? (job->printer ? job->printer : (job->dest ? cupsdFindDest(job->dest) : NULL)) : NULL;
+    static const char * const job_states[] =
+    {                                  /* job-state strings */
+      "Pending",
+      "PendingHeld",
+      "Processing",
+      "ProcessingStopped",
+      "Canceled",
+      "Aborted",
+      "Completed"
+    };
+
+    va_start(ap, message);
+
+    do
+    {
+      va_copy(ap2, ap);
+      status = format_log_line(message, ap2);
+      va_end(ap2);
+    }
+    while (status == 0);
+
+    va_end(ap);
+
+    if (job)
+      sd_journal_send("MESSAGE=%s", log_line,
+                     "PRIORITY=%i", log_levels[level],
+                     PWG_Event"=JobStateChanged",
+                     PWG_ServiceURI"=%s", printer ? printer->uri : "",
+                     PWG_JobID"=%d", job->id,
+                     PWG_JobState"=%s", job->state_value < IPP_JSTATE_PENDING ? "" : job_states[job->state_value - IPP_JSTATE_PENDING],
+                     PWG_JobImpressionsCompleted"=%d", ippGetInteger(job->impressions, 0),
+                     NULL);
+    else
+      sd_journal_send("MESSAGE=%s", log_line,
+                     "PRIORITY=%i", log_levels[level],
+                     NULL);
+
+    return (1);
+  }
+#endif /* HAVE_ASL_H */
+
  /*
   * Format and write the log message...
   */
@@ -496,12 +712,13 @@ cupsdLogJob(cupsd_job_t *job,             /* I - Job */
       */
 
       cupsd_joblog_t *temp;            /* Copy of log message */
+      size_t         log_len = strlen(log_line);
+                                       /* Length of log message */
 
-
-      if ((temp = malloc(sizeof(cupsd_joblog_t) + strlen(log_line))) != NULL)
+      if ((temp = malloc(sizeof(cupsd_joblog_t) + log_len)) != NULL)
       {
         temp->time = time(NULL);
-       strcpy(temp->message, log_line);
+       memcpy(temp->message, log_line, log_len + 1);
       }
 
       if (!job->history)
@@ -535,7 +752,7 @@ cupsdLogJob(cupsd_job_t *job,               /* I - Job */
   }
   else
     return (cupsdWriteErrorLog(CUPSD_LOG_ERROR,
-                               "Unable to allocate memory for log line!"));
+                               "Unable to allocate memory for log line."));
 }
 
 
@@ -559,12 +776,26 @@ cupsdLogMessage(int        level, /* I - Log level */
   if ((TestConfigFile || !ErrorLog) && level <= CUPSD_LOG_WARN)
   {
     va_start(ap, message);
-#ifdef HAVE_VSYSLOG
-    vsyslog(LOG_LPR | syslevels[level], message, ap);
+
+#ifdef HAVE_ASL_H
+    asl_object_t       m;              /* Log message */
+
+    m = asl_new(ASL_TYPE_MSG);
+    asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+    asl_vlog(NULL, m, log_levels[level], message, ap);
+    asl_release(m);
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+    sd_journal_printv(log_levels[level], message, ap);
+
+#elif defined(HAVE_VSYSLOG)
+    vsyslog(LOG_LPR | log_levels[level], message, ap);
+
 #else
     vfprintf(stderr, message, ap);
     putc('\n', stderr);
 #endif /* HAVE_VSYSLOG */
+
     va_end(ap);
 
     return (1);
@@ -573,6 +804,32 @@ cupsdLogMessage(int        level,  /* I - Log level */
   if (level > LogLevel || !ErrorLog)
     return (1);
 
+#ifdef HAVE_ASL_H
+  if (!strcmp(ErrorLog, "syslog"))
+  {
+    asl_object_t       m;              /* Log message */
+
+    m = asl_new(ASL_TYPE_MSG);
+    asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+
+    va_start(ap, message);
+    asl_vlog(NULL, m, log_levels[level], message, ap);
+    va_end(ap);
+
+    asl_release(m);
+    return (1);
+  }
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+  if (!strcmp(ErrorLog, "syslog"))
+  {
+    va_start(ap, message);
+    sd_journal_printv(log_levels[level], message, ap);
+    va_end(ap);
+    return (1);
+  }
+#endif /* HAVE_ASL_H */
+
  /*
   * Format and write the log message...
   */
@@ -623,7 +880,7 @@ cupsdLogPage(cupsd_job_t *job,              /* I - Job being printed */
   if (!PageLogFormat)
     return (1);
 
-  strcpy(number, "1");
+  strlcpy(number, "1", sizeof(number));
   copies = 1;
   sscanf(page, "%255s%d", number, &copies);
 
@@ -641,53 +898,68 @@ cupsdLogPage(cupsd_job_t *job,            /* I - Job being printed */
            break;
 
         case 'p' :                     /* Printer name */
-           strlcpy(bufptr, job->printer->name,
-                   sizeof(buffer) - (bufptr - buffer));
+           strlcpy(bufptr, job->dest, sizeof(buffer) - (size_t)(bufptr - buffer));
            bufptr += strlen(bufptr);
            break;
 
         case 'j' :                     /* Job ID */
-           snprintf(bufptr, sizeof(buffer) - (bufptr - buffer), "%d", job->id);
+           snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), "%d", job->id);
            bufptr += strlen(bufptr);
            break;
 
         case 'u' :                     /* Username */
-           strlcpy(bufptr, job->username ? job->username : "-",
-                   sizeof(buffer) - (bufptr - buffer));
+           strlcpy(bufptr, job->username ? job->username : "-", sizeof(buffer) - (size_t)(bufptr - buffer));
            bufptr += strlen(bufptr);
            break;
 
         case 'T' :                     /* Date and time */
-           strlcpy(bufptr, cupsdGetDateTime(NULL, LogTimeFormat),
-                   sizeof(buffer) - (bufptr - buffer));
+           strlcpy(bufptr, cupsdGetDateTime(NULL, LogTimeFormat), sizeof(buffer) - (size_t)(bufptr - buffer));
            bufptr += strlen(bufptr);
            break;
 
         case 'P' :                     /* Page number */
-           strlcpy(bufptr, number, sizeof(buffer) - (bufptr - buffer));
+           strlcpy(bufptr, number, sizeof(buffer) - (size_t)(bufptr - buffer));
            bufptr += strlen(bufptr);
            break;
 
         case 'C' :                     /* Number of copies */
-           snprintf(bufptr, sizeof(buffer) - (bufptr - buffer), "%d", copies);
+           snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), "%d", copies);
            bufptr += strlen(bufptr);
            break;
 
         case '{' :                     /* {attribute} */
-           if ((nameend = strchr(format, '}')) != NULL &&
-               (nameend - format - 2) < (sizeof(name) - 1))
+           if ((nameend = strchr(format, '}')) != NULL && (size_t)(nameend - format - 2) < (sizeof(name) - 1))
            {
             /*
              * Pull the name from inside the brackets...
              */
 
-             memcpy(name, format + 1, nameend - format - 1);
+             memcpy(name, format + 1, (size_t)(nameend - format - 1));
              name[nameend - format - 1] = '\0';
 
              format = nameend;
 
-             if ((attr = ippFindAttribute(job->attrs, name,
-                                          IPP_TAG_ZERO)) != NULL)
+             attr = ippFindAttribute(job->attrs, name, IPP_TAG_ZERO);
+             if (!attr && !strcmp(name, "job-billing"))
+             {
+              /*
+               * Handle alias "job-account-id" (which was standardized after
+               * "job-billing" was defined for CUPS...
+               */
+
+               attr = ippFindAttribute(job->attrs, "job-account-id", IPP_TAG_ZERO);
+             }
+             else if (!attr && !strcmp(name, "media"))
+             {
+              /*
+               * Handle alias "media-col" which uses dimensions instead of
+               * names...
+               */
+
+               attr = ippFindAttribute(job->attrs, "media-col/media-size", IPP_TAG_BEGIN_COLLECTION);
+             }
+
+             if (attr)
              {
               /*
                * Add the attribute value...
@@ -705,14 +977,12 @@ cupsdLogPage(cupsd_job_t *job,            /* I - Job being printed */
                  {
                    case IPP_TAG_INTEGER :
                    case IPP_TAG_ENUM :
-                       snprintf(bufptr, sizeof(buffer) - (bufptr - buffer),
-                                "%d", attr->values[i].integer);
+                       snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), "%d", attr->values[i].integer);
                        bufptr += strlen(bufptr);
                        break;
 
                     case IPP_TAG_BOOLEAN :
-                       snprintf(bufptr, sizeof(buffer) - (bufptr - buffer),
-                                "%d", attr->values[i].boolean);
+                       snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer), "%d", attr->values[i].boolean);
                        bufptr += strlen(bufptr);
                        break;
 
@@ -726,14 +996,28 @@ cupsdLogPage(cupsd_job_t *job,            /* I - Job being printed */
                    case IPP_TAG_CHARSET :
                    case IPP_TAG_LANGUAGE :
                    case IPP_TAG_MIMETYPE :
-                       strlcpy(bufptr, attr->values[i].string.text,
-                               sizeof(buffer) - (bufptr - buffer));
+                       strlcpy(bufptr, attr->values[i].string.text, sizeof(buffer) - (size_t)(bufptr - buffer));
                        bufptr += strlen(bufptr);
                        break;
 
+                    case IPP_TAG_BEGIN_COLLECTION :
+                       if (!strcmp(attr->name, "media-size"))
+                       {
+                         ipp_attribute_t *x_dimension = ippFindAttribute(ippGetCollection(attr, 0), "x-dimension", IPP_TAG_INTEGER);
+                         ipp_attribute_t *y_dimension = ippFindAttribute(ippGetCollection(attr, 0), "y-dimension", IPP_TAG_INTEGER);
+                                       /* Media dimensions */
+
+                         if (x_dimension && y_dimension)
+                         {
+                           pwg_media_t *pwg = pwgMediaForSize(ippGetInteger(x_dimension, 0), ippGetInteger(y_dimension, 0));
+                                       /* PWG media name */
+                           strlcpy(bufptr, pwg->pwg, sizeof(buffer) - (size_t)(bufptr - buffer));
+                           break;
+                         }
+                       }
+
                    default :
-                       strlcpy(bufptr, "???",
-                               sizeof(buffer) - (bufptr - buffer));
+                       strlcpy(bufptr, "???", sizeof(buffer) - (size_t)(bufptr - buffer));
                        bufptr += strlen(bufptr);
                        break;
                  }
@@ -759,7 +1043,70 @@ cupsdLogPage(cupsd_job_t *job,            /* I - Job being printed */
 
   *bufptr = '\0';
 
-#ifdef HAVE_VSYSLOG
+#ifdef HAVE_ASL_H
+  if (!strcmp(ErrorLog, "syslog"))
+  {
+    asl_object_t       m;              /* Log message */
+    char               job_id[32],     /* job-id string */
+                       completed[32];  /* job-impressions-completed string */
+    static const char * const job_states[] =
+    {                                  /* job-state strings */
+      "Pending",
+      "PendingHeld",
+      "Processing",
+      "ProcessingStopped",
+      "Canceled",
+      "Aborted",
+      "Completed"
+    };
+
+    snprintf(job_id, sizeof(job_id), "%d", job->id);
+
+    m = asl_new(ASL_TYPE_MSG);
+    asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+    asl_set(m, PWG_Event, "JobStateChanged");
+    asl_set(m, PWG_ServiceURI, job->printer->uri);
+    asl_set(m, PWG_JobID, job_id);
+    asl_set(m, PWG_JobState, job_states[job->state_value - IPP_JSTATE_PENDING]);
+
+    if (job->impressions)
+    {
+      snprintf(completed, sizeof(completed), "%d", ippGetInteger(job->impressions, 0));
+      asl_set(m, PWG_JobImpressionsCompleted, completed);
+    }
+
+    asl_log(NULL, m, ASL_LEVEL_INFO, "%s", buffer);
+
+    asl_release(m);
+    return (1);
+  }
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+  if (!strcmp(ErrorLog, "syslog"))
+  {
+    static const char * const job_states[] =
+    {                                  /* job-state strings */
+      "Pending",
+      "PendingHeld",
+      "Processing",
+      "ProcessingStopped",
+      "Canceled",
+      "Aborted",
+      "Completed"
+    };
+
+    sd_journal_send("MESSAGE=%s", buffer,
+                    "PRIORITY=%i", LOG_INFO,
+                   PWG_Event"=JobStateChanged",
+                   PWG_ServiceURI"=%s", job->printer->uri,
+                   PWG_JobID"=%d", job->id,
+                   PWG_JobState"=%s", job_states[job->state_value - IPP_JSTATE_PENDING],
+                   PWG_JobImpressionsCompleted"=%d", ippGetInteger(job->impressions, 0),
+                   NULL);
+    return (1);
+  }
+
+#elif defined(HAVE_VSYSLOG)
  /*
   * See if we are logging pages via syslog...
   */
@@ -770,7 +1117,7 @@ cupsdLogPage(cupsd_job_t *job,             /* I - Job being printed */
 
     return (1);
   }
-#endif /* HAVE_VSYSLOG */
+#endif /* HAVE_ASL_H */
 
  /*
   * Not using syslog; check the log file...
@@ -825,7 +1172,9 @@ cupsdLogRequest(cupsd_client_t *con,       /* I - Request to log */
   * Filter requests as needed...
   */
 
-  if (AccessLogLevel < CUPSD_ACCESSLOG_ALL)
+  if (AccessLogLevel == CUPSD_ACCESSLOG_NONE)
+    return (1);
+  else if (AccessLogLevel < CUPSD_ACCESSLOG_ALL)
   {
    /*
     * Eliminate simple GET, POST, and PUT requests...
@@ -929,7 +1278,36 @@ cupsdLogRequest(cupsd_client_t *con,      /* I - Request to log */
     }
   }
 
-#ifdef HAVE_VSYSLOG
+#ifdef HAVE_ASL_H
+  if (!strcmp(ErrorLog, "syslog"))
+  {
+    asl_object_t       m;              /* Log message */
+
+    m = asl_new(ASL_TYPE_MSG);
+    asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+
+    asl_log(NULL, m, ASL_LEVEL_INFO, "REQUEST %s - %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s\n",
+           con->http->hostname, con->username[0] != '\0' ? con->username : "-",
+          states[con->operation], _httpEncodeURI(temp, con->uri, sizeof(temp)),
+          con->http->version / 100, con->http->version % 100,
+          code, CUPS_LLCAST con->bytes,
+          con->request ?
+              ippOpString(con->request->request.op.operation_id) : "-",
+          con->response ?
+              ippErrorString(con->response->request.status.status_code) : "-");
+
+    asl_release(m);
+    return (1);
+  }
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+  if (!strcmp(ErrorLog, "syslog"))
+  {
+    sd_journal_print(LOG_INFO, "REQUEST %s - %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s", con->http->hostname, con->username[0] != '\0' ? con->username : "-", states[con->operation], _httpEncodeURI(temp, con->uri, sizeof(temp)), con->http->version / 100, con->http->version % 100, code, CUPS_LLCAST con->bytes, con->request ? ippOpString(con->request->request.op.operation_id) : "-", con->response ? ippErrorString(con->response->request.status.status_code) : "-");
+    return (1);
+  }
+
+#elif defined(HAVE_VSYSLOG)
  /*
   * See if we are logging accesses via syslog...
   */
@@ -938,9 +1316,9 @@ cupsdLogRequest(cupsd_client_t *con,       /* I - Request to log */
   {
     syslog(LOG_INFO,
            "REQUEST %s - %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s\n",
-           con->http.hostname, con->username[0] != '\0' ? con->username : "-",
+           con->http->hostname, con->username[0] != '\0' ? con->username : "-",
           states[con->operation], _httpEncodeURI(temp, con->uri, sizeof(temp)),
-          con->http.version / 100, con->http.version % 100,
+          con->http->version / 100, con->http->version % 100,
           code, CUPS_LLCAST con->bytes,
           con->request ?
               ippOpString(con->request->request.op.operation_id) : "-",
@@ -949,7 +1327,7 @@ cupsdLogRequest(cupsd_client_t *con,       /* I - Request to log */
 
     return (1);
   }
-#endif /* HAVE_VSYSLOG */
+#endif /* HAVE_ASL_H */
 
  /*
   * Not using syslog; check the log file...
@@ -964,12 +1342,12 @@ cupsdLogRequest(cupsd_client_t *con,     /* I - Request to log */
 
   cupsFilePrintf(AccessFile,
                  "%s - %s %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s\n",
-                con->http.hostname,
+                con->http->hostname,
                 con->username[0] != '\0' ? con->username : "-",
                 cupsdGetDateTime(&(con->start), LogTimeFormat),
                 states[con->operation],
                 _httpEncodeURI(temp, con->uri, sizeof(temp)),
-                con->http.version / 100, con->http.version % 100,
+                con->http->version / 100, con->http->version % 100,
                 code, CUPS_LLCAST con->bytes,
                 con->request ?
                     ippOpString(con->request->request.op.operation_id) : "-",
@@ -991,6 +1369,7 @@ int                                        /* O - 1 on success, 0 on failure */
 cupsdWriteErrorLog(int        level,   /* I - Log level */
                    const char *message)        /* I - Message string */
 {
+  int          ret = 1;                /* Return value */
   static const char    levels[] =      /* Log levels... */
                {
                  ' ',
@@ -1006,34 +1385,62 @@ cupsdWriteErrorLog(int        level,    /* I - Log level */
                };
 
 
-#ifdef HAVE_VSYSLOG
+#ifdef HAVE_ASL_H
+  if (!strcmp(ErrorLog, "syslog"))
+  {
+    asl_object_t       m;              /* Log message */
+
+    m = asl_new(ASL_TYPE_MSG);
+    asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+    asl_log(NULL, m, ASL_LEVEL_INFO, "%s", message);
+
+    asl_release(m);
+    return (1);
+  }
+
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+  if (!strcmp(ErrorLog, "syslog"))
+  {
+    sd_journal_print(log_levels[level], "%s", message);
+    return (1);
+  }
+
+#elif defined(HAVE_VSYSLOG)
  /*
   * See if we are logging errors via syslog...
   */
 
   if (!strcmp(ErrorLog, "syslog"))
   {
-    syslog(syslevels[level], "%s", message);
+    syslog(log_levels[level], "%s", message);
     return (1);
   }
-#endif /* HAVE_VSYSLOG */
+#endif /* HAVE_ASL_H */
 
  /*
   * Not using syslog; check the log file...
   */
 
+  _cupsMutexLock(&log_mutex);
+
   if (!cupsdCheckLogFile(&ErrorFile, ErrorLog))
-    return (0);
+  {
+    ret = 0;
+  }
+  else
+  {
+   /*
+    * Write the log message...
+    */
 
- /*
-  * Write the log message...
-  */
+    cupsFilePrintf(ErrorFile, "%c %s %s\n", levels[level],
+                   cupsdGetDateTime(NULL, LogTimeFormat), message);
+    cupsFileFlush(ErrorFile);
+  }
 
-  cupsFilePrintf(ErrorFile, "%c %s %s\n", levels[level],
-                 cupsdGetDateTime(NULL, LogTimeFormat), message);
-  cupsFileFlush(ErrorFile);
+  _cupsMutexUnlock(&log_mutex);
 
-  return (1);
+  return (ret);
 }
 
 
@@ -1049,7 +1456,7 @@ static int                                /* O - -1 for fatal, 0 for retry, 1 for success */
 format_log_line(const char *message,   /* I - Printf-style format string */
                 va_list    ap)         /* I - Argument list */
 {
-  int          len;                    /* Length of formatted line */
+  ssize_t      len;                    /* Length of formatted line */
 
 
  /*
@@ -1069,17 +1476,16 @@ format_log_line(const char *message,    /* I - Printf-style format string */
   * Format the log message...
   */
 
-  len = vsnprintf(log_line, log_linesize, message, ap);
+  len = _cups_safe_vsnprintf(log_line, log_linesize, message, ap);
 
  /*
   * Resize the buffer as needed...
   */
 
-  if (len >= log_linesize && log_linesize < 65536)
+  if ((size_t)len >= log_linesize && log_linesize < 65536)
   {
     char       *temp;                  /* Temporary string pointer */
 
-
     len ++;
 
     if (len < 8192)
@@ -1087,12 +1493,12 @@ format_log_line(const char *message,    /* I - Printf-style format string */
     else if (len > 65536)
       len = 65536;
 
-    temp = realloc(log_line, len);
+    temp = realloc(log_line, (size_t)len);
 
     if (temp)
     {
       log_line     = temp;
-      log_linesize = len;
+      log_linesize = (size_t)len;
 
       return (0);
     }
@@ -1103,5 +1509,5 @@ format_log_line(const char *message,      /* I - Printf-style format string */
 
 
 /*
- * End of "$Id: log.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: log.c 12928 2015-10-23 21:31:58Z msweet $".
  */
index 11eae52..b1aa503 100644 (file)
@@ -1,39 +1,16 @@
 /*
- * "$Id: main.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: main.c 12700 2015-06-08 18:32:35Z msweet $"
  *
- *   Main loop for the CUPS scheduler.
+ * Main loop for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()                - Main entry for the CUPS scheduler.
- *   cupsdAddString()      - Copy and add a string to an array.
- *   cupsdCheckProcess()   - Tell the main loop to check for dead children.
- *   cupsdClearString()    - Clear a string.
- *   cupsdFreeStrings()    - Free an array of strings.
- *   cupsdHoldSignals()    - Hold child and termination signals.
- *   cupsdReleaseSignals() - Release signals for delivery.
- *   cupsdSetString()      - Set a string value.
- *   cupsdSetStringf()     - Set a formatted string value.
- *   launchd_checkin()     - Check-in with launchd and collect the listening
- *                           fds.
- *   launchd_checkout()    - Update the launchd KeepAlive file as needed.
- *   parent_handler()      - Catch USR1/CHLD signals...
- *   process_children()    - Process all dead children...
- *   select_timeout()      - Calculate the select timeout value.
- *   sigchld_handler()     - Handle 'child' signals from old processes.
- *   sighup_handler()      - Handle 'hangup' signals to reconfigure the
- *                           scheduler.
- *   sigterm_handler()     - Handle 'terminate' signals that stop the scheduler.
- *   usage()               - Show scheduler usage.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
 #define _MAIN_C_
 #include "cupsd.h"
 #include <sys/resource.h>
+#ifdef HAVE_ASL_H
+#  include <asl.h>
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+#  define SD_JOURNAL_SUPPRESS_LOCATION
+#  include <systemd/sd-journal.h>
+#endif /* HAVE_ASL_H */
 #include <syslog.h>
 #include <grp.h>
 
 #  include <libgen.h>
 #  define CUPS_KEEPALIVE CUPS_CACHEDIR "/org.cups.cupsd"
                                        /* Name of the launchd KeepAlive file */
-#  ifndef LAUNCH_JOBKEY_KEEPALIVE
-#    define LAUNCH_JOBKEY_KEEPALIVE "KeepAlive"
-#  endif /* !LAUNCH_JOBKEY_KEEPALIVE */
-#  ifndef LAUNCH_JOBKEY_PATHSTATE
-#    define LAUNCH_JOBKEY_PATHSTATE "PathState"
-#  endif /* !LAUNCH_JOBKEY_PATHSTATE */
-#  ifndef LAUNCH_JOBKEY_SERVICEIPC
-#    define LAUNCH_JOBKEY_SERVICEIPC "ServiceIPC"
-#  endif /* !LAUNCH_JOBKEY_SERVICEIPC */
+#  ifdef HAVE_LAUNCH_ACTIVATE_SOCKET
+/* Update when we have a public header we can include */
+extern int launch_activate_socket(const char *name, int **fds, size_t *cnt);
+#  endif /* HAVE_LAUNCH_ACTIVATE_SOCKET */
 #endif /* HAVE_LAUNCH_H */
 
+#ifdef HAVE_SYSTEMD
+#  include <systemd/sd-daemon.h>
+#  define CUPS_KEEPALIVE CUPS_CACHEDIR "/org.cups.cupsd"
+                                       /* Name of the systemd path file */
+#endif /* HAVE_SYSTEMD */
+
 #if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO)
 #  include <malloc.h>
 #endif /* HAVE_MALLOC_H && HAVE_MALLINFO */
 #  include <notify.h>
 #endif /* HAVE_NOTIFY_H */
 
+#ifdef HAVE_DBUS
+#  include <dbus/dbus.h>
+#endif /* HAVE_DBUS */
+
 #ifdef HAVE_SYS_PARAM_H
 #  include <sys/param.h>
 #endif /* HAVE_SYS_PARAM_H */
  * Local functions...
  */
 
-#ifdef HAVE_LAUNCHD
-static void            launchd_checkin(void);
-static void            launchd_checkout(void);
-#endif /* HAVE_LAUNCHD */
 static void            parent_handler(int sig);
 static void            process_children(void);
 static void            sigchld_handler(int sig);
 static void            sighup_handler(int sig);
 static void            sigterm_handler(int sig);
 static long            select_timeout(int fds);
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+static void            service_checkin(void);
+static void            service_checkout(void);
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
 static void            usage(int status) __attribute__((noreturn));
 
 
@@ -118,7 +106,11 @@ main(int  argc,                            /* I - Number of command-line args */
 {
   int                  i;              /* Looping var */
   char                 *opt;           /* Option character */
-  int                  fg;             /* Run in the foreground */
+  int                  close_all = 1,  /* Close all file descriptors? */
+                       disconnect = 1, /* Disconnect from controlling terminal? */
+                       fg = 0,         /* Run in foreground? */
+                       run_as_child = 0;
+                                       /* Running as child process? */
   int                  fds;            /* Number of ready descriptors */
   cupsd_client_t       *con;           /* Current client */
   cupsd_job_t          *job;           /* Current job */
@@ -134,22 +126,15 @@ main(int  argc,                           /* I - Number of command-line args */
 #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
   struct sigaction     action;         /* Actions for POSIX signals */
 #endif /* HAVE_SIGACTION && !HAVE_SIGSET */
-#ifdef __sgi
-  cups_file_t          *fp;            /* Fake lpsched lock file */
-  struct stat          statbuf;        /* Needed for checking lpsched FIFO */
-#endif /* __sgi */
-  int                  run_as_child = 0;
-                                       /* Needed for background fork/exec */
 #ifdef __APPLE__
-  int                  use_sysman = !getuid();
-                                       /* Use system management functions? */
+  int                  use_sysman = 1; /* Use system management functions? */
 #else
   time_t               netif_time = 0; /* Time since last network update */
 #endif /* __APPLE__ */
-#if HAVE_LAUNCHD
-  int                  launchd_idle_exit;
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+  int                  service_idle_exit;
                                        /* Idle exit on select timeout? */
-#endif /* HAVE_LAUNCHD */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
 
 
 #ifdef HAVE_GETEUID
@@ -159,7 +144,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
   if (getuid() != geteuid())
   {
-    fputs("cupsd: Cannot run as a setuid program\n", stderr);
+    fputs("cupsd: Cannot run as a setuid program.\n", stderr);
     return (1);
   }
 #endif /* HAVE_GETEUID */
@@ -173,8 +158,10 @@ main(int  argc,                            /* I - Number of command-line args */
 #ifdef HAVE_LAUNCHD
   if (getenv("CUPSD_LAUNCHD"))
   {
-    Launchd = 1;
-    fg      = 1;
+    OnDemand   = 1;
+    fg         = 1;
+    close_all  = 0;
+    disconnect = 0;
   }
 #endif /* HAVE_LAUNCHD */
 
@@ -185,7 +172,8 @@ main(int  argc,                             /* I - Number of command-line args */
        {
          case 'C' : /* Run as child with config file */
               run_as_child = 1;
-             fg           = -1;
+             fg           = 1;
+             close_all    = 0;
 
          case 'c' : /* Configuration file */
              i ++;
@@ -240,26 +228,33 @@ main(int  argc,                           /* I - Number of command-line args */
              break;
 
           case 'f' : /* Run in foreground... */
-             fg = 1;
+             fg         = 1;
+             disconnect = 0;
+             close_all  = 0;
              break;
 
           case 'F' : /* Run in foreground, but disconnect from terminal... */
-             fg = -1;
+             fg        = 1;
+             close_all = 0;
              break;
 
           case 'h' : /* Show usage/help */
              usage(0);
              break;
 
-          case 'l' : /* Started by launchd... */
-#ifdef HAVE_LAUNCHD
-             Launchd = 1;
-             fg      = 1;
+          case 'l' : /* Started by launchd/systemd... */
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+             OnDemand   = 1;
+             fg         = 1;
+             close_all  = 0;
+             disconnect = 0;
 #else
-             _cupsLangPuts(stderr, _("cupsd: launchd(8) support not compiled "
+             _cupsLangPuts(stderr, _("cupsd: On-demand support not compiled "
                                      "in, running in normal mode."));
-              fg = 0;
-#endif /* HAVE_LAUNCHD */
+              fg         = 0;
+             disconnect = 1;
+             close_all  = 1;
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
              break;
 
           case 'p' : /* Stop immediately for profiling */
@@ -267,12 +262,13 @@ main(int  argc,                           /* I - Number of command-line args */
                     "use only!\n", stderr);
              stop_scheduler = 1;
              fg             = 1;
+             disconnect     = 0;
+             close_all      = 0;
              break;
 
           case 'P' : /* Disable security profiles */
-              fputs("cupsd: -P (disable security profiles) is for internal "
-                    "testing use only!\n", stderr);
-             UseProfiles = 0;
+              fputs("cupsd: -P (disable sandboxing) is for internal testing use only.\n", stderr);
+             UseSandboxing = 0;
              break;
 
           case 's' : /* Set cups-files.conf location */
@@ -309,6 +305,8 @@ main(int  argc,                             /* I - Number of command-line args */
           case 't' : /* Test the cupsd.conf file... */
              TestConfigFile = 1;
              fg             = 1;
+             disconnect     = 0;
+             close_all      = 0;
              break;
 
          default : /* Unknown option */
@@ -325,10 +323,7 @@ main(int  argc,                            /* I - Number of command-line args */
     }
 
   if (!ConfigurationFile)
-  {
     cupsdSetString(&ConfigurationFile, CUPS_SERVERROOT "/cupsd.conf");
-    cupsdSetString(&CupsFilesFile, CUPS_SERVERROOT "/cups-files.conf");
-  }
 
   if (!CupsFilesFile)
   {
@@ -354,13 +349,64 @@ main(int  argc,                           /* I - Number of command-line args */
       return (1);
     }
 
-    strlcpy(slash, "/cups-files.conf", len - (slash - filename));
+    strlcpy(slash, "/cups-files.conf", len - (size_t)(slash - filename));
     cupsdSetString(&CupsFilesFile, filename);
     free(filename);
   }
 
+  if (disconnect)
+  {
+   /*
+    * Make sure we aren't tying up any filesystems...
+    */
+
+    chdir("/");
+
+   /*
+    * Disconnect from the controlling terminal...
+    */
+
+    setsid();
+  }
+
+  if (close_all)
+  {
+   /*
+    * Close all open files...
+    */
+
+    getrlimit(RLIMIT_NOFILE, &limit);
+
+    for (i = 0; i < (int)limit.rlim_cur && i < 1024; i ++)
+      close(i);
+
+   /*
+    * Redirect stdin/out/err to /dev/null...
+    */
+
+    if ((i = open("/dev/null", O_RDONLY)) != 0)
+    {
+      dup2(i, 0);
+      close(i);
+    }
+
+    if ((i = open("/dev/null", O_WRONLY)) != 1)
+    {
+      dup2(i, 1);
+      close(i);
+    }
+
+    if ((i = open("/dev/null", O_WRONLY)) != 2)
+    {
+      dup2(i, 2);
+      close(i);
+    }
+  }
+  else
+    LogStderr = cupsFileStderr();
+
  /*
-  * If the user hasn't specified "-f", run in the background...
+  * Run in the background as needed...
   */
 
   if (!fg)
@@ -435,74 +481,17 @@ main(int  argc,                           /* I - Number of command-line args */
 #endif /* __OpenBSD__ && OpenBSD < 201211 */
 
    /*
-    * Since CoreFoundation and DBUS both create fork-unsafe data on execution of
-    * a program, and since this kind of really unfriendly behavior seems to be
-    * more common these days in system libraries, we need to re-execute the
-    * background cupsd with the "-C" option to avoid problems.  Unfortunately,
-    * we also have to assume that argv[0] contains the name of the cupsd
-    * executable - there is no portable way to get the real pathname...
+    * Since many system libraries create fork-unsafe data on execution of a
+    * program, we need to re-execute the background cupsd with the "-C" and "-s"
+    * options to avoid problems.  Unfortunately, we also have to assume that
+    * argv[0] contains the name of the cupsd executable - there is no portable
+    * way to get the real pathname...
     */
 
-    execlp(argv[0], argv[0], "-C", ConfigurationFile, (char *)0);
+    execlp(argv[0], argv[0], "-C", ConfigurationFile, "-s", CupsFilesFile, (char *)0);
     exit(errno);
   }
 
-  if (fg < 1)
-  {
-   /*
-    * Make sure we aren't tying up any filesystems...
-    */
-
-    chdir("/");
-
-#ifndef DEBUG
-   /*
-    * Disable core dumps...
-    */
-
-    getrlimit(RLIMIT_CORE, &limit);
-    limit.rlim_cur = 0;
-    setrlimit(RLIMIT_CORE, &limit);
-
-   /*
-    * Disconnect from the controlling terminal...
-    */
-
-    setsid();
-
-   /*
-    * Close all open files...
-    */
-
-    getrlimit(RLIMIT_NOFILE, &limit);
-
-    for (i = 0; i < limit.rlim_cur && i < 1024; i ++)
-      close(i);
-
-   /*
-    * Redirect stdin/out/err to /dev/null...
-    */
-
-    if ((i = open("/dev/null", O_RDONLY)) != 0)
-    {
-      dup2(i, 0);
-      close(i);
-    }
-
-    if ((i = open("/dev/null", O_WRONLY)) != 1)
-    {
-      dup2(i, 1);
-      close(i);
-    }
-
-    if ((i = open("/dev/null", O_WRONLY)) != 2)
-    {
-      dup2(i, 2);
-      close(i);
-    }
-#endif /* DEBUG */
-  }
-
  /*
   * Set the timezone info...
   */
@@ -513,6 +502,14 @@ main(int  argc,                            /* I - Number of command-line args */
   setlocale(LC_TIME, "");
 #endif /* LC_TIME */
 
+#ifdef HAVE_DBUS_THREADS_INIT
+ /*
+  * Enable threading support for D-BUS...
+  */
+
+  dbus_threads_init_default();
+#endif /* HAVE_DBUS_THREADS_INIT */
+
  /*
   * Set the maximum number of files...
   */
@@ -531,7 +528,7 @@ main(int  argc,                             /* I - Number of command-line args */
 #endif /* RLIM_INFINITY */
     MaxFDs = limit.rlim_max;
 
-  limit.rlim_cur = MaxFDs;
+  limit.rlim_cur = (rlim_t)MaxFDs;
 
   setrlimit(RLIMIT_NOFILE, &limit);
 
@@ -559,17 +556,18 @@ main(int  argc,                           /* I - Number of command-line args */
 
   cupsdCleanFiles(CacheDir, "*.ipp");
 
-#if HAVE_LAUNCHD
-  if (Launchd)
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+  if (OnDemand)
   {
    /*
-    * If we were started by launchd get the listen sockets file descriptors...
+    * If we were started on demand by launchd or systemd get the listen sockets
+    * file descriptors...
     */
 
-    launchd_checkin();
-    launchd_checkout();
+    service_checkin();
+    service_checkout();
   }
-#endif /* HAVE_LAUNCHD */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
 
  /*
   * Startup the server...
@@ -618,28 +616,6 @@ main(int  argc,                            /* I - Number of command-line args */
   signal(SIGTERM, sigterm_handler);
 #endif /* HAVE_SIGSET */
 
-#ifdef __sgi
- /*
-  * Try to create a fake lpsched lock file if one is not already there.
-  * Some Adobe applications need it under IRIX in order to enable
-  * printing...
-  */
-
-  if ((fp = cupsFileOpen("/var/spool/lp/SCHEDLOCK", "w")) == NULL)
-  {
-    syslog(LOG_LPR, "Unable to create fake lpsched lock file "
-                    "\"/var/spool/lp/SCHEDLOCK\"\' - %s!",
-           strerror(errno));
-  }
-  else
-  {
-    fchmod(cupsFileNumber(fp), 0644);
-    fchown(cupsFileNumber(fp), User, Group);
-
-    cupsFileClose(fp);
-  }
-#endif /* __sgi */
-
  /*
   * Initialize authentication certificates...
   */
@@ -678,18 +654,15 @@ main(int  argc,                           /* I - Number of command-line args */
   * Send server-started event...
   */
 
-#ifdef HAVE_LAUNCHD
-  if (Launchd)
-    cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL,
-                  "Scheduler started via launchd.");
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+  if (OnDemand)
+    cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL, "Scheduler started on demand.");
   else
-#endif /* HAVE_LAUNCHD */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
   if (fg)
-    cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL,
-                  "Scheduler started in foreground.");
+    cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL, "Scheduler started in foreground.");
   else
-    cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL,
-                  "Scheduler started in background.");
+    cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL, "Scheduler started in background.");
 
  /*
   * Start any pending print jobs...
@@ -732,10 +705,10 @@ main(int  argc,                           /* I - Number of command-line args */
        for (con = (cupsd_client_t *)cupsArrayFirst(Clients);
             con;
             con = (cupsd_client_t *)cupsArrayNext(Clients))
-         if (con->http.state == HTTP_WAITING)
+         if (httpGetState(con->http) == HTTP_WAITING)
            cupsdCloseClient(con);
          else
-           con->http.keep_alive = HTTP_KEEPALIVE_OFF;
+           con->http->keep_alive = HTTP_KEEPALIVE_OFF;
 
         cupsdPauseListening();
       }
@@ -763,23 +736,21 @@ main(int  argc,                           /* I - Number of command-line args */
 
         if (!cupsdReadConfiguration())
         {
-          syslog(LOG_LPR, "Unable to read configuration file \'%s\' - exiting!",
-                ConfigurationFile);
-          break;
-       }
-
-#if HAVE_LAUNCHD
-       if (Launchd)
-       {
-        /*
-         * If we were started by launchd, get the listen socket file
-         * descriptors...
-         */
+#ifdef HAVE_ASL_H
+         asl_object_t  m;              /* Log message */
+
+         m = asl_new(ASL_TYPE_MSG);
+         asl_set(m, ASL_KEY_FACILITY, "org.cups.cupsd");
+         asl_log(NULL, m, ASL_LEVEL_ERR, "Unable to read configuration file \"%s\" - exiting.", ConfigurationFile);
+         asl_release(m);
+#elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
+         sd_journal_print(LOG_ERR, "Unable to read configuration file \"%s\" - exiting.", ConfigurationFile);
+#else
+          syslog(LOG_LPR, "Unable to read configuration file \'%s\' - exiting.", ConfigurationFile);
+#endif /* HAVE_ASL_H */
 
-         launchd_checkin();
-         launchd_checkout();
+          break;
        }
-#endif /* HAVE_LAUNCHD */
 
        /*
         * Startup the server...
@@ -810,23 +781,26 @@ main(int  argc,                           /* I - Number of command-line args */
     if ((timeout = select_timeout(fds)) > 1 && LastEvent)
       timeout = 1;
 
-#if HAVE_LAUNCHD
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
    /*
     * If no other work is scheduled and we're being controlled by
     * launchd then timeout after 'LaunchdTimeout' seconds of
     * inactivity...
     */
 
-    if (timeout == 86400 && Launchd && LaunchdTimeout &&
+    if (timeout == 86400 && OnDemand && IdleExitTimeout &&
         !cupsArrayCount(ActiveJobs) &&
+#  ifdef HAVE_SYSTEMD
+        !WebInterface &&
+#  endif /* HAVE_SYSTEMD */
        (!Browsing || !BrowseLocalProtocols || !cupsArrayCount(Printers)))
     {
-      timeout          = LaunchdTimeout;
-      launchd_idle_exit = 1;
+      timeout          = IdleExitTimeout;
+      service_idle_exit = 1;
     }
     else
-      launchd_idle_exit = 0;
-#endif /* HAVE_LAUNCHD */
+      service_idle_exit = 0;
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
 
     if ((fds = cupsdDoSelect(timeout)) < 0)
     {
@@ -854,7 +828,7 @@ main(int  argc,                             /* I - Number of command-line args */
           i ++, con = (cupsd_client_t *)cupsArrayNext(Clients))
         cupsdLogMessage(CUPSD_LOG_EMERG,
                        "Clients[%d] = %d, file = %d, state = %d",
-                       i, con->http.fd, con->file, con->http.state);
+                       i, con->number, con->file, httpGetState(con->http));
 
       for (i = 0, lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
            lis;
@@ -923,13 +897,13 @@ main(int  argc,                           /* I - Number of command-line args */
     }
 #endif /* !__APPLE__ */
 
-#if HAVE_LAUNCHD
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
    /*
     * If no other work was scheduled and we're being controlled by launchd
     * then timeout after 'LaunchdTimeout' seconds of inactivity...
     */
 
-    if (!fds && launchd_idle_exit)
+    if (!fds && service_idle_exit)
     {
       cupsdLogMessage(CUPSD_LOG_INFO,
                       "Printer sharing is off and there are no jobs pending, "
@@ -937,7 +911,7 @@ main(int  argc,                             /* I - Number of command-line args */
       stop_scheduler = 1;
       break;
     }
-#endif /* HAVE_LAUNCHD */
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
 
    /*
     * Resume listening for new connections as needed...
@@ -991,7 +965,7 @@ main(int  argc,                             /* I - Number of command-line args */
       * Process pending data in the input buffer...
       */
 
-      if (con->http.used)
+      if (httpGetReady(con->http))
       {
         cupsdReadClient(con);
        continue;
@@ -1002,11 +976,9 @@ main(int  argc,                           /* I - Number of command-line args */
       */
 
       activity = current_time - Timeout;
-      if (con->http.activity < activity && !con->pipe_pid)
+      if (httpGetActivity(con->http) < activity && !con->pipe_pid)
       {
-        cupsdLogMessage(CUPSD_LOG_DEBUG,
-                       "Closing client %d after %d seconds of inactivity...",
-                       con->http.fd, Timeout);
+        cupsdLogMessage(CUPSD_LOG_DEBUG, "Closing client %d after %d seconds of inactivity.", con->number, Timeout);
 
         cupsdCloseClient(con);
         continue;
@@ -1143,14 +1115,14 @@ main(int  argc,                         /* I - Number of command-line args */
 
   cupsdStopServer();
 
-#ifdef HAVE_LAUNCHD
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
  /*
-  * Update the launchd KeepAlive file as needed...
+  * Update the keep-alive file as needed...
   */
 
-  if (Launchd)
-    launchd_checkout();
-#endif /* HAVE_LAUNCHD */
+  if (OnDemand)
+    service_checkout();
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
 
  /*
   * Stop all jobs...
@@ -1167,18 +1139,6 @@ main(int  argc,                          /* I - Number of command-line args */
     cupsdStopSystemMonitor();
 #endif /* __APPLE__ */
 
-#ifdef __sgi
- /*
-  * Remove the fake IRIX lpsched lock file, but only if the existing
-  * file is not a FIFO which indicates that the real IRIX lpsched is
-  * running...
-  */
-
-  if (!stat("/var/spool/lp/FIFO", &statbuf))
-    if (!S_ISFIFO(statbuf.st_mode))
-      unlink("/var/spool/lp/SCHEDLOCK");
-#endif /* __sgi */
-
   cupsdStopSelect();
 
   return (!stop_scheduler);
@@ -1196,8 +1156,8 @@ cupsdAddString(cups_array_t **a,  /* IO - String array */
   if (!*a)
     *a = cupsArrayNew3((cups_array_func_t)strcmp, NULL,
                       (cups_ahash_func_t)NULL, 0,
-                      (cups_acopy_func_t)_cupsStrAlloc,
-                      (cups_afree_func_t)_cupsStrFree);
+                      (cups_acopy_func_t)strdup,
+                      (cups_afree_func_t)free);
 
   return (cupsArrayAdd(*a, (char *)s));
 }
@@ -1227,7 +1187,7 @@ cupsdClearString(char **s)                /* O - String value */
 {
   if (s && *s)
   {
-    _cupsStrFree(*s);
+    free(*s);
     *s = NULL;
   }
 }
@@ -1308,10 +1268,10 @@ cupsdSetString(char       **s,          /* O - New string */
     return;
 
   if (*s)
-    _cupsStrFree(*s);
+    free(*s);
 
   if (v)
-    *s = _cupsStrAlloc(v);
+    *s = strdup(v);
   else
     *s = NULL;
 }
@@ -1342,274 +1302,83 @@ cupsdSetStringf(char       **s,                /* O - New string */
     vsnprintf(v, sizeof(v), f, ap);
     va_end(ap);
 
-    *s = _cupsStrAlloc(v);
+    *s = strdup(v);
   }
   else
     *s = NULL;
 
   if (olds)
-    _cupsStrFree(olds);
+    free(olds);
 }
 
 
-#ifdef HAVE_LAUNCHD
 /*
- * 'launchd_checkin()' - Check-in with launchd and collect the listening fds.
+ * 'parent_handler()' - Catch USR1/CHLD signals...
  */
 
 static void
-launchd_checkin(void)
+parent_handler(int sig)                        /* I - Signal */
 {
-  size_t               i,              /* Looping var */
-                       count;          /* Number of listeners */
-  launch_data_t                ld_msg,         /* Launch data message */
-                       ld_resp,        /* Launch data response */
-                       ld_array,       /* Launch data array */
-                       ld_sockets,     /* Launch data sockets dictionary */
-                       tmp;            /* Launch data */
-  cupsd_listener_t     *lis;           /* Listeners array */
-  http_addr_t          addr;           /* Address variable */
-  socklen_t            addrlen;        /* Length of address */
-  int                  fd;             /* File descriptor */
-  char                 s[256];         /* String addresss */
-
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "launchd_checkin: pid=%d", (int)getpid());
-
  /*
-  * Check-in with launchd...
+  * Store the signal we got from the OS and return...
   */
 
-  ld_msg = launch_data_new_string(LAUNCH_KEY_CHECKIN);
-  if ((ld_resp = launch_msg(ld_msg)) == NULL)
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                   "launchd_checkin: launch_msg(\"" LAUNCH_KEY_CHECKIN
-                   "\") IPC failure");
-    exit(EXIT_FAILURE);
-    return; /* anti-compiler-warning */
-  }
+  parent_signal = sig;
+}
 
-  if (launch_data_get_type(ld_resp) == LAUNCH_DATA_ERRNO)
-  {
-    errno = launch_data_get_errno(ld_resp);
-    cupsdLogMessage(CUPSD_LOG_ERROR, "launchd_checkin: Check-in failed: %s",
-                    strerror(errno));
-    exit(EXIT_FAILURE);
-    return; /* anti-compiler-warning */
-  }
 
- /*
 * Get the sockets dictionary...
 */
+/*
* 'process_children()' - Process all dead children...
+ */
 
-  if ((ld_sockets = launch_data_dict_lookup(ld_resp, LAUNCH_JOBKEY_SOCKETS))
-          == NULL)
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "launchd_checkin: No sockets found to answer requests on!");
-    exit(EXIT_FAILURE);
-    return; /* anti-compiler-warning */
-  }
+static void
+process_children(void)
+{
+  int          status;                 /* Exit status of child */
+  int          pid,                    /* Process ID of child */
+               job_id;                 /* Job ID of child */
+  cupsd_job_t  *job;                   /* Current job */
+  int          i;                      /* Looping var */
+  char         name[1024];             /* Process name */
+  const char   *type;                  /* Type of program */
+
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "process_children()");
 
  /*
-  * Get the array of listener sockets...
+  * Reset the dead_children flag...
   */
 
-  if ((ld_array = launch_data_dict_lookup(ld_sockets, "Listeners")) == NULL)
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "launchd_checkin: No sockets found to answer requests on!");
-    exit(EXIT_FAILURE);
-    return; /* anti-compiler-warning */
-  }
+  dead_children = 0;
 
  /*
-  * Add listening fd(s) to the Listener array...
+  * Collect the exit status of some children...
   */
 
-  if (launch_data_get_type(ld_array) == LAUNCH_DATA_ARRAY)
+#ifdef HAVE_WAITPID
+  while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
+#elif defined(HAVE_WAIT3)
+  while ((pid = wait3(&status, WNOHANG, NULL)) > 0)
+#else
+  if ((pid = wait(&status)) > 0)
+#endif /* HAVE_WAITPID */
   {
-    count = launch_data_array_get_count(ld_array);
+   /*
+    * Collect the name of the process that finished...
+    */
 
-    for (i = 0; i < count; i ++)
-    {
-     /*
-      * Get the launchd file descriptor and address...
-      */
+    cupsdFinishProcess(pid, name, sizeof(name), &job_id);
 
-      if ((tmp = launch_data_array_get_index(ld_array, i)) != NULL)
-      {
-       fd      = launch_data_get_fd(tmp);
-       addrlen = sizeof(addr);
+   /*
+    * Delete certificates for CGI processes...
+    */
 
-       if (getsockname(fd, (struct sockaddr *)&addr, &addrlen))
-       {
-         cupsdLogMessage(CUPSD_LOG_ERROR,
-                         "launchd_checkin: Unable to get local address - %s",
-                         strerror(errno));
-         continue;
-       }
+    if (pid)
+      cupsdDeleteCert(pid);
 
-       /*
-       * Try to match the launchd socket address to one of the listeners...
-       */
-
-       for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
-            lis;
-            lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
-         if (httpAddrEqual(&lis->address, &addr))
-           break;
-
-       /*
-       * Add a new listener If there's no match...
-       */
-
-       if (lis)
-       {
-         cupsdLogMessage(CUPSD_LOG_DEBUG,
-                 "launchd_checkin: Matched existing listener %s with fd %d...",
-                 httpAddrString(&(lis->address), s, sizeof(s)), fd);
-       }
-       else
-       {
-         cupsdLogMessage(CUPSD_LOG_DEBUG,
-                 "launchd_checkin: Adding new listener %s with fd %d...",
-                 httpAddrString(&addr, s, sizeof(s)), fd);
-
-         if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL)
-         {
-           cupsdLogMessage(CUPSD_LOG_ERROR,
-                           "launchd_checkin: Unable to allocate listener - "
-                           "%s.", strerror(errno));
-           exit(EXIT_FAILURE);
-         }
-
-         cupsArrayAdd(Listeners, lis);
-
-         memcpy(&lis->address, &addr, sizeof(lis->address));
-       }
-
-       lis->fd = fd;
-
-#  ifdef HAVE_SSL
-       if (_httpAddrPort(&(lis->address)) == 443)
-         lis->encryption = HTTP_ENCRYPT_ALWAYS;
-#  endif /* HAVE_SSL */
-      }
-    }
-  }
-
-  launch_data_free(ld_msg);
-  launch_data_free(ld_resp);
-}
-
-
-/*
- * 'launchd_checkout()' - Update the launchd KeepAlive file as needed.
- */
-
-static void
-launchd_checkout(void)
-{
-  int  fd;                             /* File descriptor */
-
-
- /*
-  * Create or remove the launchd KeepAlive file based on whether
-  * there are active jobs, polling, browsing for remote printers or
-  * shared printers to advertise...
-  */
-
-  if (cupsArrayCount(ActiveJobs) ||
-      (Browsing && BrowseLocalProtocols && cupsArrayCount(Printers)))
-  {
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                    "Creating launchd keepalive file \"" CUPS_KEEPALIVE
-                    "\"...");
-
-    if ((fd = open(CUPS_KEEPALIVE, O_RDONLY | O_CREAT | O_EXCL, S_IRUSR)) >= 0)
-      close(fd);
-  }
-  else
-  {
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                    "Removing launchd keepalive file \"" CUPS_KEEPALIVE
-                    "\"...");
-
-    unlink(CUPS_KEEPALIVE);
-  }
-}
-#endif /* HAVE_LAUNCHD */
-
-
-/*
- * 'parent_handler()' - Catch USR1/CHLD signals...
- */
-
-static void
-parent_handler(int sig)                        /* I - Signal */
-{
- /*
-  * Store the signal we got from the OS and return...
-  */
-
-  parent_signal = sig;
-}
-
-
-/*
- * 'process_children()' - Process all dead children...
- */
-
-static void
-process_children(void)
-{
-  int          status;                 /* Exit status of child */
-  int          pid,                    /* Process ID of child */
-               job_id;                 /* Job ID of child */
-  cupsd_job_t  *job;                   /* Current job */
-  int          i;                      /* Looping var */
-  char         name[1024];             /* Process name */
-  const char   *type;                  /* Type of program */
-
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "process_children()");
-
- /*
-  * Reset the dead_children flag...
-  */
-
-  dead_children = 0;
-
- /*
-  * Collect the exit status of some children...
-  */
-
-#ifdef HAVE_WAITPID
-  while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
-#elif defined(HAVE_WAIT3)
-  while ((pid = wait3(&status, WNOHANG, NULL)) > 0)
-#else
-  if ((pid = wait(&status)) > 0)
-#endif /* HAVE_WAITPID */
-  {
-   /*
-    * Collect the name of the process that finished...
-    */
-
-    cupsdFinishProcess(pid, name, sizeof(name), &job_id);
-
-   /*
-    * Delete certificates for CGI processes...
-    */
-
-    if (pid)
-      cupsdDeleteCert(pid);
-
-   /*
-    * Handle completed job filters...
-    */
+   /*
+    * Handle completed job filters...
+    */
 
     if (job_id > 0)
       job = cupsdFindJob(job_id);
@@ -1699,8 +1468,7 @@ process_children(void)
            }
 
            if (job->printer_message)
-             cupsdSetString(&(job->printer_message->values[0].string.text),
-                            message);
+             ippSetString(job->attrs, &job->printer_message, 0, message);
          }
        }
 
@@ -1820,7 +1588,7 @@ select_timeout(int fds)                   /* I - Number of descriptors returned */
   for (con = (cupsd_client_t *)cupsArrayFirst(Clients);
        con;
        con = (cupsd_client_t *)cupsArrayNext(Clients))
-    if (con->http.used > 0)
+    if (httpGetReady(con->http))
       return (0);
 
  /*
@@ -1874,9 +1642,9 @@ select_timeout(int fds)                   /* I - Number of descriptors returned */
   for (con = (cupsd_client_t *)cupsArrayFirst(Clients);
        con;
        con = (cupsd_client_t *)cupsArrayNext(Clients))
-    if ((con->http.activity + Timeout) < timeout)
+    if ((httpGetActivity(con->http) + Timeout) < timeout)
     {
-      timeout = con->http.activity + Timeout;
+      timeout = httpGetActivity(con->http) + Timeout;
       why     = "timeout a client connection";
     }
 
@@ -2040,6 +1808,361 @@ sigterm_handler(int sig)                /* I - Signal number */
 }
 
 
+#if defined(HAVE_LAUNCHD) || defined(HAVE_SYSTEMD)
+/*
+ * 'service_checkin()' - Check-in with launchd and collect the listening fds.
+ */
+
+static void
+service_checkin(void)
+{
+#  ifdef HAVE_LAUNCH_ACTIVATE_SOCKET
+  int                  error;          /* Check-in error, if any */
+  size_t               i,              /* Looping var */
+                       count;          /* Number of listeners */
+  int                  *ld_sockets;    /* Listener sockets */
+  cupsd_listener_t     *lis;           /* Listeners array */
+  http_addr_t          addr;           /* Address variable */
+  socklen_t            addrlen;        /* Length of address */
+  char                 s[256];         /* String addresss */
+
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: pid=%d", (int)getpid());
+
+ /*
+  * Check-in with launchd...
+  */
+
+  if ((error = launch_activate_socket("Listeners", &ld_sockets, &count)) != 0)
+  {
+    cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get listener sockets: %s", strerror(error));
+    exit(EXIT_FAILURE);
+    return; /* anti-compiler-warning */
+  }
+
+ /*
+  * Try to match the launchd sockets to the cupsd listeners...
+  */
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: %d listeners.", (int)count);
+
+  for (i = 0; i < count; i ++)
+  {
+   /*
+    * Get the launchd socket address...
+    */
+
+    addrlen = sizeof(addr);
+
+    if (getsockname(ld_sockets[i], (struct sockaddr *)&addr, &addrlen))
+    {
+      cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get local address for listener #%d: %s", (int)i + 1, strerror(errno));
+      continue;
+    }
+
+    cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Listener #%d at fd %d, \"%s\".", (int)i + 1, ld_sockets[i], httpAddrString(&addr, s, sizeof(s)));
+
+    for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
+        lis;
+        lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
+      if (httpAddrEqual(&lis->address, &addr))
+       break;
+
+   /*
+    * Add a new listener if there's no match...
+    */
+
+    if (lis)
+    {
+      cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Matched existing listener #%d to %s.", (int)i + 1, httpAddrString(&(lis->address), s, sizeof(s)));
+    }
+    else
+    {
+      cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Adding new listener #%d for %s.", (int)i + 1, httpAddrString(&addr, s, sizeof(s)));
+
+      if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL)
+      {
+       cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to allocate listener: %s", strerror(errno));
+       exit(EXIT_FAILURE);
+      }
+
+      cupsArrayAdd(Listeners, lis);
+
+      memcpy(&lis->address, &addr, sizeof(lis->address));
+    }
+
+    lis->fd        = ld_sockets[i];
+    lis->on_demand = 1;
+
+#    ifdef HAVE_SSL
+    if (httpAddrPort(&(lis->address)) == 443)
+      lis->encryption = HTTP_ENCRYPT_ALWAYS;
+#    endif /* HAVE_SSL */
+  }
+
+  free(ld_sockets);
+
+#  elif defined(HAVE_LAUNCHD)
+  size_t               i,              /* Looping var */
+                       count;          /* Number of listeners */
+  launch_data_t                ld_msg,         /* Launch data message */
+                       ld_resp,        /* Launch data response */
+                       ld_array,       /* Launch data array */
+                       ld_sockets,     /* Launch data sockets dictionary */
+                       tmp;            /* Launch data */
+  cupsd_listener_t     *lis;           /* Listeners array */
+  http_addr_t          addr;           /* Address variable */
+  socklen_t            addrlen;        /* Length of address */
+  int                  fd;             /* File descriptor */
+  char                 s[256];         /* String addresss */
+
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: pid=%d", (int)getpid());
+
+ /*
+  * Check-in with launchd...
+  */
+
+  ld_msg = launch_data_new_string(LAUNCH_KEY_CHECKIN);
+  if ((ld_resp = launch_msg(ld_msg)) == NULL)
+  {
+    cupsdLogMessage(CUPSD_LOG_ERROR,
+                   "service_checkin: launch_msg(\"" LAUNCH_KEY_CHECKIN
+                   "\") IPC failure");
+    exit(EXIT_FAILURE);
+    return; /* anti-compiler-warning */
+  }
+
+  if (launch_data_get_type(ld_resp) == LAUNCH_DATA_ERRNO)
+  {
+    errno = launch_data_get_errno(ld_resp);
+    cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Check-in failed: %s",
+                    strerror(errno));
+    exit(EXIT_FAILURE);
+    return; /* anti-compiler-warning */
+  }
+
+ /*
+  * Get the sockets dictionary...
+  */
+
+  if ((ld_sockets = launch_data_dict_lookup(ld_resp, LAUNCH_JOBKEY_SOCKETS))
+          == NULL)
+  {
+    cupsdLogMessage(CUPSD_LOG_ERROR,
+                    "service_checkin: No sockets found to answer requests on.");
+    exit(EXIT_FAILURE);
+    return; /* anti-compiler-warning */
+  }
+
+ /*
+  * Get the array of listener sockets...
+  */
+
+  if ((ld_array = launch_data_dict_lookup(ld_sockets, "Listeners")) == NULL)
+  {
+    cupsdLogMessage(CUPSD_LOG_ERROR,
+                    "service_checkin: No sockets found to answer requests on.");
+    exit(EXIT_FAILURE);
+    return; /* anti-compiler-warning */
+  }
+
+ /*
+  * Add listening fd(s) to the Listener array...
+  */
+
+  if (launch_data_get_type(ld_array) == LAUNCH_DATA_ARRAY)
+  {
+    count = launch_data_array_get_count(ld_array);
+
+    cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: %d listeners.", (int)count);
+
+    for (i = 0; i < count; i ++)
+    {
+     /*
+      * Get the launchd file descriptor and address...
+      */
+
+      if ((tmp = launch_data_array_get_index(ld_array, i)) != NULL)
+      {
+       fd      = launch_data_get_fd(tmp);
+       addrlen = sizeof(addr);
+
+       if (getsockname(fd, (struct sockaddr *)&addr, &addrlen))
+       {
+         cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get local address for listener #%d: %s", (int)i + 1, strerror(errno));
+         continue;
+       }
+
+        cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Listener #%d at fd %d, \"%s\".", (int)i + 1, fd, httpAddrString(&addr, s, sizeof(s)));
+
+       /*
+       * Try to match the launchd socket address to one of the listeners...
+       */
+
+       for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
+            lis;
+            lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
+         if (httpAddrEqual(&lis->address, &addr))
+           break;
+
+       /*
+       * Add a new listener If there's no match...
+       */
+
+       if (lis)
+       {
+         cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Matched existing listener #%d to %s.", (int)i + 1, httpAddrString(&(lis->address), s, sizeof(s)));
+       }
+       else
+       {
+         cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Adding new listener #%d for %s.", (int)i + 1, httpAddrString(&addr, s, sizeof(s)));
+
+         if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL)
+         {
+           cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to allocate listener: %s.", strerror(errno));
+           exit(EXIT_FAILURE);
+         }
+
+         cupsArrayAdd(Listeners, lis);
+
+         memcpy(&lis->address, &addr, sizeof(lis->address));
+       }
+
+       lis->fd        = fd;
+        lis->on_demand = 1;
+
+#    ifdef HAVE_SSL
+       if (httpAddrPort(&(lis->address)) == 443)
+         lis->encryption = HTTP_ENCRYPT_ALWAYS;
+#    endif /* HAVE_SSL */
+      }
+    }
+  }
+
+  launch_data_free(ld_msg);
+  launch_data_free(ld_resp);
+
+#  else /* HAVE_SYSTEMD */
+  int                  i,              /* Looping var */
+                       count;          /* Number of listeners */
+  cupsd_listener_t     *lis;           /* Listeners array */
+  http_addr_t          addr;           /* Address variable */
+  socklen_t            addrlen;        /* Length of address */
+  char                 s[256];         /* String addresss */
+
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: pid=%d", (int)getpid());
+
+ /*
+  * Check-in with systemd...
+  */
+
+  if ((count = sd_listen_fds(0)) < 0)
+  {
+    cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get listener sockets: %s", strerror(-count));
+    exit(EXIT_FAILURE);
+    return; /* anti-compiler-warning */
+  }
+
+ /*
+  * Try to match the systemd sockets to the cupsd listeners...
+  */
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: %d listeners.", count);
+
+  for (i = 0; i < count; i ++)
+  {
+   /*
+    * Get the launchd socket address...
+    */
+
+    addrlen = sizeof(addr);
+
+    if (getsockname(SD_LISTEN_FDS_START + i, (struct sockaddr *)&addr, &addrlen))
+    {
+      cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to get local address for listener #%d: %s", (int)i + 1, strerror(errno));
+      continue;
+    }
+
+    cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Listener #%d at fd %d, \"%s\".", (int)i + 1, SD_LISTEN_FDS_START + i, httpAddrString(&addr, s, sizeof(s)));
+
+    for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
+        lis;
+        lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
+      if (httpAddrEqual(&lis->address, &addr))
+       break;
+
+   /*
+    * Add a new listener if there's no match...
+    */
+
+    if (lis)
+    {
+      cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Matched existing listener #%d to %s.", (int)i + 1, httpAddrString(&(lis->address), s, sizeof(s)));
+    }
+    else
+    {
+      cupsdLogMessage(CUPSD_LOG_DEBUG, "service_checkin: Adding new listener #%d for %s.", (int)i + 1, httpAddrString(&addr, s, sizeof(s)));
+
+      if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL)
+      {
+       cupsdLogMessage(CUPSD_LOG_ERROR, "service_checkin: Unable to allocate listener: %s", strerror(errno));
+       exit(EXIT_FAILURE);
+      }
+
+      cupsArrayAdd(Listeners, lis);
+
+      memcpy(&lis->address, &addr, sizeof(lis->address));
+    }
+
+    lis->fd        = SD_LISTEN_FDS_START + i;
+    lis->on_demand = 1;
+
+#    ifdef HAVE_SSL
+    if (httpAddrPort(&(lis->address)) == 443)
+      lis->encryption = HTTP_ENCRYPT_ALWAYS;
+#    endif /* HAVE_SSL */
+  }
+#  endif /* HAVE_LAUNCH_ACTIVATE_SOCKET */
+}
+
+
+/*
+ * 'service_checkout()' - Update the CUPS_KEEPALIVE file as needed.
+ */
+
+static void
+service_checkout(void)
+{
+  int  fd;                             /* File descriptor */
+
+
+ /*
+  * Create or remove the "keep-alive" file based on whether there are active
+  * jobs or shared printers to advertise...
+  */
+
+  if (cupsArrayCount(ActiveJobs) ||    /* Active jobs */
+      WebInterface ||                  /* Web interface enabled */
+      (Browsing && BrowseLocalProtocols && cupsArrayCount(Printers)))
+                                       /* Printers being shared */
+  {
+    cupsdLogMessage(CUPSD_LOG_DEBUG, "Creating keep-alive file \"" CUPS_KEEPALIVE "\".");
+
+    if ((fd = open(CUPS_KEEPALIVE, O_RDONLY | O_CREAT | O_EXCL, S_IRUSR)) >= 0)
+      close(fd);
+  }
+  else
+  {
+    cupsdLogMessage(CUPSD_LOG_DEBUG, "Removing keep-alive file \"" CUPS_KEEPALIVE "\".");
+
+    unlink(CUPS_KEEPALIVE);
+  }
+}
+#endif /* HAVE_LAUNCHD || HAVE_SYSTEMD */
+
+
 /*
  * 'usage()' - Show scheduler usage.
  */
@@ -2057,7 +2180,7 @@ usage(int status)                 /* O - Exit status */
   _cupsLangPuts(fp, _("  -F                      Run in the foreground but "
                       "detach from console."));
   _cupsLangPuts(fp, _("  -h                      Show this usage message."));
-  _cupsLangPuts(fp, _("  -l                      Run cupsd from launchd(8)."));
+  _cupsLangPuts(fp, _("  -l                      Run cupsd on demand."));
   _cupsLangPuts(fp, _("  -t                      Test the configuration "
                       "file."));
 
@@ -2066,5 +2189,5 @@ usage(int status)                 /* O - Exit status */
 
 
 /*
- * End of "$Id: main.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: main.c 12700 2015-06-08 18:32:35Z msweet $".
  */
index f984548..078953d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: mime-private.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: mime-private.h 3411 2011-09-07 22:31:27Z msweet $"
  *
  *   Private MIME type/conversion database definitions for CUPS.
  *
@@ -41,5 +41,5 @@ extern void   _mimeError(mime_t *mime, const char *format, ...)
 #endif /* !_CUPS_MIME_PRIVATE_H_ */
 
 /*
- * End of "$Id: mime-private.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: mime-private.h 3411 2011-09-07 22:31:27Z msweet $".
  */
index 412c9e0..29d3ebc 100644 (file)
@@ -1,40 +1,16 @@
 /*
- * "$Id: mime.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: mime.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   MIME database file routines for CUPS.
+ * MIME database file routines for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   mimeDelete()           - Delete (free) a MIME database.
- *   mimeDeleteFilter()     - Delete a filter from the MIME database.
- *   mimeDeleteType()       - Delete a type from the MIME database.
- *   _mimeError()           - Show an error message.
- *   mimeFirstFilter()      - Get the first filter in the MIME database.
- *   mimeFirstType()        - Get the first type in the MIME database.
- *   mimeLoad()             - Create a new MIME database from disk.
- *   mimeLoadFilters()      - Load filter definitions from disk.
- *   mimeLoadTypes()        - Load type definitions from disk.
- *   mimeNew()              - Create a new, empty MIME database.
- *   mimeNextFilter()       - Get the next filter in the MIME database.
- *   mimeNextType()         - Get the next type in the MIME database.
- *   mimeNumFilters()       - Get the number of filters in a MIME database.
- *   mimeNumTypes()         - Get the number of types in a MIME database.
- *   mimeSetErrorCallback() - Set the callback for error messages.
- *   mime_add_fcache()      - Add a filter to the filter cache.
- *   mime_compare_fcache()  - Compare two filter cache entries.
- *   mime_delete_fcache()   - Free all memory used by the filter cache.
- *   mime_delete_rules()    - Free all memory for the given rule tree.
- *   mime_load_convs()      - Load a xyz.convs file.
- *   mime_load_types()      - Load a xyz.types file.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -134,7 +110,7 @@ mimeDeleteFilter(mime_t        *mime,       /* I - MIME database */
                filter ? filter->dst->super : "???",
                filter ? filter->cost : -1,
                filter ? CUPS_LLCAST filter->maxsize : CUPS_LLCAST -1));
-               
+
   if (!mime || !filter)
     return;
 
@@ -659,6 +635,9 @@ mime_delete_rules(mime_magic_t *rules)      /* I - Rules to free */
     if (rules->child != NULL)
       mime_delete_rules(rules->child);
 
+    if (rules->op == MIME_MAGIC_REGEX)
+      regfree(&(rules->value.rev));
+
     free(rules);
     rules = next;
   }
@@ -741,7 +720,7 @@ mime_load_convs(
 
     while (*lineptr != '/' && *lineptr != '\n' && *lineptr != '\0' &&
            (temp - super + 1) < MIME_MAX_SUPER)
-      *temp++ = tolower(*lineptr++ & 255);
+      *temp++ = (char)tolower(*lineptr++ & 255);
 
     *temp = '\0';
 
@@ -753,7 +732,7 @@ mime_load_convs(
 
     while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\n' &&
            *lineptr != '\0' && (temp - type + 1) < MIME_MAX_TYPE)
-      *temp++ = tolower(*lineptr++ & 255);
+      *temp++ = (char)tolower(*lineptr++ & 255);
 
     *temp = '\0';
 
@@ -798,7 +777,7 @@ mime_load_convs(
       if (!mime_add_fcache(filtercache, filter, filterpath))
       {
         DEBUG_printf(("mime_load_convs: Filter %s not found in %s.", filter,
-                     filterpath)); 
+                     filterpath));
         _mimeError(mime, "Filter \"%s\" not found.", filter);
         continue;
       }
@@ -814,7 +793,7 @@ mime_load_convs(
 
     while (*lineptr != '/' && *lineptr != '\n' && *lineptr != '\0' &&
            (temp - super + 1) < MIME_MAX_SUPER)
-      *temp++ = tolower(*lineptr++ & 255);
+      *temp++ = (char)tolower(*lineptr++ & 255);
 
     *temp = '\0';
 
@@ -826,7 +805,7 @@ mime_load_convs(
 
     while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\n' &&
            *lineptr != '\0' && (temp - type + 1) < MIME_MAX_TYPE)
-      *temp++ = tolower(*lineptr++ & 255);
+      *temp++ = (char)tolower(*lineptr++ & 255);
 
     *temp = '\0';
 
@@ -836,8 +815,8 @@ mime_load_convs(
       * Force * / * to be "application/octet-stream"...
       */
 
-      strcpy(super, "application");
-      strcpy(type, "octet-stream");
+      strlcpy(super, "application", sizeof(super));
+      strlcpy(type, "octet-stream", sizeof(type));
     }
 
    /*
@@ -865,7 +844,7 @@ mime_load_types(mime_t     *mime,   /* I - MIME database */
                 const char *filename)  /* I - Types file to load */
 {
   cups_file_t  *fp;                    /* Types file */
-  int          linelen;                /* Length of line */
+  size_t       linelen;                /* Length of line */
   char         line[32768],            /* Input line from file */
                *lineptr,               /* Current position in line */
                super[MIME_MAX_SUPER],  /* Super-type name */
@@ -927,7 +906,7 @@ mime_load_types(mime_t     *mime,   /* I - MIME database */
 
     while (*lineptr != '/' && *lineptr != '\n' && *lineptr != '\0' &&
            (temp - super + 1) < MIME_MAX_SUPER)
-      *temp++ = tolower(*lineptr++ & 255);
+      *temp++ = (char)tolower(*lineptr++ & 255);
 
     *temp = '\0';
 
@@ -939,7 +918,7 @@ mime_load_types(mime_t     *mime,   /* I - MIME database */
 
     while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\n' &&
            *lineptr != '\0' && (temp - type + 1) < MIME_MAX_TYPE)
-      *temp++ = tolower(*lineptr++ & 255);
+      *temp++ = (char)tolower(*lineptr++ & 255);
 
     *temp = '\0';
 
@@ -956,5 +935,5 @@ mime_load_types(mime_t     *mime,   /* I - MIME database */
 
 
 /*
- * End of "$Id: mime.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: mime.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 51d7a29..ddd3283 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: mime.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: mime.h 11272 2013-09-10 19:15:36Z msweet $"
  *
  *   MIME type/conversion database definitions for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
+ *   Copyright 2007-2013 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -19,6 +19,7 @@
 #  include <cups/array.h>
 #  include <cups/ipp.h>
 #  include <cups/file.h>
+#  include <regex.h>
 
 
 /*
@@ -58,7 +59,8 @@ typedef enum
   MIME_MAGIC_INT,                      /* Integer/32-bit word matches */
   MIME_MAGIC_LOCALE,                   /* Current locale matches string */
   MIME_MAGIC_CONTAINS,                 /* File contains a string */
-  MIME_MAGIC_ISTRING                   /* Case-insensitive string matches */
+  MIME_MAGIC_ISTRING,                  /* Case-insensitive string matches */
+  MIME_MAGIC_REGEX                     /* Regular expression matches */
 } mime_op_t;
 
 typedef struct _mime_magic_s           /**** MIME Magic Data ****/
@@ -80,6 +82,7 @@ typedef struct _mime_magic_s          /**** MIME Magic Data ****/
     unsigned char charv;               /* Byte value */
     unsigned short shortv;             /* Short value */
     unsigned   intv;                   /* Integer value */
+    regex_t    rev;                    /* Regular expression value */
   }            value;
 } mime_magic_t;
 
@@ -158,5 +161,5 @@ extern void         mimeSetErrorCallback(mime_t *mime, mime_error_cb_t cb,
 #endif /* !_CUPS_MIME_H_ */
 
 /*
- * End of "$Id: mime.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: mime.h 11272 2013-09-10 19:15:36Z msweet $".
  */
index 07b5265..18f9b7c 100644 (file)
@@ -1,23 +1,16 @@
 /*
- * "$Id: network.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: network.c 11497 2014-01-06 21:59:35Z msweet $"
  *
- *   Network interface functions for the CUPS scheduler.
+ * Network interface functions for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   "LICENSE" which should have been included with this file.  If this
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdNetIFFind()   - Find a network interface.
- *   cupsdNetIFFree()   - Free the current network interface list.
- *   cupsdNetIFUpdate() - Update the network interface list as needed...
- *   compare_netif()    - Compare two network interfaces.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * "LICENSE" which should have been included with this file.  If this
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -133,7 +126,10 @@ cupsdNetIFUpdate(void)
   */
 
   if (getifaddrs(&addrs) < 0)
+  {
+    cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdNetIFUpdate: Unable to get interface list - %s", strerror(errno));
     return;
+  }
 
   for (addr = addrs; addr != NULL; addr = addr->ifa_next)
   {
@@ -148,7 +144,10 @@ cupsdNetIFUpdate(void)
 #endif
        ) ||
         addr->ifa_netmask == NULL || addr->ifa_name == NULL)
+    {
+      cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdNetIFUpdate: Ignoring \"%s\".", addr->ifa_name);
       continue;
+    }
 
    /*
     * Try looking up the hostname for the address as needed...
@@ -178,7 +177,10 @@ cupsdNetIFUpdate(void)
 
     hostlen = strlen(hostname);
     if ((temp = calloc(1, sizeof(cupsd_netif_t) + hostlen)) == NULL)
+    {
+      cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdNetIFUpdate: Unable to allocate memory for interface.");
       break;
+    }
 
    /*
     * Copy all of the information...
@@ -264,7 +266,7 @@ cupsdNetIFUpdate(void)
 
       if (match)
       {
-        temp->port = _httpAddrPort(&(lis->address));
+        temp->port = httpAddrPort(&(lis->address));
        break;
       }
     }
@@ -296,5 +298,5 @@ compare_netif(cupsd_netif_t *a,             /* I - First network interface */
 
 
 /*
- * End of "$Id: network.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: network.c 11497 2014-01-06 21:59:35Z msweet $".
  */
index 0570975..411a6d2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: network.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: network.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Network interface definitions for the CUPS scheduler.
  *
@@ -48,5 +48,5 @@ extern void           cupsdNetIFUpdate(void);
 
 
 /*
- * End of "$Id: network.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: network.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index 32067ef..76eb2ee 100644 (file)
@@ -6,6 +6,12 @@
        <true/>
        <key>Label</key>
        <string>org.cups.cups-lpd</string>
+       <key>ProcessType</key>
+       <string>Background</string>
+       <key>EnableTransactions</key>
+       <true/>
+       <key>EnablePressuredExit</key>
+       <true/>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/libexec/cups/daemon/cups-lpd</string>
diff --git a/scheduler/org.cups.cups-lpd.socket b/scheduler/org.cups.cups-lpd.socket
new file mode 100644 (file)
index 0000000..dd5288c
--- /dev/null
@@ -0,0 +1,9 @@
+[Unit]
+Description=CUPS LPD Server Socket
+
+[Socket]
+ListenStream=515
+Accept=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/scheduler/org.cups.cups-lpdAT.service.in b/scheduler/org.cups.cups-lpdAT.service.in
new file mode 100644 (file)
index 0000000..5c78273
--- /dev/null
@@ -0,0 +1,9 @@
+[Unit]
+Description=CUPS LPD server
+Documentation=man:cups-lpd(8)
+
+[Service]
+ExecStart=-@CUPS_SERVERBIN@/daemon/cups-lpd
+StandardInput=socket
+User=@CUPS_USER@
+
diff --git a/scheduler/org.cups.cupsd.path.in b/scheduler/org.cups.cupsd.path.in
new file mode 100644 (file)
index 0000000..1bccc6f
--- /dev/null
@@ -0,0 +1,8 @@
+[Unit]
+Description=CUPS Scheduler
+
+[Path]
+PathExists=@CUPS_CACHEDIR@/org.cups.cupsd
+
+[Install]
+WantedBy=multi-user.target
index ccc861d..c0755c4 100644 (file)
@@ -4,8 +4,12 @@
 <dict>
        <key>Label</key>
        <string>org.cups.cupsd</string>
+       <key>ProcessType</key>
+       <string>Background</string>
        <key>EnableTransactions</key>
        <true/>
+       <key>EnablePressuredExit</key>
+       <true/>
        <key>ExitTimeOut</key>
        <integer>60</integer>
        <key>KeepAlive</key>
@@ -21,8 +25,7 @@
                <string>/usr/sbin/cupsd</string>
                <string>-l</string>
        </array>
-       <!-- These environment variables are only used when CUPS is compiled
-            with --enable-debug-printfs -->
+       <!-- These environment variables are only used when CUPS is compiled with debug-printfs support -->
        <key>EnvironmentVariables</key>
        <dict>
                <key>CUPS_DEBUG_LOG</key>
                <key>CUPS_DEBUG_LEVEL</key>
                <string>3</string>
                <key>CUPS_DEBUG_FILTER</key>
-               <string>^(http|_http|ipp|_ipp|mime).*</string>
+               <string>^(cupsDo|cupsGet|cupsMake|cupsSet|http|_http|ipp|_ipp|mime).*</string>
        </dict>
-       <key>ServiceIPC</key>
-       <true/>
        <key>Sockets</key>
        <dict>
                <key>Listeners</key>
                <array>
                        <dict>
-                               <key>SockNodeName</key>
-                               <string>::1</string>
-                               <key>SockServiceName</key>
-                               <string>ipp</string>
-                       </dict>
-                       <dict>
-                               <key>SockNodeName</key>
-                               <string>127.0.0.1</string>
-                               <key>SockServiceName</key>
-                               <string>ipp</string>
-                       </dict>
-                       <dict>
                                <key>SockPathMode</key>
                                <integer>49663</integer>
                                <key>SockPathName</key>
diff --git a/scheduler/org.cups.cupsd.service.in b/scheduler/org.cups.cupsd.service.in
new file mode 100644 (file)
index 0000000..0a27c76
--- /dev/null
@@ -0,0 +1,11 @@
+[Unit]
+Description=CUPS Scheduler
+Documentation=man:cupsd(8)
+
+[Service]
+ExecStart=@sbindir@/cupsd -l
+Type=simple
+
+[Install]
+Also=org.cups.cupsd.socket org.cups.cupsd.path
+WantedBy=printer.target
diff --git a/scheduler/org.cups.cupsd.socket.in b/scheduler/org.cups.cupsd.socket.in
new file mode 100644 (file)
index 0000000..b0928c5
--- /dev/null
@@ -0,0 +1,8 @@
+[Unit]
+Description=CUPS Scheduler
+
+[Socket]
+ListenStream=@CUPS_DEFAULT_DOMAINSOCKET@
+
+[Install]
+WantedBy=sockets.target
index 75b5983..b9883d4 100644 (file)
@@ -1,32 +1,16 @@
 /*
- * "$Id: policy.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: policy.c 11681 2014-03-05 19:07:24Z msweet $"
  *
- *   Policy routines for the CUPS scheduler.
+ * Policy routines for the CUPS scheduler.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2011, 2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   AddPolicy()              - Add a policy to the system.
- *   cupsdAddPolicyOp()       - Add an operation to a policy.
- *   cupsdCheckPolicy()       - Check the IPP operation and username against a
- *                              policy.
- *   cupsdDeleteAllPolicies() - Delete all policies in memory.
- *   cupsdFindPolicy()        - Find a named policy.
- *   cupsdFindPolicyOp()      - Find a policy operation.
- *   cupsdGetPrivateAttrs()   - Get the private attributes for the current
- *                              request.
- *   compare_ops()            - Compare two operations.
- *   compare_policies()       - Compare two policies.
- *   free_policy()            - Free the memory used by a policy.
- *   hash_op()                - Generate a lookup hash for the operation.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -48,7 +32,7 @@ static int    hash_op(cupsd_location_t *op);
 
 
 /*
- * 'AddPolicy()' - Add a policy to the system.
+ * 'cupsdAddPolicy()' - Add a policy to the system.
  */
 
 cupsd_policy_t *                       /* O - Policy */
@@ -136,7 +120,7 @@ cupsdCheckPolicy(cupsd_policy_t *p, /* I - Policy */
 
   if (!p || !con)
   {
-    cupsdLogMessage(CUPSD_LOG_CRIT, "cupsdCheckPolicy: p=%p, con=%p!", p, con);
+    cupsdLogMessage(CUPSD_LOG_CRIT, "cupsdCheckPolicy: p=%p, con=%p.", p, con);
 
     return ((http_status_t)0);
   }
@@ -147,7 +131,7 @@ cupsdCheckPolicy(cupsd_policy_t *p, /* I - Policy */
 
   if ((po = cupsdFindPolicyOp(p, con->request->request.op.operation_id)) == NULL)
   {
-    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckPolicy: No matching operation, returning 0!");
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckPolicy: No matching operation, returning 0.");
     return ((http_status_t)0);
   }
 
@@ -263,7 +247,7 @@ cupsdFindPolicyOp(cupsd_policy_t *p,        /* I - Policy */
     return (po);
   }
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindPolicyOp: No match found!");
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindPolicyOp: No match found.");
 
   return (NULL);
 }
@@ -293,9 +277,15 @@ cupsdGetPrivateAttrs(
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                   "cupsdGetPrivateAttrs(policy=%p(%s), con=%p(%d), "
                  "printer=%p(%s), owner=\"%s\")", policy, policy->name, con,
-                 con->http.fd, printer, printer ? printer->name : "", owner);
+                 con->number, printer, printer ? printer->name : "", owner);
 #endif /* DEBUG */
 
+  if (!policy)
+  {
+    cupsdLogMessage(CUPSD_LOG_CRIT, "cupsdGetPrivateAttrs: policy=%p, con=%p, printer=%p, owner=\"%s\", DefaultPolicyPtr=%p: This should never happen, please report a bug.", policy, con, printer, owner, DefaultPolicyPtr);
+    policy = DefaultPolicyPtr;
+  }
+
  /*
   * Get the access and attributes lists that correspond to the request...
   */
@@ -513,5 +503,5 @@ hash_op(cupsd_location_t *op)               /* I - Operation */
 
 
 /*
- * End of "$Id: policy.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: policy.c 11681 2014-03-05 19:07:24Z msweet $".
  */
index df17a11..8af88f5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: policy.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: policy.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Policy definitions for the CUPS scheduler.
  *
@@ -59,5 +59,5 @@ extern cups_array_t   *cupsdGetPrivateAttrs(cupsd_policy_t *p,
 
 
 /*
- * End of "$Id: policy.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: policy.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index 48c4a82..61956b7 100644 (file)
@@ -1,59 +1,16 @@
 /*
- * "$Id: printers.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: printers.c 12733 2015-06-12 01:21:05Z msweet $"
  *
- *   Printer routines for the CUPS scheduler.
+ * Printer routines for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdAddPrinter()          - Add a printer to the system.
- *   cupsdCreateCommonData()    - Create the common printer data.
- *   cupsdDeleteAllPrinters()   - Delete all printers from the system.
- *   cupsdDeletePrinter()       - Delete a printer from the system.
- *   cupsdFindDest()            - Find a destination in the list.
- *   cupsdFindPrinter()         - Find a printer in the list.
- *   cupsdLoadAllPrinters()     - Load printers from the printers.conf file.
- *   cupsdRenamePrinter()       - Rename a printer.
- *   cupsdSaveAllPrinters()     - Save all printer definitions to the
- *                                printers.conf file.
- *   cupsdSetAuthInfoRequired() - Set the required authentication info.
- *   cupsdSetDeviceURI()        - Set the device URI for a printer.
- *   cupsdSetPrinterAttr()      - Set a printer attribute.
- *   cupsdSetPrinterAttrs()     - Set printer attributes based upon the PPD
- *                                file.
- *   cupsdSetPrinterReasons()   - Set/update the reasons strings.
- *   cupsdSetPrinterState()     - Update the current state of a printer.
- *   cupsdStopPrinter()         - Stop a printer from printing any jobs...
- *   cupsdUpdatePrinterPPD()    - Update keywords in a printer's PPD file.
- *   cupsdUpdatePrinters()      - Update printers after a partial reload.
- *   cupsdValidateDest()        - Validate a printer/class destination.
- *   cupsdWritePrintcap()       - Write a pseudo-printcap file for older
- *                                applications that need it...
- *   add_printer_defaults()     - Add name-default attributes to the printer
- *                                attributes.
- *   add_printer_filter()       - Add a MIME filter for a printer.
- *   add_printer_formats()      - Add document-format-supported values for a
- *                                printer.
- *   compare_printers()         - Compare two printers.
- *   delete_printer_filters()   - Delete all MIME filters for a printer.
- *   dirty_printer()            - Mark config and state files dirty for the
- *                                specified printer.
- *   load_ppd()                 - Load a cached PPD file, updating the cache as
- *                                needed.
- *   new_media_col()            - Create a media-col collection value.
- *   write_irix_config()        - Update the config files used by the IRIX
- *                                desktop tools.
- *   write_irix_state()         - Update the status files used by IRIX printing
- *                                desktop tools.
- *   write_xml_string()         - Write a string with XML escaping.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -93,13 +50,8 @@ static int   compare_printers(void *first, void *second, void *data);
 static void    delete_printer_filters(cupsd_printer_t *p);
 static void    dirty_printer(cupsd_printer_t *p);
 static void    load_ppd(cupsd_printer_t *p);
-static void    log_ipp_conformance(cupsd_printer_t *p, const char *reason);
 static ipp_t   *new_media_col(_pwg_size_t *size, const char *source,
                               const char *type);
-#ifdef __sgi
-static void    write_irix_config(cupsd_printer_t *p);
-static void    write_irix_state(cupsd_printer_t *p);
-#endif /* __sgi */
 static void    write_xml_string(cups_file_t *fp, const char *s);
 
 
@@ -139,15 +91,16 @@ cupsdAddPrinter(const char *name)  /* I - Name of printer */
   httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
                   ServerName, RemotePort, "/printers/%s", name);
   cupsdSetString(&p->uri, uri);
-  cupsdSetString(&p->uuid, _httpAssembleUUID(ServerName, RemotePort, name, 0,
-                                             uuid, sizeof(uuid)));
+  cupsdSetString(&p->uuid, httpAssembleUUID(ServerName, RemotePort, name, 0,
+                                            uuid, sizeof(uuid)));
   cupsdSetDeviceURI(p, "file:///dev/null");
 
-  p->state      = IPP_PRINTER_STOPPED;
-  p->state_time = time(NULL);
-  p->accepting  = 0;
-  p->shared     = DefaultShared;
-  p->filetype   = mimeAddType(MimeDatabase, "printer", name);
+  p->config_time = time(NULL);
+  p->state       = IPP_PRINTER_STOPPED;
+  p->state_time  = time(NULL);
+  p->accepting   = 0;
+  p->shared      = DefaultShared;
+  p->filetype    = mimeAddType(MimeDatabase, "printer", name);
 
   cupsdSetString(&p->job_sheets[0], "none");
   cupsdSetString(&p->job_sheets[1], "none");
@@ -219,6 +172,10 @@ cupsdCreateCommonData(void)
                  "third-shift",
                  "weekend"
                };
+  static const char * const features[] =/* ipp-features-supported values */
+               {
+                 "subscription-object"
+               };
   static const char * const versions[] =/* ipp-versions-supported values */
                {
                  "1.0",
@@ -228,54 +185,53 @@ cupsdCreateCommonData(void)
                };
   static const int     ops[] =         /* operations-supported values */
                {
-                 IPP_PRINT_JOB,
-                 IPP_VALIDATE_JOB,
-                 IPP_CREATE_JOB,
-                 IPP_SEND_DOCUMENT,
-                 IPP_CANCEL_JOB,
-                 IPP_GET_JOB_ATTRIBUTES,
-                 IPP_GET_JOBS,
-                 IPP_GET_PRINTER_ATTRIBUTES,
-                 IPP_HOLD_JOB,
-                 IPP_RELEASE_JOB,
-                 IPP_RESTART_JOB,
-                 IPP_PAUSE_PRINTER,
-                 IPP_RESUME_PRINTER,
-                 IPP_PURGE_JOBS,
-                 IPP_SET_PRINTER_ATTRIBUTES,
-                 IPP_SET_JOB_ATTRIBUTES,
-                 IPP_GET_PRINTER_SUPPORTED_VALUES,
-                 IPP_CREATE_PRINTER_SUBSCRIPTION,
-                 IPP_CREATE_JOB_SUBSCRIPTION,
-                 IPP_GET_SUBSCRIPTION_ATTRIBUTES,
-                 IPP_GET_SUBSCRIPTIONS,
-                 IPP_RENEW_SUBSCRIPTION,
-                 IPP_CANCEL_SUBSCRIPTION,
-                 IPP_GET_NOTIFICATIONS,
-                 IPP_ENABLE_PRINTER,
-                 IPP_DISABLE_PRINTER,
-                 IPP_HOLD_NEW_JOBS,
-                 IPP_RELEASE_HELD_NEW_JOBS,
-                 IPP_CANCEL_JOBS,
-                 IPP_CANCEL_MY_JOBS,
-                 IPP_CLOSE_JOB,
-                 CUPS_GET_DEFAULT,
-                 CUPS_GET_PRINTERS,
-                 CUPS_ADD_PRINTER,
-                 CUPS_DELETE_PRINTER,
-                 CUPS_GET_CLASSES,
-                 CUPS_ADD_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,
-                 CUPS_GET_DOCUMENT,
-                 IPP_RESTART_JOB
+                 IPP_OP_PRINT_JOB,
+                 IPP_OP_VALIDATE_JOB,
+                 IPP_OP_CREATE_JOB,
+                 IPP_OP_SEND_DOCUMENT,
+                 IPP_OP_CANCEL_JOB,
+                 IPP_OP_GET_JOB_ATTRIBUTES,
+                 IPP_OP_GET_JOBS,
+                 IPP_OP_GET_PRINTER_ATTRIBUTES,
+                 IPP_OP_HOLD_JOB,
+                 IPP_OP_RELEASE_JOB,
+                 IPP_OP_PAUSE_PRINTER,
+                 IPP_OP_RESUME_PRINTER,
+                 IPP_OP_PURGE_JOBS,
+                 IPP_OP_SET_PRINTER_ATTRIBUTES,
+                 IPP_OP_SET_JOB_ATTRIBUTES,
+                 IPP_OP_GET_PRINTER_SUPPORTED_VALUES,
+                 IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS,
+                 IPP_OP_CREATE_JOB_SUBSCRIPTIONS,
+                 IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES,
+                 IPP_OP_GET_SUBSCRIPTIONS,
+                 IPP_OP_RENEW_SUBSCRIPTION,
+                 IPP_OP_CANCEL_SUBSCRIPTION,
+                 IPP_OP_GET_NOTIFICATIONS,
+                 IPP_OP_ENABLE_PRINTER,
+                 IPP_OP_DISABLE_PRINTER,
+                 IPP_OP_HOLD_NEW_JOBS,
+                 IPP_OP_RELEASE_HELD_NEW_JOBS,
+                 IPP_OP_CANCEL_JOBS,
+                 IPP_OP_CANCEL_MY_JOBS,
+                 IPP_OP_CLOSE_JOB,
+                 IPP_OP_CUPS_GET_DEFAULT,
+                 IPP_OP_CUPS_GET_PRINTERS,
+                 IPP_OP_CUPS_ADD_MODIFY_PRINTER,
+                 IPP_OP_CUPS_DELETE_PRINTER,
+                 IPP_OP_CUPS_GET_CLASSES,
+                 IPP_OP_CUPS_ADD_MODIFY_CLASS,
+                 IPP_OP_CUPS_DELETE_CLASS,
+                 IPP_OP_CUPS_ACCEPT_JOBS,
+                 IPP_OP_CUPS_REJECT_JOBS,
+                 IPP_OP_CUPS_SET_DEFAULT,
+                 IPP_OP_CUPS_GET_DEVICES,
+                 IPP_OP_CUPS_GET_PPDS,
+                 IPP_OP_CUPS_MOVE_JOB,
+                 IPP_OP_CUPS_AUTHENTICATE_JOB,
+                 IPP_OP_CUPS_GET_PPD,
+                 IPP_OP_CUPS_GET_DOCUMENT,
+                 IPP_OP_RESTART_JOB
                };
   static const char * const charsets[] =/* charset-supported values */
                {
@@ -348,9 +304,9 @@ cupsdCreateCommonData(void)
                  "multiple-document-handling",
                  "number-up",
                  "output-bin",
-                 "output-mode",
                  "orientation-requested",
                  "page-ranges",
+                 "print-color-mode",
                  "print-quality",
                  "printer-resolution",
                  "sides"
@@ -367,9 +323,9 @@ cupsdCreateCommonData(void)
                  "multiple-document-handling",
                  "number-up",
                  "output-bin",
-                 "output-mode",
                  "orientation-requested",
                  "page-ranges",
+                 "print-color-mode",
                  "print-quality",
                  "printer-resolution",
                  "sides"
@@ -388,8 +344,11 @@ cupsdCreateCommonData(void)
                };
   static const char * const printer_settable[] =
                {                       /* printer-settable-attributes-supported */
+                 "printer-geo-location",
                  "printer-info",
-                 "printer-location"
+                 "printer-location",
+                 "printer-organization",
+                 "printer-organizational-unit"
                };
   static const char * const which_jobs[] =
                {                       /* which-jobs-supported values */
@@ -469,6 +428,9 @@ cupsdCreateCommonData(void)
   ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE,
                "generated-natural-language-supported", NULL, DefaultLanguage);
 
+  /* ipp-features-supported */
+  ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-features-supported", sizeof(features) / sizeof(features[0]), NULL, features);
+
   /* ipp-versions-supported */
   ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
                 "ipp-versions-supported", sizeof(versions) / sizeof(versions[0]),
@@ -478,6 +440,10 @@ cupsdCreateCommonData(void)
   ippAddInteger(CommonData, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
                 "ippget-event-life", 15);
 
+  /* job-cancel-after-supported */
+  ippAddRange(CommonData, IPP_TAG_PRINTER, "job-cancel-after-supported",
+              0, INT_MAX);
+
   /* job-creation-attributes-supported */
   ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
                 "job-creation-attributes-supported",
@@ -578,6 +544,9 @@ cupsdCreateCommonData(void)
   ippAddInteger(CommonData, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
                 "multiple-operation-time-out", MultipleOperationTimeout);
 
+  /* multiple-operation-time-out-action */
+  ippAddString(CommonData, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "multiple-operation-time-out-action", NULL, "process-job");
+
   /* natural-language-configured (no IPP_TAG_COPY) */
   ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE,
                "natural-language-configured", NULL, DefaultLanguage);
@@ -663,6 +632,9 @@ cupsdCreateCommonData(void)
   ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
                "pdl-override-supported", NULL, "attempted");
 
+  /* printer-get-attributes-supported */
+  ippAddString(CommonData, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-get-attributes-supported", NULL, "document-format");
+
   /* printer-op-policy-supported */
   attr = ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_NAME | IPP_TAG_COPY,
                        "printer-op-policy-supported", cupsArrayCount(Policies),
@@ -720,9 +692,6 @@ cupsdDeletePrinter(
 {
   int  i,                              /* Looping var */
        changed = 0;                    /* Class changed? */
-#ifdef __sgi
-  char filename[1024];                 /* Interface script filename */
-#endif /* __sgi */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDeletePrinter(p=%p(%s), update=%d)",
@@ -756,31 +725,6 @@ cupsdDeletePrinter(
   cupsArrayRemove(Printers, p);
 
  /*
-  * Remove the dummy interface/icon/option files under IRIX...
-  */
-
-#ifdef __sgi
-  snprintf(filename, sizeof(filename), "/var/spool/lp/interface/%s", p->name);
-  unlink(filename);
-
-  snprintf(filename, sizeof(filename), "/var/spool/lp/gui_interface/ELF/%s.gui",
-           p->name);
-  unlink(filename);
-
-  snprintf(filename, sizeof(filename), "/var/spool/lp/activeicons/%s", p->name);
-  unlink(filename);
-
-  snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.config", p->name);
-  unlink(filename);
-
-  snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.status", p->name);
-  unlink(filename);
-
-  snprintf(filename, sizeof(filename), "/var/spool/lp/member/%s", p->name);
-  unlink(filename);
-#endif /* __sgi */
-
- /*
   * If p is the default printer, assign a different one...
   */
 
@@ -824,6 +768,7 @@ cupsdDeletePrinter(
   cupsdClearString(&p->hostname);
   cupsdClearString(&p->name);
   cupsdClearString(&p->location);
+  cupsdClearString(&p->geo_location);
   cupsdClearString(&p->make_model);
   cupsdClearString(&p->info);
   cupsdClearString(&p->job_sheets[0]);
@@ -957,7 +902,7 @@ cupsdLoadAllPrinters(void)
         cupsdLogMessage(CUPSD_LOG_ERROR,
                        "Syntax error on line %d of printers.conf.", linenum);
     }
-    else if (!_cups_strcasecmp(line, "</Printer>"))
+    else if (!_cups_strcasecmp(line, "</Printer>") || !_cups_strcasecmp(line, "</DefaultPrinter>"))
     {
       if (p != NULL)
       {
@@ -1033,6 +978,21 @@ cupsdLoadAllPrinters(void)
       if (value)
        cupsdSetString(&p->location, value);
     }
+    else if (!_cups_strcasecmp(line, "GeoLocation"))
+    {
+      if (value)
+        cupsdSetString(&p->geo_location, value);
+    }
+    else if (!_cups_strcasecmp(line, "Organization"))
+    {
+      if (value)
+       cupsdSetString(&p->organization, value);
+    }
+    else if (!_cups_strcasecmp(line, "OrganizationalUnit"))
+    {
+      if (value)
+       cupsdSetString(&p->organizational_unit, value);
+    }
     else if (!_cups_strcasecmp(line, "DeviceURI"))
     {
       if (value)
@@ -1137,6 +1097,15 @@ cupsdLoadAllPrinters(void)
       if (value)
         p->state_time = atoi(value);
     }
+    else if (!_cups_strcasecmp(line, "ConfigTime"))
+    {
+     /*
+      * Set the config time...
+      */
+
+      if (value)
+        p->config_time = atoi(value);
+    }
     else if (!_cups_strcasecmp(line, "Accepting"))
     {
      /*
@@ -1160,7 +1129,7 @@ cupsdLoadAllPrinters(void)
     else if (!_cups_strcasecmp(line, "Type"))
     {
       if (value)
-        p->type = atoi(value);
+        p->type = (cups_ptype_t)atoi(value);
       else
        cupsdLogMessage(CUPSD_LOG_ERROR,
                        "Syntax error on line %d of printers.conf.", linenum);
@@ -1287,10 +1256,17 @@ cupsdLoadAllPrinters(void)
     else if (!_cups_strcasecmp(line, "ErrorPolicy"))
     {
       if (value)
-        cupsdSetString(&p->error_policy, value);
+      {
+       if (strcmp(value, "retry-current-job") &&
+           strcmp(value, "abort-job") &&
+           strcmp(value, "retry-job") &&
+           strcmp(value, "stop-printer"))
+         cupsdLogMessage(CUPSD_LOG_ALERT, "Invalid ErrorPolicy \"%s\" on line %d or printers.conf.", ErrorPolicy, linenum);
+       else
+         cupsdSetString(&p->error_policy, value);
+      }
       else
-       cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "Syntax error on line %d of printers.conf.", linenum);
+       cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d of printers.conf.", linenum);
     }
     else if (!_cups_strcasecmp(line, "Attribute") && value)
     {
@@ -1486,9 +1462,18 @@ cupsdSaveAllPrinters(void)
     if (printer->location)
       cupsFilePutConf(fp, "Location", printer->location);
 
+    if (printer->geo_location)
+      cupsFilePutConf(fp, "GeoLocation", printer->geo_location);
+
     if (printer->make_model)
       cupsFilePutConf(fp, "MakeModel", printer->make_model);
 
+    if (printer->organization)
+      cupsFilePutConf(fp, "Organization", printer->organization);
+
+    if (printer->organizational_unit)
+      cupsFilePutConf(fp, "OrganizationalUnit", printer->organizational_unit);
+
     cupsFilePutConf(fp, "DeviceURI", printer->device_uri);
 
     if (printer->port_monitor)
@@ -1498,13 +1483,14 @@ cupsdSaveAllPrinters(void)
     {
       cupsFilePuts(fp, "State Stopped\n");
 
-      if (printer->state_message)
+      if (printer->state_message[0])
         cupsFilePutConf(fp, "StateMessage", printer->state_message);
     }
     else
       cupsFilePuts(fp, "State Idle\n");
 
     cupsFilePrintf(fp, "StateTime %d\n", (int)printer->state_time);
+    cupsFilePrintf(fp, "ConfigTime %d\n", (int)printer->config_time);
 
     for (i = 0; i < printer->num_reasons; i ++)
       if (strcmp(printer->reasons[i], "connecting-to-device") &&
@@ -1562,8 +1548,7 @@ cupsdSaveAllPrinters(void)
         if (i)
          *ptr++ = ',';
 
-        strlcpy(ptr, marker->values[i].string.text,
-               value + sizeof(value) - ptr);
+        strlcpy(ptr, marker->values[i].string.text, (size_t)(value + sizeof(value) - ptr));
         ptr += strlen(ptr);
       }
 
@@ -1622,8 +1607,7 @@ cupsdSaveAllPrinters(void)
         if (i)
          *ptr++ = ',';
 
-        strlcpy(ptr, marker->values[i].string.text,
-               value + sizeof(value) - ptr);
+        strlcpy(ptr, marker->values[i].string.text, (size_t)(value + sizeof(value) - ptr));
         ptr += strlen(ptr);
       }
 
@@ -1643,8 +1627,7 @@ cupsdSaveAllPrinters(void)
         if (i)
          *ptr++ = ',';
 
-        strlcpy(ptr, marker->values[i].string.text,
-               value + sizeof(value) - ptr);
+        strlcpy(ptr, marker->values[i].string.text, (size_t)(value + sizeof(value) - ptr));
         ptr += strlen(ptr);
       }
 
@@ -1656,15 +1639,10 @@ cupsdSaveAllPrinters(void)
       cupsFilePrintf(fp, "Attribute marker-change-time %ld\n",
                      (long)printer->marker_time);
 
-    cupsFilePuts(fp, "</Printer>\n");
-
-#ifdef __sgi
-    /*
-     * Make IRIX desktop & printer status happy
-     */
-
-    write_irix_state(printer);
-#endif /* __sgi */
+    if (printer == DefaultPrinter)
+      cupsFilePuts(fp, "</DefaultPrinter>\n");
+    else
+      cupsFilePuts(fp, "</Printer>\n");
   }
 
   cupsdCloseCreatedConfFile(fp, filename);
@@ -1767,7 +1745,7 @@ cupsdSetAuthInfoRequired(
         strcmp(p->auth_info_required[0], "none"))
       p->type |= CUPS_PRINTER_AUTHENTICATED;
     else
-      p->type &= ~CUPS_PRINTER_AUTHENTICATED;
+      p->type &= (cups_ptype_t)~CUPS_PRINTER_AUTHENTICATED;
 
     return (1);
   }
@@ -1910,12 +1888,13 @@ void
 cupsdSetPrinterAttr(
     cupsd_printer_t *p,                        /* I - Printer */
     const char      *name,             /* I - Attribute name */
-    char            *value)            /* I - Attribute value string */
+    const char      *value)            /* I - Attribute value string */
 {
   ipp_attribute_t      *attr;          /* Attribute */
   int                  i,              /* Looping var */
                        count;          /* Number of values */
-  char                 *ptr,           /* Pointer into value */
+  char                 *temp,          /* Temporary copy of value string */
+                       *ptr,           /* Pointer into value */
                        *start,         /* Start of value */
                        quote;          /* Quote character */
   ipp_tag_t            value_tag;      /* Value tag for this attribute */
@@ -1932,10 +1911,21 @@ cupsdSetPrinterAttr(
   }
 
  /*
+  * Copy the value string so we can do what we want with it...
+  */
+
+  if ((temp = strdup(value)) == NULL)
+  {
+    cupsdLogMessage(CUPSD_LOG_ERROR,
+                    "Unable to duplicate value for \"%s\" attribute.", name);
+    return;
+  }
+
+ /*
   * Count the number of values...
   */
 
-  for (count = 1, quote = '\0', ptr = value;
+  for (count = 1, quote = '\0', ptr = temp;
        *ptr;
        ptr ++)
   {
@@ -1977,21 +1967,22 @@ cupsdSetPrinterAttr(
 
     if (!attr)
     {
+      free(temp);
       cupsdLogMessage(CUPSD_LOG_ERROR,
                       "Unable to allocate memory for printer attribute "
                      "(%d values)", count);
       return;
     }
 
-    for (i = 0; i < count; i ++)
+    for (i = 0, start = temp; i < count; i ++)
     {
-      if ((ptr = strchr(value, ',')) != NULL)
+      if ((ptr = strchr(start, ',')) != NULL)
         *ptr++ = '\0';
 
-      attr->values[i].integer = strtol(value, NULL, 10);
+      attr->values[i].integer = strtol(start, NULL, 10);
 
       if (ptr)
-        value = ptr;
+        start = ptr;
     }
   }
   else
@@ -2027,13 +2018,14 @@ cupsdSetPrinterAttr(
 
     if (!attr)
     {
+      free(temp);
       cupsdLogMessage(CUPSD_LOG_ERROR,
                       "Unable to allocate memory for printer attribute "
                      "(%d values)", count);
       return;
     }
 
-    for (i = 0, quote = '\0', ptr = value; i < count; i ++)
+    for (i = 0, quote = '\0', ptr = temp; i < count; i ++)
     {
       for (start = ptr; *ptr; ptr ++)
       {
@@ -2062,6 +2054,79 @@ cupsdSetPrinterAttr(
       attr->values[i].string.text = _cupsStrAlloc(start);
     }
   }
+
+  free(temp);
+
+ /*
+  * Update the printer-supply and printer-supply-description, as needed...
+  */
+
+  if (!strcmp(name, "marker-names"))
+  {
+    ipp_attribute_t *supply_desc = ippFindAttribute(p->attrs, "printer-supply-description", IPP_TAG_TEXT);
+                                       /* printer-supply-description attribute */
+
+    if (supply_desc != NULL)
+      ippDeleteAttribute(p->attrs, supply_desc);
+
+    supply_desc = ippCopyAttribute(p->attrs, attr, 0);
+    ippSetName(p->attrs, &supply_desc, "printer-supply-description");
+    ippSetValueTag(p->attrs, &supply_desc, IPP_TAG_TEXT);
+  }
+  else if (!strcmp(name, "marker-colors") || !strcmp(name, "marker-levels") || !strcmp(name, "marker-types"))
+  {
+    char       buffer[256],            /* printer-supply values */
+               pstype[64],             /* printer-supply type value */
+               *psptr;                 /* Pointer into type */
+    const char *color,                 /* marker-colors value */
+               *type;                  /* marker-types value */
+    int                level;                  /* marker-levels value */
+    ipp_attribute_t *colors = ippFindAttribute(p->attrs, "marker-colors", IPP_TAG_NAME);
+                                       /* marker-colors attribute */
+    ipp_attribute_t *levels = ippFindAttribute(p->attrs, "marker-levels", IPP_TAG_INTEGER);
+                                       /* marker-levels attribute */
+    ipp_attribute_t *types = ippFindAttribute(p->attrs, "marker-types", IPP_TAG_KEYWORD);
+                                       /* marker-types attribute */
+    ipp_attribute_t *supply = ippFindAttribute(p->attrs, "printer-supply", IPP_TAG_STRING);
+                                       /* printer-supply attribute */
+
+    if (supply != NULL)
+    {
+      ippDeleteAttribute(p->attrs, supply);
+      supply = NULL;
+    }
+
+    if (!colors || !levels || !types)
+      return;
+
+    count = ippGetCount(colors);
+    if (count != ippGetCount(levels) || count != ippGetCount(types))
+      return;
+
+    for (i = 0; i < count; i ++)
+    {
+      color = ippGetString(colors, i, NULL);
+      level = ippGetInteger(levels, i);
+      type  = ippGetString(types, i, NULL);
+
+      for (psptr = pstype; *type && psptr < (pstype + sizeof(pstype) - 1); type ++)
+        if (*type == '-')
+       {
+         type ++;
+         *psptr++ = (char)toupper(*type & 255);
+       }
+       else
+         *psptr++ = *type;
+      *psptr = '\0';
+
+      snprintf(buffer, sizeof(buffer), "index=%d;class=%s;type=%s;unit=percent;maxcapacity=100;level=%d;colorantname=%s;", i + 1, strncmp(pstype, "waste", 5) ? "supplyThatIsConsumed" : "receptacleThatIsFilled", pstype, level, color);
+
+      if (!i)
+        supply = ippAddOctetString(p->attrs, IPP_TAG_PRINTER, "printer-supply", buffer, (int)strlen(buffer));
+      else
+        ippSetOctetString(p->attrs, &supply, i, buffer, (int)strlen(buffer));
+    }
+  }
 }
 
 
@@ -2121,10 +2186,8 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
     if ((auth_type = auth->type) == CUPSD_AUTH_DEFAULT)
       auth_type = cupsdDefaultAuthType();
 
-    if (auth_type == CUPSD_AUTH_BASIC || auth_type == CUPSD_AUTH_BASICDIGEST)
+    if (auth_type == CUPSD_AUTH_BASIC)
       auth_supported = "basic";
-    else if (auth_type == CUPSD_AUTH_DIGEST)
-      auth_supported = "digest";
 #ifdef HAVE_GSSAPI
     else if (auth_type == CUPSD_AUTH_NEGOTIATE)
       auth_supported = "negotiate";
@@ -2133,10 +2196,10 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
     if (auth_type != CUPSD_AUTH_NONE)
       p->type |= CUPS_PRINTER_AUTHENTICATED;
     else
-      p->type &= ~CUPS_PRINTER_AUTHENTICATED;
+      p->type &= (cups_ptype_t)~CUPS_PRINTER_AUTHENTICATED;
   }
   else
-    p->type &= ~CUPS_PRINTER_AUTHENTICATED;
+    p->type &= (cups_ptype_t)~CUPS_PRINTER_AUTHENTICATED;
 
  /*
   * Create the required IPP attributes for a printer...
@@ -2153,10 +2216,15 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
                p->name);
   ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location",
                NULL, p->location ? p->location : "");
+  if (p->geo_location)
+    ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-geo-location", NULL, p->geo_location);
+  else
+    ippAddOutOfBand(p->attrs, IPP_TAG_PRINTER, IPP_TAG_UNKNOWN, "printer-geo-location");
   ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info",
                NULL, p->info ? p->info : "");
-  ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL,
-              p->uuid);
+  ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-organization", NULL, p->organization ? p->organization : "");
+  ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-organizational-unit", NULL, p->organizational_unit ? p->organizational_unit : "");
+  ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL, p->uuid);
 
   if (cupsArrayCount(p->users) > 0)
   {
@@ -2172,7 +2240,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
     for (i = 0, name = (char *)cupsArrayFirst(p->users);
          name;
         i ++, name = (char *)cupsArrayNext(p->users))
-      attr->values[i].string.text = _cupsStrRetain(name);
+      attr->values[i].string.text = _cupsStrAlloc(name);
   }
 
   ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
@@ -2215,7 +2283,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
   if (p->type & CUPS_PRINTER_CLASS)
   {
     p->raw = 1;
-    p->type &= ~CUPS_PRINTER_OPTIONS;
+    p->type &= (cups_ptype_t)~CUPS_PRINTER_OPTIONS;
 
    /*
     * Add class-specific attributes...
@@ -2239,9 +2307,9 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
       for (i = 0; i < p->num_printers; i ++)
       {
        if (attr != NULL)
-         attr->values[i].string.text = _cupsStrRetain(p->printers[i]->name);
+         attr->values[i].string.text = _cupsStrAlloc(p->printers[i]->name);
 
-       p->type &= ~CUPS_PRINTER_OPTIONS | p->printers[i]->type;
+       p->type &= (cups_ptype_t)~CUPS_PRINTER_OPTIONS | p->printers[i]->type;
       }
     }
   }
@@ -2339,7 +2407,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
       {
        for (i = 0; i < oldattr->num_values; i ++)
          attr->values[i].string.text =
-             _cupsStrRetain(oldattr->values[i].string.text);
+             _cupsStrAlloc(oldattr->values[i].string.text);
       }
     }
 
@@ -2393,7 +2461,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
       {
        for (i = 0; i < oldattr->num_values; i ++)
          attr->values[i].string.text =
-             _cupsStrRetain(oldattr->values[i].string.text);
+             _cupsStrAlloc(oldattr->values[i].string.text);
       }
     }
 
@@ -2406,7 +2474,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
       {
        for (i = 0; i < oldattr->num_values; i ++)
          attr->values[i].string.text =
-             _cupsStrRetain(oldattr->values[i].string.text);
+             _cupsStrAlloc(oldattr->values[i].string.text);
       }
     }
 
@@ -2435,15 +2503,6 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */
 
   add_printer_defaults(p);
 
-#ifdef __sgi
- /*
-  * Write the IRIX printer config and status files...
-  */
-
-  write_irix_config(p);
-  write_irix_state(p);
-#endif /* __sgi */
-
  /*
   * Let the browse protocols reflect the change
   */
@@ -2539,14 +2598,17 @@ cupsdSetPrinterReasons(
          _cupsStrFree(p->reasons[i]);
 
          if (i < p->num_reasons)
-           memmove(p->reasons + i, p->reasons + i + 1,
-                   (p->num_reasons - i) * sizeof(char *));
+           memmove(p->reasons + i, p->reasons + i + 1, (size_t)(p->num_reasons - i) * sizeof(char *));
 
           if (!strcmp(reason, "paused") && p->state == IPP_PRINTER_STOPPED)
            cupsdSetPrinterState(p, IPP_PRINTER_IDLE, 1);
 
+          if (!strcmp(reason, "cups-waiting-for-job-completed") && p->job)
+            p->job->completed = 0;
+
           if (strcmp(reason, "connecting-to-device"))
            dirty_printer(p);
+
          break;
        }
     }
@@ -2562,10 +2624,6 @@ cupsdSetPrinterReasons(
 
       if (i >= p->num_reasons)
       {
-        if (!strncmp(reason, "cups-ipp-missing-", 17) ||
-           !strncmp(reason, "cups-ipp-wrong-", 15))
-         log_ipp_conformance(p, reason);
-
         if (i >= (int)(sizeof(p->reasons) / sizeof(p->reasons[0])))
        {
          cupsdLogMessage(CUPSD_LOG_ALERT,
@@ -2581,6 +2639,9 @@ cupsdSetPrinterReasons(
        if (!strcmp(reason, "paused") && p->state != IPP_PRINTER_STOPPED)
          cupsdSetPrinterState(p, IPP_PRINTER_STOPPED, 1);
 
+       if (!strcmp(reason, "cups-waiting-for-job-completed") && p->job)
+         p->job->completed = 1;
+
        if (strcmp(reason, "connecting-to-device"))
          dirty_printer(p);
       }
@@ -2631,10 +2692,6 @@ cupsdSetPrinterState(
     */
 
     p->state_time = time(NULL);
-
-#ifdef __sgi
-    write_irix_state(p);
-#endif /* __sgi */
   }
 
  /*
@@ -3023,16 +3080,6 @@ cupsdWritePrintcap(void)
   cupsd_printer_t      *p;             /* Current printer */
 
 
-#ifdef __sgi
- /*
-  * Update the IRIX printer state for the default printer; if
-  * no printers remain, then the default printer file will be
-  * removed...
-  */
-
-  write_irix_state(DefaultPrinter);
-#endif /* __sgi */
-
  /*
   * See if we have a printcap file; if not, don't bother writing it.
   */
@@ -3226,6 +3273,10 @@ add_printer_defaults(cupsd_printer_t *p)/* I - Printer */
     cupsArrayAdd(CommonDefaults, _cupsStrAlloc("copies-default"));
     cupsArrayAdd(CommonDefaults, _cupsStrAlloc("document-format-default"));
     cupsArrayAdd(CommonDefaults, _cupsStrAlloc("finishings-default"));
+    cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-account-id-default"));
+    cupsArrayAdd(CommonDefaults,
+                 _cupsStrAlloc("job-accounting-user-id-default"));
+    cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-cancel-after-default"));
     cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-hold-until-default"));
     cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-priority-default"));
     cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-sheets-default"));
@@ -3274,6 +3325,10 @@ add_printer_defaults(cupsd_printer_t *p)/* I - Printer */
     ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_MIMETYPE,
                 "document-format-default", NULL, "application/octet-stream");
 
+  if (!cupsGetOption("job-cancel-after", p->num_options, p->options))
+    ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+                 "job-cancel-after-default", MaxJobTime);
+
   if (!cupsGetOption("job-hold-until", p->num_options, p->options))
     ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
                  "job-hold-until-default", NULL, "no-hold");
@@ -3377,7 +3432,7 @@ add_printer_filter(
   {
     char       *ptr;                   /* Pointer into maxsize(nnnn) program */
 
-    maxsize = strtoll(program + 8, &ptr, 10);
+    maxsize = (size_t)strtoll(program + 8, &ptr, 10);
 
     if (*ptr != ')')
     {
@@ -3565,8 +3620,7 @@ add_printer_formats(cupsd_printer_t *p)   /* I - Printer */
         filter;
         filter = (mime_filter_t *)cupsArrayNext(MimeDatabase->filters))
     {
-      if (filter->dst == p->filetype && filter->filter &&
-         strstr(filter->filter, "PrintJobMgr"))
+      if (filter->dst == p->filetype && strstr(filter->filter, "PrintJobMgr"))
        break;
     }
 
@@ -3731,7 +3785,8 @@ load_ppd(cupsd_printer_t *p)              /* I - Printer */
                qualities[3];           /* print-quality values */
   int          num_margins,            /* Number of media-*-margin-supported values */
                margins[16];            /* media-*-margin-supported values */
-  const char   *filter;                /* Current filter */
+  const char   *filter,                /* Current filter */
+               *mandatory;             /* Current mandatory attribute */
   static const char * const sides[3] = /* sides-supported values */
                {
                  "one-sided",
@@ -3787,7 +3842,9 @@ load_ppd(cupsd_printer_t *p)              /* I - Printer */
 
   cupsdLogMessage(CUPSD_LOG_DEBUG, "load_ppd: Loading %s...", ppd_name);
 
-  p->type &= ~CUPS_PRINTER_OPTIONS;
+  cupsdClearString(&(p->make_model));
+
+  p->type &= (cups_ptype_t)~CUPS_PRINTER_OPTIONS;
   p->type |= CUPS_PRINTER_BW;
 
   finishings[0]  = IPP_FINISHINGS_NONE;
@@ -3803,6 +3860,10 @@ load_ppd(cupsd_printer_t *p)             /* I - Printer */
 
     p->pc = _ppdCacheCreateWithPPD(ppd);
 
+    if (!p->pc)
+      cupsdLogMessage(CUPSD_LOG_WARN, "Unable to create cache of \"%s\": %s",
+                      ppd_name, cupsLastErrorString());
+
     ppdMarkDefaults(ppd);
 
     if (ppd->color_device)
@@ -3815,8 +3876,28 @@ load_ppd(cupsd_printer_t *p)             /* I - Printer */
       if (ppd_attr->value && !_cups_strcasecmp(ppd_attr->value, "true"))
        p->type |= CUPS_PRINTER_FAX;
 
-    ippAddBoolean(p->ppd_attrs, IPP_TAG_PRINTER, "color-supported",
-                 ppd->color_device);
+    ippAddBoolean(p->ppd_attrs, IPP_TAG_PRINTER, "color-supported", (char)ppd->color_device);
+
+    if (p->pc && p->pc->charge_info_uri)
+      ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_URI,
+                   "printer-charge-info-uri", NULL, p->pc->charge_info_uri);
+
+    if (p->pc && p->pc->account_id)
+      ippAddBoolean(p->ppd_attrs, IPP_TAG_PRINTER, "job-account-id-supported",
+                    1);
+
+    if (p->pc && p->pc->accounting_user_id)
+      ippAddBoolean(p->ppd_attrs, IPP_TAG_PRINTER,
+                    "job-accounting-user-id-supported", 1);
+
+    if (p->pc && p->pc->password)
+    {
+      ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
+                   "job-password-encryption-supported", NULL, "none");
+      ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+                    "job-password-supported", (int)strlen(p->pc->password));
+    }
+
     if (ppd->throughput)
     {
       ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
@@ -3838,6 +3919,9 @@ load_ppd(cupsd_printer_t *p)              /* I - Printer */
                      "pages-per-minute-color", 1);
     }
 
+    if ((ppd_attr = ppdFindAttr(ppd, "1284DeviceId", NULL)) != NULL)
+      ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-device-id", NULL, ppd_attr->value);
+
     num_qualities = 0;
 
     if ((output_mode = ppdFindOption(ppd, "OutputMode")) != NULL)
@@ -3906,10 +3990,10 @@ load_ppd(cupsd_printer_t *p)            /* I - Printer */
 
     if (ppd->num_sizes == 0 || !p->pc)
     {
-      if (!ppdFindAttr(ppd, "APScannerOnly", NULL))
+      if (!ppdFindAttr(ppd, "APScannerOnly", NULL) && !ppdFindAttr(ppd, "cups3D", NULL))
        cupsdLogMessage(CUPSD_LOG_CRIT,
                        "The PPD file for printer %s contains no media "
-                       "options and is therefore invalid!", p->name);
+                       "options and is therefore invalid.", p->name);
 
       ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
                   "media-default", NULL, "unknown");
@@ -3973,13 +4057,13 @@ load_ppd(cupsd_printer_t *p)            /* I - Printer */
         for (i = p->pc->num_sizes, pwgsize = p->pc->sizes;
             i > 0;
             i --, pwgsize ++, val ++)
-         val->string.text = _cupsStrRetain(pwgsize->map.pwg);
+         val->string.text = _cupsStrAlloc(pwgsize->map.pwg);
 
         if (p->pc->custom_min_keyword)
        {
-         val->string.text = _cupsStrRetain(p->pc->custom_min_keyword);
+         val->string.text = _cupsStrAlloc(p->pc->custom_min_keyword);
          val ++;
-         val->string.text = _cupsStrRetain(p->pc->custom_max_keyword);
+         val->string.text = _cupsStrAlloc(p->pc->custom_max_keyword);
         }
       }
 
@@ -4031,7 +4115,7 @@ load_ppd(cupsd_printer_t *p)              /* I - Printer */
                 val = attr->values;
             i > 0;
             i --, pwgsource ++, val ++)
-         val->string.text = _cupsStrRetain(pwgsource->pwg);
+         val->string.text = _cupsStrAlloc(pwgsource->pwg);
       }
 
      /*
@@ -4047,7 +4131,7 @@ load_ppd(cupsd_printer_t *p)              /* I - Printer */
                 val = attr->values;
             i > 0;
             i --, pwgtype ++, val ++)
-         val->string.text = _cupsStrRetain(pwgtype->pwg);
+         val->string.text = _cupsStrAlloc(pwgtype->pwg);
       }
 
      /*
@@ -4292,41 +4376,51 @@ load_ppd(cupsd_printer_t *p)            /* I - Printer */
     }
 
    /*
-    * output-mode and print-color-mode...
+    * print-color-mode...
     */
 
     if (ppd->color_device)
     {
-      static const char * const output_modes[] =
+      static const char * const color_modes[] =
       {
         "monochrome",
        "color"
       };
 
       ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
-                    "output-mode-supported", 2, NULL, output_modes);
-      ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
-                   "output-mode-default", NULL, "color");
-
-      ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
-                    "print-color-mode-supported", 2, NULL, output_modes);
+                    "print-color-mode-supported", 2, NULL, color_modes);
       ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
                    "print-color-mode-default", NULL, "color");
     }
     else
     {
       ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
-                   "output-mode-supported", NULL, "monochrome");
-      ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
-                   "output-mode-default", NULL, "monochrome");
-
-      ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
                    "print-color-mode-supported", NULL, "monochrome");
       ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
                    "print-color-mode-default", NULL, "monochrome");
     }
 
    /*
+    * Mandatory job attributes, if any...
+    */
+
+    if (p->pc && cupsArrayCount(p->pc->mandatory) > 0)
+    {
+      int      count = cupsArrayCount(p->pc->mandatory);
+                                       /* Number of mandatory attributes */
+
+      attr = ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
+                           "printer-mandatory-job-attributes", count, NULL,
+                           NULL);
+
+      for (val = attr->values,
+               mandatory = (char *)cupsArrayFirst(p->pc->mandatory);
+           mandatory;
+           val ++, mandatory = (char *)cupsArrayNext(p->pc->mandatory))
+        val->string.text = _cupsStrAlloc(mandatory);
+    }
+
+   /*
     * Printer resolutions...
     */
 
@@ -4589,6 +4683,13 @@ load_ppd(cupsd_printer_t *p)             /* I - Printer */
     }
 
    /*
+    * 3D printer support...
+    */
+
+    if (ppdFindAttr(ppd, "cups3D", NULL))
+      p->type |= CUPS_PRINTER_3D;
+
+   /*
     * Show current and available port monitors for this printer...
     */
 
@@ -4654,22 +4755,16 @@ load_ppd(cupsd_printer_t *p)            /* I - Printer */
       CGContextRef     context;        /* The CG context used for resizing */
 
       snprintf(outPath, sizeof(outPath), "%s/%s.png", CacheDir, p->name);
-      outUrl      = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
-                                                            (UInt8 *)outPath,
-                                                           strlen(outPath),
-                                                           FALSE);
-      icnsFileUrl = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
-                                                           (UInt8 *)ppd_attr->value,
-                                                           strlen(ppd_attr->value),
-                                                           FALSE);
+      outUrl      = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (UInt8 *)outPath, (CFIndex)strlen(outPath), FALSE);
+      icnsFileUrl = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (UInt8 *)ppd_attr->value, (CFIndex)strlen(ppd_attr->value), FALSE);
       if (outUrl && icnsFileUrl)
       {
         sourceRef = CGImageSourceCreateWithURL(icnsFileUrl, NULL);
         if (sourceRef)
         {
-          for (i = 0; i < CGImageSourceGetCount(sourceRef); i ++)
+          for (i = 0; i < (int)CGImageSourceGetCount(sourceRef); i ++)
           {
-            imageRef = CGImageSourceCreateImageAtIndex(sourceRef, i, NULL);
+            imageRef = CGImageSourceCreateImageAtIndex(sourceRef, (size_t)i, NULL);
            if (!imageRef)
              continue;
 
@@ -4773,14 +4868,12 @@ load_ppd(cupsd_printer_t *p)            /* I - Printer */
 
     pstatus = ppdLastError(&pline);
 
-    cupsdLogMessage(CUPSD_LOG_ERROR, "PPD file for %s cannot be loaded!",
-                   p->name);
+    cupsdLogMessage(CUPSD_LOG_ERROR, "PPD file for %s cannot be loaded.", p->name);
 
     if (pstatus <= PPD_ALLOC_ERROR)
-      cupsdLogMessage(CUPSD_LOG_ERROR, "%s", strerror(errno));
+      cupsdLogMessage(CUPSD_LOG_ERROR, "%s: %s", ppd_name, strerror(errno));
     else
-      cupsdLogMessage(CUPSD_LOG_ERROR, "%s on line %d.",
-                     ppdErrorString(pstatus), pline);
+      cupsdLogMessage(CUPSD_LOG_ERROR, "%s on line %d of %s.", ppdErrorString(pstatus), pline, ppd_name);
 
     cupsdLogMessage(CUPSD_LOG_INFO,
                    "Hint: Run \"cupstestppd %s\" and fix any errors.",
@@ -4902,83 +4995,6 @@ load_ppd(cupsd_printer_t *p)             /* I - Printer */
 
 
 /*
- * 'log_ipp_conformance()' - Log an IPP conformance issue with a printer.
- */
-
-static void
-log_ipp_conformance(
-    cupsd_printer_t *p,                        /* I - Printer */
-    const char      *reason)           /* I - Printer state reason */
-{
-  const char   *message;               /* Message to log */
-#ifdef __APPLE__
-  aslmsg       aslm;                   /* Apple System Log message */
-#endif /* __APPLE__ */
-
-
- /*
-  * Strip the leading "cups-ipp-" from the reason and create a log message for
-  * it...
-  */
-
-  reason += 9;
-  if (!strcmp(reason, "missing-cancel-job"))
-    message = "Printer does not support REQUIRED Cancel-Job operation.";
-  else if (!strcmp(reason, "missing-get-job-attributes"))
-    message = "Printer does not support REQUIRED Get-Job-Attributes operation.";
-  else if (!strcmp(reason, "missing-print-job"))
-    message = "Printer does not support REQUIRED Print-Job operation.";
-  else if (!strcmp(reason, "missing-validate-job"))
-    message = "Printer does not support REQUIRED Validate-Job operation.";
-  else if (!strcmp(reason, "missing-get-printer-attributes"))
-    message = "Printer does not support REQUIRED Get-Printer-Attributes operation.";
-  else if (!strcmp(reason, "missing-send-document"))
-    message = "Printer supports Create-Job but not Send-Document operation.";
-  else if (!strcmp(reason, "missing-job-history"))
-    message = "Printer does not provide REQUIRED job history.";
-  else if (!strcmp(reason, "missing-job-id"))
-    message = "Printer does not provide REQUIRED job-id attribute.";
-  else if (!strcmp(reason, "missing-job-state"))
-    message = "Printer does not provide REQUIRED job-state attribute.";
-  else if (!strcmp(reason, "missing-operations-supported"))
-    message = "Printer does not provide REQUIRED operations-supported "
-              "attribute.";
-  else if (!strcmp(reason, "missing-printer-is-accepting-jobs"))
-    message = "Printer does not provide REQUIRED printer-is-accepting-jobs "
-              "attribute.";
-  else if (!strcmp(reason, "missing-printer-state-reasons"))
-    message = "Printer does not provide REQUIRED printer-state-reasons "
-              "attribute.";
-  else if (!strcmp(reason, "wrong-http-version"))
-    message = "Printer does not use REQUIRED HTTP/1.1 transport.";
-  else
-    message = "Unknown IPP conformance failure.";
-
-  cupsdLogMessage(CUPSD_LOG_WARN, "%s: %s", p->name, message);
-
-#ifdef __APPLE__
- /*
-  * Report the failure information to Apple if the user opts into providing
-  * feedback to Apple...
-  */
-
-  aslm = asl_new(ASL_TYPE_MSG);
-  if (aslm)
-  {
-    asl_set(aslm, "com.apple.message.domain", "com.apple.printing.ipp.conformance");
-    asl_set(aslm, "com.apple.message.domain_scope", "com.apple.printing.ipp.conformance");
-    asl_set(aslm, "com.apple.message.signature", reason);
-    asl_set(aslm, "com.apple.message.signature2",
-           p->make_model ? p->make_model : "Unknown");
-    asl_log(NULL, aslm, ASL_LEVEL_NOTICE, "%s: %s",
-            p->make_model ? p->make_model : "Unknown", message);
-    asl_free(aslm);
-  }
-#endif /* __APPLE__ */
-}
-
-
-/*
  * 'new_media_col()' - Create a media-col collection value.
  */
 
@@ -5022,261 +5038,6 @@ new_media_col(_pwg_size_t *size,        /* I - media-size/margin values */
 }
 
 
-#ifdef __sgi
-/*
- * 'write_irix_config()' - Update the config files used by the IRIX
- *                         desktop tools.
- */
-
-static void
-write_irix_config(cupsd_printer_t *p)  /* I - Printer to update */
-{
-  char         filename[1024];         /* Interface script filename */
-  cups_file_t  *fp;                    /* Interface script file */
-  ipp_attribute_t *attr;               /* Attribute data */
-
-
- /*
-  * Add dummy interface and GUI scripts to fool SGI's "challenged" printing
-  * tools.  First the interface script that tells the tools what kind of
-  * printer we have...
-  */
-
-  snprintf(filename, sizeof(filename), "/var/spool/lp/interface/%s", p->name);
-
-  if (p->type & CUPS_PRINTER_CLASS)
-    unlink(filename);
-  else if ((fp = cupsFileOpen(filename, "w")) != NULL)
-  {
-    cupsFilePuts(fp, "#!/bin/sh\n");
-
-    if ((attr = ippFindAttribute(p->attrs, "printer-make-and-model",
-                                 IPP_TAG_TEXT)) != NULL)
-      cupsFilePrintf(fp, "NAME=\"%s\"\n", attr->values[0].string.text);
-    else if (p->type & CUPS_PRINTER_CLASS)
-      cupsFilePuts(fp, "NAME=\"Printer Class\"\n");
-    else
-      cupsFilePuts(fp, "NAME=\"Remote Destination\"\n");
-
-    if (p->type & CUPS_PRINTER_COLOR)
-      cupsFilePuts(fp, "TYPE=ColorPostScript\n");
-    else
-      cupsFilePuts(fp, "TYPE=MonoPostScript\n");
-
-    cupsFilePrintf(fp, "HOSTNAME=%s\n", ServerName);
-    cupsFilePrintf(fp, "HOSTPRINTER=%s\n", p->name);
-
-    cupsFileClose(fp);
-
-    chmod(filename, 0755);
-    chown(filename, User, Group);
-  }
-
- /*
-  * Then the member file that tells which device file the queue is connected
-  * to...  Networked printers use "/dev/null" in this file, so that's what
-  * we use (the actual device URI can confuse some apps...)
-  */
-
-  snprintf(filename, sizeof(filename), "/var/spool/lp/member/%s", p->name);
-
-  if (p->type & CUPS_PRINTER_CLASS)
-    unlink(filename);
-  else if ((fp = cupsFileOpen(filename, "w")) != NULL)
-  {
-    cupsFilePuts(fp, "/dev/null\n");
-
-    cupsFileClose(fp);
-
-    chmod(filename, 0644);
-    chown(filename, User, Group);
-  }
-
- /*
-  * The gui_interface file is a script or program that launches a GUI
-  * option panel for the printer, using options specified on the
-  * command-line in the third argument.  The option panel must send
-  * any printing options to stdout on a single line when the user
-  * accepts them, or nothing if the user cancels the dialog.
-  *
-  * The default options panel program is /usr/bin/glpoptions, from
-  * the ESP Print Pro software.  You can select another using the
-  * PrintcapGUI option.
-  */
-
-  snprintf(filename, sizeof(filename), "/var/spool/lp/gui_interface/ELF/%s.gui", p->name);
-
-  if (p->type & CUPS_PRINTER_CLASS)
-    unlink(filename);
-  else if ((fp = cupsFileOpen(filename, "w")) != NULL)
-  {
-    cupsFilePuts(fp, "#!/bin/sh\n");
-    cupsFilePrintf(fp, "%s -d %s -o \"$3\"\n", PrintcapGUI, p->name);
-
-    cupsFileClose(fp);
-
-    chmod(filename, 0755);
-    chown(filename, User, Group);
-  }
-
- /*
-  * The POD config file is needed by the printstatus command to show
-  * the printer location and device.
-  */
-
-  snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.config", p->name);
-
-  if (p->type & CUPS_PRINTER_CLASS)
-    unlink(filename);
-  else if ((fp = cupsFileOpen(filename, "w")) != NULL)
-  {
-    cupsFilePrintf(fp, "Printer Class      | %s\n",
-            (p->type & CUPS_PRINTER_COLOR) ? "ColorPostScript" : "MonoPostScript");
-    cupsFilePrintf(fp, "Printer Model      | %s\n", p->make_model ? p->make_model : "");
-    cupsFilePrintf(fp, "Location Code      | %s\n", p->location ? p->location : "");
-    cupsFilePrintf(fp, "Physical Location  | %s\n", p->info ? p->info : "");
-    cupsFilePrintf(fp, "Port Path          | %s\n", p->device_uri);
-    cupsFilePrintf(fp, "Config Path        | /var/spool/lp/pod/%s.config\n", p->name);
-    cupsFilePrintf(fp, "Active Status Path | /var/spool/lp/pod/%s.status\n", p->name);
-    cupsFilePuts(fp, "Status Update Wait | 10 seconds\n");
-
-    cupsFileClose(fp);
-
-    chmod(filename, 0664);
-    chown(filename, User, Group);
-  }
-}
-
-
-/*
- * 'write_irix_state()' - Update the status files used by IRIX printing
- *                        desktop tools.
- */
-
-static void
-write_irix_state(cupsd_printer_t *p)   /* I - Printer to update */
-{
-  char         filename[1024];         /* Interface script filename */
-  cups_file_t  *fp;                    /* Interface script file */
-  int          tag;                    /* Status tag value */
-
-
-  if (p)
-  {
-   /*
-    * The POD status file is needed for the printstatus window to
-    * provide the current status of the printer.
-    */
-
-    snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.status", p->name);
-
-    if (p->type & CUPS_PRINTER_CLASS)
-      unlink(filename);
-    else if ((fp = cupsFileOpen(filename, "w")) != NULL)
-    {
-      cupsFilePrintf(fp, "Operational Status | %s\n",
-              (p->state == IPP_PRINTER_IDLE)       ? "Idle" :
-              (p->state == IPP_PRINTER_PROCESSING) ? "Busy" :
-                                                     "Faulted");
-      cupsFilePrintf(fp, "Information        | 01 00 00 | %s\n", CUPS_SVERSION);
-      cupsFilePrintf(fp, "Information        | 02 00 00 | Device URI: %s\n",
-              p->device_uri);
-      cupsFilePrintf(fp, "Information        | 03 00 00 | %s jobs\n",
-              p->accepting ? "Accepting" : "Not accepting");
-      cupsFilePrintf(fp, "Information        | 04 00 00 | %s\n", p->state_message);
-
-      cupsFileClose(fp);
-
-      chmod(filename, 0664);
-      chown(filename, User, Group);
-    }
-
-   /*
-    * The activeicons file is needed to provide desktop icons for printers:
-    *
-    * [ quoted from /usr/lib/print/tagit ]
-    *
-    * --- Type of printer tags (base values)
-    *
-    * Dumb=66048                       # 0x10200
-    * DumbColor=66080          # 0x10220
-    * Raster=66112             # 0x10240
-    * ColorRaster=66144                # 0x10260
-    * Plotter=66176            # 0x10280
-    * PostScript=66208         # 0x102A0
-    * ColorPostScript=66240    # 0x102C0
-    * MonoPostScript=66272     # 0x102E0
-    *
-    * --- Printer state modifiers for local printers
-    *
-    * Idle=0                   # 0x0
-    * Busy=1                   # 0x1
-    * Faulted=2                        # 0x2
-    * Unknown=3                        # 0x3 (Faulted due to unknown reason)
-    *
-    * --- Printer state modifiers for network printers
-    *
-    * NetIdle=8                        # 0x8
-    * NetBusy=9                        # 0x9
-    * NetFaulted=10            # 0xA
-    * NetUnknown=11            # 0xB (Faulted due to unknown reason)
-    */
-
-    snprintf(filename, sizeof(filename), "/var/spool/lp/activeicons/%s", p->name);
-
-    if (p->type & CUPS_PRINTER_CLASS)
-      unlink(filename);
-    else if ((fp = cupsFileOpen(filename, "w")) != NULL)
-    {
-      if (p->type & CUPS_PRINTER_COLOR)
-       tag = 66240;
-      else
-       tag = 66272;
-
-      if (p->type & CUPS_PRINTER_REMOTE)
-       tag |= 8;
-
-      if (p->state == IPP_PRINTER_PROCESSING)
-       tag |= 1;
-
-      else if (p->state == IPP_PRINTER_STOPPED)
-       tag |= 2;
-
-      cupsFilePuts(fp, "#!/bin/sh\n");
-      cupsFilePrintf(fp, "#Tag %d\n", tag);
-
-      cupsFileClose(fp);
-
-      chmod(filename, 0755);
-      chown(filename, User, Group);
-    }
-  }
-
- /*
-  * The default file is needed by the printers window to show
-  * the default printer.
-  */
-
-  snprintf(filename, sizeof(filename), "/var/spool/lp/default");
-
-  if (DefaultPrinter != NULL)
-  {
-    if ((fp = cupsFileOpen(filename, "w")) != NULL)
-    {
-      cupsFilePrintf(fp, "%s\n", DefaultPrinter->name);
-
-      cupsFileClose(fp);
-
-      chmod(filename, 0644);
-      chown(filename, User, Group);
-    }
-  }
-  else
-    unlink(filename);
-}
-#endif /* __sgi */
-
-
 /*
  * 'write_xml_string()' - Write a string with XML escaping.
  */
@@ -5296,7 +5057,7 @@ write_xml_string(cups_file_t *fp, /* I - File to write to */
     if (*s == '&')
     {
       if (s > start)
-        cupsFileWrite(fp, start, s - start);
+        cupsFileWrite(fp, start, (size_t)(s - start));
 
       cupsFilePuts(fp, "&amp;");
       start = s + 1;
@@ -5304,7 +5065,7 @@ write_xml_string(cups_file_t *fp, /* I - File to write to */
     else if (*s == '<')
     {
       if (s > start)
-        cupsFileWrite(fp, start, s - start);
+        cupsFileWrite(fp, start, (size_t)(s - start));
 
       cupsFilePuts(fp, "&lt;");
       start = s + 1;
@@ -5317,5 +5078,5 @@ write_xml_string(cups_file_t *fp, /* I - File to write to */
 
 
 /*
- * End of "$Id: printers.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: printers.c 12733 2015-06-12 01:21:05Z msweet $".
  */
index ad89d70..27db750 100644 (file)
@@ -1,16 +1,16 @@
 /*
- * "$Id: printers.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: printers.h 12666 2015-05-25 19:38:09Z msweet $"
  *
- *   Printer definitions for the CUPS scheduler.
+ * Printer definitions for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2013 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 #ifdef HAVE_DNSSD
@@ -63,9 +63,12 @@ struct cupsd_printer_s
                *uuid,                  /* Printer UUID */
                *hostname,              /* Host printer resides on */
                *name,                  /* Printer name */
-               *location,              /* Location code */
+               *location,              /* Location string */
+               *geo_location,          /* Geographic location URI */
                *make_model,            /* Make and model */
                *info,                  /* Description */
+               *organization,          /* Organization name */
+               *organizational_unit,   /* Organizational unit (department, etc.) */
                *op_policy,             /* Operation policy name */
                *error_policy;          /* Error policy */
   cupsd_policy_t *op_policy_ptr;       /* Pointer to operation policy */
@@ -77,7 +80,8 @@ struct cupsd_printer_s
   char         state_message[1024];    /* Printer state message */
   int          num_reasons;            /* Number of printer-state-reasons */
   char         *reasons[64];           /* printer-state-reasons strings */
-  time_t       state_time;             /* Time at this state */
+  time_t       config_time,            /* Time at this configuration */
+               state_time;             /* Time at this state */
   char         *job_sheets[2];         /* Banners/job sheets */
   cups_ptype_t type;                   /* Printer type (color, small, etc.) */
   char         *device_uri;            /* Device URI */
@@ -166,7 +170,8 @@ extern int          cupsdSetAuthInfoRequired(cupsd_printer_t *p,
                                                 ipp_attribute_t *attr);
 extern void            cupsdSetDeviceURI(cupsd_printer_t *p, const char *uri);
 extern void            cupsdSetPrinterAttr(cupsd_printer_t *p,
-                                           const char *name, char *value);
+                                           const char *name,
+                                           const char *value);
 extern void            cupsdSetPrinterAttrs(cupsd_printer_t *p);
 extern int             cupsdSetPrinterReasons(cupsd_printer_t *p,
                                               const char *s);
@@ -189,5 +194,5 @@ extern void         cupsdWritePrintcap(void);
 
 
 /*
- * End of "$Id: printers.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: printers.h 12666 2015-05-25 19:38:09Z msweet $".
  */
index a706ac2..19c7472 100644 (file)
@@ -1,26 +1,16 @@
 /*
- * "$Id: process.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: process.c 12521 2015-02-17 20:00:17Z msweet $"
  *
- *   Process management routines for the CUPS scheduler.
+ * Process management routines for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdCreateProfile()  - Create an execution profile for a subprocess.
- *   cupsdDestroyProfile() - Delete an execution profile.
- *   cupsdEndProcess()     - End a process.
- *   cupsdFinishProcess()  - Finish a process and get its name.
- *   cupsdStartProcess()   - Start a process.
- *   compare_procs()       - Compare two processes.
- *   cupsd_requote()       - Make a regular-expression version of a string.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
 #ifdef __APPLE__
 #  include <libgen.h>
 #endif /* __APPLE__ */
+#ifdef HAVE_POSIX_SPAWN
+#  include <spawn.h>
+extern char **environ;
+#endif /* HAVE_POSIX_SPAWN */
+#ifdef HAVE_POSIX_SPAWN
+#  if !defined(__OpenBSD__) || OpenBSD >= 201505
+#    define USE_POSIX_SPAWN 1
+#  else
+#    define USE_POSIX_SPAWN 0
+#  endif /* !__OpenBSD__ || */
+#else
+#  define USE_POSIX_SPAWN 0
+#endif /* HAVE_POSIX_SPAWN */
 
 
 /*
@@ -68,34 +71,37 @@ static char *cupsd_requote(char *dst, const char *src, size_t dstsize);
  */
 
 void *                                 /* O - Profile or NULL on error */
-cupsdCreateProfile(int job_id)         /* I - Job ID or 0 for none */
+cupsdCreateProfile(int job_id,         /* I - Job ID or 0 for none */
+                   int allow_networking)/* I - Allow networking off machine? */
 {
 #ifdef HAVE_SANDBOX_H
-  cups_file_t  *fp;                    /* File pointer */
-  char         profile[1024],          /* File containing the profile */
-               cache[1024],            /* Quoted CacheDir */
-               request[1024],          /* Quoted RequestRoot */
-               root[1024],             /* Quoted ServerRoot */
-               temp[1024];             /* Quoted TempDir */
-  const char   *nodebug;               /* " (with no-log)" for no debug */
-
-
-  if (!UseProfiles)
+  cups_file_t          *fp;            /* File pointer */
+  char                 profile[1024],  /* File containing the profile */
+                       bin[1024],      /* Quoted ServerBin */
+                       cache[1024],    /* Quoted CacheDir */
+                       domain[1024],   /* Domain socket, if any */
+                       request[1024],  /* Quoted RequestRoot */
+                       root[1024],     /* Quoted ServerRoot */
+                       state[1024],    /* Quoted StateDir */
+                       temp[1024];     /* Quoted TempDir */
+  const char           *nodebug;       /* " (with no-log)" for no debug */
+  cupsd_listener_t     *lis;           /* Current listening socket */
+
+
+  if (!UseSandboxing || Sandboxing == CUPSD_SANDBOXING_OFF)
   {
    /*
     * Only use sandbox profiles as root...
     */
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL",
-                    job_id);
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d, allow_networking=%d) = NULL", job_id, allow_networking);
 
     return (NULL);
   }
 
   if ((fp = cupsTempFile2(profile, sizeof(profile))) == NULL)
   {
-    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL",
-                    job_id);
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d, allow_networking=%d) = NULL", job_id, allow_networking);
     cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create security profile: %s",
                     strerror(errno));
     return (NULL);
@@ -104,22 +110,29 @@ cupsdCreateProfile(int job_id)            /* I - Job ID or 0 for none */
   fchown(cupsFileNumber(fp), RunUser, Group);
   fchmod(cupsFileNumber(fp), 0640);
 
+  cupsd_requote(bin, ServerBin, sizeof(bin));
   cupsd_requote(cache, CacheDir, sizeof(cache));
   cupsd_requote(request, RequestRoot, sizeof(request));
   cupsd_requote(root, ServerRoot, sizeof(root));
+  cupsd_requote(state, StateDir, sizeof(state));
   cupsd_requote(temp, TempDir, sizeof(temp));
 
   nodebug = LogLevel < CUPSD_LOG_DEBUG ? " (with no-log)" : "";
 
   cupsFilePuts(fp, "(version 1)\n");
-  cupsFilePuts(fp, "(allow default)\n");
-  cupsFilePrintf(fp,
-                 "(deny file-write* file-read-data file-read-metadata\n"
-                 "  (regex"
-                " #\"^%s$\""           /* RequestRoot */
-                " #\"^%s/\""           /* RequestRoot/... */
-                ")%s)\n",
-                request, request, nodebug);
+  if (Sandboxing == CUPSD_SANDBOXING_STRICT)
+    cupsFilePuts(fp, "(deny default)\n");
+  else
+    cupsFilePuts(fp, "(allow default)\n");
+  if (LogLevel >= CUPSD_LOG_DEBUG)
+    cupsFilePuts(fp, "(debug deny)\n");
+  cupsFilePuts(fp, "(import \"system.sb\")\n");
+  cupsFilePuts(fp, "(system-network)\n");
+  cupsFilePuts(fp, "(allow mach-per-user-lookup)\n");
+  cupsFilePuts(fp, "(allow ipc-posix-sem)\n");
+  cupsFilePuts(fp, "(allow ipc-posix-shm)\n");
+  cupsFilePuts(fp, "(allow ipc-sysv-shm)\n");
+  cupsFilePuts(fp, "(allow mach-lookup)\n");
   if (!RunUser)
     cupsFilePrintf(fp,
                   "(deny file-write* file-read-data file-read-metadata\n"
@@ -142,13 +155,43 @@ cupsdCreateProfile(int job_id)            /* I - Job ID or 0 for none */
                 " #\"^/System/\""
                 ")%s)\n",
                 root, root, nodebug);
-  /* Specifically allow applications to stat RequestRoot */
+  /* Specifically allow applications to stat RequestRoot and some other system folders */
   cupsFilePrintf(fp,
                  "(allow file-read-metadata\n"
                  "  (regex"
+                " #\"^/$\""            /* / */
+                " #\"^/usr$\""         /* /usr */
+                " #\"^/Library$\""     /* /Library */
+                " #\"^/Library/Printers$\""    /* /Library/Printers */
                 " #\"^%s$\""           /* RequestRoot */
                 "))\n",
                 request);
+  /* Read and write TempDir, CacheDir, and other common folders */
+  cupsFilePuts(fp,
+              "(allow file-write* file-read-data file-read-metadata\n"
+              "  (regex"
+              " #\"^/private/var/db/\""
+              " #\"^/private/var/folders/\""
+              " #\"^/private/var/lib/\""
+              " #\"^/private/var/log/\""
+              " #\"^/private/var/mysql/\""
+              " #\"^/private/var/run/\""
+              " #\"^/private/var/spool/\""
+              " #\"^/Library/Application Support/\""
+              " #\"^/Library/Caches/\""
+              " #\"^/Library/Logs/\""
+              " #\"^/Library/Preferences/\""
+              " #\"^/Library/WebServer/\""
+              " #\"^/Users/Shared/\""
+              "))\n");
+  cupsFilePrintf(fp,
+                "(deny file-write*\n"
+                "       (regex #\"^%s$\")%s)\n",
+                request, nodebug);
+  cupsFilePrintf(fp,
+                "(deny file-write* file-read-data file-read-metadata\n"
+                "       (regex #\"^%s/\")%s)\n",
+                request, nodebug);
   cupsFilePrintf(fp,
                  "(allow file-write* file-read-data file-read-metadata\n"
                  "  (regex"
@@ -156,56 +199,160 @@ cupsdCreateProfile(int job_id)           /* I - Job ID or 0 for none */
                 " #\"^%s/\""           /* TempDir/... */
                 " #\"^%s$\""           /* CacheDir */
                 " #\"^%s/\""           /* CacheDir/... */
+                " #\"^%s$\""           /* StateDir */
+                " #\"^%s/\""           /* StateDir/... */
+                "))\n",
+                temp, temp, cache, cache, state, state);
+  /* Read common folders */
+  cupsFilePrintf(fp,
+                 "(allow file-read-data file-read-metadata\n"
+                 "  (regex"
+                 " #\"^/AppleInternal$\""
+                 " #\"^/AppleInternal/\""
+                 " #\"^/bin$\""                /* /bin */
+                 " #\"^/bin/\""                /* /bin/... */
+                 " #\"^/private$\""
+                 " #\"^/private/etc$\""
+                 " #\"^/private/etc/\""
+                 " #\"^/private/tmp$\""
+                 " #\"^/private/tmp/\""
+                 " #\"^/private/var$\""
+                 " #\"^/private/var/db$\""
+                 " #\"^/private/var/folders$\""
+                 " #\"^/private/var/lib$\""
+                 " #\"^/private/var/log$\""
+                 " #\"^/private/var/mysql$\""
+                 " #\"^/private/var/run$\""
+                 " #\"^/private/var/spool$\""
+                 " #\"^/private/var/tmp$\""
+                 " #\"^/private/var/tmp/\""
+                 " #\"^/usr/bin$\""    /* /usr/bin */
+                 " #\"^/usr/bin/\""    /* /usr/bin/... */
+                 " #\"^/usr/libexec/cups$\""   /* /usr/libexec/cups */
+                 " #\"^/usr/libexec/cups/\""   /* /usr/libexec/cups/... */
+                 " #\"^/usr/libexec/fax$\""    /* /usr/libexec/fax */
+                 " #\"^/usr/libexec/fax/\""    /* /usr/libexec/fax/... */
+                 " #\"^/usr/sbin$\""   /* /usr/sbin */
+                 " #\"^/usr/sbin/\""   /* /usr/sbin/... */
+                " #\"^/Library$\""     /* /Library */
+                " #\"^/Library/\""     /* /Library/... */
+                " #\"^/System$\""      /* /System */
+                " #\"^/System/\""      /* /System/... */
                 " #\"^%s/Library$\""   /* RequestRoot/Library */
                 " #\"^%s/Library/\""   /* RequestRoot/Library/... */
-                " #\"^/Library/Application Support/\""
-                " #\"^/Library/Caches/\""
-                " #\"^/Library/Preferences/\""
-                " #\"^/Library/Printers/.*/\""
-                " #\"^/Users/Shared/\""
+                " #\"^%s$\""           /* ServerBin */
+                " #\"^%s/\""           /* ServerBin/... */
+                " #\"^%s$\""           /* ServerRoot */
+                " #\"^%s/\""           /* ServerRoot/... */
                 "))\n",
-                temp, temp, cache, cache, request, request);
-  cupsFilePrintf(fp,
-                "(deny file-write*\n"
+                request, request, bin, bin, root, root);
+  if (Sandboxing == CUPSD_SANDBOXING_RELAXED)
+  {
+    /* Limited write access to /Library/Printers/... */
+    cupsFilePuts(fp,
+                "(allow file-write*\n"
                 "  (regex"
-                " #\"^/Library/Printers/PPDs$\""
-                " #\"^/Library/Printers/PPDs/\""
-                " #\"^/Library/Printers/PPD Plugins$\""
-                " #\"^/Library/Printers/PPD Plugins/\""
-                ")%s)\n", nodebug);
-  if (job_id)
+                " #\"^/Library/Printers/.*/\""
+                "))\n");
+    cupsFilePrintf(fp,
+                  "(deny file-write*\n"
+                  "  (regex"
+                  " #\"^/Library/Printers/PPDs$\""
+                  " #\"^/Library/Printers/PPDs/\""
+                  " #\"^/Library/Printers/PPD Plugins$\""
+                  " #\"^/Library/Printers/PPD Plugins/\""
+                  ")%s)\n", nodebug);
+  }
+  /* Allow execution of child processes as long as the programs are not in a user directory */
+  cupsFilePuts(fp, "(allow process*)\n");
+  cupsFilePuts(fp, "(deny process-exec (regex #\"^/Users/\"))\n");
+  if (RunUser && getenv("CUPS_TESTROOT"))
   {
-   /*
-    * Allow job filters to read the spool file(s)...
-    */
+    /* Allow source directory access in "make test" environment */
+    char       testroot[1024];         /* Root directory of test files */
+
+    cupsd_requote(testroot, getenv("CUPS_TESTROOT"), sizeof(testroot));
 
     cupsFilePrintf(fp,
+                  "(allow file-write* file-read-data file-read-metadata\n"
+                  "  (regex"
+                  " #\"^%s$\""         /* CUPS_TESTROOT */
+                  " #\"^%s/\""         /* CUPS_TESTROOT/... */
+                  "))\n",
+                  testroot, testroot);
+    cupsFilePrintf(fp,
+                  "(allow process-exec\n"
+                  "  (regex"
+                  " #\"^%s/\""         /* CUPS_TESTROOT/... */
+                  "))\n",
+                  testroot);
+    cupsFilePrintf(fp, "(allow sysctl*)\n");
+  }
+  if (job_id)
+  {
+    /* Allow job filters to read the current job files... */
+    cupsFilePrintf(fp,
                    "(allow file-read-data file-read-metadata\n"
-                   "  (regex #\"^%s/([ac]%05d|d%05d-[0-9][0-9][0-9])$\"))\n",
+                   "       (regex #\"^%s/([ac]%05d|d%05d-[0-9][0-9][0-9])$\"))\n",
                   request, job_id, job_id);
   }
   else
   {
-   /*
-    * Allow email notifications from notifiers...
-    */
-
+    /* Allow email notifications from notifiers... */
     cupsFilePuts(fp,
                 "(allow process-exec\n"
                 "  (literal \"/usr/sbin/sendmail\")\n"
-                "  (with no-sandbox)\n"
-                ")\n");
+                "  (with no-sandbox))\n");
+  }
+  /* Allow access to Bluetooth, USB, and notify_post. */
+  cupsFilePuts(fp, "(allow iokit*)\n");
+  cupsFilePuts(fp, "(allow distributed-notification-post)\n");
+  /* Allow outbound networking to local services */
+  cupsFilePuts(fp, "(allow network-outbound"
+                  "\n       (regex #\"^/private/var/run/\" #\"^/private/tmp/\" #\"^/private/var/tmp/\")");
+  for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
+       lis;
+       lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
+  {
+    if (httpAddrFamily(&(lis->address)) == AF_LOCAL)
+    {
+      httpAddrString(&(lis->address), domain, sizeof(domain));
+      cupsFilePrintf(fp, "\n       (literal \"%s\")", domain);
+    }
+  }
+  if (allow_networking)
+  {
+    /* Allow TCP and UDP networking off the machine... */
+    cupsFilePuts(fp, "\n       (remote tcp))\n");
+    cupsFilePuts(fp, "(allow network-bind)\n"); /* for LPD resvport */
+    cupsFilePuts(fp, "(allow network*\n"
+                    "       (local udp \"*:*\")\n"
+                    "       (remote udp \"*:*\"))\n");
+
+    /* Also allow access to device files... */
+    cupsFilePuts(fp, "(allow file-write* file-read-data file-read-metadata file-ioctl\n"
+                     "       (regex #\"^/dev/\"))\n");
+
+    /* And allow kernel extensions to be loaded, e.g., SMB */
+    cupsFilePuts(fp, "(allow system-kext-load)\n");
+  }
+  else
+  {
+    /* Only allow SNMP (UDP) and LPD (TCP) off the machine... */
+    cupsFilePuts(fp, ")\n");
+    cupsFilePuts(fp, "(allow network-outbound\n"
+                    "       (remote udp \"*:161\")"
+                    "       (remote tcp \"*:515\"))\n");
+    cupsFilePuts(fp, "(allow network-inbound\n"
+                    "       (local udp \"localhost:*\"))\n");
   }
-
   cupsFileClose(fp);
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = \"%s\"",
-                  job_id, profile);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d,allow_networking=%d) = \"%s\"", job_id, allow_networking, profile);
   return ((void *)strdup(profile));
 
 #else
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL",
-                  job_id);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d, allow_networking=%d) = NULL", job_id, allow_networking);
 
   return (NULL);
 #endif /* HAVE_SANDBOX_H */
@@ -268,10 +415,10 @@ cupsdEndProcess(int pid,          /* I - Process ID */
  */
 
 const char *                           /* O - Process name */
-cupsdFinishProcess(int  pid,           /* I - Process ID */
-                   char *name,         /* I - Name buffer */
-                  int  namelen,        /* I - Size of name buffer */
-                  int  *job_id)        /* O - Job ID pointer or NULL */
+cupsdFinishProcess(int    pid,         /* I - Process ID */
+                   char   *name,       /* I - Name buffer */
+                  size_t namelen,      /* I - Size of name buffer */
+                  int    *job_id)      /* O - Job ID pointer or NULL */
 {
   cupsd_proc_t key,                    /* Search key */
                *proc;                  /* Matching process */
@@ -296,10 +443,7 @@ cupsdFinishProcess(int  pid,               /* I - Process ID */
     strlcpy(name, "unknown", namelen);
   }
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                 "cupsdFinishProcess(pid=%d, name=%p, namelen=%d, "
-                 "job_id=%p(%d)) = \"%s\"", pid, name, namelen, job_id,
-                 job_id ? *job_id : 0, name);
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFinishProcess(pid=%d, name=%p, namelen=" CUPS_LLFMT ", job_id=%p(%d)) = \"%s\"", pid, name, CUPS_LLCAST namelen, job_id, job_id ? *job_id : 0, name);
 
   return (name);
 }
@@ -326,13 +470,20 @@ cupsdStartProcess(
 {
   int          i;                      /* Looping var */
   const char   *exec_path = command;   /* Command to be exec'd */
-  char         *real_argv[103],        /* Real command-line arguments */
-               cups_exec[1024];        /* Path to "cups-exec" program */
-  int          user;                   /* Command UID */
+  char         *real_argv[110],        /* Real command-line arguments */
+               cups_exec[1024],        /* Path to "cups-exec" program */
+               user_str[16],           /* User string */
+               group_str[16],          /* Group string */
+               nice_str[16];           /* FilterNice string */
+  uid_t                user;                   /* Command UID */
   cupsd_proc_t *proc;                  /* New process record */
-#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+#if USE_POSIX_SPAWN
+  posix_spawn_file_actions_t actions;  /* Spawn file actions */
+  posix_spawnattr_t attrs;             /* Spawn attributes */
+  sigset_t     defsignals;             /* Default signals */
+#elif defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
   struct sigaction action;             /* POSIX signal handler */
-#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
+#endif /* USE_POSIX_SPAWN */
 #if defined(__APPLE__)
   char         processPath[1024],      /* CFProcessPath environment variable */
                linkpath[1024];         /* Link path for symlinks... */
@@ -396,25 +547,107 @@ cupsdStartProcess(
   * Use helper program when we have a sandbox profile...
   */
 
+#if !USE_POSIX_SPAWN
   if (profile)
+#endif /* !USE_POSIX_SPAWN */
   {
     snprintf(cups_exec, sizeof(cups_exec), "%s/daemon/cups-exec", ServerBin);
+    snprintf(user_str, sizeof(user_str), "%d", user);
+    snprintf(group_str, sizeof(group_str), "%d", Group);
+    snprintf(nice_str, sizeof(nice_str), "%d", FilterNice);
 
     real_argv[0] = cups_exec;
-    real_argv[1] = profile;
-    real_argv[2] = (char *)command;
+    real_argv[1] = (char *)"-g";
+    real_argv[2] = group_str;
+    real_argv[3] = (char *)"-n";
+    real_argv[4] = nice_str;
+    real_argv[5] = (char *)"-u";
+    real_argv[6] = user_str;
+    real_argv[7] = profile ? profile : "none";
+    real_argv[8] = (char *)command;
 
     for (i = 0;
-         i < (int)(sizeof(real_argv) / sizeof(real_argv[0]) - 4) && argv[i];
+         i < (int)(sizeof(real_argv) / sizeof(real_argv[0]) - 10) && argv[i];
         i ++)
-      real_argv[i + 3] = argv[i];
+      real_argv[i + 9] = argv[i];
 
-    real_argv[i + 3] = NULL;
+    real_argv[i + 9] = NULL;
 
     argv      = real_argv;
     exec_path = cups_exec;
   }
 
+  if (LogLevel == CUPSD_LOG_DEBUG2)
+  {
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartProcess: Preparing to start \"%s\", arguments:", command);
+
+    for (i = 0; argv[i]; i ++)
+      cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartProcess: argv[%d] = \"%s\"", i, argv[i]);
+  }
+
+#if USE_POSIX_SPAWN
+ /*
+  * Setup attributes and file actions for the spawn...
+  */
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartProcess: Setting spawn attributes.");
+  sigemptyset(&defsignals);
+  sigaddset(&defsignals, SIGTERM);
+  sigaddset(&defsignals, SIGCHLD);
+  sigaddset(&defsignals, SIGPIPE);
+
+  posix_spawnattr_init(&attrs);
+  posix_spawnattr_setflags(&attrs, POSIX_SPAWN_SETPGROUP | POSIX_SPAWN_SETSIGDEF);
+  posix_spawnattr_setpgroup(&attrs, 0);
+  posix_spawnattr_setsigdefault(&attrs, &defsignals);
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartProcess: Setting file actions.");
+  posix_spawn_file_actions_init(&actions);
+  if (infd != 0)
+  {
+    if (infd < 0)
+      posix_spawn_file_actions_addopen(&actions, 0, "/dev/null", O_RDONLY, 0);
+    else
+      posix_spawn_file_actions_adddup2(&actions, infd, 0);
+  }
+
+  if (outfd != 1)
+  {
+    if (outfd < 0)
+      posix_spawn_file_actions_addopen(&actions, 1, "/dev/null", O_WRONLY, 0);
+    else
+      posix_spawn_file_actions_adddup2(&actions, outfd, 1);
+  }
+
+  if (errfd != 2)
+  {
+    if (errfd < 0)
+      posix_spawn_file_actions_addopen(&actions, 2, "/dev/null", O_WRONLY, 0);
+    else
+      posix_spawn_file_actions_adddup2(&actions, errfd, 2);
+  }
+
+  if (backfd != 3 && backfd >= 0)
+    posix_spawn_file_actions_adddup2(&actions, backfd, 3);
+
+  if (sidefd != 4 && sidefd >= 0)
+    posix_spawn_file_actions_adddup2(&actions, sidefd, 4);
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartProcess: Calling posix_spawn.");
+
+  if (posix_spawn(pid, exec_path, &actions, &attrs, argv, envp ? envp : environ))
+  {
+    cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to fork %s - %s.", command, strerror(errno));
+
+    *pid = 0;
+  }
+  else
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartProcess: pid=%d", (int)*pid);
+
+  posix_spawn_file_actions_destroy(&actions);
+  posix_spawnattr_destroy(&attrs);
+
+#else
  /*
   * Block signals before forking...
   */
@@ -444,13 +677,13 @@ cupsdStartProcess(
     * processes it creates.
     */
 
-#ifdef HAVE_SETPGID
+#  ifdef HAVE_SETPGID
     if (!RunUser && setpgid(0, 0))
       exit(errno + 100);
-#else
+#  else
     if (!RunUser && setpgrp())
       exit(errno + 100);
-#endif /* HAVE_SETPGID */
+#  endif /* HAVE_SETPGID */
 
    /*
     * Update the remaining file descriptors as needed...
@@ -529,11 +762,11 @@ cupsdStartProcess(
     * Unblock signals before doing the exec...
     */
 
-#ifdef HAVE_SIGSET
+#  ifdef HAVE_SIGSET
     sigset(SIGTERM, SIG_DFL);
     sigset(SIGCHLD, SIG_DFL);
     sigset(SIGPIPE, SIG_DFL);
-#elif defined(HAVE_SIGACTION)
+#  elif defined(HAVE_SIGACTION)
     memset(&action, 0, sizeof(action));
 
     sigemptyset(&action.sa_mask);
@@ -542,11 +775,11 @@ cupsdStartProcess(
     sigaction(SIGTERM, &action, NULL);
     sigaction(SIGCHLD, &action, NULL);
     sigaction(SIGPIPE, &action, NULL);
-#else
+#  else
     signal(SIGTERM, SIG_DFL);
     signal(SIGCHLD, SIG_DFL);
     signal(SIGPIPE, SIG_DFL);
-#endif /* HAVE_SIGSET */
+#  endif /* HAVE_SIGSET */
 
     cupsdReleaseSignals();
 
@@ -573,7 +806,11 @@ cupsdStartProcess(
 
     *pid = 0;
   }
-  else
+
+  cupsdReleaseSignals();
+#endif /* USE_POSIX_SPAWN */
+
+  if (*pid)
   {
     if (!process_array)
       process_array = cupsArrayNew((cups_array_func_t)compare_procs, NULL);
@@ -591,8 +828,6 @@ cupsdStartProcess(
     }
   }
 
-  cupsdReleaseSignals();
-
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                  "cupsdStartProcess(command=\"%s\", argv=%p, envp=%p, "
                  "infd=%d, outfd=%d, errfd=%d, backfd=%d, sidefd=%d, root=%d, "
@@ -638,10 +873,13 @@ cupsd_requote(char       *dst,            /* I - Destination buffer */
   {
     ch = *src++;
 
+    if (ch == '/' && !*src)
+      break;                           /* Don't add trailing slash */
+
     if (strchr(".?*()[]^$\\", ch))
       *dstptr++ = '\\';
 
-    *dstptr++ = ch;
+    *dstptr++ = (char)ch;
   }
 
   *dstptr = '\0';
@@ -652,5 +890,5 @@ cupsd_requote(char       *dst,              /* I - Destination buffer */
 
 
 /*
- * End of "$Id: process.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: process.c 12521 2015-02-17 20:00:17Z msweet $".
  */
index 3ebfd8d..ae8b88f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: quotas.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: quotas.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Quota routines for the CUPS scheduler.
  *
@@ -240,5 +240,5 @@ compare_quotas(const cupsd_quota_t *q1,     /* I - First quota record */
 
 
 /*
- * End of "$Id: quotas.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: quotas.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index e2f40d8..357cc40 100644 (file)
@@ -1,28 +1,16 @@
 /*
- * "$Id: select.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: select.c 11594 2014-02-14 20:09:01Z msweet $"
  *
- *   Select abstraction functions for the CUPS scheduler.
+ * Select abstraction functions for the CUPS scheduler.
  *
- *   Copyright 2007-2010 by Apple Inc.
- *   Copyright 2006-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdAddSelect()    - Add a file descriptor to the list.
- *   cupsdDoSelect()     - Do a select-like operation.
- *   cupsdIsSelecting()  - Determine whether we are monitoring a file
- *                         descriptor.
- *   cupsdRemoveSelect() - Remove a file descriptor from the list.
- *   cupsdStartSelect()  - Initialize the file polling engine.
- *   cupsdStopSelect()   - Shutdown the file polling engine.
- *   compare_fds()       - Compare file descriptors.
- *   find_fd()           - Find an existing file descriptor record.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -39,8 +27,6 @@
 #  include <sys/time.h>
 #elif defined(HAVE_POLL)
 #  include <poll.h>
-#elif defined(__hpux)
-#  include <sys/time.h>
 #else
 #  include <sys/select.h>
 #endif /* HAVE_EPOLL */
 /*
  * Design Notes for Poll/Select API in CUPSD
  * -----------------------------------------
- * 
+ *
  * SUPPORTED APIS
- * 
+ *
  *     OS              select  poll    epoll   kqueue  /dev/poll
  *     --------------  ------  ------  ------  ------  ---------
  *     AIX             YES     YES     NO      NO      NO
  *     FreeBSD         YES     YES     NO      YES     NO
  *     HP-UX           YES     YES     NO      NO      NO
- *     IRIX            YES     YES     NO      NO      NO
  *     Linux           YES     YES     YES     NO      NO
  *     MacOS X         YES     YES     NO      YES     NO
  *     NetBSD          YES     YES     NO      YES     NO
  *     Solaris         YES     YES     NO      NO      YES
  *     Tru64           YES     YES     NO      NO      NO
  *     Windows         YES     NO      NO      NO      NO
- * 
- * 
+ *
+ *
  * HIGH-LEVEL API
- * 
+ *
  *     typedef void (*cupsd_selfunc_t)(void *data);
- * 
+ *
  *     void cupsdStartSelect(void);
  *     void cupsdStopSelect(void);
  *     void cupsdAddSelect(int fd, cupsd_selfunc_t read_cb,
  *                         cupsd_selfunc_t write_cb, void *data);
  *     void cupsdRemoveSelect(int fd);
  *     int cupsdDoSelect(int timeout);
- * 
- * 
+ *
+ *
  * IMPLEMENTATION STRATEGY
- * 
+ *
  *     0. Common Stuff
  *         a. CUPS array of file descriptor to callback functions
  *            and data + temporary array of removed fd's.
  *            working sets.
  *         d. cupsdStopSelect() frees all of the memory used by the
  *            CUPS array and fd_set's.
- * 
+ *
  *     2. poll() - O(n log n)
  *         a. Regular array of pollfd, sorted the same as the CUPS
  *            array.
  *         e. cupsdRemoveSelect() flags the pollfd array as invalid.
  *         f. cupsdStopSelect() frees all of the memory used by the
  *            CUPS array and pollfd array.
- * 
+ *
  *     3. epoll() - O(n)
  *         a. cupsdStartSelect() creates epoll file descriptor using
  *            epoll_create() with the maximum fd count, and
  *            the callback record.
  *         d. cupsdStopSelect() closes the epoll file descriptor and
  *            frees all of the memory used by the event buffer.
- * 
+ *
  *     4. kqueue() - O(n)
  *         b. cupsdStartSelect() creates kqueue file descriptor
  *            using kqueue() function and allocates a global event
  *            find the callback record.
  *         e. cupsdStopSelect() closes the kqueue() file descriptor
  *            and frees all of the memory used by the event buffer.
- * 
+ *
  *     5. /dev/poll - O(n log n) - NOT YET IMPLEMENTED
  *         a. cupsdStartSelect() opens /dev/poll and allocates an
  *            array of pollfd structs; on failure to open /dev/poll,
@@ -533,15 +518,13 @@ cupsdDoSelect(long timeout)               /* I - Timeout in seconds */
 
 
       if (cupsd_pollfds)
-       pfd = realloc(cupsd_pollfds, allocfds * sizeof(struct pollfd));
+       pfd = realloc(cupsd_pollfds, (size_t)allocfds * sizeof(struct pollfd));
       else
-       pfd = malloc(allocfds * sizeof(struct pollfd));
+       pfd = malloc((size_t)allocfds * sizeof(struct pollfd));
 
       if (!pfd)
       {
-       cupsdLogMessage(CUPSD_LOG_EMERG,
-                       "Unable to allocate %d bytes for polling!",
-                       (int)(allocfds * sizeof(struct pollfd)));
+       cupsdLogMessage(CUPSD_LOG_EMERG, "Unable to allocate %d bytes for polling.", (int)((size_t)allocfds * sizeof(struct pollfd)));
 
        return (-1);
       }
@@ -570,9 +553,9 @@ cupsdDoSelect(long timeout)         /* I - Timeout in seconds */
   }
 
   if (timeout >= 0 && timeout < 86400)
-    nfds = poll(cupsd_pollfds, count, timeout * 1000);
+    nfds = poll(cupsd_pollfds, (nfds_t)count, timeout * 1000);
   else
-    nfds = poll(cupsd_pollfds, count, -1);
+    nfds = poll(cupsd_pollfds, (nfds_t)count, -1);
 
   if (nfds > 0)
   {
@@ -813,7 +796,7 @@ cupsdRemoveSelect(int fd)           /* I - File descriptor */
 void
 cupsdStartSelect(void)
 {
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartSelect()");
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdStartSelect()");
 
   cupsd_fds = cupsArrayNew((cups_array_func_t)compare_fds, NULL);
 
@@ -823,13 +806,13 @@ cupsdStartSelect(void)
 
 #ifdef HAVE_EPOLL
   cupsd_epoll_fd       = epoll_create(MaxFDs);
-  cupsd_epoll_events   = calloc(MaxFDs, sizeof(struct epoll_event));
+  cupsd_epoll_events   = calloc((size_t)MaxFDs, sizeof(struct epoll_event));
   cupsd_update_pollfds = 0;
 
 #elif defined(HAVE_KQUEUE)
   cupsd_kqueue_fd      = kqueue();
   cupsd_kqueue_changes = 0;
-  cupsd_kqueue_events  = calloc(MaxFDs, sizeof(struct kevent));
+  cupsd_kqueue_events  = calloc((size_t)MaxFDs, sizeof(struct kevent));
 
 #elif defined(HAVE_POLL)
   cupsd_update_pollfds = 0;
@@ -851,7 +834,7 @@ cupsdStopSelect(void)
   _cupsd_fd_t  *fdptr;                 /* Current file descriptor */
 
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStopSelect()");
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdStopSelect()");
 
   for (fdptr = (_cupsd_fd_t *)cupsArrayFirst(cupsd_fds);
        fdptr;
@@ -947,5 +930,5 @@ find_fd(int fd)                             /* I - File descriptor */
 
 
 /*
- * End of "$Id: select.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: select.c 11594 2014-02-14 20:09:01Z msweet $".
  */
index 7e511c4..37001de 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: server.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: server.c 12689 2015-06-03 19:49:54Z msweet $"
  *
  *   Server start/stop routines for the CUPS scheduler.
  *
@@ -54,7 +54,7 @@ cupsdStartServer(void)
   * Create the default security profile...
   */
 
-  DefaultProfile = cupsdCreateProfile(0);
+  DefaultProfile = cupsdCreateProfile(0, 1);
 
  /*
   * Startup all the networking stuff...
@@ -142,21 +142,24 @@ cupsdStopServer(void)
 
   if (AccessFile != NULL)
   {
-    cupsFileClose(AccessFile);
+    if (AccessFile != LogStderr)
+      cupsFileClose(AccessFile);
 
     AccessFile = NULL;
   }
 
   if (ErrorFile != NULL)
   {
-    cupsFileClose(ErrorFile);
+    if (ErrorFile != LogStderr)
+      cupsFileClose(ErrorFile);
 
     ErrorFile = NULL;
   }
 
   if (PageFile != NULL)
   {
-    cupsFileClose(PageFile);
+    if (PageFile != LogStderr)
+      cupsFileClose(PageFile);
 
     PageFile = NULL;
   }
@@ -180,5 +183,5 @@ cupsdStopServer(void)
 
 
 /*
- * End of "$Id: server.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: server.c 12689 2015-06-03 19:49:54Z msweet $".
  */
index 7f99149..b608b15 100644 (file)
@@ -1,22 +1,16 @@
 /*
- * "$Id: statbuf.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: statbuf.c 11594 2014-02-14 20:09:01Z msweet $"
  *
- *   Status buffer routines for the CUPS scheduler.
+ * Status buffer routines for the CUPS scheduler.
  *
- *   Copyright 2007-2010 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdStatBufDelete() - Destroy a status buffer.
- *   cupsdStatBufNew()    - Create a new status buffer.
- *   cupsdStatBufUpdate() - Update the status buffer.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -119,7 +113,7 @@ cupsdStatBufNew(int        fd,              /* I - File descriptor of pipe */
 char *                                 /* O - Line from buffer, "", or NULL */
 cupsdStatBufUpdate(
     cupsd_statbuf_t *sb,               /* I - Status buffer */
-    int             *loglevel,         /* O - Log level */ 
+    int             *loglevel,         /* O - Log level */
     char            *line,             /* I - Line buffer */
     int             linelen)           /* I - Size of line buffer */
 {
@@ -138,8 +132,7 @@ cupsdStatBufUpdate(
     * No, read more data...
     */
 
-    if ((bytes = read(sb->fd, sb->buffer + sb->bufused,
-                      CUPSD_SB_BUFFER_SIZE - sb->bufused - 1)) > 0)
+    if ((bytes = read(sb->fd, sb->buffer + sb->bufused, (size_t)(CUPSD_SB_BUFFER_SIZE - sb->bufused - 1))) > 0)
     {
       sb->bufused += bytes;
       sb->buffer[sb->bufused] = '\0';
@@ -258,6 +251,11 @@ cupsdStatBufUpdate(
     *loglevel = CUPSD_LOG_STATE;
     message   = sb->buffer + 6;
   }
+  else if (!strncmp(sb->buffer, "JOBSTATE:", 9))
+  {
+    *loglevel = CUPSD_LOG_JOBSTATE;
+    message   = sb->buffer + 9;
+  }
   else if (!strncmp(sb->buffer, "ATTR:", 5))
   {
     *loglevel = CUPSD_LOG_ATTR;
@@ -307,7 +305,7 @@ cupsdStatBufUpdate(
   * Copy the message to the line buffer...
   */
 
-  strlcpy(line, message, linelen);
+  strlcpy(line, message, (size_t)linelen);
 
  /*
   * Copy over the buffer data we've used up...
@@ -326,5 +324,5 @@ cupsdStatBufUpdate(
 
 
 /*
- * End of "$Id: statbuf.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: statbuf.c 11594 2014-02-14 20:09:01Z msweet $".
  */
index 91564d0..68bf206 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: statbuf.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: statbuf.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Status buffer definitions for the CUPS scheduler.
  *
@@ -45,5 +45,5 @@ extern char           *cupsdStatBufUpdate(cupsd_statbuf_t *sb, int *loglevel,
 
 
 /*
- * End of "$Id: statbuf.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: statbuf.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index 0b9c452..5d0e822 100644 (file)
@@ -1,37 +1,16 @@
 /*
- * "$Id: subscriptions.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: subscriptions.c 12978 2015-11-17 19:29:52Z msweet $"
  *
- *   Subscription routines for the CUPS scheduler.
+ * Subscription routines for the CUPS scheduler.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdAddEvent()               - Add an event to the global event cache.
- *   cupsdAddSubscription()        - Add a new subscription object.
- *   cupsdDeleteAllSubscriptions() - Delete all subscriptions.
- *   cupsdDeleteSubscription()     - Delete a subscription object.
- *   cupsdEventName()              - Return a single event name.
- *   cupsdEventValue()             - Return the event mask value for a name.
- *   cupsdExpireSubscriptions()    - Expire old subscription objects.
- *   cupsdFindSubscription()       - Find a subscription by ID.
- *   cupsdLoadAllSubscriptions()   - Load all subscriptions from the .conf file.
- *   cupsdSaveAllSubscriptions()   - Save all subscriptions to the .conf file.
- *   cupsdStopAllNotifiers()       - Stop all notifier processes.
- *   cupsd_compare_subscriptions() - Compare two subscriptions.
- *   cupsd_delete_event()          - Delete a single event...
- *   cupsd_send_dbus()             - Send a DBUS notification...
- *   cupsd_send_notification()     - Send a notification for the specified
- *                                   event.
- *   cupsd_start_notifier()        - Start a notifier subprocess...
- *   cupsd_update_notifier()       - Read messages from notifiers.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -126,9 +105,7 @@ cupsdAddEvent(
     * Check if this subscription requires this event...
     */
 
-    if ((sub->mask & event) != 0 &&
-        (sub->dest == dest || !sub->dest) &&
-       (sub->job == job || !sub->job))
+    if ((sub->mask & event) != 0 && (sub->dest == dest || !sub->dest || sub->job == job))
     {
      /*
       * Need this event, so create a new event record...
@@ -212,7 +189,7 @@ cupsdAddEvent(
                        (const char * const *)dest->reasons);
 
        ippAddBoolean(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
-                     "printer-is-accepting-jobs", dest->accepting);
+                     "printer-is-accepting-jobs", (char)dest->accepting);
       }
 
       if (job)
@@ -945,9 +922,9 @@ cupsdLoadAllSubscriptions(void)
            if (isxdigit(valueptr[0]) && isxdigit(valueptr[1]))
            {
              if (isdigit(valueptr[0]))
-               sub->user_data[i] = (valueptr[0] - '0') << 4;
+               sub->user_data[i] = (unsigned char)((valueptr[0] - '0') << 4);
              else
-               sub->user_data[i] = (tolower(valueptr[0]) - 'a' + 10) << 4;
+               sub->user_data[i] = (unsigned char)((tolower(valueptr[0]) - 'a' + 10) << 4);
 
              if (isdigit(valueptr[1]))
                sub->user_data[i] |= valueptr[1] - '0';
@@ -966,7 +943,7 @@ cupsdLoadAllSubscriptions(void)
              break;
          }
          else
-           sub->user_data[i] = *valueptr++;
+           sub->user_data[i] = (unsigned char)*valueptr++;
        }
 
        if (*valueptr)
@@ -1638,5 +1615,5 @@ cupsd_update_notifier(void)
 
 
 /*
- * End of "$Id: subscriptions.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: subscriptions.c 12978 2015-11-17 19:29:52Z msweet $".
  */
index 1a786ae..867a1c6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: subscriptions.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: subscriptions.h 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Subscription definitions for the CUPS scheduler.
  *
@@ -162,5 +162,5 @@ extern void cupsdStopAllNotifiers(void);
 
 
 /*
- * End of "$Id: subscriptions.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: subscriptions.h 10996 2013-05-29 11:51:34Z msweet $".
  */
index d5f82c1..63b51a9 100644 (file)
@@ -1,34 +1,16 @@
 /*
- * "$Id: sysman.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: sysman.c 12236 2014-11-03 04:08:41Z msweet $"
  *
- *   System management functions for the CUPS scheduler.
+ * System management functions for the CUPS scheduler.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdCleanDirty()               - Write dirty config and state files.
- *   cupsdMarkDirty()                - Mark config or state files as needing a
- *                                     write.
- *   cupsdSetBusyState()             - Let the system know when we are busy
- *                                     doing something.
- *   cupsdAllowSleep()               - Tell the OS it is now OK to sleep.
- *   cupsdStartSystemMonitor()       - Start monitoring for system change.
- *   cupsdStopSystemMonitor()        - Stop monitoring for system change.
- *   sysEventThreadEntry()           - A thread to receive power and computer
- *                                     name change notifications.
- *   sysEventPowerNotifier()         - Handle power notification events.
- *   sysEventConfigurationNotifier() - Computer name changed notification
- *                                     callback.
- *   sysEventTimerNotifier()         - Handle delayed event notifications.
- *   sysUpdate()                     - Update the current system state.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 
  */
 
 #include "cupsd.h"
-#ifdef HAVE_VPROC_TRANSACTION_BEGIN
-#  include <vproc.h>
-#endif /* HAVE_VPROC_TRANSACTION_BEGIN */
 #ifdef __APPLE__
+#  include <vproc.h>
 #  include <IOKit/pwr_mgt/IOPMLib.h>
-#  ifdef HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H
-#    include <IOKit/pwr_mgt/IOPMLibPrivate.h>
-#  endif /* HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */
 #endif /* __APPLE__ */
 
 
 /*
  * The system management functions cover disk and power management which
- * are primarily used on portable computers.
+ * are primarily used for portable computers.
  *
  * Disk management involves delaying the write of certain configuration
  * and state files to minimize the number of times the disk has to spin
- * up.
+ * up or flash to be written to.
  *
- * Power management support is currently only implemented on MacOS X, but
+ * Power management support is currently only implemented on OS X, but
  * essentially we use four functions to let the OS know when it is OK to
  * put the system to sleep, typically when we are not in the middle of
- * printing a job.
- *
- * Once put to sleep, we invalidate all remote printers since it is common
- * to wake up in a new location/on a new wireless network.
+ * printing a job.  And on OS X we can also "sleep print" - basically the
+ * system only wakes up long enough to service network requests and process
+ * print jobs.
  */
 
-/*
- * Local globals...
- */
-
-#ifdef kIOPMAssertionTypeDenySystemSleep
-static IOPMAssertionID dark_wake = 0;  /* "Dark wake" assertion for sharing */
-#endif /* kIOPMAssertionTypeDenySystemSleep */
-
 
 /*
  * 'cupsdCleanDirty()' - Write dirty config and state files.
@@ -162,9 +130,10 @@ cupsdSetBusyState(void)
     "Active clients and printing jobs",
     "Active clients, printing jobs, and dirty files"
   };
-#ifdef HAVE_VPROC_TRANSACTION_BEGIN
+#ifdef __APPLE__
   static vproc_transaction_t vtran = 0;        /* Current busy transaction */
-#endif /* HAVE_VPROC_TRANSACTION_BEGIN */
+  static IOPMAssertionID keep_awake = 0;/* Keep the system awake while printing */
+#endif /* __APPLE__ */
 
 
  /*
@@ -204,7 +173,7 @@ cupsdSetBusyState(void)
   {
     busy = newbusy;
 
-#ifdef HAVE_VPROC_TRANSACTION_BEGIN
+#ifdef __APPLE__
     if (busy && !vtran)
       vtran = vproc_transaction_begin(NULL);
     else if (!busy && vtran)
@@ -212,24 +181,25 @@ cupsdSetBusyState(void)
       vproc_transaction_end(NULL, vtran);
       vtran = 0;
     }
-#endif /* HAVE_VPROC_TRANSACTION_BEGIN */
+#endif /* __APPLE__ */
   }
 
-#ifdef kIOPMAssertionTypeDenySystemSleep
-  if (cupsArrayCount(PrintingJobs) > 0 && !dark_wake)
+#ifdef __APPLE__
+  if (cupsArrayCount(PrintingJobs) > 0 && !keep_awake)
   {
-    cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting dark wake.");
-    IOPMAssertionCreateWithName(kIOPMAssertionTypeDenySystemSleep,
+    cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting NetworkClientActive.");
+
+    IOPMAssertionCreateWithName(kIOPMAssertNetworkClientActive,
                                kIOPMAssertionLevelOn,
-                               CFSTR("org.cups.cupsd"), &dark_wake);
+                               CFSTR("org.cups.cupsd"), &keep_awake);
   }
-  else if (cupsArrayCount(PrintingJobs) == 0 && dark_wake)
+  else if (cupsArrayCount(PrintingJobs) == 0 && keep_awake)
   {
-    cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing dark wake assertion.");
-    IOPMAssertionRelease(dark_wake);
-    dark_wake = 0;
+    cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing power assertion.");
+    IOPMAssertionRelease(keep_awake);
+    keep_awake = 0;
   }
-#endif /* kIOPMAssertionTypeDenySystemSleep */
+#endif /* __APPLE__ */
 }
 
 
@@ -244,8 +214,10 @@ cupsdSetBusyState(void)
  * Include MacOS-specific headers...
  */
 
+#  include <notify.h>
 #  include <IOKit/IOKitLib.h>
 #  include <IOKit/IOMessage.h>
+#  include <IOKit/ps/IOPowerSources.h>
 #  include <IOKit/pwr_mgt/IOPMLib.h>
 #  include <SystemConfiguration/SystemConfiguration.h>
 #  include <pthread.h>
@@ -310,6 +282,8 @@ static CFStringRef  ComputerNameKey = NULL,
                        NetworkInterfaceKeyIPv6 = NULL;
                                        /* Netowrk interface key */
 static cupsd_sysevent_t        LastSysEvent;   /* Last system event (for delayed sleep) */
+static int             NameChanged = 0;/* Did we get a 'name changed' event during sleep? */
+static int             PSToken = 0;    /* Power source notifications */
 
 
 /*
@@ -325,6 +299,7 @@ static void sysEventConfigurationNotifier(SCDynamicStoreRef store,
                                              void *context);
 static void    sysEventTimerNotifier(CFRunLoopTimerRef timer, void *context);
 static void    sysUpdate(void);
+static void    sysUpdateNames(void);
 
 
 /*
@@ -336,6 +311,7 @@ cupsdAllowSleep(void)
 {
   cupsdCleanDirty();
 
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "Allowing system sleep.");
   IOAllowPowerChange(LastSysEvent.powerKernelPort,
                     LastSysEvent.powerNotificationID);
 }
@@ -351,6 +327,8 @@ cupsdStartSystemMonitor(void)
   int  flags;                          /* fcntl flags on pipe */
 
 
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartSystemMonitor()");
+
   if (cupsdOpenPipe(SysEventPipes))
   {
     cupsdLogMessage(CUPSD_LOG_ERROR, "System event monitor pipe() failed - %s!",
@@ -375,6 +353,15 @@ cupsdStartSystemMonitor(void)
   pthread_mutex_init(&SysEventThreadMutex, NULL);
   pthread_cond_init(&SysEventThreadCond, NULL);
   pthread_create(&SysEventThread, NULL, (void *(*)())sysEventThreadEntry, NULL);
+
+ /*
+  * Monitor for power source changes via dispatch queue...
+  */
+
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartSystemMonitor: IOPSGetTimeRemainingEstimate=%f", IOPSGetTimeRemainingEstimate());
+  ACPower = IOPSGetTimeRemainingEstimate() == kIOPSTimeRemainingUnlimited;
+  notify_register_dispatch(kIOPSNotifyPowerSource, &PSToken, dispatch_get_main_queue(), ^(int t) { (void)t;
+      ACPower = IOPSGetTimeRemainingEstimate() == kIOPSTimeRemainingUnlimited; });
 }
 
 
@@ -388,6 +375,8 @@ cupsdStopSystemMonitor(void)
   CFRunLoopRef rl;                     /* The event handler runloop */
 
 
+  cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStopSystemMonitor()");
+
   if (SysEventThread)
   {
    /*
@@ -418,6 +407,12 @@ cupsdStopSystemMonitor(void)
     cupsdRemoveSelect(SysEventPipes[0]);
     cupsdClosePipe(SysEventPipes);
   }
+
+  if (PSToken != 0)
+  {
+    notify_cancel(PSToken);
+    PSToken = 0;
+  }
 }
 
 
@@ -658,18 +653,19 @@ sysEventPowerNotifier(
 
   switch (messageType)
   {
-    case kIOMessageCanSystemPowerOff:
-    case kIOMessageCanSystemSleep:
+    case kIOMessageCanSystemPowerOff :
+    case kIOMessageCanSystemSleep :
        threadData->sysevent.event |= SYSEVENT_CANSLEEP;
        break;
 
-    case kIOMessageSystemWillRestart:
-    case kIOMessageSystemWillPowerOff:
-    case kIOMessageSystemWillSleep:
+    case kIOMessageSystemWillRestart :
+    case kIOMessageSystemWillPowerOff :
+    case kIOMessageSystemWillSleep :
        threadData->sysevent.event |= SYSEVENT_WILLSLEEP;
+       threadData->sysevent.event &= ~SYSEVENT_WOKE;
        break;
 
-    case kIOMessageSystemHasPoweredOn:
+    case kIOMessageSystemHasPoweredOn :
        /*
        * Because powered on is followed by a net-changed event, delay
        * before sending it.
@@ -679,16 +675,62 @@ sysEventPowerNotifier(
        threadData->sysevent.event |= SYSEVENT_WOKE;
        break;
 
-    case kIOMessageSystemWillNotPowerOff:
-    case kIOMessageSystemWillNotSleep:
+    case kIOMessageSystemWillNotPowerOff :
+    case kIOMessageSystemWillNotSleep :
 #  ifdef kIOMessageSystemWillPowerOn
-    case kIOMessageSystemWillPowerOn:
+    case kIOMessageSystemWillPowerOn :
 #  endif /* kIOMessageSystemWillPowerOn */
     default:
        sendit = 0;
        break;
   }
 
+  switch (messageType)
+  {
+    case kIOMessageCanSystemPowerOff :
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
+                        "Got kIOMessageCanSystemPowerOff message.");
+       break;
+    case kIOMessageCanSystemSleep :
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
+                        "Got kIOMessageCannSystemSleep message.");
+       break;
+    case kIOMessageSystemWillRestart :
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
+                        "Got kIOMessageSystemWillRestart message.");
+       break;
+    case kIOMessageSystemWillPowerOff :
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
+                        "Got kIOMessageSystemWillPowerOff message.");
+       break;
+    case kIOMessageSystemWillSleep :
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
+                        "Got kIOMessageSystemWillSleep message.");
+       break;
+    case kIOMessageSystemHasPoweredOn :
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
+                        "Got kIOMessageSystemHasPoweredOn message.");
+       break;
+    case kIOMessageSystemWillNotPowerOff :
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
+                        "Got kIOMessageSystemWillNotPowerOff message.");
+       break;
+    case kIOMessageSystemWillNotSleep :
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
+                        "Got kIOMessageSystemWillNotSleep message.");
+       break;
+#  ifdef kIOMessageSystemWillPowerOn
+    case kIOMessageSystemWillPowerOn :
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
+                        "Got kIOMessageSystemWillPowerOn message.");
+       break;
+#  endif /* kIOMessageSystemWillPowerOn */
+    default:
+        cupsdLogMessage(CUPSD_LOG_DEBUG, "Got unknown power message %d.",
+                        (int)messageType);
+       break;
+  }
+
   if (sendit == 0)
     IOAllowPowerChange(threadData->sysevent.powerKernelPort,
                        (long)messageArgument);
@@ -816,8 +858,9 @@ sysUpdate(void)
     {
      /*
       * If there are active printers that don't have the connecting-to-device
-      * printer-state-reason then cancel the sleep request (i.e. this reason
-      * indicates a job that is not yet connected to the printer)...
+      * or cups-waiting-for-job-completed printer-state-reason then cancel the
+      * sleep request, i.e., these reasons indicate a job that is not actively
+      * doing anything...
       */
 
       for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
@@ -827,7 +870,8 @@ sysUpdate(void)
         if (p->job)
         {
          for (i = 0; i < p->num_reasons; i ++)
-           if (!strcmp(p->reasons[i], "connecting-to-device"))
+           if (!strcmp(p->reasons[i], "connecting-to-device") ||
+               !strcmp(p->reasons[i], "cups-waiting-for-job-completed"))
              break;
 
          if (!p->num_reasons || i >= p->num_reasons)
@@ -838,14 +882,14 @@ sysUpdate(void)
       if (p)
       {
         cupsdLogMessage(CUPSD_LOG_INFO,
-                       "System sleep canceled because printer %s is active",
+                       "System sleep canceled because printer %s is active.",
                        p->name);
         IOCancelPowerChange(sysevent.powerKernelPort,
                            sysevent.powerNotificationID);
       }
       else
       {
-       cupsdLogMessage(CUPSD_LOG_DEBUG, "System wants to sleep");
+       cupsdLogMessage(CUPSD_LOG_DEBUG, "System wants to sleep.");
         IOAllowPowerChange(sysevent.powerKernelPort,
                           sysevent.powerNotificationID);
       }
@@ -853,50 +897,30 @@ sysUpdate(void)
 
     if (sysevent.event & SYSEVENT_WILLSLEEP)
     {
-      cupsdLogMessage(CUPSD_LOG_DEBUG, "System going to sleep");
+      cupsdLogMessage(CUPSD_LOG_DEBUG, "System going to sleep.");
 
       Sleeping = 1;
 
-      for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
-           p;
-          p = (cupsd_printer_t *)cupsArrayNext(Printers))
-      {
-       cupsdLogMessage(CUPSD_LOG_DEBUG,
-                       "Deregistering local printer \"%s\"", p->name);
-       cupsdDeregisterPrinter(p, 0);
-      }
-
       cupsdCleanDirty();
 
-#ifdef kIOPMAssertionTypeDenySystemSleep
-     /*
-      * Remove our assertion as needed since the user wants the system to
-      * sleep (different than idle sleep)...
-      */
-
-      if (dark_wake)
-      {
-       cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing dark wake assertion.");
-       IOPMAssertionRelease(dark_wake);
-       dark_wake = 0;
-      }
-#endif /* kIOPMAssertionTypeDenySystemSleep */
-
      /*
       * If we have no printing jobs, allow the power change immediately.
-      * Otherwise set the SleepJobs time to 15 seconds in the future when
+      * Otherwise set the SleepJobs time to 10 seconds in the future when
       * we'll take more drastic measures...
       */
 
       if (cupsArrayCount(PrintingJobs) == 0)
+      {
+       cupsdLogMessage(CUPSD_LOG_DEBUG, "Allowing system sleep.");
        IOAllowPowerChange(sysevent.powerKernelPort,
                           sysevent.powerNotificationID);
+      }
       else
       {
        /*
        * If there are active printers that don't have the connecting-to-device
-       * printer-state-reason then delay the sleep request (i.e. this reason
-       * indicates a job that is not yet connected to the printer)...
+       * or cups-waiting-for-job-completed printer-state-reasons then delay the
+       * sleep request, i.e., these reasons indicate a job is active...
        */
 
        for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
@@ -906,7 +930,8 @@ sysUpdate(void)
          if (p->job)
          {
            for (i = 0; i < p->num_reasons; i ++)
-             if (!strcmp(p->reasons[i], "connecting-to-device"))
+             if (!strcmp(p->reasons[i], "connecting-to-device") ||
+                 !strcmp(p->reasons[i], "cups-waiting-for-job-completed"))
                break;
 
            if (!p->num_reasons || i >= p->num_reasons)
@@ -916,11 +941,16 @@ sysUpdate(void)
 
        if (p)
        {
+         cupsdLogMessage(CUPSD_LOG_INFO,
+                         "System sleep delayed because printer %s is active.",
+                         p->name);
+
          LastSysEvent = sysevent;
          SleepJobs    = time(NULL) + 10;
        }
        else
        {
+         cupsdLogMessage(CUPSD_LOG_DEBUG, "Allowing system sleep.");
          IOAllowPowerChange(sysevent.powerKernelPort,
                             sysevent.powerNotificationID);
        }
@@ -929,78 +959,118 @@ sysUpdate(void)
 
     if (sysevent.event & SYSEVENT_WOKE)
     {
-      cupsdLogMessage(CUPSD_LOG_DEBUG, "System woke from sleep");
+      cupsdLogMessage(CUPSD_LOG_DEBUG, "System woke from sleep.");
       IOAllowPowerChange(sysevent.powerKernelPort,
                          sysevent.powerNotificationID);
       Sleeping = 0;
 
-#ifdef kIOPMAssertionTypeDenySystemSleep
-      if (cupsArrayCount(PrintingJobs) > 0 && !dark_wake)
+     /*
+      * Make sure jobs that were queued prior to the system going to sleep don't
+      * get canceled right away...
+      */
+
+      if (MaxJobTime > 0)
       {
-       cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting dark wake.");
-       IOPMAssertionCreateWithName(kIOPMAssertionTypeDenySystemSleep,
-                                   kIOPMAssertionLevelOn,
-                                   CFSTR("org.cups.cupsd"), &dark_wake);
+        cupsd_job_t    *job;           /* Current job */
+
+        for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs);
+             job;
+             job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
+        {
+          if (job->cancel_time)
+          {
+            ipp_attribute_t *cancel_after = ippFindAttribute(job->attrs,
+                                                             "job-cancel-after",
+                                                             IPP_TAG_INTEGER);
+
+            if (cancel_after)
+              job->cancel_time = time(NULL) + ippGetInteger(cancel_after, 0);
+            else
+              job->cancel_time = time(NULL) + MaxJobTime;
+          }
+        }
       }
-#endif /* kIOPMAssertionTypeDenySystemSleep */
+
+      if (NameChanged)
+        sysUpdateNames();
 
       cupsdCheckJobs();
     }
 
     if (sysevent.event & SYSEVENT_NETCHANGED)
     {
-      if (!Sleeping)
+      if (Sleeping)
         cupsdLogMessage(CUPSD_LOG_DEBUG,
-                       "System network configuration changed");
+                       "System network configuration changed - "
+                       "ignored while sleeping.");
       else
         cupsdLogMessage(CUPSD_LOG_DEBUG,
-                       "System network configuration changed; "
-                       "ignored while sleeping");
+                       "System network configuration changed.");
     }
 
     if (sysevent.event & SYSEVENT_NAMECHANGED)
     {
-      if (!Sleeping)
+      if (Sleeping)
+      {
+        NameChanged = 1;
+
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
+                       "Computer name or BTMM domains changed - ignored while "
+                       "sleeping.");
+      }
+      else
       {
         cupsdLogMessage(CUPSD_LOG_DEBUG,
-                       "Computer name or BTMM domains changed");
+                       "Computer name or BTMM domains changed.");
 
-       /*
-       * De-register the individual printers...
-       */
+        sysUpdateNames();
+      }
+    }
+  }
+}
 
-       for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
-            p;
-            p = (cupsd_printer_t *)cupsArrayNext(Printers))
-         cupsdDeregisterPrinter(p, 1);
+
+/*
+ * 'sysUpdateNames()' - Update computer and/or BTMM domains.
+ */
+
+static void
+sysUpdateNames(void)
+{
+  cupsd_printer_t      *p;             /* Current printer */
+
+
+  NameChanged = 0;
+
+ /*
+  * De-register the individual printers...
+  */
+
+  for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
+       p;
+       p = (cupsd_printer_t *)cupsArrayNext(Printers))
+    cupsdDeregisterPrinter(p, 1);
 
 #  if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
      /*
-        * Update the computer name and BTMM domain list...
-       */
+ /*
+  * Update the computer name and BTMM domain list...
+  */
 
-       cupsdUpdateDNSSDName();
+  cupsdUpdateDNSSDName();
 #  endif /* HAVE_DNSSD || HAVE_AVAHI */
 
      /*
-       * Now re-register them...
-       */
+ /*
+  * Now re-register them...
+  */
 
-       for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
-            p;
-            p = (cupsd_printer_t *)cupsArrayNext(Printers))
-         cupsdRegisterPrinter(p);
-      }
-      else
-        cupsdLogMessage(CUPSD_LOG_DEBUG,
-                       "Computer name or BTMM domains changed; ignored while "
-                       "sleeping");
-    }
-  }
+  for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
+       p;
+       p = (cupsd_printer_t *)cupsArrayNext(Printers))
+    cupsdRegisterPrinter(p);
 }
 #endif /* __APPLE__ */
 
 
 /*
- * End of "$Id: sysman.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: sysman.c 12236 2014-11-03 04:08:41Z msweet $".
  */
index d603178..9da386d 100644 (file)
@@ -1,16 +1,16 @@
 /*
- * "$Id: sysman.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: sysman.h 12140 2014-08-30 01:51:22Z msweet $"
  *
- *   System management definitions for the CUPS scheduler.
+ * System management definitions for the CUPS scheduler.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -35,7 +35,9 @@ VAR int                       DirtyFiles      VALUE(CUPSD_DIRTY_NONE),
                                        /* How often do we write dirty files? */
 VAR time_t             DirtyCleanTime  VALUE(0);
                                        /* When to clean dirty files next */
-VAR int                        Sleeping        VALUE(0);
+VAR int                        ACPower         VALUE(-1),
+                                       /* Is the system on AC power? */
+                       Sleeping        VALUE(0);
                                        /* Non-zero if machine is entering or *
                                         * in a sleep state...                */
 VAR time_t             SleepJobs       VALUE(0);
@@ -60,5 +62,5 @@ extern void   cupsdStopSystemMonitor(void);
 
 
 /*
- * End of "$Id: sysman.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: sysman.h 12140 2014-08-30 01:51:22Z msweet $".
  */
index 3ff483e..a614ec4 100644 (file)
@@ -1,27 +1,16 @@
 /*
- * "$Id: testlpd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testlpd.c 12644 2015-05-19 21:22:35Z msweet $"
  *
- *   cups-lpd test program for CUPS.
+ * cups-lpd test program for CUPS.
  *
- *   Copyright 2007-2010 by Apple Inc.
- *   Copyright 2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()          - Simulate an LPD client.
- *   do_command()    - Send the LPD command and wait for a response.
- *   print_job()     - Submit a file for printing.
- *   print_waiting() - Print waiting jobs.
- *   remove_job()    - Cancel a print job.
- *   status_long()   - Show the long printer status.
- *   status_short()  - Show the short printer status.
- *   usage()         - Show program usage...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
  */
 
 static int     do_command(int outfd, int infd, const char *command);
-static int     print_job(int outfd, int infd, char *dest, char **args);
+static int     print_job(int outfd, int infd, char *dest, char **args) __attribute__((nonnull(4)));
 static int     print_waiting(int outfd, int infd, char *dest);
-static int     remove_job(int outfd, int infd, char *dest, char **args);
-static int     status_long(int outfd, int infd, char *dest, char **args);
-static int     status_short(int outfd, int infd, char *dest, char **args);
+static int     remove_job(int outfd, int infd, char *dest, char **args) __attribute__((nonnull(4)));
+static int     status_long(int outfd, int infd, char *dest, char **args) __attribute__((nonnull(4)));
+static int     status_short(int outfd, int infd, char *dest, char **args) __attribute__((nonnull(4)));
 static void    usage(void) __attribute__((noreturn));
 
 
@@ -76,7 +65,7 @@ main(int  argc,                               /* I - Number of command-line arguments */
   */
 
   op              = NULL;
-  opargs          = NULL;
+  opargs          = argv + argc;
   dest            = NULL;
   cupslpd_argc    = 1;
   cupslpd_argv[0] = (char *)"cups-lpd";
@@ -210,15 +199,15 @@ do_command(int        outfd,              /* I - Command file descriptor */
            int        infd,            /* I - Response file descriptor */
           const char *command)         /* I - Command line to send */
 {
-  int  len;                            /* Length of command line */
-  char status;                         /* Status byte */
+  size_t       len;                    /* Length of command line */
+  char         status;                 /* Status byte */
 
 
   printf("COMMAND: %02X %s", command[0], command + 1);
 
   len = strlen(command);
 
-  if (write(outfd, command, len) < len)
+  if ((size_t)write(outfd, command, len) < len)
   {
     puts("    Write failed!");
     return (-1);
@@ -251,7 +240,7 @@ print_job(int  outfd,                       /* I - Command file descriptor */
   struct stat  fileinfo;               /* File information */
   char         *jobname;               /* Job name */
   int          sequence;               /* Sequence number */
-  int          bytes;                  /* Bytes read/written */
+  ssize_t      bytes;                  /* Bytes read/written */
 
 
  /*
@@ -305,10 +294,10 @@ print_job(int  outfd,                     /* I - Command file descriptor */
   * Send the control file...
   */
 
-  bytes = strlen(control);
+  bytes = (ssize_t)strlen(control);
 
   snprintf(command, sizeof(command), "\002%d cfA%03dlocalhost\n",
-           bytes, sequence);
+           (int)bytes, sequence);
 
   if ((status = do_command(outfd, infd, command)) != 0)
   {
@@ -318,14 +307,14 @@ print_job(int  outfd,                     /* I - Command file descriptor */
 
   bytes ++;
 
-  if (write(outfd, control, bytes) < bytes)
+  if (write(outfd, control, (size_t)bytes) < bytes)
   {
-    printf("CONTROL: Unable to write %d bytes!\n", bytes);
+    printf("CONTROL: Unable to write %d bytes!\n", (int)bytes);
     close(fd);
     return (-1);
   }
 
-  printf("CONTROL: Wrote %d bytes.\n", bytes);
+  printf("CONTROL: Wrote %d bytes.\n", (int)bytes);
 
   if (read(infd, command, 1) < 1)
   {
@@ -355,9 +344,9 @@ print_job(int  outfd,                       /* I - Command file descriptor */
 
   while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
   {
-    if (write(outfd, buffer, bytes) < bytes)
+    if (write(outfd, buffer, (size_t)bytes) < bytes)
     {
-      printf("DATA: Unable to write %d bytes!\n", bytes);
+      printf("DATA: Unable to write %d bytes!\n", (int)bytes);
       close(fd);
       return (-1);
     }
@@ -451,21 +440,21 @@ status_long(int  outfd,                   /* I - Command file descriptor */
 {
   char         command[1024],          /* Command buffer */
                buffer[8192];           /* Status buffer */
-  int          bytes;                  /* Bytes read/written */
+  ssize_t      bytes;                  /* Bytes read/written */
 
 
  /*
   * Send the "send short status" command...
   */
 
-  if (args)
+  if (args[0])
     snprintf(command, sizeof(command), "\004%s %s\n", dest, args[0]);
   else
     snprintf(command, sizeof(command), "\004%s\n", dest);
 
-  bytes = strlen(command);
+  bytes = (ssize_t)strlen(command);
 
-  if (write(outfd, command, bytes) < bytes)
+  if (write(outfd, command, (size_t)bytes) < bytes)
     return (-1);
 
  /*
@@ -474,7 +463,7 @@ status_long(int  outfd,                     /* I - Command file descriptor */
 
   while ((bytes = read(infd, buffer, sizeof(buffer))) > 0)
   {
-    fwrite(buffer, 1, bytes, stdout);
+    fwrite(buffer, 1, (size_t)bytes, stdout);
     fflush(stdout);
   }
 
@@ -494,21 +483,21 @@ status_short(int  outfd,          /* I - Command file descriptor */
 {
   char         command[1024],          /* Command buffer */
                buffer[8192];           /* Status buffer */
-  int          bytes;                  /* Bytes read/written */
+  ssize_t      bytes;                  /* Bytes read/written */
 
 
  /*
   * Send the "send short status" command...
   */
 
-  if (args)
+  if (args[0])
     snprintf(command, sizeof(command), "\003%s %s\n", dest, args[0]);
   else
     snprintf(command, sizeof(command), "\003%s\n", dest);
 
-  bytes = strlen(command);
+  bytes = (ssize_t)strlen(command);
 
-  if (write(outfd, command, bytes) < bytes)
+  if (write(outfd, command, (size_t)bytes) < bytes)
     return (-1);
 
  /*
@@ -517,7 +506,7 @@ status_short(int  outfd,            /* I - Command file descriptor */
 
   while ((bytes = read(infd, buffer, sizeof(buffer))) > 0)
   {
-    fwrite(buffer, 1, bytes, stdout);
+    fwrite(buffer, 1, (size_t)bytes, stdout);
     fflush(stdout);
   }
 
@@ -546,5 +535,5 @@ usage(void)
 
 
 /*
- * End of "$Id: testlpd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testlpd.c 12644 2015-05-19 21:22:35Z msweet $".
  */
index 5a71ea9..0271309 100644 (file)
@@ -1,24 +1,16 @@
 /*
- * "$Id: testmime.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testmime.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   MIME test program for CUPS.
+ * MIME test program for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()            - Main entry for the test program.
- *   add_ppd_filter()  - Add a printer filter from a PPD.
- *   add_ppd_filters() - Add all filters from a PPD.
- *   print_rules()     - Print the rules for a file type...
- *   type_dir()        - Show the MIME types for a given directory.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -135,7 +127,7 @@ main(int  argc,                             /* I - Number of command-line args */
       sscanf(argv[i], "%15[^/]/%255s", super, type);
       dst = mimeType(mime, super, type);
 
-      filters = mimeFilter2(mime, src, srcinfo.st_size, dst, &cost);
+      filters = mimeFilter2(mime, src, (size_t)srcinfo.st_size, dst, &cost);
 
       if (!filters)
       {
@@ -264,7 +256,7 @@ add_ppd_filter(mime_t      *mime,   /* I - MIME database */
   {
     char       *ptr;                   /* Pointer into maxsize(nnnn) program */
 
-    maxsize = strtoll(program + 8, &ptr, 10);
+    maxsize = (size_t)strtoll(program + 8, &ptr, 10);
 
     if (*ptr != ')')
     {
@@ -527,5 +519,5 @@ type_dir(mime_t     *mime,          /* I - MIME database */
 
 
 /*
- * End of "$Id: testmime.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testmime.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 425f471..9b443cb 100644 (file)
@@ -1,23 +1,16 @@
 /*
- * "$Id: testspeed.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testspeed.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Scheduler speed test for CUPS.
+ * Scheduler speed test for CUPS.
  *
- *   Copyright 2007-2010 by Apple Inc.
- *   Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()    - Send multiple IPP requests and report on the average response
- *               time.
- *   do_test() - Run a test on a specific host...
- *   usage()   - Show program usage...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -39,7 +32,7 @@
 
 static int     do_test(const char *server, int port,
                        http_encryption_t encryption, int requests,
-                       int verbose);
+                       const char *opstring, int verbose);
 static void    usage(void) __attribute__((noreturn));
 
 
@@ -66,6 +59,7 @@ main(int  argc,                               /* I - Number of command-line arguments */
                end;                    /* End time */
   double       elapsed;                /* Elapsed time */
   int          verbose;                /* Verbosity */
+  const char   *opstring;              /* Operation name */
 
 
  /*
@@ -78,6 +72,7 @@ main(int  argc,                               /* I - Number of command-line arguments */
   port       = ippPort();
   encryption = HTTP_ENCRYPT_IF_REQUESTED;
   verbose    = 0;
+  opstring   = NULL;
 
   for (i = 1; i < argc; i ++)
     if (argv[i][0] == '-')
@@ -85,6 +80,10 @@ main(int  argc,                              /* I - Number of command-line arguments */
       for (ptr = argv[i] + 1; *ptr; ptr ++)
         switch (*ptr)
        {
+         case 'E' : /* Enable encryption */
+             encryption = HTTP_ENCRYPT_REQUIRED;
+             break;
+
          case 'c' : /* Number of children */
              i ++;
              if (i >= argc)
@@ -93,16 +92,20 @@ main(int  argc,                             /* I - Number of command-line arguments */
              children = atoi(argv[i]);
              break;
 
-          case 'r' : /* Number of requests */
+          case 'o' : /* Operation */
              i ++;
              if (i >= argc)
                usage();
 
-             requests = atoi(argv[i]);
+             opstring = argv[i];
              break;
 
-         case 'E' : /* Enable encryption */
-             encryption = HTTP_ENCRYPT_REQUIRED;
+          case 'r' : /* Number of requests */
+             i ++;
+             if (i >= argc)
+               usage();
+
+             requests = atoi(argv[i]);
              break;
 
           case 'v' : /* Verbose logging */
@@ -139,9 +142,10 @@ main(int  argc,                            /* I - Number of command-line arguments */
   start = time(NULL);
 
   if (children < 1)
-    return (do_test(server, port, encryption, requests, verbose));
+    return (do_test(server, port, encryption, requests, opstring, verbose));
   else if (children == 1)
-    good_children = do_test(server, port, encryption, requests, verbose) ? 0 : 1;
+    good_children = do_test(server, port, encryption, requests, opstring,
+                            verbose) ? 0 : 1;
   else
   {
     char       options[255],           /* Command-line options for child */
@@ -174,7 +178,12 @@ main(int  argc,                            /* I - Number of command-line arguments */
        * Child goes here...
        */
 
-        execlp(argv[0], argv[0], options, "0", reqstr, serverstr, (char *)NULL);
+        if (opstring)
+         execlp(argv[0], argv[0], options, "0", reqstr, "-o", opstring,
+                serverstr, (char *)NULL);
+        else
+         execlp(argv[0], argv[0], options, "0", reqstr, serverstr, (char *)NULL);
+
        exit(errno);
       }
       else if (pid < 0)
@@ -237,6 +246,7 @@ do_test(const char        *server,  /* I - Server to use */
         int               port,                /* I - Port number to use */
         http_encryption_t encryption,  /* I - Encryption to use */
        int               requests,     /* I - Number of requests to send */
+       const char        *opstring,    /* I - Operation string */
        int               verbose)      /* I - Verbose output? */
 {
   int          i;                      /* Looping var */
@@ -247,9 +257,10 @@ do_test(const char        *server, /* I - Server to use */
   double       reqtime,                /* Time for this request */
                elapsed;                /* Elapsed time */
   int          op;                     /* Current operation */
-  static ipp_op_t ops[4] =             /* Operations to test... */
+  static ipp_op_t ops[5] =             /* Operations to test... */
                {
                  IPP_PRINT_JOB,
+                 CUPS_GET_DEFAULT,
                  CUPS_GET_PRINTERS,
                  CUPS_GET_CLASSES,
                  IPP_GET_JOBS
@@ -282,7 +293,11 @@ do_test(const char        *server, /* I - Server to use */
     * In addition, IPP_GET_JOBS needs a printer-uri attribute.
     */
 
-    op      = ops[i & 3];
+    if (opstring)
+      op = ippOpValue(opstring);
+    else
+      op = ops[i % (int)(sizeof(ops) / sizeof(ops[0]))];
+
     request = ippNewRequest(op);
 
     gettimeofday(&start, NULL);
@@ -353,13 +368,13 @@ do_test(const char        *server,        /* I - Server to use */
 static void
 usage(void)
 {
-  puts("Usage: testspeed [-c children] [-h] [-r requests] [-v] [-E] "
-       "hostname[:port]");
+  puts("Usage: testspeed [-c children] [-h] [-o operation] [-r requests] [-v] "
+       "[-E] hostname[:port]");
   exit(0);
 }
 
 
 
 /*
- * End of "$Id: testspeed.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testspeed.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 66801af..97a3a83 100644 (file)
@@ -1,23 +1,16 @@
 /*
- * "$Id: testsub.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: testsub.c 11889 2014-05-22 13:54:15Z msweet $"
  *
- *   Scheduler notification tester for CUPS.
+ * Scheduler notification tester for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 2006-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2006-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()             - Subscribe to the .
- *   print_attributes() - Print the attributes in a request...
- *   sigterm_handler()  - Flag when the user hits CTRL-C...
- *   usage()            - Show program usage...
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -251,7 +244,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
       interval = 5;
 
     ippDelete(response);
-    sleep(interval);
+    sleep((unsigned)interval);
   }
 
  /*
@@ -435,17 +428,10 @@ print_attributes(ipp_t *ipp,              /* I - IPP request */
 
       case IPP_TAG_DATE :
           {
-           time_t      vtime;          /* Date/Time value */
-           struct tm   *vdate;         /* Date info */
            char        vstring[256];   /* Formatted time */
 
            for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++)
-           {
-             vtime = ippDateToTime(val->date);
-             vdate = localtime(&vtime);
-             strftime(vstring, sizeof(vstring), "%c", vdate);
-             printf(" (%s)", vstring);
-           }
+             printf(" (%s)", _cupsStrDate(vstring, sizeof(vstring), ippDateToTime(val->date)));
           }
           putchar('\n');
           break;
@@ -519,5 +505,5 @@ usage(void)
 
 
 /*
- * End of "$Id: testsub.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: testsub.c 11889 2014-05-22 13:54:15Z msweet $".
  */
diff --git a/scheduler/tls-darwin.c b/scheduler/tls-darwin.c
deleted file mode 100644 (file)
index bb6998b..0000000
+++ /dev/null
@@ -1,570 +0,0 @@
-/*
- * "$Id: tls-darwin.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- *   TLS support code for the CUPS scheduler on OS X.
- *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdEndTLS()          - Shutdown a secure session with the client.
- *   cupsdStartTLS()        - Start a secure session with the client.
- *   copy_cdsa_certificate() - Copy a SSL/TLS certificate from the System
- *                            keychain.
- *   make_certificate()      - Make a self-signed SSL/TLS certificate.
- */
-
-
-/*
- * Local functions...
- */
-
-static CFArrayRef      copy_cdsa_certificate(cupsd_client_t *con);
-static int             make_certificate(cupsd_client_t *con);
-
-
-/*
- * 'cupsdEndTLS()' - Shutdown a secure session with the client.
- */
-
-int                                    /* O - 1 on success, 0 on error */
-cupsdEndTLS(cupsd_client_t *con)       /* I - Client connection */
-{
-  while (SSLClose(con->http.tls) == errSSLWouldBlock)
-    usleep(1000);
-
-  SSLDisposeContext(con->http.tls);
-  con->http.tls = NULL;
-
-  if (con->http.tls_credentials)
-    CFRelease(con->http.tls_credentials);
-
-  return (1);
-}
-
-
-/*
- * 'cupsdStartTLS()' - Start a secure session with the client.
- */
-
-int                                    /* O - 1 on success, 0 on error */
-cupsdStartTLS(cupsd_client_t *con)     /* I - Client connection */
-{
-  OSStatus     error = 0;              /* Error code */
-  CFArrayRef   peerCerts;              /* Peer certificates */
-
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Encrypting connection.",
-                  con->http.fd);
-
-  con->http.tls_credentials = copy_cdsa_certificate(con);
-
-  if (!con->http.tls_credentials)
-  {
-   /*
-    * No keychain (yet), make a self-signed certificate...
-    */
-
-    if (make_certificate(con))
-      con->http.tls_credentials = copy_cdsa_certificate(con);
-  }
-
-  if (!con->http.tls_credentials)
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                   "Could not find signing key in keychain \"%s\"",
-                   ServerCertificate);
-    error = errSSLBadConfiguration;
-  }
-
-  if (!error)
-    error = SSLNewContext(true, &con->http.tls);
-
-  if (!error)
-    error = SSLSetIOFuncs(con->http.tls, _httpReadCDSA, _httpWriteCDSA);
-
-  if (!error)
-    error = SSLSetConnection(con->http.tls, HTTP(con));
-
-  if (!error)
-    error = SSLSetAllowsExpiredCerts(con->http.tls, true);
-
-  if (!error)
-    error = SSLSetAllowsAnyRoot(con->http.tls, true);
-
-  if (!error)
-    error = SSLSetCertificate(con->http.tls, con->http.tls_credentials);
-
-  if (!error)
-  {
-   /*
-    * Perform SSL/TLS handshake
-    */
-
-    while ((error = SSLHandshake(con->http.tls)) == errSSLWouldBlock)
-      usleep(1000);
-  }
-
-  if (error)
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "Unable to encrypt connection from %s - %s (%d)",
-                    con->http.hostname, cssmErrorString(error), (int)error);
-
-    con->http.error  = error;
-    con->http.status = HTTP_ERROR;
-
-    if (con->http.tls)
-    {
-      SSLDisposeContext(con->http.tls);
-      con->http.tls = NULL;
-    }
-
-    if (con->http.tls_credentials)
-    {
-      CFRelease(con->http.tls_credentials);
-      con->http.tls_credentials = NULL;
-    }
-
-    return (0);
-  }
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.",
-                  con->http.hostname);
-
-  if (!SSLCopyPeerCertificates(con->http.tls, &peerCerts) && peerCerts)
-  {
-    cupsdLogMessage(CUPSD_LOG_DEBUG, "Received %d peer certificates!",
-                   (int)CFArrayGetCount(peerCerts));
-    CFRelease(peerCerts);
-  }
-  else
-    cupsdLogMessage(CUPSD_LOG_DEBUG, "Received NO peer certificates!");
-
-  return (1);
-}
-
-
-/*
- * 'copy_cdsa_certificate()' - Copy a SSL/TLS certificate from the System
- *                             keychain.
- */
-
-static CFArrayRef                              /* O - Array of certificates */
-copy_cdsa_certificate(
-    cupsd_client_t *con)                       /* I - Client connection */
-{
-  OSStatus             err;            /* Error info */
-  SecKeychainRef       keychain = NULL;/* Keychain reference */
-  SecIdentitySearchRef search = NULL;  /* Search reference */
-  SecIdentityRef       identity = NULL;/* Identity */
-  CFArrayRef           certificates = NULL;
-                                       /* Certificate array */
-#  if HAVE_SECPOLICYCREATESSL
-  SecPolicyRef         policy = NULL;  /* Policy ref */
-  CFStringRef          servername = NULL;
-                                       /* Server name */
-  CFMutableDictionaryRef query = NULL; /* Query qualifiers */
-  CFArrayRef           list = NULL;    /* Keychain list */
-#    if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-  char                 localname[1024];/* Local hostname */
-#    endif /* HAVE_DNSSD || HAVE_AVAHI */
-#  elif defined(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY)
-  SecPolicyRef         policy = NULL;  /* Policy ref */
-  SecPolicySearchRef   policy_search = NULL;
-                                       /* Policy search ref */
-  CSSM_DATA            options;        /* Policy options */
-  CSSM_APPLE_TP_SSL_OPTIONS
-                       ssl_options;    /* SSL Option for hostname */
-  char                 localname[1024];/* Local hostname */
-#  endif /* HAVE_SECPOLICYCREATESSL */
-
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG,
-                  "copy_cdsa_certificate: Looking for certs for \"%s\"...",
-                 con->servername);
-
-  if ((err = SecKeychainOpen(ServerCertificate, &keychain)))
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot open keychain \"%s\" - %s (%d)",
-                   ServerCertificate, cssmErrorString(err), (int)err);
-    goto cleanup;
-  }
-
-#  if HAVE_SECPOLICYCREATESSL
-  servername = CFStringCreateWithCString(kCFAllocatorDefault, con->servername,
-                                        kCFStringEncodingUTF8);
-
-  policy = SecPolicyCreateSSL(1, servername);
-
-  if (servername)
-    CFRelease(servername);
-
-  if (!policy)
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create ssl policy reference");
-    goto cleanup;
-  }
-
-  if (!(query = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
-                                         &kCFTypeDictionaryKeyCallBacks,
-                                         &kCFTypeDictionaryValueCallBacks)))
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create query dictionary");
-    goto cleanup;
-  }
-
-  list = CFArrayCreate(kCFAllocatorDefault, (const void **)&keychain, 1,
-                       &kCFTypeArrayCallBacks);
-
-  CFDictionaryAddValue(query, kSecClass, kSecClassIdentity);
-  CFDictionaryAddValue(query, kSecMatchPolicy, policy);
-  CFDictionaryAddValue(query, kSecReturnRef, kCFBooleanTrue);
-  CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitOne);
-  CFDictionaryAddValue(query, kSecMatchSearchList, list);
-
-  CFRelease(list);
-
-  err = SecItemCopyMatching(query, (CFTypeRef *)&identity);
-
-#    if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-  if (err && DNSSDHostName)
-  {
-   /*
-    * Search for the connection server name failed; try the DNS-SD .local
-    * hostname instead...
-    */
-
-    snprintf(localname, sizeof(localname), "%s.local", DNSSDHostName);
-
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                   "copy_cdsa_certificate: Looking for certs for \"%s\"...",
-                   localname);
-
-    servername = CFStringCreateWithCString(kCFAllocatorDefault, localname,
-                                          kCFStringEncodingUTF8);
-
-    CFRelease(policy);
-
-    policy = SecPolicyCreateSSL(1, servername);
-
-    if (servername)
-      CFRelease(servername);
-
-    if (!policy)
-    {
-      cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create ssl policy reference");
-      goto cleanup;
-    }
-
-    CFDictionarySetValue(query, kSecMatchPolicy, policy);
-
-    err = SecItemCopyMatching(query, (CFTypeRef *)&identity);
-  }
-#    endif /* HAVE_DNSSD || HAVE_AVAHI */
-
-  if (err)
-  {
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                   "Cannot find signing key in keychain \"%s\": %s (%d)",
-                   ServerCertificate, cssmErrorString(err), (int)err);
-    goto cleanup;
-  }
-
-#  elif defined(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY)
- /*
-  * Use a policy to search for valid certificates whose common name matches the
-  * servername...
-  */
-
-  if (SecPolicySearchCreate(CSSM_CERT_X_509v3, &CSSMOID_APPLE_TP_SSL,
-                           NULL, &policy_search))
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create a policy search reference");
-    goto cleanup;
-  }
-
-  if (SecPolicySearchCopyNext(policy_search, &policy))
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                   "Cannot find a policy to use for searching");
-    goto cleanup;
-  }
-
-  memset(&ssl_options, 0, sizeof(ssl_options));
-  ssl_options.Version = CSSM_APPLE_TP_SSL_OPTS_VERSION;
-  ssl_options.ServerName = con->servername;
-  ssl_options.ServerNameLen = strlen(con->servername);
-
-  options.Data = (uint8 *)&ssl_options;
-  options.Length = sizeof(ssl_options);
-
-  if (SecPolicySetValue(policy, &options))
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                   "Cannot set policy value to use for searching");
-    goto cleanup;
-  }
-
-  if ((err = SecIdentitySearchCreateWithPolicy(policy, NULL, CSSM_KEYUSE_SIGN,
-                                              keychain, FALSE, &search)))
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                   "Cannot create identity search reference: %s (%d)",
-                   cssmErrorString(err), (int)err);
-    goto cleanup;
-  }
-
-  err = SecIdentitySearchCopyNext(search, &identity);
-
-#    if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-  if (err && DNSSDHostName)
-  {
-   /*
-    * Search for the connection server name failed; try the DNS-SD .local
-    * hostname instead...
-    */
-
-    snprintf(localname, sizeof(localname), "%s.local", DNSSDHostName);
-
-    ssl_options.ServerName    = localname;
-    ssl_options.ServerNameLen = strlen(localname);
-
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                   "copy_cdsa_certificate: Looking for certs for \"%s\"...",
-                   localname);
-
-    if (SecPolicySetValue(policy, &options))
-    {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "Cannot set policy value to use for searching");
-      goto cleanup;
-    }
-
-    CFRelease(search);
-    search = NULL;
-    if ((err = SecIdentitySearchCreateWithPolicy(policy, NULL, CSSM_KEYUSE_SIGN,
-                                              keychain, FALSE, &search)))
-    {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "Cannot create identity search reference: %s (%d)",
-                     cssmErrorString(err), (int)err);
-      goto cleanup;
-    }
-
-    err = SecIdentitySearchCopyNext(search, &identity);
-
-  }
-#    endif /* HAVE_DNSSD || HAVE_AVAHI */
-
-  if (err)
-  {
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                   "Cannot find signing key in keychain \"%s\": %s (%d)",
-                   ServerCertificate, cssmErrorString(err), (int)err);
-    goto cleanup;
-  }
-
-#  else
- /*
-  * Assume there is exactly one SecIdentity in the keychain...
-  */
-
-  if ((err = SecIdentitySearchCreate(keychain, CSSM_KEYUSE_SIGN, &search)))
-  {
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                   "Cannot create identity search reference (%d)", (int)err);
-    goto cleanup;
-  }
-
-  if ((err = SecIdentitySearchCopyNext(search, &identity)))
-  {
-    cupsdLogMessage(CUPSD_LOG_DEBUG,
-                   "Cannot find signing key in keychain \"%s\": %s (%d)",
-                   ServerCertificate, cssmErrorString(err), (int)err);
-    goto cleanup;
-  }
-#  endif /* HAVE_SECPOLICYCREATESSL */
-
-  if (CFGetTypeID(identity) != SecIdentityGetTypeID())
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR, "SecIdentity CFTypeID failure!");
-    goto cleanup;
-  }
-
-  if ((certificates = CFArrayCreate(NULL, (const void **)&identity,
-                                 1, &kCFTypeArrayCallBacks)) == NULL)
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create certificate array");
-    goto cleanup;
-  }
-
-  cleanup :
-
-  if (keychain)
-    CFRelease(keychain);
-  if (search)
-    CFRelease(search);
-  if (identity)
-    CFRelease(identity);
-
-#  if HAVE_SECPOLICYCREATESSL
-  if (policy)
-    CFRelease(policy);
-  if (query)
-    CFRelease(query);
-#  elif defined(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY)
-  if (policy)
-    CFRelease(policy);
-  if (policy_search)
-    CFRelease(policy_search);
-#  endif /* HAVE_SECPOLICYCREATESSL */
-
-  return (certificates);
-}
-
-
-/*
- * 'make_certificate()' - Make a self-signed SSL/TLS certificate.
- */
-
-static int                             /* O - 1 on success, 0 on failure */
-make_certificate(cupsd_client_t *con)  /* I - Client connection */
-{
-  int          pid,                    /* Process ID of command */
-               status;                 /* Status of command */
-  char         command[1024],          /* Command */
-               *argv[4],               /* Command-line arguments */
-               *envp[MAX_ENV + 1],     /* Environment variables */
-               keychain[1024],         /* Keychain argument */
-               infofile[1024],         /* Type-in information for cert */
-#  if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-               localname[1024],        /* Local hostname */
-#  endif /* HAVE_DNSSD || HAVE_AVAHI */
-               *servername;            /* Name of server in cert */
-  cups_file_t  *fp;                    /* Seed/info file */
-  int          infofd;                 /* Info file descriptor */
-
-
-#  if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-  if (con->servername && isdigit(con->servername[0] & 255) && DNSSDHostName)
-  {
-    snprintf(localname, sizeof(localname), "%s.local", DNSSDHostName);
-    servername = localname;
-  }
-  else
-#  endif /* HAVE_DNSSD || HAVE_AVAHI */
-    servername = con->servername;
-
- /*
-  * Run the "certtool" command to generate a self-signed certificate...
-  */
-
-  if (!cupsFileFind("certtool", getenv("PATH"), 1, command, sizeof(command)))
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "No SSL certificate and certtool command not found!");
-    return (0);
-  }
-
- /*
-  * 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)
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "Unable to create certificate information file %s - %s",
-                    infofile, strerror(errno));
-    return (0);
-  }
-
-  cupsFilePrintf(fp,
-                 "%s\n"                        /* Enter key and certificate label */
-                 "r\n"                 /* Generate RSA key pair */
-                 "2048\n"              /* Key size in bits */
-                 "y\n"                 /* OK (y = yes) */
-                 "b\n"                 /* Usage (b=signing/encryption) */
-                 "s\n"                 /* Sign with SHA1 */
-                 "y\n"                 /* OK (y = yes) */
-                 "%s\n"                        /* Common name */
-                 "\n"                  /* Country (default) */
-                 "\n"                  /* Organization (default) */
-                 "\n"                  /* Organizational unit (default) */
-                 "\n"                  /* State/Province (default) */
-                 "%s\n"                        /* Email address */
-                 "y\n",                        /* OK (y = yes) */
-                servername, servername, ServerAdmin);
-  cupsFileClose(fp);
-
-  cupsdLogMessage(CUPSD_LOG_INFO,
-                  "Generating SSL server key and certificate...");
-
-  snprintf(keychain, sizeof(keychain), "k=%s", ServerCertificate);
-
-  argv[0] = "certtool";
-  argv[1] = "c";
-  argv[2] = keychain;
-  argv[3] = NULL;
-
-  cupsdLoadEnv(envp, MAX_ENV);
-
-  infofd = open(infofile, O_RDONLY);
-
-  if (!cupsdStartProcess(command, argv, envp, infofd, -1, -1, -1, -1, 1, NULL,
-                         NULL, &pid))
-  {
-    close(infofd);
-    unlink(infofile);
-    return (0);
-  }
-
-  close(infofd);
-  unlink(infofile);
-
-  while (waitpid(pid, &status, 0) < 0)
-    if (errno != EINTR)
-    {
-      status = 1;
-      break;
-    }
-
-  cupsdFinishProcess(pid, command, sizeof(command), NULL);
-
-  if (status)
-  {
-    if (WIFEXITED(status))
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "Unable to create SSL server key and certificate - "
-                     "the certtool command stopped with status %d!",
-                     WEXITSTATUS(status));
-    else
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "Unable to create SSL server key and certificate - "
-                     "the certtool command crashed on signal %d!",
-                     WTERMSIG(status));
-  }
-  else
-  {
-    cupsdLogMessage(CUPSD_LOG_INFO,
-                    "Created SSL server certificate file \"%s\"...",
-                   ServerCertificate);
-  }
-
-  return (!status);
-}
-
-
-/*
- * End of "$Id: tls-darwin.c 11173 2013-07-23 12:31:34Z msweet $".
- */
diff --git a/scheduler/tls-gnutls.c b/scheduler/tls-gnutls.c
deleted file mode 100644 (file)
index c2d7032..0000000
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * "$Id: tls-gnutls.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- *   TLS support code for the CUPS scheduler using GNU TLS.
- *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdEndTLS()     - Shutdown a secure session with the client.
- *   cupsdStartTLS()   - Start a secure session with the client.
- *   make_certificate() - Make a self-signed SSL/TLS certificate.
- */
-
-
-/*
- * Local functions...
- */
-
-static int             make_certificate(cupsd_client_t *con);
-
-
-/*
- * 'cupsdEndTLS()' - Shutdown a secure session with the client.
- */
-
-int                                    /* O - 1 on success, 0 on error */
-cupsdEndTLS(cupsd_client_t *con)       /* I - Client connection */
-{
-  int          error;                  /* Error code */
-  gnutls_certificate_server_credentials *credentials;
-                                       /* TLS credentials */
-
-
-  credentials = (gnutls_certificate_server_credentials *)
-                    (con->http.tls_credentials);
-
-  error = gnutls_bye(con->http.tls, GNUTLS_SHUT_WR);
-  switch (error)
-  {
-    case GNUTLS_E_SUCCESS:
-      cupsdLogMessage(CUPSD_LOG_DEBUG,
-                     "SSL shutdown successful!");
-      break;
-    default:
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                     "SSL shutdown failed: %s", gnutls_strerror(error));
-      break;
-  }
-
-  gnutls_deinit(con->http.tls);
-  con->http.tls = NULL;
-
-  gnutls_certificate_free_credentials(*credentials);
-  free(credentials);
-
-  return (1);
-}
-
-
-/*
- * 'cupsdStartTLS()' - Start a secure session with the client.
- */
-
-int                                    /* O - 1 on success, 0 on error */
-cupsdStartTLS(cupsd_client_t *con)     /* I - Client connection */
-{
-  int          status;                 /* Error code */
-  gnutls_certificate_server_credentials *credentials;
-                                       /* TLS credentials */
-
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Encrypting connection.",
-                  con->http.fd);
-
- /*
-  * Verify that we have a certificate...
-  */
-
-  if (access(ServerKey, 0) || access(ServerCertificate, 0))
-  {
-   /*
-    * Nope, make a self-signed certificate...
-    */
-
-    if (!make_certificate(con))
-      return (0);
-  }
-
- /*
-  * Create the SSL object and perform the SSL handshake...
-  */
-
-  credentials = (gnutls_certificate_server_credentials *)
-                    malloc(sizeof(gnutls_certificate_server_credentials));
-  if (credentials == NULL)
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "Unable to encrypt connection from %s - %s",
-                    con->http.hostname, strerror(errno));
-
-    return (0);
-  }
-
-  gnutls_certificate_allocate_credentials(credentials);
-  gnutls_certificate_set_x509_key_file(*credentials, ServerCertificate,
-                                      ServerKey, GNUTLS_X509_FMT_PEM);
-
-  gnutls_init(&con->http.tls, GNUTLS_SERVER);
-  gnutls_set_default_priority(con->http.tls);
-
-  gnutls_credentials_set(con->http.tls, GNUTLS_CRD_CERTIFICATE, *credentials);
-  gnutls_transport_set_ptr(con->http.tls, (gnutls_transport_ptr)HTTP(con));
-  gnutls_transport_set_pull_function(con->http.tls, _httpReadGNUTLS);
-  gnutls_transport_set_push_function(con->http.tls, _httpWriteGNUTLS);
-
-  while ((status = gnutls_handshake(con->http.tls)) != GNUTLS_E_SUCCESS)
-  {
-    if (gnutls_error_is_fatal(status))
-    {
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "Unable to encrypt connection from %s - %s",
-                      con->http.hostname, gnutls_strerror(status));
-
-      gnutls_deinit(con->http.tls);
-      gnutls_certificate_free_credentials(*credentials);
-      con->http.tls = NULL;
-      free(credentials);
-      return (0);
-    }
-  }
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.",
-                  con->http.hostname);
-
-  con->http.tls_credentials = credentials;
-  return (1);
-}
-
-
-/*
- * 'make_certificate()' - Make a self-signed SSL/TLS certificate.
- */
-
-static int                             /* O - 1 on success, 0 on failure */
-make_certificate(cupsd_client_t *con)  /* I - Client connection */
-{
-  gnutls_x509_crt      crt;            /* Self-signed certificate */
-  gnutls_x509_privkey  key;            /* Encryption key */
-  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 */
-
-
- /*
-  * Create the encryption key...
-  */
-
-  cupsdLogMessage(CUPSD_LOG_INFO, "Generating SSL server key...");
-
-  gnutls_x509_privkey_init(&key);
-  gnutls_x509_privkey_generate(key, GNUTLS_PK_RSA, 2048, 0);
-
- /*
-  * Save it...
-  */
-
-  bytes = sizeof(buffer);
-
-  if ((result = gnutls_x509_privkey_export(key, GNUTLS_X509_FMT_PEM,
-                                           buffer, &bytes)) < 0)
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to export SSL server key - %s",
-                    gnutls_strerror(result));
-    gnutls_x509_privkey_deinit(key);
-    return (0);
-  }
-  else if ((fp = cupsFileOpen(ServerKey, "w")) != NULL)
-  {
-    cupsFileWrite(fp, (char *)buffer, bytes);
-    cupsFileClose(fp);
-
-    cupsdLogMessage(CUPSD_LOG_INFO, "Created SSL server key file \"%s\"...",
-                   ServerKey);
-  }
-  else
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "Unable to create SSL server key file \"%s\" - %s",
-                   ServerKey, strerror(errno));
-    gnutls_x509_privkey_deinit(key);
-    return (0);
-  }
-
- /*
-  * Create the self-signed certificate...
-  */
-
-  cupsdLogMessage(CUPSD_LOG_INFO, "Generating self-signed SSL 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,
-                                ServerName, strlen(ServerName));
-  gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_ORGANIZATION_NAME, 0,
-                                ServerName, strlen(ServerName));
-  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_alternative_name(crt, GNUTLS_SAN_DNSNAME,
-                                               ServerName);
-  gnutls_x509_crt_set_key_purpose_oid(crt, GNUTLS_KP_TLS_WWW_SERVER, 0);
-  gnutls_x509_crt_set_key_usage(crt, 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)
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "Unable to export SSL server certificate - %s",
-                   gnutls_strerror(result));
-  else if ((fp = cupsFileOpen(ServerCertificate, "w")) != NULL)
-  {
-    cupsFileWrite(fp, (char *)buffer, bytes);
-    cupsFileClose(fp);
-
-    cupsdLogMessage(CUPSD_LOG_INFO,
-                    "Created SSL server certificate file \"%s\"...",
-                   ServerCertificate);
-  }
-  else
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "Unable to create SSL server certificate file \"%s\" - %s",
-                   ServerCertificate, strerror(errno));
-
- /*
-  * Cleanup...
-  */
-
-  gnutls_x509_crt_deinit(crt);
-  gnutls_x509_privkey_deinit(key);
-
-  return (1);
-}
-
-
-/*
- * End of "$Id: tls-gnutls.c 11173 2013-07-23 12:31:34Z msweet $".
- */
diff --git a/scheduler/tls-openssl.c b/scheduler/tls-openssl.c
deleted file mode 100644 (file)
index f123d28..0000000
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * "$Id: tls-openssl.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- *   TLS support code for the CUPS scheduler using OpenSSL.
- *
- *   Copyright 2007-2012 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdEndTLS()     - Shutdown a secure session with the client.
- *   cupsdStartTLS()   - Start a secure session with the client.
- *   make_certificate() - Make a self-signed SSL/TLS certificate.
- */
-
-
-/*
- * Local functions...
- */
-
-static int             make_certificate(cupsd_client_t *con);
-
-
-/*
- * 'cupsdEndTLS()' - Shutdown a secure session with the client.
- */
-
-int                                    /* O - 1 on success, 0 on error */
-cupsdEndTLS(cupsd_client_t *con)       /* I - Client connection */
-{
-  SSL_CTX      *context;               /* Context for encryption */
-  unsigned long        error;                  /* Error code */
-  int          status;                 /* Return status */
-
-
-  context = SSL_get_SSL_CTX(con->http.tls);
-
-  switch (SSL_shutdown(con->http.tls))
-  {
-    case 1 :
-       cupsdLogMessage(CUPSD_LOG_DEBUG,
-                       "SSL shutdown successful!");
-       status = 1;
-       break;
-
-    case -1 :
-       cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "Fatal error during SSL shutdown!");
-
-    default :
-       while ((error = ERR_get_error()) != 0)
-         cupsdLogMessage(CUPSD_LOG_ERROR, "SSL shutdown failed: %s",
-                         ERR_error_string(error, NULL));
-       status = 0;
-       break;
-  }
-
-  SSL_CTX_free(context);
-  SSL_free(con->http.tls);
-  con->http.tls = NULL;
-
-  return (status);
-}
-
-
-/*
- * 'cupsdStartTLS()' - Start a secure session with the client.
- */
-
-int                                    /* O - 1 on success, 0 on error */
-cupsdStartTLS(cupsd_client_t *con)     /* I - Client connection */
-{
-  SSL_CTX      *context;               /* Context for encryption */
-  BIO          *bio;                   /* BIO data */
-  unsigned long        error;                  /* Error code */
-
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "[Client %d] Encrypting connection.",
-                  con->http.fd);
-
- /*
-  * Verify that we have a certificate...
-  */
-
-  if (access(ServerKey, 0) || access(ServerCertificate, 0))
-  {
-   /*
-    * Nope, make a self-signed certificate...
-    */
-
-    if (!make_certificate(con))
-      return (0);
-  }
-
- /*
-  * Create the SSL context and accept the connection...
-  */
-
-  context = SSL_CTX_new(SSLv23_server_method());
-
-  SSL_CTX_set_options(context, SSL_OP_NO_SSLv2); /* Only use SSLv3 or TLS */
-  if (SSLOptions & CUPSD_SSL_NOEMPTY)
-    SSL_CTX_set_options(context, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);
-  SSL_CTX_use_PrivateKey_file(context, ServerKey, SSL_FILETYPE_PEM);
-  SSL_CTX_use_certificate_chain_file(context, ServerCertificate);
-
-  bio = BIO_new(_httpBIOMethods());
-  BIO_ctrl(bio, BIO_C_SET_FILE_PTR, 0, (char *)HTTP(con));
-
-  con->http.tls = SSL_new(context);
-  SSL_set_bio(con->http.tls, bio, bio);
-
-  if (SSL_accept(con->http.tls) != 1)
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to encrypt connection from %s.",
-                    con->http.hostname);
-
-    while ((error = ERR_get_error()) != 0)
-      cupsdLogMessage(CUPSD_LOG_ERROR, "%s", ERR_error_string(error, NULL));
-
-    SSL_CTX_free(context);
-    SSL_free(con->http.tls);
-    con->http.tls = NULL;
-    return (0);
-  }
-
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.",
-                  con->http.hostname);
-
-  return (1);
-}
-
-
-/*
- * 'make_certificate()' - Make a self-signed SSL/TLS certificate.
- */
-
-static int                             /* O - 1 on success, 0 on failure */
-make_certificate(cupsd_client_t *con)  /* I - Client connection */
-{
-#ifdef HAVE_WAITPID
-  int          pid,                    /* Process ID of command */
-               status;                 /* Status of command */
-  char         command[1024],          /* Command */
-               *argv[12],              /* Command-line arguments */
-               *envp[MAX_ENV + 1],     /* Environment variables */
-               infofile[1024],         /* Type-in information for cert */
-               seedfile[1024];         /* Random number seed file */
-  int          envc,                   /* Number of environment variables */
-               bytes;                  /* Bytes written */
-  cups_file_t  *fp;                    /* Seed/info file */
-  int          infofd;                 /* Info file descriptor */
-
-
- /*
-  * Run the "openssl" command to seed the random number generator and
-  * generate a self-signed certificate that is good for 10 years:
-  *
-  *     openssl rand -rand seedfile 1
-  *
-  *     openssl req -new -x509 -keyout ServerKey \
-  *             -out ServerCertificate -days 3650 -nodes
-  *
-  * The seeding step is crucial in ensuring that the openssl command
-  * does not block on systems without sufficient entropy...
-  */
-
-  if (!cupsFileFind("openssl", getenv("PATH"), 1, command, sizeof(command)))
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "No SSL certificate and openssl command not found!");
-    return (0);
-  }
-
-  if (access("/dev/urandom", 0))
-  {
-   /*
-    * If the system doesn't provide /dev/urandom, then any random source
-    * will probably be blocking-style, so generate some random data to
-    * use as a seed for the certificate.  Note that we have already
-    * seeded the random number generator in cupsdInitCerts()...
-    */
-
-    cupsdLogMessage(CUPSD_LOG_INFO,
-                    "Seeding the random number generator...");
-
-   /*
-    * Write the seed file...
-    */
-
-    if ((fp = cupsTempFile2(seedfile, sizeof(seedfile))) == NULL)
-    {
-      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create seed file %s - %s",
-                      seedfile, strerror(errno));
-      return (0);
-    }
-
-    for (bytes = 0; bytes < 262144; bytes ++)
-      cupsFilePutChar(fp, CUPS_RAND());
-
-    cupsFileClose(fp);
-
-   /*
-    * Run the openssl command to seed its random number generator...
-    */
-
-    argv[0] = "openssl";
-    argv[1] = "rand";
-    argv[2] = "-rand";
-    argv[3] = seedfile;
-    argv[4] = "1";
-    argv[5] = NULL;
-
-    envc = cupsdLoadEnv(envp, MAX_ENV);
-    envp[envc] = NULL;
-
-    if (!cupsdStartProcess(command, argv, envp, -1, -1, -1, -1, -1, 1, NULL,
-                           NULL, &pid))
-    {
-      unlink(seedfile);
-      return (0);
-    }
-
-    while (waitpid(pid, &status, 0) < 0)
-      if (errno != EINTR)
-      {
-       status = 1;
-       break;
-      }
-
-    cupsdFinishProcess(pid, command, sizeof(command), NULL);
-
-   /*
-    * Remove the seed file, as it is no longer needed...
-    */
-
-    unlink(seedfile);
-
-    if (status)
-    {
-      if (WIFEXITED(status))
-       cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "Unable to seed random number generator - "
-                       "the openssl command stopped with status %d!",
-                       WEXITSTATUS(status));
-      else
-       cupsdLogMessage(CUPSD_LOG_ERROR,
-                       "Unable to seed random number generator - "
-                       "the openssl command crashed on signal %d!",
-                       WTERMSIG(status));
-
-      return (0);
-    }
-  }
-
- /*
-  * Create a file with the certificate information fields...
-  *
-  * Note: This assumes that the default questions are asked by the openssl
-  * command...
-  */
-
-  if ((fp = cupsTempFile2(infofile, sizeof(infofile))) == NULL)
-  {
-    cupsdLogMessage(CUPSD_LOG_ERROR,
-                    "Unable to create certificate information file %s - %s",
-                    infofile, strerror(errno));
-    return (0);
-  }
-
-  cupsFilePrintf(fp, ".\n.\n.\n%s\n.\n%s\n%s\n",
-                 ServerName, ServerName, ServerAdmin);
-  cupsFileClose(fp);
-
-  cupsdLogMessage(CUPSD_LOG_INFO,
-                  "Generating SSL server key and certificate...");
-
-  argv[0]  = "openssl";
-  argv[1]  = "req";
-  argv[2]  = "-new";
-  argv[3]  = "-x509";
-  argv[4]  = "-keyout";
-  argv[5]  = ServerKey;
-  argv[6]  = "-out";
-  argv[7]  = ServerCertificate;
-  argv[8]  = "-days";
-  argv[9]  = "3650";
-  argv[10] = "-nodes";
-  argv[11] = NULL;
-
-  cupsdLoadEnv(envp, MAX_ENV);
-
-  infofd = open(infofile, O_RDONLY);
-
-  if (!cupsdStartProcess(command, argv, envp, infofd, -1, -1, -1, -1, 1, NULL,
-                         NULL, &pid))
-  {
-    close(infofd);
-    unlink(infofile);
-    return (0);
-  }
-
-  close(infofd);
-  unlink(infofile);
-
-  while (waitpid(pid, &status, 0) < 0)
-    if (errno != EINTR)
-    {
-      status = 1;
-      break;
-    }
-
-  cupsdFinishProcess(pid, command, sizeof(command), NULL);
-
-  if (status)
-  {
-    if (WIFEXITED(status))
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "Unable to create SSL server key and certificate - "
-                     "the openssl command stopped with status %d!",
-                     WEXITSTATUS(status));
-    else
-      cupsdLogMessage(CUPSD_LOG_ERROR,
-                      "Unable to create SSL server key and certificate - "
-                     "the openssl command crashed on signal %d!",
-                     WTERMSIG(status));
-  }
-  else
-  {
-    cupsdLogMessage(CUPSD_LOG_INFO, "Created SSL server key file \"%s\"...",
-                   ServerKey);
-    cupsdLogMessage(CUPSD_LOG_INFO,
-                    "Created SSL server certificate file \"%s\"...",
-                   ServerCertificate);
-  }
-
-  return (!status);
-
-#else
-  return (0);
-#endif /* HAVE_WAITPID */
-}
-
-
-/*
- * End of "$Id: tls-openssl.c 11173 2013-07-23 12:31:34Z msweet $".
- */
diff --git a/scheduler/tls.c b/scheduler/tls.c
deleted file mode 100644 (file)
index bd18263..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * "$Id: tls.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- *   TLS support code for the CUPS scheduler.
- *
- *   Copyright 2012 by Apple Inc.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- */
-
-#include "cupsd.h"
-
-#ifdef HAVE_SSL
-#  ifdef HAVE_CDSASSL
-#    include "tls-darwin.c"
-#  elif defined(HAVE_GNUTLS)
-#    include "tls-gnutls.c"
-#  elif defined(HAVE_LIBSSL)
-#    include "tls-openssl.c"
-#  endif /* HAVE_CDSASSL */
-#endif /* HAVE_SSL */
-
-
-/*
- * End of "$Id: tls.c 11173 2013-07-23 12:31:34Z msweet $".
- */
index bf014be..68ed07e 100644 (file)
@@ -1,26 +1,16 @@
 /*
- * "$Id: type.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: type.c 12577 2015-03-30 19:07:17Z msweet $"
  *
- *   MIME typing routines for CUPS.
+ * MIME typing routines for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   mimeAddType()        - Add a MIME type to a database.
- *   mimeAddTypeRule()    - Add a detection rule for a file type.
- *   mimeFileType()       - Determine the type of a file.
- *   mimeType()           - Lookup a file type.
- *   mime_compare_types() - Compare two MIME super/type names.
- *   mime_check_rules()   - Check each rule in a list.
- *   mime_patmatch()      - Pattern matching.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -319,7 +309,7 @@ mimeAddTypeRule(mime_type_t *mt,    /* I - Type to add to */
       */
 
       ptr = name;
-      while (isalnum(*rule & 255) && (ptr - name) < (sizeof(name) - 1))
+      while (isalnum(*rule & 255) && (size_t)(ptr - name) < (sizeof(name) - 1))
         *ptr++ = *rule++;
 
       *ptr = '\0';
@@ -332,12 +322,12 @@ mimeAddTypeRule(mime_type_t *mt,  /* I - Type to add to */
 
        rule ++;
        for (num_values = 0;
-            num_values < (sizeof(value) / sizeof(value[0]));
+            num_values < (int)(sizeof(value) / sizeof(value[0]));
             num_values ++)
        {
          ptr = value[num_values];
 
-         while ((ptr - value[num_values]) < (sizeof(value[0]) - 1) &&
+         while ((size_t)(ptr - value[num_values]) < (sizeof(value[0]) - 1) &&
                 *rule != '\0' && *rule != ',' && *rule != ')')
          {
            if (isspace(*rule & 255))
@@ -358,7 +348,7 @@ mimeAddTypeRule(mime_type_t *mt,    /* I - Type to add to */
              quote = *rule++;
 
              while (*rule != '\0' && *rule != quote &&
-                    (ptr - value[num_values]) < (sizeof(value[0]) - 1))
+                    (size_t)(ptr - value[num_values]) < (sizeof(value[0]) - 1))
                *ptr++ = *rule++;
 
               if (*rule == quote)
@@ -371,14 +361,14 @@ mimeAddTypeRule(mime_type_t *mt,  /* I - Type to add to */
              rule ++;
 
              while (*rule != '>' && *rule != '\0' &&
-                    (ptr - value[num_values]) < (sizeof(value[0]) - 1))
+                    (size_t)(ptr - value[num_values]) < (sizeof(value[0]) - 1))
              {
                if (isxdigit(rule[0] & 255) && isxdigit(rule[1] & 255))
                {
                  if (isdigit(*rule))
-                   *ptr = (*rule++ - '0') << 4;
+                   *ptr = (char)((*rule++ - '0') << 4);
                  else
-                   *ptr = (tolower(*rule++) - 'a' + 10) << 4;
+                   *ptr = (char)((tolower(*rule++) - 'a' + 10) << 4);
 
                  if (isdigit(*rule))
                    *ptr++ |= *rule++ - '0';
@@ -425,6 +415,8 @@ mimeAddTypeRule(mime_type_t *mt,    /* I - Type to add to */
          op = MIME_MAGIC_ASCII;
        else if (!strcmp(name, "printable"))
          op = MIME_MAGIC_PRINTABLE;
+       else if (!strcmp(name, "regex"))
+         op = MIME_MAGIC_REGEX;
        else if (!strcmp(name, "string"))
          op = MIME_MAGIC_STRING;
        else if (!strcmp(name, "istring"))
@@ -454,7 +446,7 @@ mimeAddTypeRule(mime_type_t *mt,    /* I - Type to add to */
        */
 
        snprintf(value[0], sizeof(value[0]), "*.%s", name);
-       length[0]  = strlen(value[0]);
+       length[0]  = (int)strlen(value[0]);
        op         = MIME_MAGIC_MATCH;
       }
 
@@ -465,7 +457,7 @@ mimeAddTypeRule(mime_type_t *mt,    /* I - Type to add to */
       if ((temp = calloc(1, sizeof(mime_magic_t))) == NULL)
        return (-1);
 
-      temp->invert = invert;
+      temp->invert = (short)invert;
       if (current != NULL)
       {
        temp->parent  = current->parent;
@@ -507,15 +499,15 @@ mimeAddTypeRule(mime_type_t *mt,  /* I - Type to add to */
       */
 
       current  = temp;
-      temp->op = op;
+      temp->op = (short)op;
       invert   = 0;
 
       switch (op)
       {
         case MIME_MAGIC_MATCH :
-           if (length[0] > (sizeof(temp->value.matchv) - 1))
+           if ((size_t)length[0] > (sizeof(temp->value.matchv) - 1))
              return (-1);
-           strcpy(temp->value.matchv, value[0]);
+           strlcpy(temp->value.matchv, value[0], sizeof(temp->value.matchv));
            break;
        case MIME_MAGIC_ASCII :
        case MIME_MAGIC_PRINTABLE :
@@ -524,18 +516,24 @@ mimeAddTypeRule(mime_type_t *mt,  /* I - Type to add to */
            if (temp->length > MIME_MAX_BUFFER)
              temp->length = MIME_MAX_BUFFER;
            break;
+       case MIME_MAGIC_REGEX :
+           temp->offset = strtol(value[0], NULL, 0);
+           temp->length = MIME_MAX_BUFFER;
+           if (regcomp(&(temp->value.rev), value[1], REG_NOSUB | REG_EXTENDED))
+             return (-1);
+           break;
        case MIME_MAGIC_STRING :
        case MIME_MAGIC_ISTRING :
            temp->offset = strtol(value[0], NULL, 0);
-           if (length[1] > sizeof(temp->value.stringv))
+           if ((size_t)length[1] > sizeof(temp->value.stringv))
              return (-1);
            temp->length = length[1];
-           memcpy(temp->value.stringv, value[1], length[1]);
+           memcpy(temp->value.stringv, value[1], (size_t)length[1]);
            break;
        case MIME_MAGIC_CHAR :
            temp->offset = strtol(value[0], NULL, 0);
            if (length[1] == 1)
-             temp->value.charv = value[1][0];
+             temp->value.charv = (unsigned char)value[1][0];
            else
              temp->value.charv = (unsigned char)strtol(value[1], NULL, 0);
 
@@ -551,18 +549,18 @@ mimeAddTypeRule(mime_type_t *mt,  /* I - Type to add to */
            temp->value.intv = (unsigned)strtol(value[1], NULL, 0);
            break;
        case MIME_MAGIC_LOCALE :
-           if (length[0] > (sizeof(temp->value.localev) - 1))
+           if ((size_t)length[0] > (sizeof(temp->value.localev) - 1))
              return (-1);
 
-           strcpy(temp->value.localev, value[0]);
+           strlcpy(temp->value.localev, value[0], sizeof(temp->value.localev));
            break;
        case MIME_MAGIC_CONTAINS :
            temp->offset = strtol(value[0], NULL, 0);
            temp->region = strtol(value[1], NULL, 0);
-           if (length[2] > sizeof(temp->value.stringv))
+           if ((size_t)length[2] > sizeof(temp->value.stringv))
              return (-1);
            temp->length = length[2];
-           memcpy(temp->value.stringv, value[2], length[2]);
+           memcpy(temp->value.stringv, value[2], (size_t)length[2]);
            break;
       }
     }
@@ -615,8 +613,23 @@ mimeFileType(mime_t     *mime,             /* I - MIME database */
     return (NULL);
   }
 
-  fb.offset = -1;
-  fb.length = 0;
+ /*
+  * Then preload the first MIME_MAX_BUFFER bytes of the file into the file
+  * buffer, returning an error if we can't read anything...
+  */
+
+  fb.offset = 0;
+  fb.length = (int)cupsFileRead(fb.fp, (char *)fb.buffer, MIME_MAX_BUFFER);
+
+  if (fb.length <= 0)
+  {
+    DEBUG_printf(("1mimeFileType: Unable to read from \"%s\": %s", pathname, strerror(errno)));
+    DEBUG_puts("1mimeFileType: Returning NULL.");
+
+    cupsFileClose(fb.fp);
+
+    return (NULL);
+  }
 
  /*
   * Figure out the base filename (without directory portion)...
@@ -735,8 +748,8 @@ mime_check_rules(
   int          n;                      /* Looping var */
   int          region;                 /* Region to look at */
   int          logic,                  /* Logic to apply */
-               result,                 /* Result of test */
-               intv;                   /* Integer value */
+               result;                 /* Result of test */
+  unsigned     intv;                   /* Integer value */
   short                shortv;                 /* Short value */
   unsigned char        *bufptr;                /* Pointer into buffer */
 
@@ -782,6 +795,8 @@ mime_check_rules(
            fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
                                      sizeof(fb->buffer));
            fb->offset = rules->offset;
+
+           DEBUG_printf(("4mime_check_rules: MIME_MAGIC_ASCII fb->length=%d", fb->length));
          }
 
          /*
@@ -824,6 +839,8 @@ mime_check_rules(
            fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
                                      sizeof(fb->buffer));
            fb->offset = rules->offset;
+
+           DEBUG_printf(("4mime_check_rules: MIME_MAGIC_PRINTABLE fb->length=%d", fb->length));
          }
 
          /*
@@ -852,6 +869,52 @@ mime_check_rules(
          result = (n == 0);
          break;
 
+      case MIME_MAGIC_REGEX :
+          DEBUG_printf(("5mime_check_rules: regex(%d, \"%s\")", rules->offset,
+                       rules->value.stringv));
+
+         /*
+         * Load the buffer if necessary...
+         */
+
+          if (fb->offset < 0 || rules->offset < fb->offset ||
+             (rules->offset + rules->length) > (fb->offset + fb->length))
+         {
+          /*
+           * Reload file buffer...
+           */
+
+            cupsFileSeek(fb->fp, rules->offset);
+           fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
+                                     sizeof(fb->buffer));
+           fb->offset = rules->offset;
+
+           DEBUG_printf(("4mime_check_rules: MIME_MAGIC_REGEX fb->length=%d", fb->length));
+
+            DEBUG_printf(("5mime_check_rules: loaded %d byte fb->buffer at %d, starts "
+                         "with \"%c%c%c%c\".",
+                         fb->length, fb->offset, fb->buffer[0], fb->buffer[1],
+                         fb->buffer[2], fb->buffer[3]));
+         }
+
+         /*
+         * Compare the buffer against the string.  If the file is too
+         * short then don't compare - it can't match...
+         */
+
+          if (fb->length > 0)
+          {
+            char temp[MIME_MAX_BUFFER + 1];
+                                       /* Temporary buffer */
+
+            memcpy(temp, fb->buffer, (size_t)fb->length);
+            temp[fb->length] = '\0';
+            result = !regexec(&(rules->value.rev), temp, 0, NULL, 0);
+          }
+
+          DEBUG_printf(("5mime_check_rules: result=%d", result));
+         break;
+
       case MIME_MAGIC_STRING :
           DEBUG_printf(("5mime_check_rules: string(%d, \"%s\")", rules->offset,
                        rules->value.stringv));
@@ -872,6 +935,8 @@ mime_check_rules(
                                      sizeof(fb->buffer));
            fb->offset = rules->offset;
 
+           DEBUG_printf(("4mime_check_rules: MIME_MAGIC_STRING fb->length=%d", fb->length));
+
             DEBUG_printf(("5mime_check_rules: loaded %d byte fb->buffer at %d, starts "
                          "with \"%c%c%c%c\".",
                          fb->length, fb->offset, fb->buffer[0], fb->buffer[1],
@@ -886,8 +951,7 @@ mime_check_rules(
          if ((rules->offset + rules->length) > (fb->offset + fb->length))
            result = 0;
          else
-            result = (memcmp(fb->buffer + rules->offset - fb->offset,
-                            rules->value.stringv, rules->length) == 0);
+            result = !memcmp(fb->buffer + rules->offset - fb->offset, rules->value.stringv, (size_t)rules->length);
           DEBUG_printf(("5mime_check_rules: result=%d", result));
          break;
 
@@ -907,6 +971,8 @@ mime_check_rules(
            fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
                                      sizeof(fb->buffer));
            fb->offset = rules->offset;
+
+           DEBUG_printf(("4mime_check_rules: MIME_MAGIC_ISTRING fb->length=%d", fb->length));
          }
 
          /*
@@ -917,9 +983,7 @@ mime_check_rules(
          if ((rules->offset + rules->length) > (fb->offset + fb->length))
            result = 0;
          else
-            result = (_cups_strncasecmp((char *)fb->buffer + rules->offset -
-                                     fb->offset,
-                                 rules->value.stringv, rules->length) == 0);
+            result = !_cups_strncasecmp((char *)fb->buffer + rules->offset - fb->offset, rules->value.stringv, (size_t)rules->length);
          break;
 
       case MIME_MAGIC_CHAR :
@@ -937,6 +1001,8 @@ mime_check_rules(
            fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
                                      sizeof(fb->buffer));
            fb->offset = rules->offset;
+
+           DEBUG_printf(("4mime_check_rules: MIME_MAGIC_CHAR fb->length=%d", fb->length));
          }
 
         /*
@@ -967,6 +1033,8 @@ mime_check_rules(
            fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
                                      sizeof(fb->buffer));
            fb->offset = rules->offset;
+
+           DEBUG_printf(("4mime_check_rules: MIME_MAGIC_SHORT fb->length=%d", fb->length));
          }
 
         /*
@@ -979,7 +1047,7 @@ mime_check_rules(
          else
          {
            bufptr = fb->buffer + rules->offset - fb->offset;
-           shortv = (bufptr[0] << 8) | bufptr[1];
+           shortv = (short)((bufptr[0] << 8) | bufptr[1]);
            result = (shortv == rules->value.shortv);
          }
          break;
@@ -1000,6 +1068,8 @@ mime_check_rules(
            fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
                                      sizeof(fb->buffer));
            fb->offset = rules->offset;
+
+           DEBUG_printf(("4mime_check_rules: MIME_MAGIC_INT fb->length=%d", fb->length));
          }
 
         /*
@@ -1012,19 +1082,16 @@ mime_check_rules(
          else
          {
            bufptr = fb->buffer + rules->offset - fb->offset;
-           intv   = (((((bufptr[0] << 8) | bufptr[1]) << 8) |
-                      bufptr[2]) << 8) | bufptr[3];
+           intv   = (unsigned)((((((bufptr[0] << 8) | bufptr[1]) << 8) | bufptr[2]) << 8) | bufptr[3]);
            result = (intv == rules->value.intv);
          }
          break;
 
       case MIME_MAGIC_LOCALE :
 #if defined(WIN32) || defined(__EMX__) || defined(__APPLE__)
-          result = (strcmp(rules->value.localev,
-                          setlocale(LC_ALL, "")) == 0);
+          result = !strcmp(rules->value.localev, setlocale(LC_ALL, ""));
 #else
-          result = (strcmp(rules->value.localev,
-                          setlocale(LC_MESSAGES, "")) == 0);
+          result = !strcmp(rules->value.localev, setlocale(LC_MESSAGES, ""));
 #endif /* __APPLE__ */
          break;
 
@@ -1044,6 +1111,8 @@ mime_check_rules(
            fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
                                      sizeof(fb->buffer));
            fb->offset = rules->offset;
+
+           DEBUG_printf(("4mime_check_rules: MIME_MAGIC_CONTAINS fb->length=%d", fb->length));
          }
 
          /*
@@ -1061,9 +1130,7 @@ mime_check_rules(
              region = fb->length - rules->length;
 
            for (n = 0; n < region; n ++)
-             if ((result = (memcmp(fb->buffer + rules->offset - fb->offset + n,
-                                   rules->value.stringv,
-                                   rules->length) == 0)) != 0)
+             if ((result = (memcmp(fb->buffer + rules->offset - fb->offset + n, rules->value.stringv, (size_t)rules->length) == 0)) != 0)
                break;
           }
          break;
@@ -1212,5 +1279,5 @@ mime_patmatch(const char *s,              /* I - String to match against */
 
 
 /*
- * End of "$Id: type.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: type.c 12577 2015-03-30 19:07:17Z msweet $".
  */
index 74dd9ff..a31be2e 100644 (file)
@@ -1,28 +1,16 @@
 /*
- * "$Id: util.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: util.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Mini-daemon utility functions for CUPS.
+ * Mini-daemon utility functions for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   cupsdCompareNames()       - Compare two names.
- *   cupsdCreateStringsArray() - Create a CUPS array of strings.
- *   cupsdExec()               - Run a program with the correct environment.
- *   cupsdPipeCommand()        - Read output from a command.
- *   cupsdSendIPPGroup()       - Send a group tag.
- *   cupsdSendIPPHeader()      - Send the IPP response header.
- *   cupsdSendIPPInteger()     - Send an integer attribute.
- *   cupsdSendIPPString()      - Send a string attribute.
- *   cupsdSendIPPTrailer()     - Send the end-of-message tag.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -163,7 +151,7 @@ cupsdCreateStringsArray(const char *s)      /* I - Comma-delimited strings */
   if (!s || !*s)
     return (NULL);
   else
-    return (_cupsArrayNewStrings(s));
+    return (_cupsArrayNewStrings(s, ','));
 }
 
 
@@ -251,7 +239,7 @@ cups_file_t *                               /* O - CUPS file or NULL on error */
 cupsdPipeCommand(int        *pid,      /* O - Process ID or 0 on error */
                  const char *command,  /* I - Command to run */
                  char       **argv,    /* I - Arguments to pass to command */
-                int        user)       /* I - User to run as or 0 for current */
+                uid_t      user)       /* I - User to run as or 0 for current */
 {
   int  fd,                             /* Temporary file descriptor */
        fds[2];                         /* Pipe file descriptors */
@@ -404,8 +392,8 @@ cupsdSendIPPInteger(
   putchar(value_tag);
 
   len = strlen(name);
-  putchar(len >> 8);
-  putchar(len);
+  putchar((int)(len >> 8));
+  putchar((int)len);
 
   fputs(name, stdout);
 
@@ -441,14 +429,14 @@ cupsdSendIPPString(
   putchar(value_tag);
 
   len = strlen(name);
-  putchar(len >> 8);
-  putchar(len);
+  putchar((int)(len >> 8));
+  putchar((int)len);
 
   fputs(name, stdout);
 
   len = strlen(value);
-  putchar(len >> 8);
-  putchar(len);
+  putchar((int)(len >> 8));
+  putchar((int)len);
 
   fputs(value, stdout);
 }
@@ -467,5 +455,5 @@ cupsdSendIPPTrailer(void)
 
 
 /*
- * End of "$Id: util.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: util.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index cf5ae0d..08b495c 100644 (file)
@@ -1,16 +1,16 @@
 /*
- * "$Id: util.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: util.h 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Mini-daemon utility definitions for CUPS.
+ * Mini-daemon utility definitions for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2005 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2005 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 #ifndef _CUPSD_UTIL_H_
@@ -49,7 +49,7 @@ extern int            cupsdCompareNames(const char *s, const char *t);
 extern cups_array_t    *cupsdCreateStringsArray(const char *s);
 extern int             cupsdExec(const char *command, char **argv);
 extern cups_file_t     *cupsdPipeCommand(int *pid, const char *command,
-                                         char **argv, int user);
+                                         char **argv, uid_t user);
 extern void            cupsdSendIPPGroup(ipp_tag_t group_tag);
 extern void            cupsdSendIPPHeader(ipp_status_t status_code,
                                           int request_id);
@@ -67,5 +67,5 @@ extern void           cupsdSendIPPTrailer(void);
 #endif /* !_CUPSD_UTIL_H_ */
 
 /*
- * End of "$Id: util.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: util.h 11558 2014-02-06 18:33:34Z msweet $".
  */
index 84fc07b..effbf99 100644 (file)
@@ -1,93 +1,89 @@
 cancel.o: cancel.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
 cupsaccept.o: cupsaccept.c ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h
 cupsaddsmb.o: cupsaddsmb.c ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/adminutil.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/adminutil.h
 cupsctl.o: cupsctl.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/adminutil.h
 cupstestdsc.o: cupstestdsc.c ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h
 cupstestppd.o: cupstestppd.c ../cups/cups-private.h \
   ../cups/string-private.h ../config.h ../cups/debug-private.h \
-  ../cups/versioning.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
-  ../cups/dir.h ../cups/raster.h
+  ../cups/versioning.h ../cups/array-private.h ../cups/array.h \
+  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h ../cups/dir.h ../cups/raster.h
 lp.o: lp.c ../cups/cups-private.h ../cups/string-private.h ../config.h \
-  ../cups/debug-private.h ../cups/versioning.h ../cups/ipp-private.h \
-  ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/http-private.h \
-  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
-  ../cups/language.h ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+  ../cups/debug-private.h ../cups/versioning.h ../cups/array-private.h \
+  ../cups/array.h ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h \
+  ../cups/http-private.h ../cups/language.h ../cups/md5-private.h \
+  ../cups/language-private.h ../cups/transcode.h ../cups/pwg-private.h \
+  ../cups/cups.h ../cups/file.h ../cups/pwg.h ../cups/ppd-private.h \
+  ../cups/ppd.h ../cups/thread-private.h
 lpadmin.o: lpadmin.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
 lpinfo.o: lpinfo.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
 lpmove.o: lpmove.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
 lpoptions.o: lpoptions.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
-  ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
-lppasswd.o: lppasswd.c ../cups/cups-private.h ../cups/string-private.h \
-  ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
 lpstat.o: lpstat.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
index c034255..62b9da7 100644 (file)
@@ -1,25 +1,25 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 11776 2014-03-28 19:16:05Z msweet $"
 #
-#   System V commands makefile for CUPS.
+# System V commands makefile for CUPS.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1997-2006 by Easy Software Products, all rights reserved.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 include ../Makedefs
 
 TARGETS        =       cancel cupsaccept cupsaddsmb cupsctl cupstestdsc cupstestppd \
-               lp lpadmin lpinfo lpmove lpoptions lppasswd lpstat
+               lp lpadmin lpinfo lpmove lpoptions lpstat
 OBJS   =       cancel.o cupsaccept.o cupsaddsmb.o cupsctl.o cupstestdsc.o \
                cupstestppd.o lp.o lpadmin.o lpinfo.o lpmove.o lpoptions.o \
-               lppasswd.o lpstat.o
+               lpstat.o
 
 
 #
@@ -105,11 +105,11 @@ install-exec:
        $(INSTALL_BIN) lp $(BINDIR)
        $(INSTALL_BIN) lpoptions $(BINDIR)
        $(INSTALL_BIN) lpstat $(BINDIR)
-       $(INSTALL_BIN) lppasswd $(BINDIR)
        if test "x$(SYMROOT)" != "x"; then \
                $(INSTALL_DIR) $(SYMROOT); \
                for file in $(TARGETS); do \
                        cp $$file $(SYMROOT); \
+                       dsymutil $(SYMROOT)/$$file; \
                done \
        fi
 
@@ -138,7 +138,6 @@ uninstall:
        $(RM) $(BINDIR)/cupstestppd
        $(RM) $(BINDIR)/lp
        $(RM) $(BINDIR)/lpoptions
-       $(RM) $(BINDIR)/lppasswd
        $(RM) $(BINDIR)/lpstat
        -$(RMDIR) $(BINDIR)
        $(RM) $(SBINDIR)/accept
@@ -264,15 +263,6 @@ lpoptions: lpoptions.o ../cups/$(LIBCUPS)
 
 
 #
-# lppasswd
-#
-
-lppasswd:      lppasswd.o ../cups/$(LIBCUPS)
-       echo Linking $@...
-       $(CC) $(LDFLAGS) -o lppasswd lppasswd.o $(LIBZ) $(LIBS)
-
-
-#
 # lpstat
 #
 
@@ -289,5 +279,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 11776 2014-03-28 19:16:05Z msweet $".
 #
index 678903f..3881102 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: cancel.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cancel.c 12247 2014-11-12 16:23:39Z msweet $"
  *
  *   "cancel" command for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
+ *   Copyright 2007-2013 by Apple Inc.
  *   Copyright 1997-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -68,6 +68,7 @@ main(int  argc,                               /* I - Number of command-line arguments */
 
   for (i = 1; i < argc; i ++)
     if (argv[i][0] == '-' && argv[i][1])
+    {
       switch (argv[i][1])
       {
         case 'E' : /* Encrypt */
@@ -101,8 +102,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
            break;
 
         case 'a' : /* Cancel all jobs */
-           purge = 1;
-           op    = IPP_PURGE_JOBS;
+           op = purge ? IPP_PURGE_JOBS : IPP_CANCEL_JOBS;
            break;
 
         case 'h' : /* Connect to host */
@@ -131,7 +131,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
            break;
 
         case 'u' : /* Username */
-           op = IPP_PURGE_JOBS;
+           op = IPP_CANCEL_MY_JOBS;
 
            if (argv[i][2] != '\0')
              user = argv[i] + 2;
@@ -151,12 +151,20 @@ main(int  argc,                           /* I - Number of command-line arguments */
            }
            break;
 
+        case 'x' : /* Purge job(s) */
+           purge = 1;
+
+           if (op == IPP_CANCEL_JOBS)
+             op = IPP_PURGE_JOBS;
+           break;
+
        default :
            _cupsLangPrintf(stderr,
                            _("%s: Error - unknown option \"%c\"."),
                            argv[0], argv[i][1]);
            return (1);
       }
+    }
     else
     {
      /*
@@ -271,19 +279,22 @@ main(int  argc,                           /* I - Number of command-line arguments */
        ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
                      "requesting-user-name", NULL, user);
        ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1);
+
+        if (op == IPP_CANCEL_JOBS)
+          op = IPP_CANCEL_MY_JOBS;
       }
       else
        ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
                      "requesting-user-name", NULL, cupsUser());
 
-      if (op == IPP_PURGE_JOBS)
+      if (purge)
        ippAddBoolean(request, IPP_TAG_OPERATION, "purge-jobs", purge);
 
      /*
       * Do the request and get back a response...
       */
 
-      if (op == IPP_PURGE_JOBS && (!user || _cups_strcasecmp(user, cupsUser())))
+      if (op == IPP_CANCEL_JOBS && (!user || _cups_strcasecmp(user, cupsUser())))
         response = cupsDoRequest(http, request, "/admin/");
       else
         response = cupsDoRequest(http, request, "/jobs/");
@@ -304,7 +315,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
       ippDelete(response);
     }
 
-  if (num_dests == 0 && op == IPP_PURGE_JOBS)
+  if (num_dests == 0 && op != IPP_CANCEL_JOB)
   {
    /*
     * Open a connection to the server...
@@ -372,5 +383,5 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: cancel.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cancel.c 12247 2014-11-12 16:23:39Z msweet $".
  */
index 0ba756c..67a682c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cupsaccept.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupsaccept.c 2873 2010-11-30 03:16:24Z msweet $"
  *
  *   "cupsaccept", "cupsdisable", "cupsenable", and "cupsreject" commands for
  *   CUPS.
@@ -235,5 +235,5 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
 
 /*
- * End of "$Id: cupsaccept.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupsaccept.c 2873 2010-11-30 03:16:24Z msweet $".
  */
index e1a82f7..48c99ae 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cupsaddsmb.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupsaddsmb.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   "cupsaddsmb" command for CUPS.
  *
@@ -295,5 +295,5 @@ usage(void)
 
 
 /*
- * End of "$Id: cupsaddsmb.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupsaddsmb.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 4c5a9f1..09d66ea 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cupsctl.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupsctl.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   Scheduler control program for CUPS.
  *
@@ -223,5 +223,5 @@ usage(const char *opt)                      /* I - Option character/string */
 
 
 /*
- * End of "$Id: cupsctl.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupsctl.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 96ff9a3..5e2c809 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cupstestdsc.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupstestdsc.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   DSC test program for CUPS.
  *
@@ -438,5 +438,5 @@ usage(void)
 
 
 /*
- * End of "$Id: cupstestdsc.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupstestdsc.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index dfa5300..9c6be59 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: cupstestppd.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: cupstestppd.c 12583 2015-04-03 00:33:05Z msweet $"
  *
  *   PPD test program for CUPS.
  *
- *   Copyright 2007-2012 by Apple Inc.
+ *   Copyright 2007-2015 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
  *   PostScript is a trademark of Adobe Systems, Inc.
  *
  *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()               - Main entry for test program.
- *   check_basics()       - Check for CR LF, mixed line endings, and blank
- *                          lines.
- *   check_constraints()  - Check UIConstraints in the PPD file.
- *   check_case()         - Check that there are no duplicate groups, options,
- *                          or choices that differ only by case.
- *   check_defaults()     - Check default option keywords in the PPD file.
- *   check_duplex()       - Check duplex keywords in the PPD file.
- *   check_filters()      - Check filters in the PPD file.
- *   check_profiles()     - Check ICC color profiles in the PPD file.
- *   check_sizes()        - Check media sizes in the PPD file.
- *   check_translations() - Check translations in the PPD file.
- *   show_conflicts()     - Show option conflicts in a PPD file.
- *   test_raster()        - Test PostScript commands for raster printers.
- *   usage()              - Show program usage.
- *   valid_path()         - Check whether a path has the correct capitalization.
- *   valid_utf8()         - Check whether a string contains valid UTF-8 text.
  */
 
 /*
@@ -144,7 +124,7 @@ main(int  argc,                             /* I - Number of command-line args */
      char *argv[])                     /* I - Command-line arguments */
 {
   int          i, j, k, m, n;          /* Looping vars */
-  int          len;                    /* Length of option name */
+  size_t       len;                    /* Length of option name */
   char         *opt;                   /* Option character */
   const char   *ptr;                   /* Pointer into string */
   cups_file_t  *fp;                    /* PPD file */
@@ -1470,7 +1450,7 @@ main(int  argc,                           /* I - Number of command-line args */
               k < group->num_options;
               k ++, option ++)
          {
-           len = (int)strlen(option->keyword);
+           len = strlen(option->keyword);
 
            for (m = 0, group2 = ppd->groups;
                 m < ppd->num_groups;
@@ -1479,7 +1459,7 @@ main(int  argc,                           /* I - Number of command-line args */
                   n < group2->num_options;
                   n ++, option2 ++)
                if (option != option2 &&
-                   len < (int)strlen(option2->keyword) &&
+                   len < strlen(option2->keyword) &&
                    !strncmp(option->keyword, option2->keyword, len))
                {
                  _cupsLangPrintf(stdout,
@@ -1880,7 +1860,7 @@ check_constraints(ppd_file_t *ppd,        /* I - PPD file */
         if (!_cups_strncasecmp(option, "Custom", 6) && !_cups_strcasecmp(choice, "True"))
        {
          _cups_strcpy(option, option + 6);
-         strcpy(choice, "Custom");
+         strlcpy(choice, "Custom", sizeof(choice));
        }
 
         if ((o = ppdFindOption(ppd, option)) == NULL)
@@ -1981,13 +1961,13 @@ check_constraints(ppd_file_t *ppd,      /* I - PPD file */
       if (!_cups_strncasecmp(c->option1, "Custom", 6) &&
           !_cups_strcasecmp(c->choice1, "True"))
       {
-       strcpy(option, c->option1 + 6);
-       strcpy(choice, "Custom");
+       strlcpy(option, c->option1 + 6, sizeof(option));
+       strlcpy(choice, "Custom", sizeof(choice));
       }
       else
       {
-       strcpy(option, c->option1);
-       strcpy(choice, c->choice1);
+       strlcpy(option, c->option1, sizeof(option));
+       strlcpy(choice, c->choice1, sizeof(choice));
       }
 
       if ((o = ppdFindOption(ppd, option)) == NULL)
@@ -2022,13 +2002,13 @@ check_constraints(ppd_file_t *ppd,      /* I - PPD file */
       if (!_cups_strncasecmp(c->option2, "Custom", 6) &&
           !_cups_strcasecmp(c->choice2, "True"))
       {
-       strcpy(option, c->option2 + 6);
-       strcpy(choice, "Custom");
+       strlcpy(option, c->option2 + 6, sizeof(option));
+       strlcpy(choice, "Custom", sizeof(choice));
       }
       else
       {
-       strcpy(option, c->option2);
-       strcpy(choice, c->choice2);
+       strlcpy(option, c->option2, sizeof(option));
+       strlcpy(choice, c->choice2, sizeof(choice));
       }
 
       if ((o = ppdFindOption(ppd, option)) == NULL)
@@ -2391,8 +2371,40 @@ check_filters(ppd_file_t *ppd,           /* I - PPD file */
 
       if (!warn)
         errors ++;
+
+      continue;
     }
-    else if (strcmp(program, "-"))
+
+    if (!strncmp(program, "maxsize(", 8))
+    {
+      char     *mptr;                  /* Pointer into maxsize(nnnn) program */
+
+      strtoll(program + 8, &mptr, 10);
+
+      if (*mptr != ')')
+      {
+       if (!warn && !errors && !verbose)
+         _cupsLangPuts(stdout, _(" FAIL"));
+
+       if (verbose >= 0)
+         _cupsLangPrintf(stdout,
+                         _("      %s  Bad cupsFilter value \"%s\"."),
+                         prefix, attr->value);
+
+       if (!warn)
+         errors ++;
+
+       continue;
+      }
+
+      mptr ++;
+      while (_cups_isspace(*mptr))
+       mptr ++;
+
+      _cups_strcpy(program, mptr);
+    }
+
+    if (strcmp(program, "-"))
     {
       if (program[0] == '/')
        snprintf(pathprog, sizeof(pathprog), "%s%s", root, program);
@@ -2477,8 +2489,40 @@ check_filters(ppd_file_t *ppd,           /* I - PPD file */
 
       if (!warn)
         errors ++;
+
+      continue;
     }
-    else if (strcmp(program, "-"))
+
+    if (!strncmp(program, "maxsize(", 8))
+    {
+      char     *mptr;                  /* Pointer into maxsize(nnnn) program */
+
+      strtoll(program + 8, &mptr, 10);
+
+      if (*mptr != ')')
+      {
+       if (!warn && !errors && !verbose)
+         _cupsLangPuts(stdout, _(" FAIL"));
+
+       if (verbose >= 0)
+         _cupsLangPrintf(stdout,
+                         _("      %s  Bad cupsFilter2 value \"%s\"."),
+                         prefix, attr->value);
+
+       if (!warn)
+         errors ++;
+
+       continue;
+      }
+
+      mptr ++;
+      while (_cups_isspace(*mptr))
+       mptr ++;
+
+      _cups_strcpy(program, mptr);
+    }
+
+    if (strcmp(program, "-"))
     {
       if (strncmp(program, "maxsize(", 8) &&
           (ptr = strchr(program + 8, ')')) != NULL)
@@ -3080,8 +3124,8 @@ check_sizes(ppd_file_t *ppd,              /* I - PPD file */
   const char   *prefix;                /* WARN/FAIL prefix */
   ppd_option_t *page_size,             /* PageSize option */
                *page_region;           /* PageRegion option */
-  _pwg_media_t  *pwg_media;             /* PWG media */
-  char          buf[1024];              /* PapeSize name that is supposed to be */
+  _pwg_media_t *pwg_media;             /* PWG media */
+  char         buf[PPD_MAX_NAME];      /* PapeSize name that is supposed to be */
   const char   *ptr;                   /* Pointer into string */
   int          width_2540ths,          /* PageSize width in 2540ths */
                length_2540ths;         /* PageSize length in 2540ths */
@@ -3210,14 +3254,20 @@ check_sizes(ppd_file_t *ppd,            /* I - PPD file */
     {
       is_ok          = 1;
       width_2540ths  = (size->length > size->width) ?
-                           _PWG_FROMPTS(size->width) :
-                          _PWG_FROMPTS(size->length);
+                           PWG_FROM_POINTS(size->width) :
+                          PWG_FROM_POINTS(size->length);
       length_2540ths = (size->length > size->width) ?
-                           _PWG_FROMPTS(size->length) :
-                          _PWG_FROMPTS(size->width);
-      pwg_media      = _pwgMediaForSize(width_2540ths, length_2540ths);
+                           PWG_FROM_POINTS(size->length) :
+                          PWG_FROM_POINTS(size->width);
+      pwg_media      = pwgMediaForSize(width_2540ths, length_2540ths);
 
-      if (pwg_media && pwg_media->ppd && (pwg_media->ppd[0] < 'a' || pwg_media->ppd[0] > 'z'))
+      if (pwg_media &&
+          (abs(pwg_media->width - width_2540ths) > 34 ||
+           abs(pwg_media->length - length_2540ths) > 34))
+        pwg_media = NULL;              /* Only flag matches within a point */
+
+      if (pwg_media && pwg_media->ppd &&
+          (pwg_media->ppd[0] < 'a' || pwg_media->ppd[0] > 'z'))
       {
         size_t ppdlen = strlen(pwg_media->ppd);
                                        /* Length of standard PPD name */
@@ -3232,6 +3282,8 @@ check_sizes(ppd_file_t *ppd,              /* I - PPD file */
             snprintf(buf, sizeof(buf), "%s.Transverse", pwg_media->ppd);
           else
             snprintf(buf, sizeof(buf), "%sRotated", pwg_media->ppd);
+
+         ppdlen = strlen(buf);
         }
 
         if (size->left == 0 && size->bottom == 0 &&
@@ -3300,7 +3352,7 @@ check_sizes(ppd_file_t *ppd,              /* I - PPD file */
         length_tmp = (fabs(size->length - ceil(size->length)) < 0.1) ?
                         ceil(size->length) : size->length;
 
-        if (fmod(width_tmp, 18.0) == 0.0 || fmod(length_tmp, 18.0) == 0.0)
+        if (fmod(width_tmp, 9.0) == 0.0 && fmod(length_tmp, 9.0) == 0.0)
         {
           width_inch  = width_tmp / 72.0;
           length_inch = length_tmp / 72.0;
@@ -3323,14 +3375,26 @@ check_sizes(ppd_file_t *ppd,            /* I - PPD file */
 
         if (_cups_strcasecmp(size->name, buf))
         {
-          size_t buflen = strlen(buf); /* Length of proposed name */
+          size_t       buflen = strlen(buf);
+                                       /* Length of proposed name */
 
           if (_cups_strncasecmp(size->name, buf, buflen) ||
               (strcmp(size->name + buflen, "in") &&
                size->name[buflen] != '.'))
-           _cupsLangPrintf(stdout,
-                           _("      %s  Size \"%s\" should be \"%s\"."),
-                           prefix, size->name, buf);
+          {
+           char        altbuf[PPD_MAX_NAME];
+                                       /* Alternate "wNNNhNNN" name */
+           size_t      altlen;         /* Length of alternate name */
+
+           snprintf(altbuf, sizeof(altbuf), "w%.0fh%.0f", size->width,
+                    size->length);
+           altlen = strlen(altbuf);
+           if (_cups_strncasecmp(size->name, altbuf, altlen) ||
+               (size->name[altlen] && size->name[altlen] != '.'))
+             _cupsLangPrintf(stdout,
+                             _("      %s  Size \"%s\" should be \"%s\"."),
+                             prefix, size->name, buf);
+         }
         }
       }
     }
@@ -3972,5 +4036,5 @@ valid_utf8(const char *s)         /* I - String to check */
 
 
 /*
- * End of "$Id: cupstestppd.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: cupstestppd.c 12583 2015-04-03 00:33:05Z msweet $".
  */
index 830ff04..e6eb028 100644 (file)
@@ -1,22 +1,16 @@
 /*
- * "$Id: lp.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lp.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   "lp" command for CUPS.
+ * "lp" command for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()          - Parse options and send files for printing.
- *   restart_job()   - Restart a job.
- *   set_job_attrs() - Set job attributes.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -156,8 +150,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
                                              dest->options[j].value,
                                              num_options, &options);
            }
-           else if (cupsLastError() == IPP_BAD_REQUEST ||
-                    cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+           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 "
@@ -576,8 +570,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
                                      dest->options[j].value,
                                      num_options, &options);
     }
-    else if (cupsLastError() == IPP_BAD_REQUEST ||
-            cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+    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 "
@@ -640,7 +634,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
     while (status == HTTP_CONTINUE &&
            (bytes = read(0, buffer, sizeof(buffer))) > 0)
-      status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, bytes);
+      status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, (size_t)bytes);
 
     if (status != HTTP_CONTINUE)
     {
@@ -696,8 +690,8 @@ restart_job(const char *command,    /* I - Command name */
 
   ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs"));
 
-  if (cupsLastError() == IPP_BAD_REQUEST ||
-      cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+  if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+      cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
   {
     _cupsLangPrintf(stderr,
                    _("%s: Error - add '/version=1.1' to server "
@@ -745,8 +739,8 @@ set_job_attrs(const char    *command,       /* I - Command name */
 
   ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs"));
 
-  if (cupsLastError() == IPP_BAD_REQUEST ||
-      cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+  if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+      cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
   {
     _cupsLangPrintf(stderr,
                    _("%s: Error - add '/version=1.1' to server "
@@ -764,5 +758,5 @@ set_job_attrs(const char    *command,       /* I - Command name */
 
 
 /*
- * End of "$Id: lp.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lp.c 11558 2014-02-06 18:33:34Z msweet $".
  */
index 25ec642..c181d2b 100644 (file)
@@ -1,36 +1,24 @@
 /*
- * "$Id: lpadmin.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpadmin.c 12603 2015-05-06 01:42:51Z msweet $"
  *
- *   "lpadmin" command for CUPS.
+ * "lpadmin" command for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()                      - Parse options and configure the scheduler.
- *   add_printer_to_class()      - Add a printer to a class.
- *   default_printer()           - Set the default printing destination.
- *   delete_printer()            - Delete a printer from the system.
- *   delete_printer_from_class() - Delete a printer from a class.
- *   delete_printer_option()     - Delete a printer option.
- *   enable_printer()            - Enable a printer.
- *   get_printer_type()          - Determine the printer type and URI.
- *   set_printer_options()       - Set the printer options and/or file.
- *   validate_name()             - Make sure the printer name only contains
- *                                 valid chars.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
  * Include necessary headers...
  */
 
+#define _CUPS_NO_DEPRECATED
+#define _PPD_DEPRECATED
 #include <cups/cups-private.h>
 
 
@@ -46,6 +34,7 @@ static int            delete_printer_from_class(http_t *http, char *printer,
 static int             delete_printer_option(http_t *http, char *printer,
                                              char *option);
 static int             enable_printer(http_t *http, char *printer);
+static char            *get_printer_ppd(const char *uri, char *buffer, size_t bufsize);
 static cups_ptype_t    get_printer_type(http_t *http, char *printer, char *uri,
                                         size_t urisize);
 static int             set_printer_options(http_t *http, char *printer,
@@ -69,7 +58,11 @@ main(int  argc,                      /* I - Number of command-line arguments */
                *val;           /* Pointer to allow/deny value */
   int          num_options;    /* Number of options */
   cups_option_t        *options;       /* Options */
-  char         *file;          /* New PPD file/interface script */
+  char         *file,          /* New PPD file/interface script */
+               evefile[1024] = "";
+                               /* IPP Everywhere PPD */
+  const char   *ppd_name,      /* ppd-name value */
+               *device_uri;    /* device-uri value */
 
 
   _cupsSetLocale(argv);
@@ -87,8 +80,7 @@ main(int  argc,                       /* I - Number of command-line arguments */
         case 'c' : /* Add printer to class */
            if (!http)
            {
-              http = httpConnectEncrypt(cupsServer(), ippPort(),
-                                       cupsEncryption());
+              http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
 
              if (http == NULL)
              {
@@ -140,8 +132,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
         case 'd' : /* Set as default destination */
            if (!http)
            {
-              http = httpConnectEncrypt(cupsServer(), ippPort(),
-                                       cupsEncryption());
+              http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
 
              if (http == NULL)
              {
@@ -231,10 +222,10 @@ main(int  argc,                   /* I - Number of command-line arguments */
            if (printer == NULL)
            {
 #ifdef HAVE_SSL
-             cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
+             cupsSetEncryption(HTTP_ENCRYPTION_REQUIRED);
 
              if (http)
-               httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
+               httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
 #else
               _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."),
                              argv[0]);
@@ -244,8 +235,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
 
            if (!http)
            {
-              http = httpConnectEncrypt(cupsServer(), ippPort(),
-                                       cupsEncryption());
+              http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
 
              if (http == NULL)
              {
@@ -330,8 +320,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
         case 'r' : /* Remove printer from class */
            if (!http)
            {
-              http = httpConnectEncrypt(cupsServer(), ippPort(),
-                                       cupsEncryption());
+              http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
 
              if (http == NULL)
              {
@@ -384,8 +373,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
         case 'R' : /* Remove option */
            if (!http)
            {
-              http = httpConnectEncrypt(cupsServer(), ippPort(),
-                                       cupsEncryption());
+              http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
 
              if (http == NULL)
              {
@@ -501,8 +489,7 @@ main(int  argc,                     /* I - Number of command-line arguments */
         case 'x' : /* Delete a printer */
            if (!http)
            {
-              http = httpConnectEncrypt(cupsServer(), ippPort(),
-                                       cupsEncryption());
+              http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
 
              if (http == NULL)
              {
@@ -635,11 +622,19 @@ main(int  argc,                   /* I - Number of command-line arguments */
   * Set options as needed...
   */
 
+  if ((ppd_name = cupsGetOption("ppd-name", num_options, options)) != NULL && !strcmp(ppd_name, "everywhere") && (device_uri = cupsGetOption("device-uri", num_options, options)) != NULL)
+  {
+    if ((file = get_printer_ppd(device_uri, evefile, sizeof(evefile))) == NULL)
+      return (1);
+
+    num_options = cupsRemoveOption("ppd-name", num_options, &options);
+  }
+
   if (num_options || file)
   {
     if (!http)
     {
-      http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
+      http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
 
       if (http == NULL)
       {
@@ -662,6 +657,9 @@ main(int  argc,                     /* I - Number of command-line arguments */
       return (1);
   }
 
+  if (evefile[0])
+    unlink(evefile);
+
   if (printer == NULL)
   {
     _cupsLangPuts(stdout,
@@ -706,7 +704,7 @@ add_printer_to_class(http_t *http,  /* I - Server connection */
                 printer, pclass));
 
  /*
-  * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
+  * Build an IPP_OP_GET_PRINTER_ATTRIBUTES request, which requires the following
   * attributes:
   *
   *    attributes-charset
@@ -715,7 +713,7 @@ add_printer_to_class(http_t *http,  /* I - Server connection */
   *    requesting-user-name
   */
 
-  request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+  request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
 
   httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
                    "localhost", 0, "/classes/%s", pclass);
@@ -731,7 +729,7 @@ add_printer_to_class(http_t *http,  /* I - Server connection */
   response = cupsDoRequest(http, request, "/");
 
  /*
-  * Build a CUPS_ADD_MODIFY_CLASS request, which requires the following
+  * Build a CUPS-Add-Modify-Class request, which requires the following
   * attributes:
   *
   *    attributes-charset
@@ -741,7 +739,7 @@ add_printer_to_class(http_t *http,  /* I - Server connection */
   *    member-uris
   */
 
-  request = ippNewRequest(CUPS_ADD_MODIFY_CLASS);
+  request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
 
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
                "printer-uri", NULL, uri);
@@ -800,7 +798,7 @@ add_printer_to_class(http_t *http,  /* I - Server connection */
   ippDelete(response);
 
   ippDelete(cupsDoRequest(http, request, "/admin/"));
-  if (cupsLastError() > IPP_OK_CONFLICT)
+  if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
 
@@ -826,7 +824,7 @@ default_printer(http_t *http,               /* I - Server connection */
   DEBUG_printf(("default_printer(%p, \"%s\")\n", http, printer));
 
  /*
-  * Build a CUPS_SET_DEFAULT request, which requires the following
+  * Build a CUPS-Set-Default request, which requires the following
   * attributes:
   *
   *    attributes-charset
@@ -838,7 +836,7 @@ default_printer(http_t *http,               /* I - Server connection */
   httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
                    "localhost", 0, "/printers/%s", printer);
 
-  request = ippNewRequest(CUPS_SET_DEFAULT);
+  request = ippNewRequest(IPP_OP_CUPS_SET_DEFAULT);
 
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
                "printer-uri", NULL, uri);
@@ -851,7 +849,7 @@ default_printer(http_t *http,               /* I - Server connection */
 
   ippDelete(cupsDoRequest(http, request, "/admin/"));
 
-  if (cupsLastError() > IPP_OK_CONFLICT)
+  if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
 
@@ -877,7 +875,7 @@ delete_printer(http_t *http,                /* I - Server connection */
   DEBUG_printf(("delete_printer(%p, \"%s\")\n", http, printer));
 
  /*
-  * Build a CUPS_DELETE_PRINTER request, which requires the following
+  * Build a CUPS-Delete-Printer request, which requires the following
   * attributes:
   *
   *    attributes-charset
@@ -886,7 +884,7 @@ delete_printer(http_t *http,                /* I - Server connection */
   *    requesting-user-name
   */
 
-  request = ippNewRequest(CUPS_DELETE_PRINTER);
+  request = ippNewRequest(IPP_OP_CUPS_DELETE_PRINTER);
 
   httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
                    "localhost", 0, "/printers/%s", printer);
@@ -901,7 +899,7 @@ delete_printer(http_t *http,                /* I - Server connection */
 
   ippDelete(cupsDoRequest(http, request, "/admin/"));
 
-  if (cupsLastError() > IPP_OK_CONFLICT)
+  if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
 
@@ -934,7 +932,7 @@ delete_printer_from_class(
                 printer, pclass));
 
  /*
-  * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
+  * Build an IPP_OP_GET_PRINTER_ATTRIBUTES request, which requires the following
   * attributes:
   *
   *    attributes-charset
@@ -943,7 +941,7 @@ delete_printer_from_class(
   *    requesting-user-name
   */
 
-  request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+  request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
 
   httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
                    "localhost", 0, "/classes/%s", pclass);
@@ -957,7 +955,7 @@ delete_printer_from_class(
   */
 
   if ((response = cupsDoRequest(http, request, "/classes/")) == NULL ||
-      response->request.status.status_code == IPP_NOT_FOUND)
+      response->request.status.status_code == IPP_STATUS_ERROR_NOT_FOUND)
   {
     _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
 
@@ -997,7 +995,7 @@ delete_printer_from_class(
   if (members->num_values == 1)
   {
    /*
-    * Build a CUPS_DELETE_CLASS request, which requires the following
+    * Build a CUPS-Delete-Class request, which requires the following
     * attributes:
     *
     *    attributes-charset
@@ -1006,7 +1004,7 @@ delete_printer_from_class(
     *    requesting-user-name
     */
 
-    request = ippNewRequest(CUPS_DELETE_CLASS);
+    request = ippNewRequest(IPP_OP_CUPS_DELETE_CLASS);
 
     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
                 "printer-uri", NULL, uri);
@@ -1016,7 +1014,7 @@ delete_printer_from_class(
   else
   {
    /*
-    * Build a CUPS_ADD_MODIFY_CLASS request, which requires the following
+    * Build a IPP_OP_CUPS_ADD_MODIFY_CLASS request, which requires the following
     * attributes:
     *
     *    attributes-charset
@@ -1026,7 +1024,7 @@ delete_printer_from_class(
     *    member-uris
     */
 
-    request = ippNewRequest(CUPS_ADD_MODIFY_CLASS);
+    request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
 
     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
                 "printer-uri", NULL, uri);
@@ -1055,7 +1053,7 @@ delete_printer_from_class(
 
   ippDelete(cupsDoRequest(http, request, "/admin/"));
 
-  if (cupsLastError() > IPP_OK_CONFLICT)
+  if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
 
@@ -1080,7 +1078,7 @@ delete_printer_option(http_t *http,       /* I - Server connection */
 
 
  /*
-  * Build a CUPS_ADD_MODIFY_PRINTER or CUPS_ADD_MODIFY_CLASS request, which
+  * Build a IPP_OP_CUPS_ADD_MODIFY_PRINTER or IPP_OP_CUPS_ADD_MODIFY_CLASS request, which
   * requires the following attributes:
   *
   *    attributes-charset
@@ -1091,9 +1089,9 @@ delete_printer_option(http_t *http,       /* I - Server connection */
   */
 
   if (get_printer_type(http, printer, uri, sizeof(uri)) & CUPS_PRINTER_CLASS)
-    request = ippNewRequest(CUPS_ADD_MODIFY_CLASS);
+    request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
   else
-    request = ippNewRequest(CUPS_ADD_MODIFY_PRINTER);
+    request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_PRINTER);
 
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
                "printer-uri", NULL, uri);
@@ -1107,7 +1105,7 @@ delete_printer_option(http_t *http,       /* I - Server connection */
 
   ippDelete(cupsDoRequest(http, request, "/admin/"));
 
-  if (cupsLastError() > IPP_OK_CONFLICT)
+  if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
 
@@ -1133,7 +1131,7 @@ enable_printer(http_t *http,              /* I - Server connection */
   DEBUG_printf(("enable_printer(%p, \"%s\")\n", http, printer));
 
  /*
-  * Build a CUPS_ADD_MODIFY_PRINTER or CUPS_ADD_MODIFY_CLASS request, which
+  * Build a IPP_OP_CUPS_ADD_MODIFY_PRINTER or IPP_OP_CUPS_ADD_MODIFY_CLASS request, which
   * require the following attributes:
   *
   *    attributes-charset
@@ -1145,16 +1143,16 @@ enable_printer(http_t *http,            /* I - Server connection */
   */
 
   if (get_printer_type(http, printer, uri, sizeof(uri)) & CUPS_PRINTER_CLASS)
-    request = ippNewRequest(CUPS_ADD_MODIFY_CLASS);
+    request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
   else
-    request = ippNewRequest(CUPS_ADD_MODIFY_PRINTER);
+    request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_PRINTER);
 
   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());
   ippAddInteger(request, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state",
-                IPP_PRINTER_IDLE);
+                IPP_PSTATE_IDLE);
   ippAddBoolean(request, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1);
 
  /*
@@ -1163,7 +1161,7 @@ enable_printer(http_t *http,              /* I - Server connection */
 
   ippDelete(cupsDoRequest(http, request, "/admin/"));
 
-  if (cupsLastError() > IPP_OK_CONFLICT)
+  if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
 
@@ -1175,6 +1173,79 @@ enable_printer(http_t *http,             /* I - Server connection */
 
 
 /*
+ * '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 */
+
+
+ /*
+  * Connect to the printer...
+  */
+
+  if (strstr(uri, "._tcp"))
+  {
+   /*
+    * Resolve URI...
+    */
+
+    if (!_httpResolveURI(uri, resolved, sizeof(resolved), _HTTP_RESOLVE_DEFAULT, NULL, NULL))
+    {
+      _cupsLangPrintf(stderr, _("%s: Unable to resolve \"%s\"."), "lpadmin", 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)
+  {
+    _cupsLangPrintf(stderr, _("%s: Bad printer URI \"%s\"."), "lpadmin", 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)
+  {
+    _cupsLangPrintf(stderr, _("%s: Unable to connect to \"%s:%d\": %s"), "lpadmin", 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);
+  response = cupsDoRequest(http, request, resource);
+
+  if (!_ppdCreateFromIPP(buffer, bufsize, response))
+    _cupsLangPrintf(stderr, _("%s: Unable to create PPD file: %s"), "lpadmin", strerror(errno));
+
+  ippDelete(response);
+  httpClose(http);
+
+  if (buffer[0])
+    return (buffer);
+  else
+    return (NULL);
+}
+
+
+/*
  * 'get_printer_type()' - Determine the printer type and URI.
  */
 
@@ -1201,10 +1272,9 @@ get_printer_type(http_t *http,           /* I - Server connection */
   *    requesting-user-name
   */
 
-  httpAssembleURIf(HTTP_URI_CODING_ALL, uri, urisize, "ipp", NULL, "localhost",
-                   ippPort(), "/printers/%s", printer);
+  httpAssembleURIf(HTTP_URI_CODING_ALL, uri, (int)urisize, "ipp", NULL, "localhost", ippPort(), "/printers/%s", printer);
 
-  request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+  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_KEYWORD,
@@ -1223,8 +1293,7 @@ get_printer_type(http_t *http,            /* I - Server connection */
     type = (cups_ptype_t)attr->values[0].integer;
 
     if (type & CUPS_PRINTER_CLASS)
-      httpAssembleURIf(HTTP_URI_CODING_ALL, uri, urisize, "ipp", NULL,
-                      "localhost", ippPort(), "/classes/%s", printer);
+      httpAssembleURIf(HTTP_URI_CODING_ALL, uri, (int)urisize, "ipp", NULL, "localhost", ippPort(), "/classes/%s", printer);
   }
   else
     type = CUPS_PRINTER_LOCAL;
@@ -1249,7 +1318,7 @@ set_printer_options(
 {
   ipp_t                *request;               /* IPP Request */
   const char   *ppdfile;               /* PPD filename */
-  int          ppdchanged;             /* PPD changed? */
+  int          ppdchanged = 0;         /* PPD changed? */
   ppd_file_t   *ppd;                   /* PPD file */
   ppd_choice_t *choice;                /* Marked choice */
   char         uri[HTTP_MAX_URI],      /* URI for printer/class */
@@ -1259,11 +1328,13 @@ set_printer_options(
                tempfile[1024];         /* Temporary filename */
   cups_file_t  *in,                    /* PPD file */
                *out;                   /* Temporary file */
-  const char   *protocol,              /* Old protocol option */
+  const char   *ppdname,               /* ppd-name value */
+               *protocol,              /* Old protocol option */
                *customval,             /* Custom option value */
                *boolval;               /* Boolean value */
   int          wrote_ipp_supplies = 0, /* Wrote cupsIPPSupplies keyword? */
-               wrote_snmp_supplies = 0;/* Wrote cupsSNMPSupplies keyword? */
+               wrote_snmp_supplies = 0,/* Wrote cupsSNMPSupplies keyword? */
+               copied_options = 0;     /* Copied options? */
 
 
   DEBUG_printf(("set_printer_options(http=%p, printer=\"%s\", num_options=%d, "
@@ -1271,8 +1342,8 @@ set_printer_options(
                options, file));
 
  /*
-  * Build a CUPS_ADD_MODIFY_PRINTER or CUPS_ADD_MODIFY_CLASS request, which
-  * requires the following attributes:
+  * Build a CUPS-Add-Modify-Printer or CUPS-Add-Modify-Class request,
+  * which requires the following attributes:
   *
   *    attributes-charset
   *    attributes-natural-language
@@ -1282,19 +1353,45 @@ set_printer_options(
   */
 
   if (get_printer_type(http, printer, uri, sizeof(uri)) & CUPS_PRINTER_CLASS)
-    request = ippNewRequest(CUPS_ADD_MODIFY_CLASS);
+    request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
   else
-    request = ippNewRequest(CUPS_ADD_MODIFY_PRINTER);
+    request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_PRINTER);
 
-  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_URI, "printer-uri", NULL, uri);
+  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser());
 
  /*
   * Add the options...
   */
 
+  if (file)
+    ppdfile = file;
+  else if ((ppdname = cupsGetOption("ppd-name", num_options, options)) != NULL && strcmp(ppdname, "raw") && num_options > 1)
+  {
+    if ((ppdfile = cupsGetServerPPD(http, ppdname)) != NULL)
+    {
+     /*
+      * Copy options array and remove ppd-name from it...
+      */
+
+      cups_option_t *temp = NULL, *optr;
+      int i, num_temp = 0;
+      for (i = num_options, optr = options; i > 0; i --, optr ++)
+        if (strcmp(optr->name, "ppd-name"))
+         num_temp = cupsAddOption(optr->name, optr->value, num_temp, &temp);
+
+      copied_options = 1;
+      ppdchanged     = 1;
+      num_options    = num_temp;
+      options        = temp;
+    }
+  }
+  else if (request->request.op.operation_id == IPP_OP_CUPS_ADD_MODIFY_PRINTER)
+    ppdfile = cupsGetPPD(printer);
+  else
+    ppdfile = NULL;
+
+  cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION);
   cupsEncodeOptions2(request, num_options, options, IPP_TAG_PRINTER);
 
   if ((protocol = cupsGetOption("protocol", num_options, options)) != NULL)
@@ -1307,20 +1404,21 @@ set_printer_options(
                    NULL, "tbcp");
   }
 
-  if (file)
-    ppdfile = file;
-  else if (request->request.op.operation_id == CUPS_ADD_MODIFY_PRINTER)
-    ppdfile = cupsGetPPD(printer);
-  else
-    ppdfile = NULL;
-
-  if (ppdfile != NULL)
+  if (ppdfile)
   {
    /*
     * Set default options in the PPD file...
     */
 
-    ppd = ppdOpenFile(ppdfile);
+    if ((ppd = ppdOpenFile(ppdfile)) == NULL)
+    {
+      int              linenum;        /* Line number of error */
+      ppd_status_t     status = ppdLastError(&linenum);
+                                       /* Status code */
+
+      _cupsLangPrintf(stderr, _("lpadmin: Unable to open PPD \"%s\": %s on line %d."), ppdfile, ppdErrorString(status), linenum);
+    }
+
     ppdMarkDefaults(ppd);
     cupsMarkOptions(ppd, num_options, options);
 
@@ -1330,6 +1428,8 @@ set_printer_options(
       ippDelete(request);
       if (ppdfile != file)
         unlink(ppdfile);
+      if (copied_options)
+        cupsFreeOptions(num_options, options);
       return (1);
     }
 
@@ -1341,13 +1441,13 @@ set_printer_options(
       ippDelete(request);
       if (ppdfile != file)
        unlink(ppdfile);
+      if (copied_options)
+        cupsFreeOptions(num_options, options);
       cupsFileClose(out);
       unlink(tempfile);
       return (1);
     }
 
-    ppdchanged = 0;
-
     while (cupsFileGets(in, line, sizeof(line)))
     {
       if (!strncmp(line, "*cupsIPPSupplies:", 17) &&
@@ -1469,11 +1569,14 @@ set_printer_options(
     ippDelete(cupsDoRequest(http, request, "/admin/"));
   }
 
+  if (copied_options)
+    cupsFreeOptions(num_options, options);
+
  /*
   * Check the response...
   */
 
-  if (cupsLastError() > IPP_OK_CONFLICT)
+  if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
 
@@ -1514,5 +1617,5 @@ validate_name(const char *name)           /* I - Name to check */
 
 
 /*
- * End of "$Id: lpadmin.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpadmin.c 12603 2015-05-06 01:42:51Z msweet $".
  */
index 1043548..6816615 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: lpinfo.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpinfo.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   "lpinfo" command for CUPS.
  *
@@ -494,5 +494,5 @@ show_models(
 
 
 /*
- * End of "$Id: lpinfo.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpinfo.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index d9adfd8..aff9d6d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: lpmove.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpmove.c 10996 2013-05-29 11:51:34Z msweet $"
  *
  *   "lpmove" command for CUPS.
  *
@@ -209,5 +209,5 @@ move_job(http_t     *http,          /* I - HTTP connection to server */
 
 
 /*
- * End of "$Id: lpmove.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpmove.c 10996 2013-05-29 11:51:34Z msweet $".
  */
index 31a367c..1ddff29 100644 (file)
@@ -1,23 +1,16 @@
 /*
- * "$Id: lpoptions.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpoptions.c 11558 2014-02-06 18:33:34Z msweet $"
  *
- *   Printer option program for CUPS.
+ * Printer option program for CUPS.
  *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()         - Main entry.
- *   list_group()   - List printer-specific options from the PPD group.
- *   list_options() - List printer-specific options from the PPD file.
- *   usage()        - Show program usage and exit.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -274,8 +267,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
                num_options --;
 
                if (j < num_options)
-                 memcpy(options + j, options + j + 1,
-                        sizeof(cups_option_t) * (num_options - j));
+                 memmove(options + j, options + j + 1, sizeof(cups_option_t) * (size_t)(num_options - j));
                break;
               }
 
@@ -322,7 +314,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
                j = dest - dests;
                if (j < num_dests)
-                 memcpy(dest, dest + 1, (num_dests - j) * sizeof(cups_dest_t));
+                 memmove(dest, dest + 1, (size_t)(num_dests - j) * sizeof(cups_dest_t));
              }
            }
 
@@ -385,14 +377,12 @@ main(int  argc,                           /* I - Number of command-line arguments */
         *ptr++ = ' ';
 
       if (!options[i].value[0])
-        strlcpy(ptr, options[i].name, sizeof(buffer) - (ptr - buffer));
+        strlcpy(ptr, options[i].name, sizeof(buffer) - (size_t)(ptr - buffer));
       else if (strchr(options[i].value, ' ') != NULL ||
                strchr(options[i].value, '\t') != NULL)
-       snprintf(ptr, sizeof(buffer) - (ptr - buffer), "%s=\'%s\'",
-                options[i].name, options[i].value);
+       snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), "%s=\'%s\'", options[i].name, options[i].value);
       else
-       snprintf(ptr, sizeof(buffer) - (ptr - buffer), "%s=%s",
-                options[i].name, options[i].value);
+       snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), "%s=%s", options[i].name, options[i].value);
 
       ptr += strlen(ptr);
     }
@@ -450,19 +440,16 @@ list_group(ppd_file_t  *ppd,              /* I - PPD file */
 
         if ((coption = ppdFindCustomOption(ppd, option->keyword)) == NULL ||
            cupsArrayCount(coption->params) == 0)
-         snprintf(ptr, sizeof(buffer) - (ptr - buffer), " %sCustom",
-                  choice->marked ? "*" : "");
+         snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " %sCustom", choice->marked ? "*" : "");
         else if (!_cups_strcasecmp(option->keyword, "PageSize") ||
                 !_cups_strcasecmp(option->keyword, "PageRegion"))
-         snprintf(ptr, sizeof(buffer) - (ptr - buffer),
-                  " %sCustom.WIDTHxHEIGHT", choice->marked ? "*" : "");
+         snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " %sCustom.WIDTHxHEIGHT", choice->marked ? "*" : "");
         else
        {
          cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
 
          if (cupsArrayCount(coption->params) == 1)
-           snprintf(ptr, sizeof(buffer) - (ptr - buffer), " %sCustom.%s",
-                    choice->marked ? "*" : "", types[cparam->type]);
+           snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " %sCustom.%s", choice->marked ? "*" : "", types[cparam->type]);
          else
          {
            const char  *prefix;        /* Prefix string */
@@ -475,22 +462,21 @@ list_group(ppd_file_t  *ppd,              /* I - PPD file */
 
            while (cparam)
            {
-             snprintf(ptr, sizeof(buffer) - (ptr - buffer), "%s%s=%s", prefix,
-                      cparam->name, types[cparam->type]);
+             snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), "%s%s=%s", prefix, cparam->name, types[cparam->type]);
              cparam = (ppd_cparam_t *)cupsArrayNext(coption->params);
              prefix = " ";
              ptr += strlen(ptr);
            }
 
             if (ptr < (buffer + sizeof(buffer) - 1))
-             strlcpy(ptr, "}", sizeof(buffer) - (ptr - buffer));
+             strlcpy(ptr, "}", sizeof(buffer) - (size_t)(ptr - buffer));
          }
        }
       }
       else if (choice->marked)
-        snprintf(ptr, sizeof(buffer) - (ptr - buffer), " *%s", choice->choice);
+        snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " *%s", choice->choice);
       else
-        snprintf(ptr, sizeof(buffer) - (ptr - buffer), " %s", choice->choice);
+        snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " %s", choice->choice);
 
       ptr += strlen(ptr);
     }
@@ -561,5 +547,5 @@ usage(void)
 
 
 /*
- * End of "$Id: lpoptions.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpoptions.c 11558 2014-02-06 18:33:34Z msweet $".
  */
diff --git a/systemv/lppasswd.c b/systemv/lppasswd.c
deleted file mode 100644 (file)
index 9e559b4..0000000
+++ /dev/null
@@ -1,489 +0,0 @@
-/*
- * "$Id: lppasswd.c 11173 2013-07-23 12:31:34Z msweet $"
- *
- *   MD5 password program for CUPS.
- *
- *   Copyright 2007-2011 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()  - Add, change, or delete passwords from the MD5 password file.
- *   usage() - Show program usage.
- */
-
-/*
- * Include necessary headers...
- */
-
-#include <cups/cups-private.h>
-#include <cups/md5-private.h>
-#include <fcntl.h>
-#include <grp.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#ifndef WIN32
-#  include <unistd.h>
-#  include <signal.h>
-#endif /* !WIN32 */
-
-
-/*
- * Operations...
- */
-
-#define ADD    0
-#define CHANGE 1
-#define DELETE 2
-
-
-/*
- * Local functions...
- */
-
-static void    usage(FILE *fp) __attribute__((noreturn));
-
-
-/*
- * 'main()' - Add, change, or delete passwords from the MD5 password file.
- */
-
-int                                    /* O - Exit status */
-main(int  argc,                                /* I - Number of command-line arguments */
-     char *argv[])                     /* I - Command-line arguments */
-{
-  int          i;                      /* Looping var */
-  char         *opt;                   /* Option pointer */
-  const char   *username;              /* Pointer to username */
-  const char   *groupname;             /* Pointer to group name */
-  int          op;                     /* Operation (add, change, delete) */
-  const char   *passwd;                /* Password string */
-  FILE         *infile,                /* Input file */
-               *outfile;               /* Output file */
-  char         line[256],              /* Line from file */
-               userline[17],           /* User from line */
-               groupline[17],          /* Group from line */
-               md5line[33],            /* MD5-sum from line */
-               md5new[33];             /* New MD5 sum */
-  char         passwdmd5[1024],        /* passwd.md5 file */
-               passwdold[1024],        /* passwd.old file */
-               passwdnew[1024];        /* passwd.tmp file */
-  char         *newpass,               /* new password */
-               *oldpass;               /* old password */
-  int          flag;                   /* Password check flags... */
-  int          fd;                     /* Password file descriptor */
-  int          error;                  /* Write error */
-  _cups_globals_t *cg = _cupsGlobals();        /* Global data */
-  cups_lang_t  *lang;                  /* Language info */
-#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
-  struct sigaction action;             /* Signal action */
-#endif /* HAVE_SIGACTION && !HAVE_SIGSET*/
-
-
-  _cupsSetLocale(argv);
-  lang = cupsLangDefault();
-
- /*
-  * Check to see if stdin, stdout, and stderr are still open...
-  */
-
-  if (fcntl(0, F_GETFD, &i) ||
-      fcntl(1, F_GETFD, &i) ||
-      fcntl(2, F_GETFD, &i))
-  {
-   /*
-    * No, return exit status 2 and don't try to send any output since
-    * someone is trying to bypass the security on the server.
-    */
-
-    return (2);
-  }
-
- /*
-  * Find the server directory...
-  */
-
-  snprintf(passwdmd5, sizeof(passwdmd5), "%s/passwd.md5", cg->cups_serverroot);
-  snprintf(passwdold, sizeof(passwdold), "%s/passwd.old", cg->cups_serverroot);
-  snprintf(passwdnew, sizeof(passwdnew), "%s/passwd.new", cg->cups_serverroot);
-
- /*
-  * Find the default system group...
-  */
-
-  if (getgrnam(CUPS_DEFAULT_GROUP))
-    groupname = CUPS_DEFAULT_GROUP;
-  else
-    groupname = "unknown";
-
-  endgrent();
-
-  username = NULL;
-  op       = CHANGE;
-
- /*
-  * Parse command-line options...
-  */
-
-  for (i = 1; i < argc; i ++)
-    if (argv[i][0] == '-')
-      for (opt = argv[i] + 1; *opt; opt ++)
-        switch (*opt)
-       {
-         case 'a' : /* Add */
-             op = ADD;
-             break;
-         case 'x' : /* Delete */
-             op = DELETE;
-             break;
-         case 'g' : /* Group */
-             i ++;
-             if (i >= argc)
-               usage(stderr);
-
-              groupname = argv[i];
-             break;
-         case 'h' : /* Help */
-             usage(stdout);
-             break;
-         default : /* Bad option */
-             usage(stderr);
-             break;
-       }
-    else if (!username)
-      username = argv[i];
-    else
-      usage(stderr);
-
- /*
-  * See if we are trying to add or delete a password when we aren't logged in
-  * as root...
-  */
-
-  if (getuid() && getuid() != geteuid() && (op != CHANGE || username))
-  {
-    _cupsLangPuts(stderr,
-                  _("lppasswd: Only root can add or delete passwords."));
-    return (1);
-  }
-
- /*
-  * Fill in missing info...
-  */
-
-  if (!username)
-    username = cupsUser();
-
-  oldpass = newpass = NULL;
-
- /*
-  * Obtain old and new password _before_ locking the database
-  * to keep users from locking the file indefinitely.
-  */
-
-  if (op == CHANGE && getuid())
-  {
-    if ((passwd = cupsGetPassword(_("Enter old password:"))) == NULL)
-      return (1);
-
-    if ((oldpass = strdup(passwd)) == NULL)
-    {
-      _cupsLangPrintf(stderr,
-                      _("lppasswd: Unable to copy password string: %s"),
-                     strerror(errno));
-      return (1);
-    }
-  }
-
- /*
-  * Now get the new password, if necessary...
-  */
-
-  if (op != DELETE)
-  {
-    if ((passwd = cupsGetPassword(
-            _cupsLangString(lang, _("Enter password:")))) == NULL)
-      return (1);
-
-    if ((newpass = strdup(passwd)) == NULL)
-    {
-      _cupsLangPrintf(stderr,
-                      _("lppasswd: Unable to copy password string: %s"),
-                     strerror(errno));
-      return (1);
-    }
-
-    if ((passwd = cupsGetPassword(
-            _cupsLangString(lang, _("Enter password again:")))) == NULL)
-      return (1);
-
-    if (strcmp(passwd, newpass) != 0)
-    {
-      _cupsLangPuts(stderr,
-                    _("lppasswd: Sorry, passwords don't match."));
-      return (1);
-    }
-
-   /*
-    * Check that the password contains at least one letter and number.
-    */
-
-    flag = 0;
-
-    for (passwd = newpass; *passwd; passwd ++)
-      if (isdigit(*passwd & 255))
-       flag |= 1;
-      else if (isalpha(*passwd & 255))
-       flag |= 2;
-
-   /*
-    * Only allow passwords that are at least 6 chars, have a letter and
-    * a number, and don't contain the username.
-    */
-
-    if (strlen(newpass) < 6 || strstr(newpass, username) != NULL || flag != 3)
-    {
-      _cupsLangPuts(stderr, _("lppasswd: Sorry, password rejected."));
-      _cupsLangPuts(stderr, _("Your password must be at least 6 characters "
-                              "long, cannot contain your username, and must "
-                             "contain at least one letter and number."));
-      return (1);
-    }
-  }
-
- /*
-  * Ignore SIGHUP, SIGINT, SIGTERM, and SIGXFSZ (if defined) for the
-  * remainder of the time so that we won't end up with bogus password
-  * files...
-  */
-
-#ifndef WIN32
-#  if defined(HAVE_SIGSET)
-  sigset(SIGHUP, SIG_IGN);
-  sigset(SIGINT, SIG_IGN);
-  sigset(SIGTERM, SIG_IGN);
-#    ifdef SIGXFSZ
-  sigset(SIGXFSZ, SIG_IGN);
-#    endif /* SIGXFSZ */
-#  elif defined(HAVE_SIGACTION)
-  memset(&action, 0, sizeof(action));
-  action.sa_handler = SIG_IGN;
-
-  sigaction(SIGHUP, &action, NULL);
-  sigaction(SIGINT, &action, NULL);
-  sigaction(SIGTERM, &action, NULL);
-#    ifdef SIGXFSZ
-  sigaction(SIGXFSZ, &action, NULL);
-#    endif /* SIGXFSZ */
-#  else
-  signal(SIGHUP, SIG_IGN);
-  signal(SIGINT, SIG_IGN);
-  signal(SIGTERM, SIG_IGN);
-#    ifdef SIGXFSZ
-  signal(SIGXFSZ, SIG_IGN);
-#    endif /* SIGXFSZ */
-#  endif
-#endif /* !WIN32 */
-
- /*
-  * Open the output file.
-  */
-
-  if ((fd = open(passwdnew, O_WRONLY | O_CREAT | O_EXCL, 0400)) < 0)
-  {
-    if (errno == EEXIST)
-      _cupsLangPuts(stderr, _("lppasswd: Password file busy."));
-    else
-      _cupsLangPrintf(stderr, _("lppasswd: Unable to open password file: %s"),
-                     strerror(errno));
-
-    return (1);
-  }
-
-  if ((outfile = fdopen(fd, "w")) == NULL)
-  {
-    _cupsLangPrintf(stderr, _("lppasswd: Unable to open password file: %s"),
-                   strerror(errno));
-
-    unlink(passwdnew);
-
-    return (1);
-  }
-
-  setbuf(outfile, NULL);
-
- /*
-  * Open the existing password file and create a new one...
-  */
-
-  infile = fopen(passwdmd5, "r");
-  if (infile == NULL && errno != ENOENT && op != ADD)
-  {
-    _cupsLangPrintf(stderr, _("lppasswd: Unable to open password file: %s"),
-                   strerror(errno));
-
-    fclose(outfile);
-
-    unlink(passwdnew);
-
-    return (1);
-  }
-
- /*
-  * Read lines from the password file; the format is:
-  *
-  *   username:group:MD5-sum
-  */
-
-  error        = 0;
-  userline[0]  = '\0';
-  groupline[0] = '\0';
-  md5line[0]   = '\0';
-
-  if (infile)
-  {
-    while (fgets(line, sizeof(line), infile) != NULL)
-    {
-      if (sscanf(line, "%16[^:]:%16[^:]:%32s", userline, groupline, md5line) != 3)
-        continue;
-
-      if (strcmp(username, userline) == 0 &&
-          strcmp(groupname, groupline) == 0)
-       break;
-
-      if (fputs(line, outfile) == EOF)
-      {
-       _cupsLangPrintf(stderr,
-                       _("lppasswd: Unable to write to password file: %s"),
-                       strerror(errno));
-        error = 1;
-       break;
-      }
-    }
-
-    if (!error)
-    {
-      while (fgets(line, sizeof(line), infile) != NULL)
-       if (fputs(line, outfile) == EOF)
-       {
-         _cupsLangPrintf(stderr,
-                         _("lppasswd: Unable to write to password file: %s"),
-                         strerror(errno));
-         error = 1;
-         break;
-       }
-    }
-  }
-
-  if (op == CHANGE &&
-      (strcmp(username, userline) || strcmp(groupname, groupline)))
-  {
-    _cupsLangPrintf(stderr,
-                    _("lppasswd: user \"%s\" and group \"%s\" do not exist."),
-                   username, groupname);
-    error = 1;
-  }
-  else if (op != DELETE)
-  {
-    if (oldpass &&
-        strcmp(httpMD5(username, "CUPS", oldpass, md5new), md5line) != 0)
-    {
-      _cupsLangPuts(stderr, _("lppasswd: Sorry, password doesn't match."));
-      error = 1;
-    }
-    else
-    {
-      snprintf(line, sizeof(line), "%s:%s:%s\n", username, groupname,
-               httpMD5(username, "CUPS", newpass, md5new));
-      if (fputs(line, outfile) == EOF)
-      {
-       _cupsLangPrintf(stderr,
-                       _("lppasswd: Unable to write to password file: %s"),
-                       strerror(errno));
-        error = 1;
-      }
-    }
-  }
-
- /*
-  * Close the files...
-  */
-
-  if (infile)
-    fclose(infile);
-
-  if (fclose(outfile) == EOF)
-    error = 1;
-
- /*
-  * Error out gracefully as needed...
-  */
-
-  if (error)
-  {
-    _cupsLangPuts(stderr, _("lppasswd: Password file not updated."));
-
-    unlink(passwdnew);
-
-    return (1);
-  }
-
- /*
-  * Save old passwd file
-  */
-
-  unlink(passwdold);
-  if (link(passwdmd5, passwdold) && errno != ENOENT)
-  {
-    _cupsLangPrintf(stderr,
-                    _("lppasswd: failed to backup old password file: %s"),
-                   strerror(errno));
-    unlink(passwdnew);
-    return (1);
-  }
-
- /*
-  * Install new password file
-  */
-
-  if (rename(passwdnew, passwdmd5) < 0)
-  {
-    _cupsLangPrintf(stderr, _("lppasswd: failed to rename password file: %s"),
-                   strerror(errno));
-    unlink(passwdnew);
-    return (1);
-  }
-
-  return (0);
-}
-
-
-/*
- * 'usage()' - Show program usage.
- */
-
-static void
-usage(FILE *fp)                /* I - File to send usage to */
-{
-  if (getuid())
-    _cupsLangPuts(fp, _("Usage: lppasswd [-g groupname]"));
-  else
-    _cupsLangPuts(fp,
-                  _("Usage: lppasswd [-g groupname] [username]\n"
-                   "       lppasswd [-g groupname] -a [username]\n"
-                   "       lppasswd [-g groupname] -x [username]"));
-
-  exit(1);
-}
-
-
-/*
- * End of "$Id: lppasswd.c 11173 2013-07-23 12:31:34Z msweet $".
- */
index acb88b6..9c076cb 100644 (file)
@@ -1,30 +1,16 @@
 /*
- * "$Id: lpstat.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: lpstat.c 12124 2014-08-28 15:37:22Z msweet $"
  *
- *   "lpstat" command for CUPS.
+ * "lpstat" command for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- *   main()           - Parse options and show status information.
- *   check_dest()     - Verify that the named destination(s) exists.
- *   match_list()     - Match a name from a list of comma or space-separated
- *                      names.
- *   show_accepting() - Show acceptance status.
- *   show_classes()   - Show printer classes.
- *   show_default()   - Show default destination.
- *   show_devices()   - Show printer devices.
- *   show_jobs()      - Show active print jobs.
- *   show_printers()  - Show printers.
- *   show_scheduler() - Show scheduler status.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 /*
@@ -109,6 +95,7 @@ main(int  argc,                              /* I - Number of command-line arguments */
              _cupsLangPuts(stdout, cupsServer());
            else
              _cupsLangPrintf(stdout, "%s:%d", cupsServer(), ippPort());
+           op = 'H';
             break;
 
         case 'P' : /* Show paper types */
@@ -201,8 +188,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
                num_dests = cupsGetDests(&dests);
 
                if (num_dests == 0 &&
-                   (cupsLastError() == IPP_BAD_REQUEST ||
-                    cupsLastError() == IPP_VERSION_NOT_SUPPORTED))
+                   (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+                    cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
                {
                  _cupsLangPrintf(stderr,
                                  _("%s: Error - add '/version=1.1' to server "
@@ -215,38 +202,6 @@ main(int  argc,                            /* I - Number of command-line arguments */
            }
            break;
 
-#ifdef __sgi
-        case 'b' : /* Show both the local and remote status */
-           op = 'b';
-
-           if (argv[i][2])
-           {
-            /*
-             * The local and remote status are separated by a blank line;
-             * since all CUPS jobs are networked, we only output the
-             * second list for now...  In the future, we might further
-             * emulate this by listing the remote server's queue, but
-             * for now this is enough to make the SGI printstatus program
-             * happy...
-             */
-
-              check_dest(argv[0], argv[i] + 2, &num_dests, &dests);
-
-             puts("");
-             status |= show_jobs(argv[i] + 2, NULL, 3, ranking, which);
-           }
-           else
-           {
-             _cupsLangPrintf(stderr,
-                             _("%s: Error - expected destination after "
-                               "\"-b\" option."),
-                             argv[0]);
-
-             return (1);
-           }
-           break;
-#endif /* __sgi */
-
         case 'c' : /* Show classes and members */
            op = 'c';
 
@@ -279,8 +234,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
              num_dests = dests ? 1 : 0;
 
              if (num_dests == 0 &&
-                 (cupsLastError() == IPP_BAD_REQUEST ||
-                  cupsLastError() == IPP_VERSION_NOT_SUPPORTED))
+                 (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+                  cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - add '/version=1.1' to server "
@@ -319,18 +274,7 @@ main(int  argc,                            /* I - Number of command-line arguments */
            break;
 
         case 'l' : /* Long status or long job status */
-#ifdef __sgi
-           op = 'l';
-
-           if (argv[i][2])
-           {
-              check_dest(argv[0], argv[i] + 2, &num_dests, &dests);
-
-             status |= show_jobs(argv[i] + 2, NULL, 3, ranking, which);
-           }
-           else
-#endif /* __sgi */
-             long_status = 2;
+           long_status = 2;
            break;
 
         case 'o' : /* Show jobs by destination */
@@ -381,8 +325,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
                num_dests = cupsGetDests(&dests);
 
                if (num_dests == 0 &&
-                   (cupsLastError() == IPP_BAD_REQUEST ||
-                    cupsLastError() == IPP_VERSION_NOT_SUPPORTED))
+                   (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+                    cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
                {
                  _cupsLangPrintf(stderr,
                                  _("%s: Error - add '/version=1.1' to server "
@@ -410,8 +354,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
              num_dests = cupsGetDests(&dests);
 
              if (num_dests == 0 &&
-                 (cupsLastError() == IPP_BAD_REQUEST ||
-                  cupsLastError() == IPP_VERSION_NOT_SUPPORTED))
+                 (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+                  cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - add '/version=1.1' to server "
@@ -434,8 +378,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
              num_dests = cupsGetDests(&dests);
 
              if (num_dests == 0 &&
-                 (cupsLastError() == IPP_BAD_REQUEST ||
-                  cupsLastError() == IPP_VERSION_NOT_SUPPORTED))
+                 (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+                  cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - add '/version=1.1' to server "
@@ -493,8 +437,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
                num_dests = cupsGetDests(&dests);
 
                if (num_dests == 0 &&
-                   (cupsLastError() == IPP_BAD_REQUEST ||
-                    cupsLastError() == IPP_VERSION_NOT_SUPPORTED))
+                   (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+                    cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
                {
                  _cupsLangPrintf(stderr,
                                  _("%s: Error - add '/version=1.1' to server "
@@ -560,8 +504,8 @@ check_dest(const char  *command,    /* I  - Command name */
 
       if ((*dests = cupsGetNamedDest(CUPS_HTTP_DEFAULT, printer, pptr)) == NULL)
       {
-       if (cupsLastError() == IPP_BAD_REQUEST ||
-           cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+       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."),
                          command);
@@ -621,8 +565,8 @@ check_dest(const char  *command,    /* I  - Command name */
 
     if (!cupsGetDest(printer, NULL, *num_dests, *dests))
     {
-      if (cupsLastError() == IPP_BAD_REQUEST ||
-          cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+      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."),
                        command);
@@ -705,7 +649,6 @@ show_accepting(const char  *printers,       /* I - Destinations */
                *message;               /* Printer device URI */
   int          accepting;              /* Accepting requests? */
   time_t       ptime;                  /* Printer state time */
-  struct tm    *pdate;                 /* Printer state date & time */
   char         printer_state_time[255];/* Printer state time */
   static const char *pattrs[] =                /* Attributes we need for printers... */
                {
@@ -746,8 +689,8 @@ show_accepting(const char  *printers,       /* I - Destinations */
 
   response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
 
-  if (cupsLastError() == IPP_BAD_REQUEST ||
-      cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+  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."),
@@ -755,7 +698,7 @@ show_accepting(const char  *printers,       /* I - Destinations */
     ippDelete(response);
     return (1);
   }
-  else if (cupsLastError() > IPP_OK_CONFLICT)
+  else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
     ippDelete(response);
@@ -828,8 +771,7 @@ show_accepting(const char  *printers,       /* I - Destinations */
 
       if (match_list(printers, printer))
       {
-        pdate = localtime(&ptime);
-        strftime(printer_state_time, sizeof(printer_state_time), "%c", pdate);
+        _cupsStrDate(printer_state_time, sizeof(printer_state_time), ptime);
 
         if (accepting)
          _cupsLangPrintf(stdout, _("%s accepting requests since %s"),
@@ -931,8 +873,8 @@ show_classes(const char *dests)             /* I - Destinations */
 
   response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
 
-  if (cupsLastError() == IPP_BAD_REQUEST ||
-      cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+  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."),
@@ -940,7 +882,7 @@ show_classes(const char *dests)             /* I - Destinations */
     ippDelete(response);
     return (1);
   }
-  else if (cupsLastError() > IPP_OK_CONFLICT)
+  else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
     ippDelete(response);
@@ -1192,8 +1134,8 @@ show_devices(const char  *printers,       /* I - Destinations */
 
   response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
 
-  if (cupsLastError() == IPP_BAD_REQUEST ||
-      cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+  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."),
@@ -1201,7 +1143,7 @@ show_devices(const char  *printers,       /* I - Destinations */
     ippDelete(response);
     return (1);
   }
-  else if (cupsLastError() > IPP_OK_CONFLICT)
+  else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
     ippDelete(response);
@@ -1272,52 +1214,6 @@ show_devices(const char  *printers,      /* I - Destinations */
 
       if (match_list(printers, printer))
       {
-#ifdef __osf__ /* Compaq/Digital like to do it their own way... */
-        char   scheme[HTTP_MAX_URI],   /* Components of printer URI */
-               username[HTTP_MAX_URI],
-               hostname[HTTP_MAX_URI],
-               resource[HTTP_MAX_URI];
-       int     port;
-
-
-        if (device == NULL)
-       {
-         httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme),
-                         username, sizeof(username), hostname,
-                         sizeof(hostname), &port, resource, sizeof(resource));
-          _cupsLangPrintf(stdout,
-                         _("Output for printer %s is sent to remote "
-                           "printer %s on %s"),
-                         printer, strrchr(resource, '/') + 1, hostname);
-        }
-        else if (!strncmp(device, "file:", 5))
-          _cupsLangPrintf(stdout,
-                         _("Output for printer %s is sent to %s"),
-                         printer, device + 5);
-        else
-          _cupsLangPrintf(stdout,
-                         _("Output for printer %s is sent to %s"),
-                         printer, device);
-
-        for (i = 0; i < num_dests; i ++)
-         if (!_cups_strcasecmp(printer, dests[i].name) && dests[i].instance)
-         {
-            if (device == NULL)
-              _cupsLangPrintf(stdout,
-                             _("Output for printer %s/%s is sent to "
-                               "remote printer %s on %s"),
-                             printer, dests[i].instance,
-                             strrchr(resource, '/') + 1, hostname);
-            else if (!strncmp(device, "file:", 5))
-              _cupsLangPrintf(stdout,
-                             _("Output for printer %s/%s is sent to %s"),
-                             printer, dests[i].instance, device + 5);
-            else
-              _cupsLangPrintf(stdout,
-                             _("Output for printer %s/%s is sent to %s"),
-                             printer, dests[i].instance, device);
-         }
-#else
         if (device == NULL)
           _cupsLangPrintf(stdout, _("device for %s: %s"),
                          printer, uri);
@@ -1329,6 +1225,7 @@ show_devices(const char  *printers,       /* I - Destinations */
                          printer, device);
 
         for (i = 0; i < num_dests; i ++)
+        {
          if (!_cups_strcasecmp(printer, dests[i].name) && dests[i].instance)
          {
             if (device == NULL)
@@ -1341,7 +1238,7 @@ show_devices(const char  *printers,       /* I - Destinations */
               _cupsLangPrintf(stdout, _("device for %s/%s: %s"),
                              printer, dests[i].instance, device);
          }
-#endif /* __osf__ */
+       }
       }
 
       if (attr == NULL)
@@ -1373,13 +1270,12 @@ show_jobs(const char *dests,            /* I - Destinations */
                *reasons;               /* Job state reasons attribute */
   const char   *dest,                  /* Pointer into job-printer-uri */
                *username,              /* Pointer to job-originating-user-name */
-               *title,                 /* Pointer to job-name */
-               *message;               /* Pointer to job-printer-state-message */
+               *message,               /* Pointer to job-printer-state-message */
+               *time_at;               /* time-at-xxx attribute name to use */
   int          rank,                   /* Rank in queue */
                jobid,                  /* job-id */
                size;                   /* job-k-octets */
   time_t       jobtime;                /* time-at-creation */
-  struct tm    *jobdate;               /* Date & time */
   char         temp[255],              /* Temporary buffer */
                date[255];              /* Date buffer */
   static const char *jattrs[] =                /* Attributes we need for jobs... */
@@ -1391,7 +1287,8 @@ show_jobs(const char *dests,              /* I - Destinations */
                  "job-printer-state-message",
                  "job-printer-uri",
                  "job-state-reasons",
-                 "time-at-creation"
+                 "time-at-creation",
+                 "time-at-completed"
                };
 
 
@@ -1435,8 +1332,8 @@ show_jobs(const char *dests,              /* I - Destinations */
 
   response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
 
-  if (cupsLastError() == IPP_BAD_REQUEST ||
-      cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+  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."),
@@ -1444,7 +1341,7 @@ show_jobs(const char *dests,              /* I - Destinations */
     ippDelete(response);
     return (1);
   }
-  else if (cupsLastError() > IPP_OK_CONFLICT)
+  else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
     ippDelete(response);
@@ -1457,6 +1354,13 @@ show_jobs(const char *dests,             /* I - Destinations */
     * Loop through the job list and display them...
     */
 
+    if (!strcmp(which, "aborted") ||
+        !strcmp(which, "canceled") ||
+        !strcmp(which, "completed"))
+      time_at = "time-at-completed";
+    else
+      time_at = "time-at-creation";
+
     rank = -1;
 
     for (attr = response->attrs; attr != NULL; attr = attr->next)
@@ -1480,7 +1384,6 @@ show_jobs(const char *dests,              /* I - Destinations */
       username = NULL;
       dest     = NULL;
       jobtime  = 0;
-      title    = "no title";
       message  = NULL;
       reasons  = NULL;
 
@@ -1492,8 +1395,7 @@ show_jobs(const char *dests,              /* I - Destinations */
         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-creation") &&
-                attr->value_tag == IPP_TAG_INTEGER)
+        else if (!strcmp(attr->name, time_at) && attr->value_tag == IPP_TAG_INTEGER)
          jobtime = attr->values[0].integer;
         else if (!strcmp(attr->name, "job-printer-state-message") &&
                 attr->value_tag == IPP_TAG_TEXT)
@@ -1507,9 +1409,6 @@ show_jobs(const char *dests,              /* I - Destinations */
         else if (!strcmp(attr->name, "job-originating-user-name") &&
                 attr->value_tag == IPP_TAG_NAME)
          username = attr->values[0].string.text;
-        else if (!strcmp(attr->name, "job-name") &&
-                attr->value_tag == IPP_TAG_NAME)
-         title = attr->values[0].string.text;
         else if (!strcmp(attr->name, "job-state-reasons") &&
                 attr->value_tag == IPP_TAG_KEYWORD)
          reasons = attr;
@@ -1537,62 +1436,42 @@ show_jobs(const char *dests,            /* I - Destinations */
 
       if (match_list(dests, dest) && match_list(users, username))
       {
-        jobdate = localtime(&jobtime);
         snprintf(temp, sizeof(temp), "%s-%d", dest, jobid);
 
-        if (long_status == 3)
-       {
-        /*
-         * Show the consolidated output format for the SGI tools...
-         */
-
-         if (!strftime(date, sizeof(date), "%b %d %H:%M", jobdate))
-           strcpy(date, "Unknown");
+       _cupsStrDate(date, sizeof(date), jobtime);
 
-         _cupsLangPrintf(stdout, "%s;%s;%d;%s;%s",
-                         temp, username ? username : "unknown",
-                         size, title ? title : "unknown", date);
-       }
+       if (ranking)
+         _cupsLangPrintf(stdout, "%3d %-21s %-13s %8.0f %s",
+                         rank, temp, username ? username : "unknown",
+                         1024.0 * size, date);
        else
+         _cupsLangPrintf(stdout, "%-23s %-13s %8.0f   %s",
+                         temp, username ? username : "unknown",
+                         1024.0 * size, date);
+       if (long_status)
        {
-         if (!strftime(date, sizeof(date), "%c", jobdate))
-           strcpy(date, "Unknown");
-
-          if (ranking)
-           _cupsLangPrintf(stdout, "%3d %-21s %-13s %8.0f %s",
-                           rank, temp, username ? username : "unknown",
-                           1024.0 * size, date);
-          else
-           _cupsLangPrintf(stdout, "%-23s %-13s %8.0f   %s",
-                           temp, username ? username : "unknown",
-                           1024.0 * size, date);
-          if (long_status)
-          {
-           if (message)
-             _cupsLangPrintf(stdout, _("\tStatus: %s"), message);
-
-           if (reasons)
-           {
-             char      alerts[1024],   /* Alerts string */
-                       *aptr;          /* Pointer into alerts string */
+         if (message)
+           _cupsLangPrintf(stdout, _("\tStatus: %s"), message);
 
-             for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
-             {
-               if (i)
-                 snprintf(aptr, sizeof(alerts) - (aptr - alerts), " %s",
-                          reasons->values[i].string.text);
-                else
-                 strlcpy(alerts, reasons->values[i].string.text,
-                         sizeof(alerts));
-
-               aptr += strlen(aptr);
-             }
+         if (reasons)
+         {
+           char        alerts[1024],   /* Alerts string */
+                     *aptr;            /* Pointer into alerts string */
 
-             _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts);
+           for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
+           {
+             if (i)
+               snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text);
+             else
+               strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts));
+
+             aptr += strlen(aptr);
            }
 
-           _cupsLangPrintf(stdout, _("\tqueued for %s"), dest);
+           _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts);
          }
+
+         _cupsLangPrintf(stdout, _("\tqueued for %s"), dest);
        }
       }
 
@@ -1635,7 +1514,6 @@ show_printers(const char  *printers,      /* I - Destinations */
   ipp_pstate_t pstate;                 /* Printer state */
   cups_ptype_t ptype;                  /* Printer type */
   time_t       ptime;                  /* Printer state time */
-  struct tm    *pdate;                 /* Printer state date & time */
   int          jobid;                  /* Job ID of current job */
   char         printer_uri[HTTP_MAX_URI],
                                        /* Printer URI */
@@ -1694,8 +1572,8 @@ show_printers(const char  *printers,      /* I - Destinations */
 
   response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
 
-  if (cupsLastError() == IPP_BAD_REQUEST ||
-      cupsLastError() == IPP_VERSION_NOT_SUPPORTED)
+  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."),
@@ -1703,7 +1581,7 @@ show_printers(const char  *printers,      /* I - Destinations */
     ippDelete(response);
     return (1);
   }
-  else if (cupsLastError() > IPP_OK_CONFLICT)
+  else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
   {
     _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
     ippDelete(response);
@@ -1865,7 +1743,7 @@ show_printers(const char  *printers,      /* I - Destinations */
                jobid = jobattr->values[0].integer;
               else if (!strcmp(jobattr->name, "job-state") &&
                       jobattr->value_tag == IPP_TAG_ENUM)
-               jobstate = jobattr->values[0].integer;
+               jobstate = (ipp_jstate_t)jobattr->values[0].integer;
            }
 
             if (jobstate != IPP_JOB_PROCESSING)
@@ -1879,8 +1757,7 @@ show_printers(const char  *printers,      /* I - Destinations */
         * Display it...
        */
 
-        pdate = localtime(&ptime);
-        strftime(printer_state_time, sizeof(printer_state_time), "%c", pdate);
+        _cupsStrDate(printer_state_time, sizeof(printer_state_time), ptime);
 
         switch (pstate)
        {
@@ -1930,11 +1807,9 @@ show_printers(const char  *printers,     /* I - Destinations */
            for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
            {
              if (i)
-               snprintf(aptr, sizeof(alerts) - (aptr - alerts), " %s",
-                        reasons->values[i].string.text);
+               snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text);
              else
-               strlcpy(alerts, reasons->values[i].string.text,
-                       sizeof(alerts));
+               strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts));
 
              aptr += strlen(aptr);
            }
@@ -2056,11 +1931,9 @@ show_printers(const char  *printers,     /* I - Destinations */
                for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
                {
                  if (i)
-                   snprintf(aptr, sizeof(alerts) - (aptr - alerts), " %s",
-                            reasons->values[i].string.text);
+                   snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text);
                  else
-                   strlcpy(alerts, reasons->values[i].string.text,
-                           sizeof(alerts));
+                   strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts));
 
                  aptr += strlen(aptr);
                }
@@ -2161,5 +2034,5 @@ show_scheduler(void)
 
 
 /*
- * End of "$Id: lpstat.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: lpstat.c 12124 2014-08-28 15:37:22Z msweet $".
  */
index 678bddd..77732b7 100644 (file)
@@ -1,16 +1,16 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 11928 2014-06-13 00:08:32Z msweet $"
 #
-#   Template makefile for CUPS.
+# Template makefile for CUPS.
 #
-#   Copyright 2007-2011 by Apple Inc.
-#   Copyright 1993-2007 by Easy Software Products.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 1993-2007 by Easy Software Products.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 include ../Makedefs
@@ -67,13 +67,13 @@ FILES       =       \
                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-purge.tmpl \
                printer-reject.tmpl \
                printer-start.tmpl \
                printer-stop.tmpl \
@@ -200,5 +200,5 @@ uninstall-langbundle:
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 11928 2014-06-13 00:08:32Z msweet $".
 #
index eaf52d7..3deaf26 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Add Class</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -37,4 +35,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 361958b..14d4eb6 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Add Printer</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -44,4 +42,3 @@ Share This Printer</TD>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index ee6b5af..101f960 100644 (file)
-<TABLE CLASS="indent" SUMMARY="Administration Tasks">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">Printers</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Add Printer"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Find New Printers"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Printers"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Export Printers to Samba"></FORM>:}
-</P>
-
-<H2 CLASS="title">Classes</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Add Class"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Classes"></FORM>
-</P>
-
-<H2 CLASS="title">Jobs</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Jobs"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">Server</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Edit Configuration File"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="View Access Log"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="View Error Log"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="View Page Log"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>Server Settings\:</B></P>
-
-<P><A HREF="/admin/">Advanced <SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Share printers connected to this system<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max clients\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Allow printing from the Internet<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Advertise web interface<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Allow remote administration<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Use Kerberos authentication (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Allow users to cancel any job (not just their own)<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Preserve job history<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximum jobs (0 for no limit)\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retain Metadata\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retain Documents\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Save debugging information for troubleshooting<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max log file size\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>Server Settings:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Advanced <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Share printers connected to this system<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Allow printing from the Internet<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Allow remote administration<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Use Kerberos authentication (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Allow users to cancel any job (not just their own)<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Save debugging information for troubleshooting</P>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Change Settings"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">RSS Subscriptions</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Add RSS Subscription"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS Subscriptions">
-<THEAD><TR><TH>Name</TH><TH>Events</TH><TH>Queue Name</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Cancel RSS Subscription"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:All Queues}</TD></TR>}
-</TBODY>
-</TABLE>:}
+<div class="row">
+  <div class="halves">
+    <H2 CLASS="title">Printers</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Add Printer"></FORM>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Find New Printers"></FORM>
+    <FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Printers"></FORM>
+    {have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Export Printers to Samba"></FORM>:}
+    </P>
+
+    <H2 CLASS="title">Classes</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Add Class"></FORM>
+    <FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Classes"></FORM>
+    </P>
+
+    <H2 CLASS="title">Jobs</H2>
+
+    <P>
+    <FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Jobs"></FORM>
+    </P>
+  </div>
+  <div class="halves">
+    <H2 CLASS="title">Server</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Edit Configuration File"></FORM>
+    <FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="View Access Log"></FORM>
+    <FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="View Error Log"></FORM>
+    <FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="View Page Log"></FORM>
+    </P>
+
+    {SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+    <BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+    <FORM METHOD="POST" ACTION="/admin">
+    <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+
+    {ADVANCEDSETTINGS?<P><B>Server Settings\:</B></P>
+
+    <P><A HREF="/admin/">Advanced <SMALL>&#x25bc;</SMALL></A><BR>
+    <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+    <INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
+    <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Share printers connected to this system<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max clients\:
+    <INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Allow printing from the Internet<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Advertise web interface<BR>
+    <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Allow remote administration<BR>
+    {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Use Kerberos authentication (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+    <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Allow users to cancel any job (not just their own)<BR>
+    <INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Preserve job history<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximum jobs (0 for no limit)\:
+    <INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retain Metadata\:
+    <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retain Documents\:
+    <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
+    <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Save debugging information for troubleshooting<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max log file size\:
+    <INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
+
+    :<P><B>Server Settings:</B></P>
+
+    <P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Advanced <SMALL>&#x25b6;</SMALL></A><BR>
+    <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+    <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Share printers connected to this system<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Allow printing from the Internet<BR>
+    <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Allow remote administration<BR>
+    {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Use Kerberos authentication (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+    <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Allow users to cancel any job (not just their own)<BR>
+    <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Save debugging information for troubleshooting</P>
+
+    }
+    <P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Change Settings"></P>
+
+    </FORM>}
+  </div>
+</div>
+
+<div class="row">
+  <H2 CLASS="title">RSS Subscriptions</H2>
+
+  <P>
+  <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Add RSS Subscription"></FORM>
+  </P>
+
+  {notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS Subscriptions">
+  <THEAD><TR><TH>Name</TH><TH>Events</TH><TH>Queue Name</TH></TR></THEAD>
+  <TBODY>{[notify_subscription_id]
+  <TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
+  <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Cancel RSS Subscription"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:All Queues}</TD></TR>}
+  </TBODY>
+  </TABLE>:}
+</div>
\ No newline at end of file
diff --git a/templates/ca/add-class.tmpl b/templates/ca/add-class.tmpl
deleted file mode 100644 (file)
index 8af7a7d..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Afegeix una classe</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Pot contenir qualsevol car&agrave;cter excepte &laquo;/&raquo;, &laquo;#&raquo;, i espai)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Descripci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Una descripci&oacute; com ara &laquo;HP LaserJet de doble cara&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Ubicaci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Una ubicaci&oacute; com ara  &laquo;Laboratori 1&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Membres:</TH>
-<TD>
-<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
-{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
-</SELECT>
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Afegeix"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/add-printer.tmpl b/templates/ca/add-printer.tmpl
deleted file mode 100644 (file)
index f266a0b..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Afegir una impressora</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
-<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
-<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
-<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
-{?current_make!?<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE" VALUE="{current_make}">:}
-{?current_make_and_model!?<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{current_make_and_model}">:}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?template_name}"><BR>
-<SMALL>(Pot contenir qualsevol car&agrave;cter excepte &laquo;/&raquo;, &laquo;#&raquo;, i espai)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Descripci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_INFO}"><BR>
-<SMALL>(Una descripci&oacute; com ara &laquo;HP LaserJet de doble cara&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Ubicaci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_LOCATION}"><BR>
-<SMALL>(Una ubicaci&oacute; com ara  &laquo;Laboratori 1&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Connexi&oacute;:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Compartir:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
-Comparteix aquesta impressora</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continua"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/add-rss-subscription.tmpl b/templates/ca/add-rss-subscription.tmpl
deleted file mode 100644 (file)
index b195ac6..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription">
-
-<H2 CLASS="title">Afegir una subscripci&oacute; RSS</H2>
-
-<TABLE SUMMARY="Add RSS Subscription form">
-<TR>
-<TH CLASS="label">Nom:</TH>
-<TD COLSPAN="5"><INPUT TYPE="TEXT" NAME="SUBSCRIPTION_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?SUBSCRIPTION_NAME}"><BR>
-<SMALL>(Pot contenir qualsevol car&agrave;cter excepte espai &laquo;/&raquo;, &laquo;?&raquo; i &laquo;#&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Cua:</TH>
-<TD COLSPAN="5"><SELECT NAME="PRINTER_URI" SIZE="10"><OPTION VALUE="#ALL#"{?PRINTER_URI=#ALL#? SELECTED:}>Totes</OPTION>{[printer_name]<OPTION VALUE="{printer_uri_supported}"{?PRINTER_URI={printer_uri_supported}? SELECTED:}>{printer_name}</OPTION>}</SELECT></TD>
-</TR>
-<TR VALIGN="TOP">
-<TH CLASS="label">Esdeveniments:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CREATED" {?EVENT_JOB_CREATED}>Creaci&oacute; de tasca<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_COMPLETED" {?EVENT_JOB_COMPLETED}>Tasca completada<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_STOPPED" {?EVENT_JOB_STOPPED}>Tasca aturada<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CONFIG_CHANGED" {?EVENT_JOB_CONFIG_CHANGED}>Modificaci&oacute; de les opcions de la tasca</TD>
-<TD>&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_STOPPED" {?EVENT_PRINTER_STOPPED}>Cua aturada<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_ADDED" {?EVENT_PRINTER_ADDED}>Cua afegida<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_MODIFIED" {?EVENT_PRINTER_MODIFIED}>Modificaci&oacute; de la cua<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_DELETED" {?EVENT_PRINTER_DELETED}>Eliminaci&oacute; de la cua</TD>
-<TD>&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STARTED" {?EVENT_SERVER_STARTED}>Inicialitzaci&oacute; del servidor<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STOPPED" {?EVENT_SERVER_STOPPED}>Aturada del servidor<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_RESTARTED" {?EVENT_SERVER_RESTARTED}>Servidor iniciat de nou<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Auditoria de seguretat del servidor</TD>
-</TR>
-<TR>
-<TH CLASS="label">Nombre m&agrave;xims d'esdeveniments al canal:</TH>
-<TD COLSPAN="5"><INPUT TYPE="NUMBER" NAME="MAX_EVENTS" SIZE="4" MAXLENGTH="4" VALUE="{MAX_EVENTS?{MAX_EVENTS}:20}"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD COLSPAN="5"><INPUT TYPE="SUBMIT" VALUE="Afegeix"></TD>
-</TR>
-</TABLE>
-
-</FORM>
diff --git a/templates/ca/admin.tmpl b/templates/ca/admin.tmpl
deleted file mode 100644 (file)
index ea3fc1e..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<TABLE CLASS="indent" SUMMARY="Administration Tasks">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">Impressores</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Afegeix una impressora"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Busca m&eacute;s impressores"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Gestiona les impressores"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Exporta les impressores al Samba"></FORM>:}
-</P>
-
-<H2 CLASS="title">Classes</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Afegeix una classe"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Gestiona les classes"></FORM>
-</P>
-
-<H2 CLASS="title">Tasques</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Gestiona les tasques"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">Servidor</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Edita el fitxer de configuraci&oacute;"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Mostra el registre d'acc&eacute;s"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Mostra el registre d'errors"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Mostra la p&agrave;gina de registres"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>Configuraci&oacute; del servidor\:</B></P>
-
-<P><A HREF="/admin/">Avan&ccedil;at <SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Comparteix les impressores connectades a aquest sistema<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nombre m&agrave;xim de clients\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Permet imprimir des d'Internet<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Anuncia la interf&iacute;cie web<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Permet l'administraci&oacute; remota<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Fes servir l'autenticaci&oacute; Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">PMF</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Permet als usuaris cancel&middot;lar qualsevol tasca (no nom&eacute;s les pr&ograve;pies)<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Conserva l'historial de tasques<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nombre màxim de tasques (0 per ilimitat)\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Conserva les metadades\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Conserva els documents\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Desa la informaci&oacute; de depuraci&oacute; per la resoluci&oacute; de problemes<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mida m&agrave;xima de fitxer de registre\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>Configuraci&oacute; del servidor:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Avan&ccedil;at <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Comparteix les impressores connectades a aquest sistema<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Permet imprimir des d'Internet<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Permet l'administraci&oacute; remota<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Fes servir l'autenticaci&oacute; Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">PMF</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Permet als usuaris cancel&middot;lar qualsevol tasca (no nom&eacute;s les pr&ograve;pies)<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Desa la informaci&oacute; de depuraci&oacute; per la resoluci&oacute; de problemes<BR>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Envia els canvis"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Subscripcions RSS</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Afegeix una subscripci&oacute; RSS"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS Subscriptions">
-<THEAD><TR><TH>Nom</TH><TH>Esdeveniments</TH><TH>Nom de la cua</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Cancel&middot;la la subscripci&oacute; RSS"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:All Queues}</TD></TR>}
-</TBODY>
-</TABLE>:}
diff --git a/templates/ca/choose-model.tmpl b/templates/ca/choose-model.tmpl
deleted file mode 100644 (file)
index d2adeb8..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifica {printer_name}:Add Printer}</H2>
-
-<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
-<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
-<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
-<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
-<TABLE>
-{op=modify-printer?:<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
-</TR>}
-<TR>
-<TH CLASS="label">Descripci&oacute;:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Ubicaci&oacute;:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Connecci&oacute;:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Compartida:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
-{?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Comparteix aquesta impressora</TD>
-</TR>
-<TR>
-<TH CLASS="label">Fabricant:</TH>
-<TD>{PPD_MAKE} <INPUT TYPE="SUBMIT" NAME="SELECT_MAKE" VALUE="Seleccioneu un altre fabricant"></TD>
-</TR>
-<TR>
-<TH CLASS="label">Model:</TH>
-<TD>
-<SELECT NAME="PPD_NAME" SIZE="10">
-{op=add-printer?:<OPTION VALUE="__no_change__" SELECTED>Current Driver - {current_make_and_model}</OPTION>:}
-{[ppd_name]<OPTION VALUE="{ppd_name}" {op=modify-printer?:{?current_make_and_model={ppd_make_and_model}?SELECTED:}}>{ppd_make_and_model} ({ppd_natural_language})
-}</SELECT>
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">O indica un fitxer PPD:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
-TYPE="FILE" NAME="PPD_FILE"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="{op=add-printer?Add Printer:Modifica la impressora}"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/choose-serial.tmpl b/templates/ca/choose-serial.tmpl
deleted file mode 100644 (file)
index e86f5a8..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifica {printer_name}:Add Printer}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Connexi&oacute;:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Velocitat:</TH>
-<TD><SELECT NAME="BAUDRATE">
-{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Paritat:</TH>
-<TD><SELECT NAME="PARITY">
-<OPTION VALUE="none" {?parity=none?SELECTED:}>Cap
-<OPTION VALUE="even" {?parity=even?SELECTED:}>Parell
-<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Senar
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Bits de dades:</TH>
-<TD><SELECT NAME="BITS">
-<OPTION {?bits=8?SELECTED:}>8
-<OPTION {?bits=7?SELECTED:}>7
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Control de flux:</TH>
-<TD><SELECT NAME="FLOW">
-<OPTION VALUE="none" {?flow=none?SELECTED:}>Cap
-<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (Programari)
-<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (Maquinari)
-<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (Maquinari)
-</SELECT></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continua"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/choose-uri.tmpl b/templates/ca/choose-uri.tmpl
deleted file mode 100644 (file)
index 630b1d3..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifica {printer_name}:Add Printer}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Connexi&oacute;:</TH>
-<TD><INPUT TYPE="URL" SIZE="60" MAXLENGTH="1023" NAME="DEVICE_URI" VALUE="{current_device_uri?{current_device_uri}:{device_uri}}"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD>Exemples:
-<PRE>
-    http://hostname:631/ipp/
-    http://hostname:631/ipp/port1
-
-    ipp://hostname/ipp/
-    ipp://hostname/ipp/port1
-
-    lpd://hostname/queue
-
-    socket://hostname
-    socket://hostname:9100
-</PRE>
-
-<P>Llegiu <A HREF="/help/network.html" TARGET="_blank">"Impressores de xarxa"</A> per saber quin URI heu de fer servir amb la vostre impressora.</P>
-
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continua"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/class-added.tmpl b/templates/ca/class-added.tmpl
deleted file mode 100644 (file)
index 8e8347c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Afegeix una classe</H2>
-
-<P>La classe <A HREF="/classes/{printer_name}">{printer_name}</A> s'ha afegit correctament.
-
-</DIV>
diff --git a/templates/ca/class-confirm.tmpl b/templates/ca/class-confirm.tmpl
deleted file mode 100644 (file)
index 905ac6f..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Esborra la classe {printer_name}</H2>
-
-<P><B>Av&iacute;s:</B> Esteu segur que voleu esborrar la classe
-{printer_name}?</P>
-
-<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Esborra la classe"></FORM></P>
-
-</DIV>
diff --git a/templates/ca/class-deleted.tmpl b/templates/ca/class-deleted.tmpl
deleted file mode 100644 (file)
index 3f0035f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Esborra la classe {printer_name}</H2>
-
-<P>La classe {printer_name} s'ha esborrat correctament.
-
-</DIV>
diff --git a/templates/ca/class-jobs-header.tmpl b/templates/ca/class-jobs-header.tmpl
deleted file mode 100644 (file)
index 90e640e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<DIV CLASS="indent">
-<H3 CLASS="title">Tasques</H3>
-</DIV>
diff --git a/templates/ca/class-modified.tmpl b/templates/ca/class-modified.tmpl
deleted file mode 100644 (file)
index 6152ffa..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifica la classe {printer_name}</H2>
-
-<P>La classe <A HREF="/classes/{printer_name}">{printer_name}</A> s'ha modificat correctament.
-
-</DIV>
diff --git a/templates/ca/class.tmpl b/templates/ca/class.tmpl
deleted file mode 100644 (file)
index 6b39168..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<DIV CLASS="indent">
-<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?Inactiva:{printer_state=4?Processing:Paused}},
-{printer_is_accepting_jobs=0?No accepta tasques:Accepta tasques},
-{server_is_sharing_printers=0?No:{printer_is_shared=0?Not:}} Compartida{default_name={printer_name}?, Servidor per defecte:})</H2>
-
-<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
-<OPTION VALUE="">Manteniment</OPTION>
-<OPTION VALUE="print-test-page">Imprimeix una p&agrave;gina de prova</OPTION>
-{printer_state=5?<OPTION VALUE="start-class">Resume Class</OPTION>:<OPTION VALUE="stop-class">Pausa la classe</OPTION>}
-{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Accepta Tasques</OPTION>:<OPTION VALUE="reject-jobs">No acceptis tasques</OPTION>}
-<OPTION VALUE="move-jobs">Mou totes les tasques</OPTION>
-<OPTION VALUE="purge-jobs">Cancel&middot;a totes les tasques</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
-<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="1">
-<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
-<OPTION VALUE="">Administraci&oacute;</OPTION>
-<OPTION VALUE="modify-class">Modifica la classe</OPTION>
-<OPTION VALUE="delete-class">Esborra la classe</OPTION>
-<OPTION VALUE="set-class-options">Aplica les opcions per defecte</OPTION>
-<OPTION VALUE="set-as-default">Configura com a servidor per defecte</OPTION>
-<OPTION VALUE="set-allowed-users">Gestiona els permisos dels usuaris</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<TABLE SUMMARY="{printer_name}">
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Descripci&oacute;:</TH><TD>{printer_info}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Ubicaci&oacute:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Membres:</TH><TD>{?member_uris=?None:{member_uris}}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Per defecte:</TH><TD>plantilles={job_sheets_default}
-mitj&agrave;={media_default?{media_default}:unknown}
-{sides_default?laterals={sides_default}:}</TD></TR>
-</TABLE>
-
-</DIV>
diff --git a/templates/ca/classes-header.tmpl b/templates/ca/classes-header.tmpl
deleted file mode 100644 (file)
index 47ad5ce..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<P ALIGN="CENTER">{total=0?No hi ha cap classe:Es mostr{total=1?a:en} {#printer_name} classe{total=1?:s} de {total}}.</P>
diff --git a/templates/ca/command.tmpl b/templates/ca/command.tmpl
deleted file mode 100644 (file)
index 5cfd89f..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{title} a {printer_name}</H2>
-
-<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
-ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }Comanda de tasca de la impressora
-{job_state=3?pendent:{job_state=4?pausat:
-{job_state=5?processant:{job_state=6?aturat:
-{job_state=7?cancel·lat:{job_state=8?abortat:completat}}}}}}{job_state=9?:{job_printer_state_message?,
-<EM>"{job_printer_state_message}"</EM>:}}</P>
-
-</DIV>
diff --git a/templates/ca/edit-config.tmpl b/templates/ca/edit-config.tmpl
deleted file mode 100644 (file)
index e6e08f1..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<SCRIPT TYPE="text/javascript">
-function reset_config()
-{
-  document.cups.CUPSDCONF.value = "{?cupsdconf_default}";
-}
-</SCRIPT>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Edita el fitxer de configuraci&oacute;</H2>
-
-<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-
-<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
-
-<P><INPUT TYPE="SUBMIT" NAME="SAVECHANGES" VALUE="Desa els canvis">
-<INPUT TYPE="BUTTON" VALUE="Fes servir el fitxer de configuaci&oacute; per defecte"
-onClick="reset_config();"></P>
-
-</FORM>
-
-</DIV>
diff --git a/templates/ca/error-op.tmpl b/templates/ca/error-op.tmpl
deleted file mode 100644 (file)
index 064e8b4..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{?title} {?printer_name} Error</H2>
-
-<P>Error:</P>
-
-<BLOCKQUOTE>Operaci&oacute; desconeguda "{op}"!</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/ca/header.tmpl.in b/templates/ca/header.tmpl.in
deleted file mode 100644 (file)
index 988d6bf..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-       {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;Inici&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;Administraci&oacute;&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;Classes&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;Ajuda&nbsp;en&nbsp;l&iacute;nia&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;Tasques&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;Impressores&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
diff --git a/templates/ca/help-header.tmpl b/templates/ca/help-header.tmpl
deleted file mode 100644 (file)
index 54f2d22..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<DIV CLASS="indent">
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
-{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
-
-<P ALIGN="CENTER"><B>Cerca a
-{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:tots els documents}}:</B> <INPUT
-TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER=""
-AUTOSAVE="org.cups.help" RESULTS="20">
-<INPUT TYPE="SUBMIT" NAME="SEARCH" VALUE="Cerca">
-<INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Esborra"></P>
-
-</FORM>
-
-<!-- Bookmarks -->
-<DIV CLASS="sidebar"><TABLE CLASS="inset" SUMMARY="Contents">
-<TR><TD>
-
-<H3 CLASS="title">Documents d'ajuda en l&iacute;nia</H3>
-
-<P CLASS="l0"><A HREF="/help/{QUERY??QUERY={QUERY}:}">Tots els documents</A></P>
-<HR>
-
-{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
-}
-</TD></TR>
-</TABLE></DIV>
-
-{QUERY?<P>Resultats de la cerca a {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:tots els documents}}\:</P>
-{QTEXT?<UL>
-{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (in <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
-{QTEXT?</UL>:}
-:<P>No s'ha trobat cap coincid&egrave;ncia.</P>}
-<HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Mostra una versi&oacute; per imprimir"></FORM>:
-
-<H1>Ajuda en l&iacute;nia</H1>
-
-<P>Aquesta &eacute;s la interf&iacute;cie d'ajuda en l&iacute;nia de CUPS. 
-Introdu&iuml;u les paraules que vulgueu cercar aqu&iacute; dalt o feu clic als 
-enlla&ccedil;os de la documentaci&oacute; per mostrar la informaci&oacute; de
-l'ajuda en l&iacute;nia.</P>
-
-<P>Si sou nou a CUPS, llegiu la p&agrave;gina &laquo;<a
-href="/help/overview.html">Descripci&oacute; general de CUPS</a>&raquo;. Els 
-usuaris veterans haurien de llegir la p&agrave;gina &laquo;<a 
-href="/help/whatsnew.html">Que hi ha de nou a CUPS 1.6</a>&raquo;.</P>
-
-<P>La <A HREF="http://www.cups.org/">p&agrave;gina web de CUPS</A> tamb&eacute;
-dona cont&eacute; molts recursos que inclouen f&ograve;rums, respostes a les preguntes m&eacute;s
-freq&uuml;ents, i un formulari per enviar informes d'errors i demanar noves 
-caracter&iacute;stiques.</P>}
diff --git a/templates/ca/help-printable.tmpl b/templates/ca/help-printable.tmpl
deleted file mode 100644 (file)
index 2463c16..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>{HELPTITLE}</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups-printable.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
diff --git a/templates/ca/help-trailer.tmpl b/templates/ca/help-trailer.tmpl
deleted file mode 100644 (file)
index 4c1ebed..0000000
+++ /dev/null
@@ -1 +0,0 @@
-</DIV>
diff --git a/templates/ca/job-cancel.tmpl b/templates/ca/job-cancel.tmpl
deleted file mode 100644 (file)
index a53ca2f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Cancel&middot;la la tasca {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La tasca {job_id}</A> s'ha cancel&middot;lat.
-
-</DIV>
diff --git a/templates/ca/job-hold.tmpl b/templates/ca/job-hold.tmpl
deleted file mode 100644 (file)
index e89b97f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Pausa la tasca {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La tasca {job_id}</A> s'ha posat en pausa.
-
-</DIV>
diff --git a/templates/ca/job-move.tmpl b/templates/ca/job-move.tmpl
deleted file mode 100644 (file)
index 1bca282..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<DIV CLASS="indent">
-
-<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{job_id?<INPUT TYPE="HIDDEN" NAME="JOB_ID" VALUE="{job_id}">:}
-
-<H2 CLASS="title">{job_id?Mou la tasca {job_id}:Mou totes les tasques}</H2>
-
-<TABLE>
-<TR>
-<TH CLASS="label">Nova destinaci&oacute;:</TH>
-<TD>
-<SELECT NAME="JOB_PRINTER_URI" SIZE="10">
-{[job_printer_uri]<OPTION VALUE="{job_printer_uri}">{job_printer_name}}
-</SELECT>
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="{job_id?Mou la tasca:Mou les tasques}"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-
-</DIV>
diff --git a/templates/ca/job-moved.tmpl b/templates/ca/job-moved.tmpl
deleted file mode 100644 (file)
index 1e538f9..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{job_id?Mou la tasca {job_id}:Mou totes les tasques}</H2>
-
-<P>{job_id?<A HREF="/jobs/{job_id}">La tasca s'ha {job_id}</A>:Totes les tasques s'han} mogut a
-<A HREF="/{is_class?classes:printers}/{job_printer_name}">{job_printer_name}</A>.</P>
-
-</DIV>
diff --git a/templates/ca/job-release.tmpl b/templates/ca/job-release.tmpl
deleted file mode 100644 (file)
index db13e1d..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Allibera la tasca {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La tasca {job_id}</A> s'ha alliberat.
-
-</DIV>
diff --git a/templates/ca/job-restart.tmpl b/templates/ca/job-restart.tmpl
deleted file mode 100644 (file)
index d40c1c2..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Torna a imprimir la tasca {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La tasca {job_id}</A> s'ha tornat a imprimir.
-
-</DIV>
diff --git a/templates/ca/jobs-header.tmpl b/templates/ca/jobs-header.tmpl
deleted file mode 100644 (file)
index 3f785d5..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Mostra les tasques actives"></FORM>}
-{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Mostra les tasques completades"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Mostra totes les tasques"></FORM>}</DIV>
-
-<P ALIGN="CENTER">{total=0?No hi ha cap tasca:Es mostren {#job_id} tas{total=1?ca:ques} de {total} {?which_jobs=?active:{which_jobs=all?:completed}}}.</P>
diff --git a/templates/ca/modify-class.tmpl b/templates/ca/modify-class.tmpl
deleted file mode 100644 (file)
index 26a6284..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifica la classe {printer_name}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Descripci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
-</TR>
-<TR>
-<TH CLASS="label">Ubicaci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
-</TR>
-<TR>
-<TH CLASS="label">Membres:</TH>
-<TD>
-<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
-{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
-</SELECT>
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Modifica la classe"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/modify-printer.tmpl b/templates/ca/modify-printer.tmpl
deleted file mode 100644 (file)
index 3843016..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifica {printer_name}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
-<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
-<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
-<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Descripci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Una descripci&oacute; com ara &laquo;HP LaserJet de doble cara&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Ubicaci&oacute;:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Una ubicaci&oacute; com ara  &laquo;Laboratori 1&raquo;)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Connexi&oacute;:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Compartir:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
-Comparteix aquesta impressora</TD>
-</TR>
-<TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continua"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/ca/norestart.tmpl b/templates/ca/norestart.tmpl
deleted file mode 100644 (file)
index 5cdb7c4..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Canvis en la configuraci&oacute;</H2>
-
-<P>El servidor no s'ha tornat a iniciar per que no hi ha canvis
-a la configuraci&oacute;...</P>
-
-</DIV>
diff --git a/templates/ca/option-boolean.tmpl b/templates/ca/option-boolean.tmpl
deleted file mode 100644 (file)
index e832ee1..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<TR>
-<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
-<TD>
-{[choices]<INPUT TYPE="RADIO" NAME="{keyword-1}" {choices={defchoice-1}?CHECKED:} VALUE="{choices}">{text}}
-</TD>
-</TR>
diff --git a/templates/ca/option-conflict.tmpl b/templates/ca/option-conflict.tmpl
deleted file mode 100644 (file)
index 59b63e9..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<P><B>Error:</B> Les seg&uuml;ents opcions entren en conflicte:</P>
-
-<UL>
-{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A>: {cchoice}</LI>
-}</UL>
-
-<P>Canvieu algunes de les opcions per resoldre els conflictes.</P>
diff --git a/templates/ca/option-header.tmpl b/templates/ca/option-header.tmpl
deleted file mode 100644 (file)
index 464726a..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="tab" ID="{group_id}">
-
-<H3 ALIGN="CENTER">{group}</H3>
-
-<TABLE WIDTH="100%">
diff --git a/templates/ca/option-pickmany.tmpl b/templates/ca/option-pickmany.tmpl
deleted file mode 100644 (file)
index 0da75e5..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<TR>
-<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
-<TD><SELECT NAME="{keyword}" MULTIPLE SIZE="10">
-{[choices]<OPTION {choices={defchoice-1}?SELECTED:} VALUE="{choices}">{text}}
-</SELECT></TD>
-</TR>
diff --git a/templates/ca/option-pickone.tmpl b/templates/ca/option-pickone.tmpl
deleted file mode 100644 (file)
index 1b3c271..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-<TR>
-<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
-<TD><SELECT NAME="{keyword}" ID="select-{keyword}" ONCHANGE="update_paramtable('{keyword}')">
-{[choices]<OPTION {choices={defchoice-1}?SELECTED:} VALUE="{choices}">{text}}
-</SELECT>
-{iscustom=1?<TABLE NAME="paramtable" id="{keyword}-params">{[params]
-<TR><TH CLASS="sublabel">{paramtext}:</TH>
-<TD>{params=Units?<SELECT NAME="{keyword-1}.{params}">
-<OPTION VALUE="pt"{paramvalue=pt? SELECTED:}>Punts</OPTION>
-<OPTION VALUE="mm"{paramvalue=mm? SELECTED:}>Mil&middot;l&iacute;metres</OPTION>
-<OPTION VALUE="cm"{paramvalue=cm? SELECTED:}>Cent&iacute;metres</OPTION>
-<OPTION VALUE="in"{paramvalue=in? SELECTED:}>Polzades</OPTION>
-<OPTION VALUE="ft"{paramvalue=ft? SELECTED:}>Peus</OPTION>
-<OPTION VALUE="m"{paramvalue=m? SELECTED:}>Metres</OPTION>
-</SELECT>:<INPUT TYPE="{inputtype}" NAME="{keyword-1}.{params}" VALUE="{paramvalue}">}</TD></TR>
-}</TABLE>
-</TD>:}
-</TR>
diff --git a/templates/ca/option-trailer.tmpl b/templates/ca/option-trailer.tmpl
deleted file mode 100644 (file)
index 11c4011..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-</TABLE>
-
-<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="Configura els par&agrave;metres per defecte"></P>
-
-</DIV>
diff --git a/templates/ca/printer-accept.tmpl b/templates/ca/printer-accept.tmpl
deleted file mode 100644 (file)
index 0bd2a57..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Accepta tasques a {is_class?la classe: la impressora} {printer_name}</H2>
-
-<P>{is_class?La classe:La impressora} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-ara accepta tasques.</P>
-
-</DIV>
diff --git a/templates/ca/printer-added.tmpl b/templates/ca/printer-added.tmpl
deleted file mode 100644 (file)
index b5850aa..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Afegeix una impressora</H2>
-
-<P>La impressora <A HREF="/printers/{printer_name}">{printer_name}</A> s'ha afegit
-correctament.
-
-</DIV>
diff --git a/templates/ca/printer-configured.tmpl b/templates/ca/printer-configured.tmpl
deleted file mode 100644 (file)
index 20880da..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">S'ha aplicat la configuraci&oacute; per defecte a {printer_name}</H2>
-
-<P>Les opcions per defecte de la {OP=set-class-options?classe <A HREF="/classes/{printer_name}">:impressora <A HREF="/printers/{printer_name}">}{printer_name}</A> s'han establert correctament.
-</DIV>
diff --git a/templates/ca/printer-default.tmpl b/templates/ca/printer-default.tmpl
deleted file mode 100644 (file)
index 76f7ddf..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Estableix {is_class?Class:Printer} {printer_name} com a predeterminada</H2>
-
-<P>{is_class?Class:Printer} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-s'ha establert com a impressora predeterminada.</P>
-
-<BLOCKQUOTE><B>Nota:</B> Qualsevol usuari que hagi estat establert mitjan&ccedil;ant 
-la comanda <TT>lpoptions</TT> sobreescriur&agrave; aquesta configuraci&oacute; predeterminada.</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/ca/printer-deleted.tmpl b/templates/ca/printer-deleted.tmpl
deleted file mode 100644 (file)
index 695ab67..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Elimina la impressora {printer_name}</H2>
-
-<P>La impressora {printer_name} s'ha eliminat correctament.
-
-</DIV>
diff --git a/templates/ca/printer-jobs-header.tmpl b/templates/ca/printer-jobs-header.tmpl
deleted file mode 100644 (file)
index 90e640e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<DIV CLASS="indent">
-<H3 CLASS="title">Tasques</H3>
-</DIV>
diff --git a/templates/ca/printer-modified.tmpl b/templates/ca/printer-modified.tmpl
deleted file mode 100644 (file)
index efbbc3b..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifica la impressora {printer_name}</H2>
-
-<P>La impressora <A HREF="/printers/{printer_name}">{printer_name}</A> s'ha
-modificat correctament.
-
-</DIV>
diff --git a/templates/ca/printer-purge.tmpl b/templates/ca/printer-purge.tmpl
deleted file mode 100644 (file)
index 980d883..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Cancel&middot;la les tasques de {is_class?la classe:la impressora} {printer_name}</H2>
-
-<P>S'han cancel&middot;lat totes les tasques de{is_class?la classe:la impressora} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>.</P>
-
-</DIV>
diff --git a/templates/ca/printer-reject.tmpl b/templates/ca/printer-reject.tmpl
deleted file mode 100644 (file)
index 6269cf2..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Refusa les tasques a {is_class?la classe:la impressora} {printer_name}</H2>
-
-<P>{is_class?La classe:la impressora} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-no accepta tasques a partir d'ara.</P>
-
-</DIV>
diff --git a/templates/ca/printer-start.tmpl b/templates/ca/printer-start.tmpl
deleted file mode 100644 (file)
index 6986fd4..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Repr&egrave;n {is_class?la classe:la impressora} {printer_name}</H2>
-
-<P>{is_class?La classe:La impressora} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-ha repr&egrave;s les tasques.</P>
-
-</DIV>
diff --git a/templates/ca/printer-stop.tmpl b/templates/ca/printer-stop.tmpl
deleted file mode 100644 (file)
index af89331..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Pausa {is_class?la classe:la impressora} {printer_name}</H2>
-
-<P>{is_class?La classe:La impressora} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-s'ha posat en pausa.</P>
-
-</DIV>
diff --git a/templates/ca/printer.tmpl b/templates/ca/printer.tmpl
deleted file mode 100644 (file)
index 2500001..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?Inactiva:{printer_state=4?Processant:En pausa}},
-{printer_is_accepting_jobs=0?Refusa les tasques:Accepta tasques},
-{server_is_sharing_printers=0?No:{printer_is_shared=0?No:}} Compartida{default_name={printer_name}?, Servidor per defecte:})</H2>
-
-<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
-<OPTION VALUE="">Manteniment</OPTION>
-<OPTION VALUE="print-test-page">Imprimeix una p&agrave;gina de prova</OPTION>
-{printer_commands~.*Clean.*?<OPTION VALUE="clean-print-heads">Neteja els cap&ccedil;als</OPTION>:}
-{printer_commands~.*PrintSelfTestPage.*?<OPTION VALUE="print-self-test-page">Imprimeix la p&agrave;gina de prova pr&ograve;pia</OPTION>:}
-{printer_state=5?<OPTION VALUE="start-printer">Repr&egrave;n la impressora</OPTION>:<OPTION VALUE="stop-printer">Pausa la impressora</OPTION>}
-{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Accepta tasques</OPTION>:<OPTION VALUE="reject-jobs">Refusa les tasques</OPTION>}
-<OPTION VALUE="move-jobs">Mou totes les tasques</OPTION>
-<OPTION VALUE="purge-jobs">Cancel&middot;la totes les tasques</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
-<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
-<OPTION VALUE="">Administraci&oacute;</OPTION>
-<OPTION VALUE="modify-printer">Modifica la impressora</OPTION>
-<OPTION VALUE="delete-printer">Elimina la impressora</OPTION>
-<OPTION VALUE="set-printer-options">Torna a les opcions per defecte</OPTION>
-<OPTION VALUE="set-as-default">Configura com a servidor per defecte</OPTION>
-<OPTION VALUE="set-allowed-users">Configura els permisos dels usuaris</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<TABLE SUMMARY="{printer_name}">
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Descripci&oacute;:</TH><TD>{printer_info}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Ubicaci&oacute;:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Controlador:</TH><TD>{printer_make_and_model} ({color_supported=1?color:escala de grisos}{sides_supported?, impressió a doble cara:})<BR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Connexi&oacute;:</TH><TD>{device_uri}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Configuraci&oacute; per defecte:</TH><TD>Fulls de tasques={job_sheets_default}
-safata={media_default?{media_default}:desconeguda}
-{sides_default?cares={sides_default}:}</TD></TR>
-</TABLE>
-
-</DIV>
diff --git a/templates/ca/printers-header.tmpl b/templates/ca/printers-header.tmpl
deleted file mode 100644 (file)
index 52eaa2f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<P ALIGN="CENTER">{total=0?Cap impressora:Es mostr{#printer_name=1?a:en} {#printer_name} de {total} impressor{total=1?a:es}}.</P>
diff --git a/templates/ca/printers.tmpl b/templates/ca/printers.tmpl
deleted file mode 100644 (file)
index d978c17..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{#printer_name=0?:
-<TABLE CLASS="list" SUMMARY="Printer List">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Nom <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Nom <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Descripci&oacute;</TH><TH>Ubicaci&oacute</TH><TH>Marca i model</TH><TH>Estat</TH></TR>
-</THEAD>
-<TBODY>
-{[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?Preparada:{printer_state=4?Processant:En pausa}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
-}
-</TBODY>
-</TABLE></DIV>}
diff --git a/templates/ca/restart.tmpl b/templates/ca/restart.tmpl
deleted file mode 100644 (file)
index 4e3983f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Canvis en la configuraci&oacute;</H2>
-
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Busy Indicator"> Espereu mentre es torna a iniciar el servidor...</P>
-
-</DIV>
diff --git a/templates/ca/samba-export.tmpl b/templates/ca/samba-export.tmpl
deleted file mode 100644 (file)
index 2b16e1e..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<SCRIPT TYPE="text/javascript"><!--
-function select_printers() {
-  var list = document.export_samba.EXPORT_NAME;
-  var sel = document.export_samba.EXPORT_ALL.checked;
-
-  for (i = 0; i < list.length; i ++) {
-    list.options[i].selected = sel;
-  }
-}
---></SCRIPT>
-
-<FORM METHOD="POST" ACTION="/admin/" NAME="export_samba">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
-
-<H2 CLASS="title">Exporta les impressores al Samba</H2>
-
-{error?<P>No es pot exportar les impressores al Samba\:</P>
-<BLOCKQUOTE>{error}</BLOCKQUOTE>
-<P>Consulteu el fitxer <A HREF="/admin/log/error_log"
-TARGET="_blank">error_log</A> per obtenir m&eacute;s informaci&oacute;.</P>:
-<P>Aquesta p&agrave;gina us permet exportar les impressores al Samba per tal que
-els clients de Windows puguin accedir-hi a trav&eacute;s de les icones <VAR>Xarxa
-ve&iuml;na</VAR> o <VAR>Llocs de la xarxa</VAR> del seu
-escriptori. Abans heu d'instal&middot;lar el controlador d'impressores Windows PostScript
-tal i com s'explica a la p&agrave;gina del manual <A
-HREF="/help/man-cupsaddsmb.html"
-TARGET="_blank">cupsaddsmb(8)</A>.</P>}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Impressores:</TH>
-<TD>
-<SELECT NAME="EXPORT_NAME" SIZE="10" MULTIPLE>
-{[printer_name]<OPTION VALUE="{printer_name}"{export_all? SELECTED:{printer_export? SELECTED:}}>{printer_name}}
-</SELECT><BR>
-<INPUT TYPE="CHECKBOX" NAME="EXPORT_ALL"{export_all? CHECKED:}
-onChange="select_printers()"> Exporta totes les impressores
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">Nom de l'usuari del Samba:</TH>
-<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (necessari)</TD>
-</TR>
-<TR>
-<TH CLASS="label">Contrasenya del Samba:</TH>
-<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (necess&agrave;ria)</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Exporta les impressores al Samba"></TD>
-</TR>
-</TABLE>
-
-</FORM>
diff --git a/templates/ca/samba-exported.tmpl b/templates/ca/samba-exported.tmpl
deleted file mode 100644 (file)
index 7ea9857..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<P>Les impressores s'han exportat correctament al Samba.</P>
diff --git a/templates/ca/set-printer-options-header.tmpl b/templates/ca/set-printer-options-header.tmpl
deleted file mode 100644 (file)
index b4a4a4e..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Aplica les opcions per defecte a {printer_name}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{HAVE_AUTOCONFIGURE?<INPUT TYPE="SUBMIT" NAME="AUTOCONFIGURE" VALUE="Demana a la impressora les opcions per defecte">:}
-
-<SCRIPT TYPE="text/javascript"><!--
-function update_paramtable(option)
-{
-  var cb = document.getElementById("select-" + option)
-  var paramstable = document.getElementById(option + "-params");
-  if (cb.value == "Custom")
-    paramstable.style.display = "table";
-  else
-    paramstable.style.display = "none";
-}
---></SCRIPT>
-
-<H3 CLASS="title">{[group_id]
-<A HREF="#{group_id}">{group}</A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</H3>
-
-<DIV CLASS="tabs">
diff --git a/templates/ca/set-printer-options-trailer.tmpl b/templates/ca/set-printer-options-trailer.tmpl
deleted file mode 100644 (file)
index 11adc70..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-</DIV>
-
-<SCRIPT TYPE="text/javascript"><!--
-// Hide custom options parameters for browsers that understand Javascript
-var paramtables = document.getElementsByName("paramtable");
-for (var i = 0; i < paramtables.length; i++)
-{
-  var opt = paramtables[i].id.substr(0, paramtables[i].id.lastIndexOf("-"));
-  var cb = document.getElementById("select-" + opt);
-  if (cb.value != "Custom")
-    paramtables[i].style.display = "none";
-}
---></SCRIPT>
-</FORM>
-
-</DIV>
diff --git a/templates/ca/subscription-added.tmpl b/templates/ca/subscription-added.tmpl
deleted file mode 100644 (file)
index 067132f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">
-
-<P>La subscripci&oacute; {subscription_name} s'ha afegit correctament.</P>
-
-</DIV>
diff --git a/templates/ca/subscription-canceled.tmpl b/templates/ca/subscription-canceled.tmpl
deleted file mode 100644 (file)
index 8a93b4c..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">
-
-<P>La subscripci&oacute; #{notify_subscription_id} s'ha cancel&middot;lat.</P>
-
-</DIV>
diff --git a/templates/ca/test-page.tmpl b/templates/ca/test-page.tmpl
deleted file mode 100644 (file)
index 2a4b776..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Imprimeix una p&agrave;gina de prova a {printer_name}</H2>
-
-<P>S'ha enviat la p&agrave;gina de prova; l'ID de la tasca &eacute;s <A HREF="/{SECTION}/{printer_name}">
-{printer_name}-{job_id}</A>.</P>
-
-</DIV>
diff --git a/templates/ca/trailer.tmpl b/templates/ca/trailer.tmpl
deleted file mode 100644 (file)
index f75af72..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS i el logotip de CUPS s&oacute;n marques registrades per
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS t&eacute; copyright 2007-2013 Apple
-Inc. Tots els drets reservats.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
index c5ab251..5f46939 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Modify {printer_name}:Add Printer}</H2>
 
 {CUPS_GET_DEVICES_DONE?<FORM METHOD="POST" ACTION="/admin">
@@ -49,5 +47,3 @@ VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
 
 </FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
 ALT="Busy Indicator"> Looking for printers...</P>}
-
-</DIV>
index 65096ad..a5c80aa 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Modify {printer_name}:Add Printer}</H2>
 
 <FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -61,4 +59,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 992cd01..ee9338c 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Modify {printer_name}:Add Printer}</H2>
 
 <FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -57,4 +55,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 56a14a4..89a5eaf 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Modify {printer_name}:Add Printer}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -49,4 +47,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 45d84de..0c7f454 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Modify {printer_name}:Add Printer}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -41,4 +39,3 @@ Printers"</A> for the correct URI to use with your printer.</P>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index c062a16..6afd302 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Add Class</H2>
 
 <P>Class <A HREF="/classes/{printer_name}">{printer_name}</A> has been added
 successfully.
-
-</DIV>
index 5f0277c..e564379 100644 (file)
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Delete Class {printer_name}</H2>
 
 <P><B>Warning:</B> Are you sure you want to delete class
 {printer_name}?</P>
 
 <P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Delete Class"></FORM></P>
-
-</DIV>
index a4ad46a..6c44468 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Delete Class {printer_name}</H2>
 
 <P>Class {printer_name} has been deleted successfully.
-
-</DIV>
\ No newline at end of file
index ba46f10..61e5151 100644 (file)
@@ -1,3 +1 @@
-<DIV CLASS="indent">
 <H3 CLASS="title">Jobs</H3>
-</DIV>
index fe42c90..02b9895 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Modify Class {printer_name}</H2>
 
 <P>Class <A HREF="/classes/{printer_name}">{printer_name}</A> has been
 modified successfully.
-
-</DIV>
\ No newline at end of file
index 477e0e8..0afb0d3 100644 (file)
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
 <H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
 ({printer_state=3?Idle:{printer_state=4?Processing:Paused}},
 {printer_is_accepting_jobs=0?Rejecting Jobs:Accepting Jobs},
@@ -40,5 +39,3 @@
 media={media_default?{media_default}:unknown}
 {sides_default?sides={sides_default}:}</TD></TR>
 </TABLE>
-
-</DIV>
index 9a87439..a8dc6ff 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{title} On {printer_name}</H2>
 
 <P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
@@ -8,5 +6,3 @@ ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }Printer command job
 {job_state=5?processing:{job_state=6?stopped:
 {job_state=7?canceled:{job_state=8?aborted:completed}}}}}}{job_state=9?:{job_printer_state_message?,
 <EM>"{job_printer_state_message}"</EM>:}}</P>
-
-</DIV>
diff --git a/templates/cs/admin.tmpl b/templates/cs/admin.tmpl
deleted file mode 100644 (file)
index 247a10f..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<TABLE CLASS="indent" SUMMARY="Administration Tasks">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">Tiskárny</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Přidat tiskárnu"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Hledat nové tiskárny"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Správa tiskáren"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Export tiskáren do Samby"></FORM>:}
-</P>
-
-<H2 CLASS="title">Třídy</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Přidat třídu"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Správa tříd"></FORM>
-</P>
-
-<H2 CLASS="title">Úlohy</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Správa úloh"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">Server</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Úprava konfiguračního souboru"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Prohlížení Access Log"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Prohlížení Error Log"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Prohlížení Page Log"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>Nastavení serveru\:</B></P>
-
-<P><A HREF="/admin/">Skrýt rozšířené nastavení <SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Sdílet tiskárny připojené k tomuto systému<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximální počet klientů\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Povolit tisk z internetu<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Nabízet webové rozhraní<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Povolit vzdálenou správu<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Používat ověřování Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">časté dotazy</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Povolit uživatelům zrušit jakoukoliv úlohu (nejen vlastní)<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Zachovat historii úloh<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximální počet úloh (0 bez omezení)\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Zachovat metadata\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Zachovat dokumenty\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Uložit informace o ladění pro řešení problémů<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximální velikost log souboru\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>Nastavení serveru:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Zobrazit rozšířené nastavení <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Sdílet tiskárny připojené k tomuto systému<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Povolit tisk z internetu<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Povolit vzdálenou správu<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Používat ověřování Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">časté dotazy</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Povolit uživatelům zrušit jakoukoliv úlohu (nejen vlastní)<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Uložit informace o ladění pro řešení problémů</P>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Změnit nastavení"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">RSS předplatné</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Přidat RSS předplatné"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS Subscriptions">
-<THEAD><TR><TH>Název</TH><TH>Události</TH><TH>Název fronty</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Zrušit RSS předplatné"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:Všechny fronty}</TD></TR>}
-</TBODY>
-</TABLE>:}
diff --git a/templates/cs/choose-device.tmpl b/templates/cs/choose-device.tmpl
deleted file mode 100644 (file)
index aa8a649..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Úprava tiskárny {printer_name}:Přidat tiskárnu}</H2>
-
-{CUPS_GET_DEVICES_DONE?<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-
-<TABLE>
-{op=add-printer?:<TR>
-<TH CLASS="label">Aktuální připojení\:</TH>
-<TD><INPUT TYPE="RADIO" NAME="DEVICE_URI" VALUE="{current_device_uri}" CHECKED>
-{current_device_uri}</TD>
-</TR>}
-<TR>
-<TH CLASS="label">Místní tiskárny\:</TH>
-<TD>
-{[device_uri]{device_class!network?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
-:}}
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">Nalezené síťové tiskárny\:</TH>
-<TD>
-{[device_uri]{device_class=network?{device_uri~[a-z]+://?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
-:}:}}
-</TD>
-</TR>
-<TR>
-<TR>
-<TH CLASS="label">Ostatní síťové tiskárny\:</TH>
-<TD>
-{[device_uri]{device_class=network?{device_uri~[a-z]+://?:<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
-}:}}
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Pokračovat"></TD>
-</TR>
-</TABLE>
-
-</FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Busy Indicator"> Hledání tiskáren ...</P>}
-
-</DIV>
diff --git a/templates/cs/choose-make.tmpl b/templates/cs/choose-make.tmpl
deleted file mode 100644 (file)
index f018f0e..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Úprava tiskárny {printer_name}:Přidat tiskárnu}</H2>
-
-<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
-<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
-<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
-<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
-
-<TABLE>
-{op=modify-printer?:<TR>
-<TH CLASS="label">Název:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
-</TR>}
-<TR>
-<TH CLASS="label">Popis:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Umístění:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Připojení:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Sdílení:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
-{?printer_is_shared=?ne:{?printer_is_shared=0?ne:}}sdílená</TD>
-</TR>
-<TR>
-<TH CLASS="label">Výrobce:</TH>
-<TD>
-<SELECT NAME="PPD_MAKE" SIZE="10">
-{[ppd_make]<OPTION VALUE="{ppd_make}" {?current_make={ppd_make}?SELECTED:}>{ppd_make}}
-</SELECT>
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Pokračovat"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD>&nbsp;</TD>
-</TR>
-<TR>
-<TH CLASS="label">Nebo vybrat soubor PPD:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
-TYPE="FILE" NAME="PPD_FILE"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="{op=add-printer?Přidat tiskárnu:Upravit tiskárnu}"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
\ No newline at end of file
diff --git a/templates/cs/choose-serial.tmpl b/templates/cs/choose-serial.tmpl
deleted file mode 100644 (file)
index 593bcdd..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Úprava tiskárny {printer_name}:Přidat tiskárnu}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Připojení:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Přenosová rychlost:</TH>
-<TD><SELECT NAME="BAUDRATE">
-{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Parita:</TH>
-<TD><SELECT NAME="PARITY">
-<OPTION VALUE="none" {?parity=none?SELECTED:}>Žádná
-<OPTION VALUE="even" {?parity=even?SELECTED:}>Sudá
-<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Lichá
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Datových bitů:</TH>
-<TD><SELECT NAME="BITS">
-<OPTION {?bits=8?SELECTED:}>8
-<OPTION {?bits=7?SELECTED:}>7
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Řízení toku dat:</TH>
-<TD><SELECT NAME="FLOW">
-<OPTION VALUE="none" {?flow=none?SELECTED:}>Žádné
-<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (software)
-<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (hardware)
-<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (hardware)
-</SELECT></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Pokračovat"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
\ No newline at end of file
diff --git a/templates/cs/class-added.tmpl b/templates/cs/class-added.tmpl
deleted file mode 100644 (file)
index d644303..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Přidat třídu</H2>
-
-<P>Třída <A HREF="/classes/{printer_name}">{printer_name}</A> byla úspěšně přidána.
-
-</DIV>
diff --git a/templates/cs/class-deleted.tmpl b/templates/cs/class-deleted.tmpl
deleted file mode 100644 (file)
index e2fb7f8..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Výmaz třídy {printer_name}</H2>
-
-<P>Třída {printer_name} byla úspěšně vymazána.
-
-</DIV>
\ No newline at end of file
diff --git a/templates/cs/class-jobs-header.tmpl b/templates/cs/class-jobs-header.tmpl
deleted file mode 100644 (file)
index d8142d1..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<DIV CLASS="indent">
-<H3 CLASS="title">Úlohy</H3>
-</DIV>
diff --git a/templates/cs/class-modified.tmpl b/templates/cs/class-modified.tmpl
deleted file mode 100644 (file)
index 131fd08..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Úprava třídy {printer_name}</H2>
-
-<P>Třída <A HREF="/classes/{printer_name}">{printer_name}</A> byla úspěšně upravena.
-
-</DIV>
\ No newline at end of file
diff --git a/templates/cs/class.tmpl b/templates/cs/class.tmpl
deleted file mode 100644 (file)
index 39f72bf..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<DIV CLASS="indent">
-<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?čeká:{printer_state=4?tiskne:pauza}},
-{printer_is_accepting_jobs=0?ne:}přijímá úlohy,
-{server_is_sharing_printers=0?není:{printer_is_shared=0?není:}} sdílení{default_name={printer_name}?, výchozí server:})</H2>
-
-<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
-<OPTION VALUE="">Údržba</OPTION>
-<OPTION VALUE="print-test-page">Tisk zkušební stránky</OPTION>
-{printer_state=5?<OPTION VALUE="start-class">Obnovení třídy</OPTION>:<OPTION VALUE="stop-class">Pozastavení třídy</OPTION>}
-{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Příjem úloh</OPTION>:<OPTION VALUE="reject-jobs">Odmítnutí úloh</OPTION>}
-<OPTION VALUE="move-jobs">Přesun všech úloh</OPTION>
-<OPTION VALUE="purge-jobs">Výmaz všech úloh</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
-<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="1">
-<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
-<OPTION VALUE="">Administrace</OPTION>
-<OPTION VALUE="modify-class">Úprava třídy</OPTION>
-<OPTION VALUE="delete-class">Výmaz třídy</OPTION>
-<OPTION VALUE="set-class-options">Nastavení parametrů</OPTION>
-<OPTION VALUE="set-as-default">Nastavení jako výchozí na serveru</OPTION>
-<OPTION VALUE="set-allowed-users">Nastavení přístupu uživatelů</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<TABLE SUMMARY="{printer_name}">
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Popis:</TH><TD>{printer_info}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Umístění:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Členové:</TH><TD>{?member_uris=?None:{member_uris}}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Nastavení:</TH><TD>job-sheets={job_sheets_default}
-media={media_default?{media_default}:unknown}
-{sides_default?sides={sides_default}:}</TD></TR>
-</TABLE>
-
-</DIV>
diff --git a/templates/cs/classes-header.tmpl b/templates/cs/classes-header.tmpl
deleted file mode 100644 (file)
index 5bfeeee..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<P ALIGN="CENTER">{total=0?Žádné třídy:Zobrazení {#printer_name} z {total} tříd{total=1?y:}}.</P>
diff --git a/templates/cs/classes.tmpl b/templates/cs/classes.tmpl
deleted file mode 100644 (file)
index 02d32a6..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-{#printer_name=0?:
-<TABLE CLASS="list" SUMMARY="Class List">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Název fromty <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Název fronty <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Popis</TH><TH>Umístění</TH><TH>Členové</TH><TH>Stav</TH></TR>
-</THEAD>
-<TBODY>
-{[printer_name]
-<TR><TD><A
-HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?Žádný:{member_uris}}</TD><TD>{printer_state=3?Čeká:{printer_state=4?Tiskne:Pauza}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
-}
-</TBODY>
-</TABLE></DIV>}
diff --git a/templates/cs/command.tmpl b/templates/cs/command.tmpl
deleted file mode 100644 (file)
index b2a4fd4..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{title} u {printer_name}</H2>
-
-<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
-ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }Stav úlohy
-{job_state=3?čeká:{job_state=4?pozastaveno:
-{job_state=5?zpracováváno:{job_state=6?zastaveno:
-{job_state=7?zrušeno:{job_state=8?zrušeno:dokončeno}}}}}}{job_state=9?:{job_printer_state_message?,
-<EM>"{job_printer_state_message}"</EM>:}}.</P>
-
-</DIV>
diff --git a/templates/cs/error-op.tmpl b/templates/cs/error-op.tmpl
deleted file mode 100644 (file)
index 636edc2..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Chyba {?title} u {?printer_name}</H2>
-
-<P>Chyba:</P>
-
-<BLOCKQUOTE>Neznámá operace "{op}"!</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/cs/error.tmpl b/templates/cs/error.tmpl
deleted file mode 100644 (file)
index 7ee1926..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Chyba {?title} u {?printer_name}</H2>
-
-<P>{?message?{message}:Chyba}:</P>
-
-<BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/cs/header.tmpl.in b/templates/cs/header.tmpl.in
deleted file mode 100644 (file)
index 739e51d..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//CZ" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-       {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;Hlavní strana&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;Administrace&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;Třídy tiskáren&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;Nápověda&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;Úlohy&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;Tiskárny&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Hledat"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
diff --git a/templates/cs/help-header.tmpl b/templates/cs/help-header.tmpl
deleted file mode 100644 (file)
index fe8dca8..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-<DIV CLASS="indent">
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
-{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
-
-<P ALIGN="CENTER"><B>Hledat v{HELPTITLE? {HELPTITLE}:{TOPIC? {TOPIC}:e všech dokumentech}}:</B> <INPUT
-TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER=""
-AUTOSAVE="org.cups.help" RESULTS="20">
-<INPUT TYPE="SUBMIT" NAME="SEARCH" VALUE="Hledat">
-<INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Smazat"></P>
-
-</FORM>
-
-<!-- Bookmarks -->
-<DIV CLASS="sidebar"><TABLE CLASS="inset" SUMMARY="Contents">
-<TR><TD>
-
-<H3 CLASS="title">Dokumenty nápovědy</H3>
-
-<P CLASS="l0"><A HREF="/help/{QUERY??QUERY={QUERY}:}">Všechny dokumenty</A></P>
-<HR>
-
-{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
-}
-</TD></TR>
-</TABLE></DIV>
-
-{QUERY?<P>Výsledky hledání v{HELPFILE? {HELPTITLE}:{TOPIC? {TOPIC}:e všech dokumentech}}\:</P>
-{QTEXT?<UL>
-{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (v <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
-{QTEXT?</UL>:}
-:<P>Nebyl nalezen záznam.</P>}
-<HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Zobrazit verzi pro tisk"></FORM>:
-
-<H1>Nápověda</H1>
-
-<P>Toto je rozhraní nápovědy CUPS. Zadejte hledané slovo nebo klikněte na
-některý z odkazů dokumentace k zobrazení nápovědy.</P>
-
-<P>Pokud jste nový uživatel programu CUPS, přečtěte si stránku "<a
-href="/help/overview.html">Popis programu CUPS</a>". Zkušení uživatelé by
-si měli přečíst stránku "<a href="/help/whatsnew.html">Co je nového v CUPS 1.6</a>".</P>
-
-<P><A HREF="http://www.cups.org/">Hlavní strana programu CUPS</A> také
-poskytuje mnoho zdrojů, včetně uživatelského diskuzního fóra, odpovědí
-na často kladené otázky a formuláře pro odesílání zpráv o chybách a
-požadavky na nové funkce.</P>}
diff --git a/templates/cs/help-printable.tmpl b/templates/cs/help-printable.tmpl
deleted file mode 100644 (file)
index 763a98b..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//CS" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>{HELPTITLE}</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups-printable.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-</HEAD>
-<BODY>
diff --git a/templates/cs/help-trailer.tmpl b/templates/cs/help-trailer.tmpl
deleted file mode 100644 (file)
index 4c1ebed..0000000
+++ /dev/null
@@ -1 +0,0 @@
-</DIV>
diff --git a/templates/cs/job-cancel.tmpl b/templates/cs/job-cancel.tmpl
deleted file mode 100644 (file)
index 31f50ea..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Zrušit úlohu {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">Úloha {job_id}</A> byla zrušena.
-
-</DIV>
diff --git a/templates/cs/job-hold.tmpl b/templates/cs/job-hold.tmpl
deleted file mode 100644 (file)
index f0e7b63..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Pozastavení úlohy {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">Úloha {job_id}</A> byla pozastavena.
-
-</DIV>
diff --git a/templates/cs/job-moved.tmpl b/templates/cs/job-moved.tmpl
deleted file mode 100644 (file)
index 40e5eef..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{job_id?Přesun úlohy {job_id}:Přesun všech úloh}</H2>
-
-<P>{job_id?<A HREF="/jobs/{job_id}">Úloha přesunuta {job_id}</A>:Všechny úlohy přesunuty} na tiskárnu 
-<A HREF="/{is_class?classes:printers}/{job_printer_name}">{job_printer_name}</A>.</P>
-
-</DIV>
diff --git a/templates/cs/job-release.tmpl b/templates/cs/job-release.tmpl
deleted file mode 100644 (file)
index 199c798..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Uvolnit úlohu {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">Úloha {job_id}</A> byla uvolněna k tisku.
-
-</DIV>
diff --git a/templates/cs/job-restart.tmpl b/templates/cs/job-restart.tmpl
deleted file mode 100644 (file)
index 56c113a..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Opakovaný tisk úlohy {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">Úloha {job_id}</A> byla znovu spuštěna.
-
-</DIV>
diff --git a/templates/cs/jobs-header.tmpl b/templates/cs/jobs-header.tmpl
deleted file mode 100644 (file)
index 591d4ce..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Aktivní úlohy"></FORM>}
-{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Dokončené úlohy"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Všechny úlohy"></FORM>}</DIV>
-
-<P ALIGN="CENTER">{total=0?Žádné úlohy:Zobrazení {#job_id} z {total} {?which_jobs=?aktivních:{which_jobs=all?:dokončených}} {total=1?úloha:úloh}}.</P>
diff --git a/templates/cs/jobs.tmpl b/templates/cs/jobs.tmpl
deleted file mode 100644 (file)
index 75b483a..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-{#job_id=0?:
-<TABLE CLASS="list" SUMMARY="Job List">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> ID <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> ID <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Jméno</TH><TH>Uživatel</TH><TH>Velikost</TH><TH>Počet stran</TH><TH>Stav</TH><TH>Řízení</TH></TR>
-</THEAD>
-<TBODY>
-{[job_id]
-<TR VALIGN="TOP">
-<TD><A HREF="{job_printer_uri}">{job_printer_name}</A>-{job_id}{?phone? ({phone}):}&nbsp;</TD>
-<TD>{?job_name=?Neznámý:{job_name}}&nbsp;</TD>
-<TD>{?job_originating_user_name=?Neznámý:{job_originating_user_name}}&nbsp;</TD>
-<TD>{job_k_octets} k&nbsp;</TD>
-<TD>{job_media_sheets_completed=0?Neznámý:{?job_media_sheets_completed}}&nbsp;</TD>
-<TD>{job_state=3?Čeká od<BR>{time_at_creation}:{job_state=4?Pozastaveno od<BR>{time_at_creation}:
-{job_state=5?Zpracováváno od<BR>{time_at_processing}:{job_state=6?Zastaveno:
-{job_state=7?Zrušeno v<BR>{time_at_completed}:{job_state=8?Zrušeno:Dokončeno v<BR>{time_at_completed}}}}}}}&nbsp;{job_printer_state_message?<BR>
-<EM>"{job_printer_state_message}"</EM>:}</TD>
-<TD>
-{job_preserved>0?{job_state>5?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="restart-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}"><INPUT TYPE="SUBMIT"
-VALUE="Opakovat tisk"></FORM>:}:}
-{job_state=4?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="release-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Uvolnit"></FORM>:}
-{job_state=3?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="hold-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Pozastavit"></FORM>:}
-{job_state<7?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Zrušit"></FORM>
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="move-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="SUBMIT" VALUE="Přesunout"></FORM>:}
-&nbsp;</TD>
-</TR>
-}
-</TBODY>
-</TABLE>
-}
diff --git a/templates/cs/list-available-printers.tmpl b/templates/cs/list-available-printers.tmpl
deleted file mode 100644 (file)
index 8c01b27..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Dostupné tiskárny</H2>
-
-{#device_uri=0?<P>Žádné tiskárny nenalezeny.</P>
-:<UL>{[device_uri]
-<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE=""><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Přidat tiskárnu"></FORM>
-{device_make_and_model} ({device_info})</LI>
-}</UL>}
-
-</DIV>
diff --git a/templates/cs/norestart.tmpl b/templates/cs/norestart.tmpl
deleted file mode 100644 (file)
index 4f09e8b..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Změna nastavení</H2>
-
-<P>Server nebyl dosud restartován, protože nebyly provedeny žádné změny v
-konfiguraci ...</P>
-
-</DIV>
diff --git a/templates/cs/option-boolean.tmpl b/templates/cs/option-boolean.tmpl
deleted file mode 100644 (file)
index e832ee1..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<TR>
-<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
-<TD>
-{[choices]<INPUT TYPE="RADIO" NAME="{keyword-1}" {choices={defchoice-1}?CHECKED:} VALUE="{choices}">{text}}
-</TD>
-</TR>
diff --git a/templates/cs/option-conflict.tmpl b/templates/cs/option-conflict.tmpl
deleted file mode 100644 (file)
index 8c68326..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<P><B>Chyba:</B> Následující parametry jsou v rozporu:</P>
-
-<UL>
-{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A>: {cchoice}</LI>
-}</UL>
-
-<P>Prosím změňte jeden nebo více parametrů pro vyřešení problému.</P>
diff --git a/templates/cs/option-header.tmpl b/templates/cs/option-header.tmpl
deleted file mode 100644 (file)
index 464726a..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="tab" ID="{group_id}">
-
-<H3 ALIGN="CENTER">{group}</H3>
-
-<TABLE WIDTH="100%">
diff --git a/templates/cs/option-pickmany.tmpl b/templates/cs/option-pickmany.tmpl
deleted file mode 100644 (file)
index 0da75e5..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<TR>
-<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
-<TD><SELECT NAME="{keyword}" MULTIPLE SIZE="10">
-{[choices]<OPTION {choices={defchoice-1}?SELECTED:} VALUE="{choices}">{text}}
-</SELECT></TD>
-</TR>
diff --git a/templates/cs/option-trailer.tmpl b/templates/cs/option-trailer.tmpl
deleted file mode 100644 (file)
index 916de2f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-</TABLE>
-
-<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="Nastavit parametry"></P>
-
-</DIV>
\ No newline at end of file
diff --git a/templates/cs/pager.tmpl b/templates/cs/pager.tmpl
deleted file mode 100644 (file)
index 35a7a92..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<TABLE CLASS="inset" SUMMARY="Paging Bar">
-<TR>
-       <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="&#x25c0; Předchozí"></FORM>:&nbsp;}</TD>
-       <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="Další &#x25b6;"></FORM>:&nbsp;}</TD>
-</TR>
-</TABLE>
diff --git a/templates/cs/printer-accept.tmpl b/templates/cs/printer-accept.tmpl
deleted file mode 100644 (file)
index c81faef..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Příjem úloh u {is_class?třídy:tiskárny} {printer_name}</H2>
-
-<P>{is_class?Třída:Tiskárna} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-nyní přijímá úlohy.</P>
-
-</DIV>
diff --git a/templates/cs/printer-added.tmpl b/templates/cs/printer-added.tmpl
deleted file mode 100644 (file)
index ac59405..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Přidat tiskárnu</H2>
-
-<P>Tiskárna <A HREF="/printers/{printer_name}">{printer_name}</A> byla úspěšně přidána.
-
-</DIV>
diff --git a/templates/cs/printer-configured.tmpl b/templates/cs/printer-configured.tmpl
deleted file mode 100644 (file)
index c002232..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Nastavení parametrů u {printer_name}</H2>
-
-<P>{OP=set-class-options?Class <A HREF="/classes/{printer_name}">:Tiskárna <A HREF="/printers/{printer_name}">}{printer_name}</A>
-byla úspěšně nastavena.
-
-</DIV>
diff --git a/templates/cs/printer-confirm.tmpl b/templates/cs/printer-confirm.tmpl
deleted file mode 100644 (file)
index 5ace8a6..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Výmaz tiskárny {printer_name}</H2>
-
-<P><B>Varování:</B> Opravdu chcete vymazat tiskárnu
-{printer_name}?</P>
-
-<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Vymazat tiskárnu"></FORM></P>
-
-</DIV>
diff --git a/templates/cs/printer-default.tmpl b/templates/cs/printer-default.tmpl
deleted file mode 100644 (file)
index d066cc0..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Nastavení {is_class?třídy:tiskárny} {printer_name} jako výchozí</H2>
-
-<P>{is_class?Třída:Tiskárna} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-byla nastavena jako výchozí na serveru.</P>
-
-<BLOCKQUOTE><B>Pozn.</B> libovolný uživatel může pomocí příkazu <TT>lpoptions</TT> přepsat toto nastavení.</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/cs/printer-deleted.tmpl b/templates/cs/printer-deleted.tmpl
deleted file mode 100644 (file)
index 76c8b22..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Výmaz tiskárny {printer_name}</H2>
-
-<P>Tiskárna {printer_name} byla úspěšně vymazána.
-
-</DIV>
diff --git a/templates/cs/printer-jobs-header.tmpl b/templates/cs/printer-jobs-header.tmpl
deleted file mode 100644 (file)
index d8142d1..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<DIV CLASS="indent">
-<H3 CLASS="title">Úlohy</H3>
-</DIV>
diff --git a/templates/cs/printer-modified.tmpl b/templates/cs/printer-modified.tmpl
deleted file mode 100644 (file)
index 3dd91d2..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Úprava tiskárny {printer_name}</H2>
-
-<P>Tiskárna <A HREF="/printers/{printer_name}">{printer_name}</A> byla
-úspěšně upravena.
-
-</DIV>
\ No newline at end of file
diff --git a/templates/cs/printer-purge.tmpl b/templates/cs/printer-purge.tmpl
deleted file mode 100644 (file)
index b85195f..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Výmaz úloh u {is_class?třídy:tiskárny} {printer_name}</H2>
-
-<P>U {is_class?třídy:tiskárny} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-byly vymazány všechny úlohy.</P>
-
-</DIV>
-
diff --git a/templates/cs/printer-reject.tmpl b/templates/cs/printer-reject.tmpl
deleted file mode 100644 (file)
index 6ce184b..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Odmítnutí úloh u {is_class?třídy:tiskárny} {printer_name}</H2>
-
-<P>{is_class?Třída:Tiskárna} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-už nepřijímá úlohy.</P>
-
-</DIV>
diff --git a/templates/cs/printer-start.tmpl b/templates/cs/printer-start.tmpl
deleted file mode 100644 (file)
index cc9f3eb..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Obnovení {is_class?třídy:tiskárny} {printer_name}</H2>
-
-<P>{is_class?Třída:Tiskárna} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-byla obnovena.</P>
-
-</DIV>
\ No newline at end of file
diff --git a/templates/cs/printer-stop.tmpl b/templates/cs/printer-stop.tmpl
deleted file mode 100644 (file)
index cfecaa0..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Pozastavení {is_class?třídy:tiskárny} {printer_name}</H2>
-
-<P>{is_class?Třída:Tiskárna} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-byla pozastavena.</P>
-
-</DIV>
\ No newline at end of file
diff --git a/templates/cs/printer.tmpl b/templates/cs/printer.tmpl
deleted file mode 100644 (file)
index 3cddce2..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?čeká:{printer_state=4?tiskne:pauza}},
-{printer_is_accepting_jobs=0?ne:}přijímá úlohy,
-{server_is_sharing_printers=0?není:{printer_is_shared=0?není:}} sdílení{default_name={printer_name}?, výchozí server:})</H2>
-
-<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
-<OPTION VALUE="">Údržba</OPTION>
-<OPTION VALUE="print-test-page">Tisk zkušební stránky</OPTION>
-{printer_commands~.*Clean.*?<OPTION VALUE="clean-print-heads">Vyčištění tiskových hlav</OPTION>:}
-{printer_commands~.*PrintSelfTestPage.*?<OPTION VALUE="print-self-test-page">Tisk self-test stránky</OPTION>:}
-{printer_state=5?<OPTION VALUE="start-printer">Obnovení tiskárny</OPTION>:<OPTION VALUE="stop-printer">Pozastavení tiskárny</OPTION>}
-{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Příjem úloh</OPTION>:<OPTION VALUE="reject-jobs">Odmítnutí úloh</OPTION>}
-<OPTION VALUE="move-jobs">Přesun všech úloh</OPTION>
-<OPTION VALUE="purge-jobs">Výmaz všech úloh</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
-<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
-<OPTION VALUE="">Administrace</OPTION>
-<OPTION VALUE="modify-printer">Úprava tiskárny</OPTION>
-<OPTION VALUE="delete-printer">Výmaz tiskárny</OPTION>
-<OPTION VALUE="set-printer-options">Nastavení parametrů</OPTION>
-<OPTION VALUE="set-as-default">Nastavení jako výchozí na serveru</OPTION>
-<OPTION VALUE="set-allowed-users">Nastavení přístupu uživatelů</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<TABLE SUMMARY="{printer_name}">
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Popis:</TH><TD>{printer_info}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Umístění:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Výrobce a model:</TH><TD>{printer_make_and_model}
-({color_supported=1?barevná:černobílá}{sides_supported?, oboustranný tisk:})<BR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Připojení:</TH><TD>{device_uri}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Nastavení:</TH><TD>job-sheets={job_sheets_default}
-media={media_default?{media_default}:unknown}
-{sides_default?sides={sides_default}:}</TD></TR>
-</TABLE>
-
-</DIV>
\ No newline at end of file
diff --git a/templates/cs/printers-header.tmpl b/templates/cs/printers-header.tmpl
deleted file mode 100644 (file)
index 4755aff..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<P ALIGN="CENTER">{total=0?Žádné tiskárny:Zobrazení {#printer_name} z {total} tiskár{total=1?ny:en}}.</P>
diff --git a/templates/cs/printers.tmpl b/templates/cs/printers.tmpl
deleted file mode 100644 (file)
index 3861ac3..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{#printer_name=0?:
-<TABLE CLASS="list" SUMMARY="Printers List">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Název fronty <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Název fronty <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Popis</TH><TH>Umístění</TH><TH>Výrobce a model</TH><TH>Stav</TH></TR>
-</THEAD>
-<TBODY>
-{[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?Čeká:{printer_state=4?Tiskne:Pauza}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
-}
-</TBODY>
-</TABLE></DIV>}
diff --git a/templates/cs/restart.tmpl b/templates/cs/restart.tmpl
deleted file mode 100644 (file)
index 1c68b05..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Změna nastavení</H2>
-
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Busy Indicator"> Prosím čekejte, probíhá restart serveru ...</P>
-
-</DIV>
diff --git a/templates/cs/samba-export.tmpl b/templates/cs/samba-export.tmpl
deleted file mode 100644 (file)
index afc0bea..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<SCRIPT TYPE="text/javascript"><!--
-function select_printers() {
-  var list = document.export_samba.EXPORT_NAME;
-  var sel = document.export_samba.EXPORT_ALL.checked;
-
-  for (i = 0; i < list.length; i ++) {
-    list.options[i].selected = sel;
-  }
-}
---></SCRIPT>
-
-<FORM METHOD="POST" ACTION="/admin/" NAME="export_samba">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
-
-<H2 CLASS="title">Export tiskáren do Samby</H2>
-
-{error?<P>Nelze exportovat tiskárny do Samby\:</P>
-<BLOCKQUOTE>{error}</BLOCKQUOTE>
-<P>Nahlédnout do <A HREF="/admin/log/error_log"
-TARGET="_blank">error_log</A> souboru pro více informací.</P>:
-
-<P>Tato stránka umožňuje export tiskáren do Samby, aby k nim klienti
-systému Windows mohli přistupovat pomocí ikon <VAR>Okolní počítače</VAR>
-nebo <VAR>Místa v síti</VAR> na své pracovní ploše. Musíte předem
-nainstalovat ovladače OS Windows pro postScriptové tiskárny, jak je popsáno v
- <A HREF="/help/man-cupsaddsmb.html" TARGET="_blank">cupsaddsmb(8)</A> 
-manuálové stránky.</P>}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Tiskárny:</TH>
-<TD>
-<SELECT NAME="EXPORT_NAME" SIZE="10" MULTIPLE>
-{[printer_name]<OPTION VALUE="{printer_name}"{export_all? SELECTED:{printer_export? SELECTED:}}>{printer_name}}
-</SELECT><BR>
-<INPUT TYPE="CHECKBOX" NAME="EXPORT_ALL"{export_all? CHECKED:}
-onChange="select_printers()"> Export všech tiskáren
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">Uživatel Samby:</TH>
-<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (povinný údaj)</TD>
-</TR>
-<TR>
-<TH CLASS="label">Heslo uživatele:</TH>
-<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (povinný údaj)</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Export tiskáren"></TD>
-</TR>
-</TABLE>
-
-</FORM>
diff --git a/templates/cs/samba-exported.tmpl b/templates/cs/samba-exported.tmpl
deleted file mode 100644 (file)
index 121fe48..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<P>Export tiskáren do Samby byl úspěšně proveden.</P>
diff --git a/templates/cs/search.tmpl b/templates/cs/search.tmpl
deleted file mode 100644 (file)
index cad77ca..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<FORM ACTION="/{SECTION}/{?SEARCH_DEST}" METHOD="GET">
-{WHICH_JOBS?<INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{WHICH_JOBS}">:}
-{ORDER?<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{ORDER}">:}
-
-<P ALIGN="CENTER"><B>Hledat v
-{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?třídách:{SECTION=jobs?úlohách:tiskárnách}}}:</B>
-<INPUT TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40"  PLACEHOLDER="" AUTOSAVE="org.cups.{SECTION}" RESULTS="20"> <INPUT
-TYPE="SUBMIT" VALUE="Hledat"> <INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Smazat"></P>
-
-</FORM>
diff --git a/templates/cs/set-printer-options-trailer.tmpl b/templates/cs/set-printer-options-trailer.tmpl
deleted file mode 100644 (file)
index 11adc70..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-</DIV>
-
-<SCRIPT TYPE="text/javascript"><!--
-// Hide custom options parameters for browsers that understand Javascript
-var paramtables = document.getElementsByName("paramtable");
-for (var i = 0; i < paramtables.length; i++)
-{
-  var opt = paramtables[i].id.substr(0, paramtables[i].id.lastIndexOf("-"));
-  var cb = document.getElementById("select-" + opt);
-  if (cb.value != "Custom")
-    paramtables[i].style.display = "none";
-}
---></SCRIPT>
-</FORM>
-
-</DIV>
diff --git a/templates/cs/subscription-added.tmpl b/templates/cs/subscription-added.tmpl
deleted file mode 100644 (file)
index 926d796..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">
-
-<P>Předplatné {subscription_name} bylo úspěšně přidáno.</P>
-
-</DIV>
diff --git a/templates/cs/subscription-canceled.tmpl b/templates/cs/subscription-canceled.tmpl
deleted file mode 100644 (file)
index 0e25268..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">
-
-<P>Předplatné #{notify_subscription_id} bylo zrušeno.</P>
-
-</DIV>
diff --git a/templates/cs/test-page.tmpl b/templates/cs/test-page.tmpl
deleted file mode 100644 (file)
index d1a1d9d..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Tisk zkušební stránky na {printer_name}</H2>
-
-<P>Zkušební stránka odeslána; ID úlohy je <A HREF="/{SECTION}/{printer_name}">
-{printer_name}-{job_id}</A>.</P>
-
-</DIV>
diff --git a/templates/cs/trailer.tmpl b/templates/cs/trailer.tmpl
deleted file mode 100644 (file)
index 44f358b..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS a logo CUPS jsou ochranné známky společnosti
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS je chráněn autorskými
-právy 2007-2013 Apple Inc. Všechna práva vyhrazena.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
diff --git a/templates/cs/users.tmpl b/templates/cs/users.tmpl
deleted file mode 100644 (file)
index ff39cc3..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<DIV CLASS="indent">
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-{IS_CLASS?<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="{IS_CLASS}">:}
-
-<H2 CLASS="title">Nastavení přístupu uživatelů u {printer_name}</H2>
-
-<TABLE>
-<TR>
-<TH CLASS="label">Uživatelé:</TH>
-<TD>
-<INPUT TYPE='TEXT' NAME='users' SIZE='60' VALUE='{?requesting_user_name_allowed}{?requesting_user_name_denied}'>
-<BR>
-<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-allowed' {requesting_user_name_allowed?checked:}>Povolit uživatelům tisknout
-<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Zakázat uživatelům tisknout
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD>
-<INPUT TYPE="SUBMIT" VALUE="Nastavení přístupů">
-</TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
similarity index 56%
rename from templates/cs/add-class.tmpl
rename to templates/de/add-class.tmpl
index 06bb9ad..4b1fb3e 100644 (file)
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Přidat třídu</H2>
+<H2 CLASS="title">Klasse hinzufügen</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -8,22 +6,22 @@
 
 <TABLE>
 <TR>
-<TH CLASS="label">Název:</TH>
+<TH CLASS="label">Name:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Může obsahovat libovolné tisknutelné znaky kromě "/", "#" a mezery)</SMALL></TD>
+<SMALL>(Darf alle druckbaren Zeichen ausser "/", "#", und Leerzeichen enthalten)</SMALL></TD>
 </TR>
 <TR>
-<TH CLASS="label">Popis:</TH>
+<TH CLASS="label">Beschreibung:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Srozumitelný popis)</SMALL></TD>
+<SMALL>(Für Menschen lesbare Beschreibung wie "HP LaserJet with Duplexer")</SMALL></TD>
 </TR>
 <TR>
-<TH CLASS="label">Umístění:</TH>
+<TH CLASS="label">Ort:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Srozumitelný popis umístění)</SMALL></TD>
+<SMALL>(Für Menschen lesbarer Ort wie "Lab 1")</SMALL></TD>
 </TR>
 <TR>
-<TH CLASS="label">členové:</TH>
+<TH CLASS="label">Mitglieder:</TH>
 <TD>
 <SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
 {[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
@@ -32,9 +30,8 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Přidat třídu"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Klasse hinzufügen"></TD>
 </TR>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
similarity index 67%
rename from templates/cs/add-printer.tmpl
rename to templates/de/add-printer.tmpl
index 1e557d2..8cc2b17 100644 (file)
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Přidat tiskárnu</H2>
+<H2 CLASS="title">Drucker hinzufügen (Schritt 3/5)</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 
 <TABLE>
 <TR>
-<TH CLASS="label">Název:</TH>
+<TH CLASS="label">Name:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?template_name}"><BR>
-<SMALL>(Může obsahovat libovolné tisknutelné znaky kromě "/", "#" a mezery)</SMALL></TD>
+<SMALL>(Darf druckbare Zeichen enthalten ausser "/", "#", und Leerzeichen)</SMALL></TD>
 </TR>
 <TR>
-<TH CLASS="label">Popis:</TH>
+<TH CLASS="label">Beschreibung:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_INFO}"><BR>
-<SMALL>(Srozumitelný popis)</SMALL></TD>
+<SMALL>(Menschenlesbare Beschreibung wie etwa "HP LaserJet mit Duplexer")</SMALL></TD>
 </TR>
 <TR>
-<TH CLASS="label">Umístění:</TH>
+<TH CLASS="label">Ort:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_LOCATION}"><BR>
-<SMALL>(Srozumitelný popis umístění)</SMALL></TD>
+<SMALL>(Menschenlesbarer Ort wie etwa "Labor 1")</SMALL></TD>
 </TR>
 <TR>
-<TH CLASS="label">Připojení:</TH>
+<TH CLASS="label">Verbindung:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
 </TR>
 <TR>
-<TH CLASS="label">Sdílení:</TH>
+<TH CLASS="label">Freigabe:</TH>
 <TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
-sdílet tuto tiskárnu</TD>
+Gebe diesen Drucker frei</TD>
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Pokračovat"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
 </TR>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
similarity index 55%
rename from templates/cs/add-rss-subscription.tmpl
rename to templates/de/add-rss-subscription.tmpl
index d1568f7..4097e33 100644 (file)
@@ -2,42 +2,42 @@
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription">
 
-<H2 CLASS="title">Přidat RSS předplatné</H2>
+<H2 CLASS="title">RSS Subskription hinzufügen</H2>
 
-<TABLE SUMMARY="Add RSS Subscription form">
+<TABLE SUMMARY="Forumlar zum Hinzufügen einer RSS Subskription">
 <TR>
-<TH CLASS="label">Název:</TH>
+<TH CLASS="label">Name:</TH>
 <TD COLSPAN="5"><INPUT TYPE="TEXT" NAME="SUBSCRIPTION_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?SUBSCRIPTION_NAME}"><BR>
-<SMALL>(Může obsahovat libovolné tisknutelné znaky s výjimkou mezery, "/", "?" a "#")</SMALL></TD>
+<SMALL>(Darf alle druckbaren Zeichen ausser Leerzeichen, "/", "?", und "#" enthalten)</SMALL></TD>
 </TR>
 <TR>
-<TH CLASS="label">Fronta:</TH>
-<TD COLSPAN="5"><SELECT NAME="PRINTER_URI" SIZE="10"><OPTION VALUE="#ALL#"{?PRINTER_URI=#ALL#? SELECTED:}>Všechny fronty</OPTION>{[printer_name]<OPTION VALUE="{printer_uri_supported}"{?PRINTER_URI={printer_uri_supported}? SELECTED:}>{printer_name}</OPTION>}</SELECT></TD>
+<TH CLASS="label">Warteschlange:</TH>
+<TD COLSPAN="5"><SELECT NAME="PRINTER_URI" SIZE="10"><OPTION VALUE="#ALL#"{?PRINTER_URI=#ALL#? SELECTED:}>Alle Warteschlangen</OPTION>{[printer_name]<OPTION VALUE="{printer_uri_supported}"{?PRINTER_URI={printer_uri_supported}? SELECTED:}>{printer_name}</OPTION>}</SELECT></TD>
 </TR>
 <TR VALIGN="TOP">
-<TH CLASS="label">Události:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CREATED" {?EVENT_JOB_CREATED}>Vytvoření úlohy<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_COMPLETED" {?EVENT_JOB_COMPLETED}>Dokončení úlohy<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_STOPPED" {?EVENT_JOB_STOPPED}>Zastavení úlohy<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CONFIG_CHANGED" {?EVENT_JOB_CONFIG_CHANGED}>Změna parametrů úlohy</TD>
+<TH CLASS="label">Ereignisse:</TH>
+<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CREATED" {?EVENT_JOB_CREATED}>Auftrag erstellt<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_COMPLETED" {?EVENT_JOB_COMPLETED}>Auftrag abgeschlossen<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_STOPPED" {?EVENT_JOB_STOPPED}>Auftrag angehalten<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CONFIG_CHANGED" {?EVENT_JOB_CONFIG_CHANGED}>Auftrags Parameter Geändert</TD>
 <TD>&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_STOPPED" {?EVENT_PRINTER_STOPPED}>Zastavení fronty<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_ADDED" {?EVENT_PRINTER_ADDED}>Přidání fronty<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_MODIFIED" {?EVENT_PRINTER_MODIFIED}>Změna fronty<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_DELETED" {?EVENT_PRINTER_DELETED}>Vymazání fronty</TD>
+<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_STOPPED" {?EVENT_PRINTER_STOPPED}>Warteschlange angehalten<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_ADDED" {?EVENT_PRINTER_ADDED}>Warteschlange hinzugefügt<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_MODIFIED" {?EVENT_PRINTER_MODIFIED}>Warteschlange geändert<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_DELETED" {?EVENT_PRINTER_DELETED}>Warteschlange gelöscht</TD>
 <TD>&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STARTED" {?EVENT_SERVER_STARTED}>Start serveru<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STOPPED" {?EVENT_SERVER_STOPPED}>Zastavení serveru<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_RESTARTED" {?EVENT_SERVER_RESTARTED}>Restart serveru<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Audit bezpečnosti serveru</TD>
+<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STARTED" {?EVENT_SERVER_STARTED}>Server gestartet<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STOPPED" {?EVENT_SERVER_STOPPED}>Server angehalten<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_RESTARTED" {?EVENT_SERVER_RESTARTED}>Server neu gestartet<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Server Sicherheits Prüfung</TD>
 </TR>
 <TR>
-<TH CLASS="label">Maximální počet zobrazených událostí:</TH>
+<TH CLASS="label">Maximale Ereignisse in Durchführung:</TH>
 <TD COLSPAN="5"><INPUT TYPE="NUMBER" NAME="MAX_EVENTS" SIZE="4" MAXLENGTH="4" VALUE="{MAX_EVENTS?{MAX_EVENTS}:20}"></TD>
 </TR>
 <TR>
 <TD></TD>
-<TD COLSPAN="5"><INPUT TYPE="SUBMIT" VALUE="Přidat RSS předplatné"></TD>
+<TD COLSPAN="5"><INPUT TYPE="SUBMIT" VALUE="RSS Subskription hinzufügen"></TD>
 </TR>
 </TABLE>
 
diff --git a/templates/de/admin.tmpl b/templates/de/admin.tmpl
new file mode 100644 (file)
index 0000000..965d072
--- /dev/null
@@ -0,0 +1,97 @@
+<div class="row">
+  <div class="halves">
+    <H2 CLASS="title">Drucker</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Füge Drucker hinzu"></FORM>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Finde neue Drucker"></FORM>
+    <FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Manage Drucker"></FORM>
+    {have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Exportiere Drucker nach Samba"></FORM>:}
+    </P>
+
+    <H2 CLASS="title">Klassen</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Klasse hinzufügen"></FORM>
+    <FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Klasse managen"></FORM>
+    </P>
+
+    <H2 CLASS="title">Aufträge</H2>
+
+    <P>
+    <FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Aufträge managen"></FORM>
+    </P>
+  </div>
+  <div class="halves">
+    <H2 CLASS="title">Server</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Konfigurationsdatei bearbeiten"></FORM>
+    <FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Zugriffs-Log zeigen"></FORM>
+    <FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Fehler-Log zeigen"></FORM>
+    <FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Seiten-Log zeigen"></FORM>
+    </P>
+
+    {SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+    <BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+    <FORM METHOD="POST" ACTION="/admin">
+    <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+
+    {ADVANCEDSETTINGS?<P><B>Server-Einstellungen\:</B></P>
+
+    <P><A HREF="/admin/">Erweitert <SMALL>&#x25bc;</SMALL></A><BR>
+    <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+    <INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
+    <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Drucker dieses Systems im Netz freigeben<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Max clients\:
+    <INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Erlaube Druck aus dem Internet<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Mache die Web-Schnittstelle bekannt<BR>
+    <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Erlaube Fernwartung<BR>
+    {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Benutze Kerberos-Authentifizierung (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+    <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Erlaube Benutzern beliebige Aufträge abzubrechen (nicht nur die Eigenen)<BR>
+    <INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Behalte die Auftragshistorie<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximale Auftragsanzehl (0 für unbegrenzt)\:
+    <INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Behalte Metadaten\:
+    <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Behalte Dokumente\:
+    <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
+    <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Save debugging information for troubleshooting<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Maximale logDateigrösse\:
+    <INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
+
+    :<P><B>Server Einstellungen:</B></P>
+
+    <P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Erweitert <SMALL>&#x25b6;</SMALL></A><BR>
+    <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+    <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Drucker dieses Systems im Netz freigeben<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Erlaube den Druck aus dem Internet<BR>
+    <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Erlaube Fernwartung<BR>
+    {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Benutze Kerberos Authentifizierung (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+    <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Erlaube Benutzern alle Aufträge zu löschen (nicht nur die eigenen)<BR>
+    <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Speichere debugging Information zur Fehlersuche</P>
+
+    }
+    <P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Ändere Eintellungen"></P>
+
+    </FORM>}
+  </div>
+</div>
+
+<div class="row">
+  <H2 CLASS="title">RSS Subskriptionen</H2>
+
+  <P>
+  <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="RSS Subskription hinzufügen"></FORM>
+  </P>
+
+  {notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS Subskriptionen">
+  <THEAD><TR><TH>Name</TH><TH>Ereignisse</TH><TH>Queue Name</TH></TR></THEAD>
+  <TBODY>{[notify_subscription_id]
+  <TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
+  <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="RSS Subskription kündigen"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:All Queues}</TD></TR>}
+  </TBODY>
+  </TABLE>:}
+</div>
\ No newline at end of file
similarity index 58%
rename from templates/ca/choose-device.tmpl
rename to templates/de/choose-device.tmpl
index a28cc92..4aaf8ea 100644 (file)
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifica {printer_name}:Add Printer}</H2>
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen (Schritt 1/5)}</H2>
 
 {CUPS_GET_DEVICES_DONE?<FORM METHOD="POST" ACTION="/admin">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -9,31 +7,31 @@
 
 <TABLE>
 {op=add-printer?:<TR>
-<TH CLASS="label">Connexi&oacute; actual\:</TH>
+<TH CLASS="label">Aktuelle Verbindung\:</TH>
 <TD><INPUT TYPE="RADIO" NAME="DEVICE_URI" VALUE="{current_device_uri}" CHECKED>
 {current_device_uri}</TD>
 </TR>}
 <TR>
-<TH CLASS="label">Impressores locals\:</TH>
+<TH CLASS="label">Lokale Drucker\:</TH>
 <TD>
 {[device_uri]{device_class!network?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
+VALUE="{device_uri}{?device_make_and_model!Unbekannt?|{device_make_and_model}:}">
+{device_info} {?device_make_and_model!Unbekannt?({device_make_and_model}):}<BR>
 :}}
 </TD>
 </TR>
 <TR>
-<TH CLASS="label">Impressores de xarxa descobertes\:</TH>
+<TH CLASS="label">Entdeckte Netzwerkdrucker\:</TH>
 <TD>
 {[device_uri]{device_class=network?{device_uri~[a-z]+://?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
+VALUE="{device_uri}{?device_make_and_model!Unbekannt?|{device_make_and_model}:}">
+{device_info} {?device_make_and_model!Unbekannt?({device_make_and_model}):}<BR>
 :}:}}
 </TD>
 </TR>
 <TR>
 <TR>
-<TH CLASS="label">Altres impressores de xarxa\:</TH>
+<TH CLASS="label">Andere Netzwerkdrucker\:</TH>
 <TD>
 {[device_uri]{device_class=network?{device_uri~[a-z]+://?:<INPUT TYPE="RADIO" NAME="DEVICE_URI"
 VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
@@ -43,11 +41,9 @@ VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continua"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
 </TR>
 </TABLE>
 
 </FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Busy Indicator"> Buscant impressores...</P>}
-
-</DIV>
+ALT="Busy Indicator"> Suche nach Druckern...</P>}
similarity index 72%
rename from templates/ca/choose-make.tmpl
rename to templates/de/choose-make.tmpl
index 01bc654..194453c 100644 (file)
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifica {printer_name}:Add Printer}</H2>
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen (Schritt4/5)}</H2>
 
 <FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 
 <TABLE>
 {op=modify-printer?:<TR>
-<TH CLASS="label">Nom:</TH>
+<TH CLASS="label">Name:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
 </TR>}
 <TR>
-<TH CLASS="label">Descripci&oacute;:</TH>
+<TH CLASS="label">Beschreibung:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
 </TR>
 <TR>
-<TH CLASS="label">Ubicaci&oacute;:</TH>
+<TH CLASS="label">Ort:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
 </TR>
 <TR>
-<TH CLASS="label">Connecci&oacute;:</TH>
+<TH CLASS="label">Verbindung:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
 </TR>
 <TR>
-<TH CLASS="label">Compartida:</TH>
+<TH CLASS="label">Freigabe:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
-{?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Comparteix aquesta impressora</TD>
+Diesen Drucker {?printer_is_shared=?nicht:{?printer_is_shared=0?nicht:}} im Netz freigeben</TD>
 </TR>
 <TR>
-<TH CLASS="label">Fabricant:</TH>
+<TH CLASS="label">Marke:</TH>
 <TD>
 <SELECT NAME="PPD_MAKE" SIZE="10">
 {[ppd_make]<OPTION VALUE="{ppd_make}" {?current_make={ppd_make}?SELECTED:}>{ppd_make}}
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continua"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
 </TR>
 <TR>
 <TD></TD>
 <TD>&nbsp;</TD>
 </TR>
 <TR>
-<TH CLASS="label">O indica un fitxer PPD:</TH>
+<TH CLASS="label">Or Provide a PPD File:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
 TYPE="FILE" NAME="PPD_FILE"></TD>
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="{op=add-printer?Add Printer:Modifica la impressora}"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="{op=add-printer?Add Printer:Modify Printer}"></TD>
 </TR>
 </TABLE>
 
 </FORM>
-</DIV>
similarity index 63%
rename from templates/cs/choose-model.tmpl
rename to templates/de/choose-model.tmpl
index 75fc46f..174b9c6 100644 (file)
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Úprava tiskárny {printer_name}:Přidat tiskárnu}</H2>
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen (Schritt 5/5)}</H2>
 
 <FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
 <TABLE>
 {op=modify-printer?:<TR>
-<TH CLASS="label">Název:</TH>
+<TH CLASS="label">Name:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
 </TR>}
 <TR>
-<TH CLASS="label">Popis:</TH>
+<TH CLASS="label">Beschreibung:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
 </TR>
 <TR>
-<TH CLASS="label">Umístění:</TH>
+<TH CLASS="label">Ort:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
 </TR>
 <TR>
-<TH CLASS="label">Připojení:</TH>
+<TH CLASS="label">Verbindung:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
 </TR>
 <TR>
-<TH CLASS="label">Sdílení:</TH>
+<TH CLASS="label">Freigabe:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
-{?printer_is_shared=?ne:{?printer_is_shared=0?ne:}}sdílená</TD>
+Dieser Drucker ist {?printer_is_shared=?nicht:{?printer_is_shared=0?nicht:}} im Netz freigeben</TD>
 </TR>
 <TR>
-<TH CLASS="label">Výrobce:</TH>
-<TD>{PPD_MAKE} <INPUT TYPE="SUBMIT" NAME="SELECT_MAKE" VALUE="Vybrat jiného výrobce"></TD>
+<TH CLASS="label">Hersteller:</TH>
+<TD>{PPD_MAKE} <INPUT TYPE="SUBMIT" NAME="SELECT_MAKE" VALUE="Anderen Hersteller/Marke wählen"></TD>
 </TR>
 <TR>
-<TH CLASS="label">Model:</TH>
+<TH CLASS="label">Modell:</TH>
 <TD>
 <SELECT NAME="PPD_NAME" SIZE="10">
-{op=add-printer?:<OPTION VALUE="__no_change__" SELECTED>Aktuální: {current_make_and_model}</OPTION>:}
+{op=add-printer?:<OPTION VALUE="__no_change__" SELECTED>Aktueller Treiber - {current_make_and_model}</OPTION>:}
 {[ppd_name]<OPTION VALUE="{ppd_name}" {op=modify-printer?:{?current_make_and_model={ppd_make_and_model}?SELECTED:}}>{ppd_make_and_model} ({ppd_natural_language})
 }</SELECT>
 </TD>
 </TR>
 <TR>
-<TH CLASS="label">Nebo vybrat soubor PPD:</TH>
+<TH CLASS="label">Oder stelle eine PPD Datei zur Verfügung:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
 TYPE="FILE" NAME="PPD_FILE"></TD>
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="{op=add-printer?Přidat tiskárnu:Upravit tiskárnu}"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="{op=add-printer?Drucker hinzufügen:Drucker ändern}"></TD>
 </TR>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
diff --git a/templates/de/choose-serial.tmpl b/templates/de/choose-serial.tmpl
new file mode 100644 (file)
index 0000000..d410884
--- /dev/null
@@ -0,0 +1,49 @@
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}</H2>
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Verbindung:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Baud Rate:</TH>
+<TD><SELECT NAME="BAUDRATE">
+{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Parität:</TH>
+<TD><SELECT NAME="PARITY">
+<OPTION VALUE="none" {?parity=none?SELECTED:}>Keine
+<OPTION VALUE="even" {?parity=even?SELECTED:}>Gerade
+<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Ungerade
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Daten Bits:</TH>
+<TD><SELECT NAME="BITS">
+<OPTION {?bits=8?SELECTED:}>8
+<OPTION {?bits=7?SELECTED:}>7
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Flusskontrolle:</TH>
+<TD><SELECT NAME="FLOW">
+<OPTION VALUE="none" {?flow=none?SELECTED:}>None
+<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (Software)
+<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (Hardware)
+<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (Hardware)
+</SELECT></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
+</TR>
+</TABLE>
+
+</FORM>
similarity index 68%
rename from templates/cs/choose-uri.tmpl
rename to templates/de/choose-uri.tmpl
index ad919b7..bbdc5e4 100644 (file)
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Úprava tiskárny {printer_name}:Přidat tiskárnu}</H2>
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen (Schritt2/5)}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 
 <TABLE>
 <TR>
-<TH CLASS="label">Připojení:</TH>
+<TH CLASS="label">Verbindung-URI:</TH>
 <TD><INPUT TYPE="URL" SIZE="60" MAXLENGTH="1023" NAME="DEVICE_URI" VALUE="{current_device_uri?{current_device_uri}:{device_uri}}"></TD>
 </TR>
 <TR>
 <TD></TD>
-<TD>Příklady:
+<TD>Beispiele:
 <PRE>
     http://hostname:631/ipp/
     http://hostname:631/ipp/port1
     socket://hostname:9100
 </PRE>
 
-<P>Viz. <A HREF="/help/network.html" TARGET="_blank">"Síťové tiskárny"</A> pro zadání správného URI tiskárny.</P>
+<P>See <A HREF="/help/network.html" TARGET="_blank">"Netzwerkdrucker"</A> für die korrekte URI ihres Druckers.</P>
 
 </TD>
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Pokračovat"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
 </TR>
 </TABLE>
 
 </FORM>
-</DIV>
-
diff --git a/templates/de/class-added.tmpl b/templates/de/class-added.tmpl
new file mode 100644 (file)
index 0000000..85027e9
--- /dev/null
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Klasse hinzufügen</H2>
+
+<P>Die Klasse <A HREF="/classes/{printer_name}">{printer_name}</A> wurde erfolgreich hinzugefügt.
similarity index 55%
rename from templates/cs/class-confirm.tmpl
rename to templates/de/class-confirm.tmpl
index 87c1614..0cbdd78 100644 (file)
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
+<H2 CLASS="title">Klasse {printer_name} löschen</H2>
 
-<H2 CLASS="title">Výmaz třídy {printer_name}</H2>
+<P><B>Warnung:</B> Sind sie sicher dass sie die Klasse
+{printer_name} löschen wollen?</P>
 
-<P><B>Varování:</B> Opravdu chcete vymazat třídu
-{printer_name}?</P>
-
-<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Vymazat třídu"></FORM></P>
-
-</DIV>
+<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Klasse löschen"></FORM></P>
diff --git a/templates/de/class-deleted.tmpl b/templates/de/class-deleted.tmpl
new file mode 100644 (file)
index 0000000..6d09f98
--- /dev/null
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Klasse {printer_name} löschen</H2>
+
+<P>Die Klasse {printer_name} wurde erfolgreich gelöscht.
diff --git a/templates/de/class-jobs-header.tmpl b/templates/de/class-jobs-header.tmpl
new file mode 100644 (file)
index 0000000..0834c9c
--- /dev/null
@@ -0,0 +1 @@
+<H3 CLASS="title">Aufträge</H3>
diff --git a/templates/de/class-modified.tmpl b/templates/de/class-modified.tmpl
new file mode 100644 (file)
index 0000000..658defa
--- /dev/null
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Klasse {printer_name} ändern</H2>
+
+<P>Class <A HREF="/classes/{printer_name}">{printer_name}</A> wurde
+erfolgreich geändert.
diff --git a/templates/de/class.tmpl b/templates/de/class.tmpl
new file mode 100644 (file)
index 0000000..c0d9a95
--- /dev/null
@@ -0,0 +1,41 @@
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
+({printer_state=3?Im Leerlauf:{printer_state=4?Beschäftigt:Angehalten}},
+{printer_is_accepting_jobs=0?Aufträge werden ablehnt:Aufträge werden akzeptiert},
+{server_is_sharing_printers=0?Keine (Server):{printer_is_shared=0?Keine:}} Netzfreigabe{default_name={printer_name}?, Standarddrucker:})</H2>
+
+<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
+<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
+<OPTION VALUE="">Wartung</OPTION>
+<OPTION VALUE="print-test-page">Drucke Testseite</OPTION>
+{printer_state=5?<OPTION VALUE="start-class">Klasse starten</OPTION>:<OPTION VALUE="stop-class">Klasse stoppen</OPTION>}
+{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Aufträge akzeptieren</OPTION>:<OPTION VALUE="reject-jobs">Aufträge ablehnen</OPTION>}
+<OPTION VALUE="move-jobs">Alle Aufträge verschieben</OPTION>
+<OPTION VALUE="purge-jobs">Alle Aufträge abbrechen</OPTION>
+</SELECT>
+<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+</FORM>
+
+<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
+<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="1">
+<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
+<OPTION VALUE="">Verwaltung</OPTION>
+<OPTION VALUE="modify-class">Klasse ändern</OPTION>
+<OPTION VALUE="delete-class">Klasse löschen</OPTION>
+<OPTION VALUE="set-class-options">Standardeinstellungen festlegen</OPTION>
+<OPTION VALUE="set-as-default">Als Standard festlegen</OPTION>
+<OPTION VALUE="set-allowed-users">Erlaubte Benutzer festlegen</OPTION>
+</SELECT>
+<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+</FORM>
+
+<TABLE SUMMARY="{printer_name}">
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Beschreibung:</TH><TD>{printer_info}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Ort:</TH><TD>{printer_location}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Mitglieder:</TH><TD>{?member_uris=?None:{member_uris}}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Standardeinstellungen:</TH><TD>job-sheets={job_sheets_default}
+media={media_default?{media_default}:unbekannt}
+{sides_default?sides={sides_default}:}</TD></TR>
+</TABLE>
diff --git a/templates/de/classes-header.tmpl b/templates/de/classes-header.tmpl
new file mode 100644 (file)
index 0000000..5fa4d4a
--- /dev/null
@@ -0,0 +1 @@
+<P ALIGN="CENTER">{total=0?Keine Klassen:Zeige {#printer_name} von {total} Klasse{total=1?:n}}.</P>
similarity index 50%
rename from templates/ca/classes.tmpl
rename to templates/de/classes.tmpl
index bb5acf5..c04d02b 100644 (file)
@@ -1,11 +1,11 @@
 {#printer_name=0?:
 <TABLE CLASS="list" SUMMARY="Class List">
 <THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Nom de la cua <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Nom de la cua <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Descripci&oacute;</TH><TH>Ubicaci&oacute;</TH><TH>Membres</TH><TH>Estat</TH></TR>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Wartweschlange <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Warteschlange <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Beschreibung</TH><TH>Ort</TH><TH>Mitglieder</TH><TH>Status</TH></TR>
 </THEAD>
 <TBODY>
 {[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?None:{member_uris}}</TD><TD>{printer_state=3?Idle:{printer_state=4?Processing:Paused}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
+<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?Keine:{member_uris}}</TD><TD>{printer_state=3?Im Leerlauf:{printer_state=4?Beschäftigt:Angehalten}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
 }
 </TBODY>
 </TABLE></DIV>}
diff --git a/templates/de/command.tmpl b/templates/de/command.tmpl
new file mode 100644 (file)
index 0000000..126389b
--- /dev/null
@@ -0,0 +1,8 @@
+<H2 CLASS="title">{title} auf {printer_name}</H2>
+
+<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
+ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }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?,
+<EM>"{job_printer_state_message}"</EM>:}}</P>
similarity index 64%
rename from templates/cs/edit-config.tmpl
rename to templates/de/edit-config.tmpl
index ab3bf65..5c289cb 100644 (file)
@@ -5,9 +5,7 @@ function reset_config()
 }
 </SCRIPT>
 
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Úprava konfiguračního souboru</H2>
+<H2 CLASS="title">Konfigurationsdatei bearbeiten</H2>
 
 <FORM NAME="cups" METHOD="POST" ACTION="/admin/">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -15,10 +13,8 @@ function reset_config()
 
 <TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
 
-<P><INPUT TYPE="SUBMIT" NAME="SAVECHANGES" VALUE="Uložit změny">
-<INPUT TYPE="BUTTON" VALUE="Použít výchozí konfigurační soubor"
+<P><INPUT TYPE="SUBMIT" NAME="SAVECHANGES" VALUE="Änderungen speichern">
+<INPUT TYPE="BUTTON" VALUE="Standard Konfigurationsdatei verwenden"
 onClick="reset_config();"></P>
 
 </FORM>
-
-</DIV>
diff --git a/templates/de/error-op.tmpl b/templates/de/error-op.tmpl
new file mode 100644 (file)
index 0000000..698ee97
--- /dev/null
@@ -0,0 +1,6 @@
+<H2 CLASS="title">{?title} {?printer_name} Error</H2>
+
+<P>Fehler:</P>
+
+<BLOCKQUOTE>Unbekannte Operation "{op}"!</BLOCKQUOTE>
+
similarity index 58%
rename from templates/ca/error.tmpl
rename to templates/de/error.tmpl
index f04f03a..42d0f19 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{?title} {?printer_name} Error</H2>
 
-<P>{?message?{message}:Error}</P>
+<P>{?message?{message}:Fehler:}</P>
 
 <BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/de/header.tmpl.in b/templates/de/header.tmpl.in
new file mode 100644 (file)
index 0000000..4974aa6
--- /dev/null
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <link rel="stylesheet" href="/cups.css" type="text/css">
+    <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    {refresh_page?<meta http-equiv="refresh" content="{refresh_page}">:}
+    <meta http-equiv="X-UA-Compatible" content="IE=9">
+    <meta name="viewport" content="width=device-width">
+    <style>html{display:none;}</style>
+    <script type="text/javascript"><!--
+      /* Only display document if we are not in a frame... */
+      if (self == top) {
+        document.documentElement.style.display = 'block';
+      } else {
+        top.location = self.location;
+      }
+
+      /* Show an error if cookies are disabled */
+      function check_cookies() {
+       if (!navigator.cookieEnabled) {
+             document.getElementById('body').innerHTML = 'This page uses cookies to prevent common cross-site attacks. Please enable cookies in your browser.';
+       }
+      }
+    --></SCRIPT>
+    <title>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+  </head>
+  <body onload="check_cookies();">
+    <div class="header">
+      <ul>
+       <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+       <li><a href="/">Home</a></li>
+       <li><a {SECTION=admin?class="active" :}href="/admin">Verwaltung</a></li>
+       <li><a {SECTION=classes?class="active" :}href="/classes/">Klassen</a></li>
+       <li><a {SECTION=help?class="active" :}href="/help/">Hilfe</a></li>
+       <li><a {SECTION=jobs?class="active" :}href="/jobs/">Aufträge</a></li>
+       <li><a {SECTION=printers?class="active" :}href="/printers/">Drucker</a></li>
+      </ul>
+    </div>
+    <div class="body">
+      <div class="row">
+       <h1>{title}</h1>
diff --git a/templates/de/help-header.tmpl b/templates/de/help-header.tmpl
new file mode 100644 (file)
index 0000000..45df8de
--- /dev/null
@@ -0,0 +1,41 @@
+<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
+{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
+
+<P ALIGN="CENTER"><B>Suche in
+{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:allen Dokumenten}}:</B> <INPUT
+TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER=""
+AUTOSAVE="org.cups.help" RESULTS="20">
+<INPUT TYPE="SUBMIT" NAME="SEARCH" VALUE="Suchen">
+<INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Leeren"></P>
+
+</FORM>
+
+<!-- Bookmarks -->
+<DIV CLASS="sidebar"><TABLE CLASS="inset" SUMMARY="Inhalt">
+<TR><TD>
+
+<H3 CLASS="title">Online Hilfe Dokumente</H3>
+
+<P CLASS="l0"><A HREF="/help/{QUERY??QUERY={QUERY}:}">Alle Dokumente</A></P>
+<HR>
+
+{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
+}
+</TD></TR>
+</TABLE></DIV>
+
+{QUERY?<P>Suchergebnisse in {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:allen Dokumenten}}\:</P>
+{QTEXT?<UL>
+{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (in <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
+{QTEXT?</UL>:}
+:<P>Keine Übereinstimmung gefunden.</P>}
+<HR NOSHADE>:}
+{HELPTITLE?<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Druckversion anzeigen"></FORM>:
+
+<H1>CUPS Hilfeseiten</H1>
+
+<P>Dies ist das CUPS online Hilfesystem. Geben Sie Ihren Suchbegriff oben ein oder klicken Sie auf einen der Dokumentationslinks um sich die Online Hilfe Informationen anzeigen zu lassen.</P>
+
+<P>Wenn Sie noch unerfahren im Umgang mit CUPS sind, lesen Sie die "<a href="/help/overview.html">CUPS Übersicht</a>". Erfahrene Benutzer sollten "<a href="/help/whatsnew.html">Was ist neu in CUPS 2.0</a>" lesen.</P>
+
+<P>Die <A HREF="http://www.cups.org/">CUPS Webseite</A> bietet ebenfalls viele Angebote inklusive Diskussionsforen für Benutzer, Antworten auf häufig gestellte Fragen, und ein Formular für Fehlerberichte und Wünsche.</P>}
diff --git a/templates/de/help-trailer.tmpl b/templates/de/help-trailer.tmpl
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/templates/de/job-cancel.tmpl b/templates/de/job-cancel.tmpl
new file mode 100644 (file)
index 0000000..63fc385
--- /dev/null
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Auftrag {job_id} löschen</H2>
+
+<P><A HREF="{job_printer_uri}">Auftrag {job_id}</A> wurde gelöscht.
diff --git a/templates/de/job-hold.tmpl b/templates/de/job-hold.tmpl
new file mode 100644 (file)
index 0000000..15d43a4
--- /dev/null
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Auftrag {job_id} anhalten</H2>
+
+<P><A HREF="{job_printer_uri}">Auftrag {job_id}</A> wurde vom Drucken abgehalten.
similarity index 66%
rename from templates/cs/job-move.tmpl
rename to templates/de/job-move.tmpl
index b706ca8..ba790ff 100644 (file)
@@ -1,15 +1,13 @@
-<DIV CLASS="indent">
-
 <FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
 {job_id?<INPUT TYPE="HIDDEN" NAME="JOB_ID" VALUE="{job_id}">:}
 
-<H2 CLASS="title">{job_id?Přesun úlohy {job_id}:Přesun všech úloh}</H2>
+<H2 CLASS="title">{job_id?Auftrag {job_id} verschieben:Alle Aufträge verschieben}</H2>
 
 <TABLE>
 <TR>
-<TH CLASS="label">Nová tiskárna:</TH>
+<TH CLASS="label">Neues Ziel:</TH>
 <TD>
 <SELECT NAME="JOB_PRINTER_URI" SIZE="10">
 {[job_printer_uri]<OPTION VALUE="{job_printer_uri}">{job_printer_name}}
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Přesunout {job_id?úlohu:úlohy}"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="{job_id?Auftrag verschieben:Aufträge verschieben}"></TD>
 </TR>
 </TABLE>
 
 </FORM>
-
-</DIV>
diff --git a/templates/de/job-moved.tmpl b/templates/de/job-moved.tmpl
new file mode 100644 (file)
index 0000000..795db20
--- /dev/null
@@ -0,0 +1,4 @@
+<H2 CLASS="title">{job_id?Auftrag {job_id} verschieben:Alle Aufträge verschieben}</H2>
+
+<P>{job_id?<A HREF="/jobs/{job_id}">Auftrag {job_id}</A>:Alle Aufträge} nach
+<A HREF="{job_printer_uri}">{job_printer_name}</A> verschoben.</P>
diff --git a/templates/de/job-release.tmpl b/templates/de/job-release.tmpl
new file mode 100644 (file)
index 0000000..5b3c6e4
--- /dev/null
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Auftrag {job_id} freigeben</H2>
+
+<P><A HREF="{job_printer_uri}">Auftrag {job_id}</A> wurde zum Drucken freigegeben.
diff --git a/templates/de/job-restart.tmpl b/templates/de/job-restart.tmpl
new file mode 100644 (file)
index 0000000..7904376
--- /dev/null
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Auftrag {job_id} neu starten</H2>
+
+<P><A HREF="{job_printer_uri}">Auftrag {job_id}</A> wurde neu gestartet.
diff --git a/templates/de/jobs-header.tmpl b/templates/de/jobs-header.tmpl
new file mode 100644 (file)
index 0000000..e3935fe
--- /dev/null
@@ -0,0 +1,5 @@
+{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Aktive Aufträge anzeigen"></FORM>}
+{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Fertige Aufträge anzeigen"></FORM>}
+{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Alle Aufträge anzeigen"></FORM>}
+
+<P ALIGN="CENTER">{total=0?Keine Aufträge:Zeige {#job_id} von {total} {?which_jobs=?aktiven:{which_jobs=all?:beendeten}} {total=1?:s}Auftrag:Aufträgen}.</P>
similarity index 63%
rename from templates/ca/jobs.tmpl
rename to templates/de/jobs.tmpl
index 2ec88e1..d24c3a1 100644 (file)
@@ -1,33 +1,34 @@
 {#job_id=0?:
-<TABLE CLASS="list" SUMMARY="Job List">
+<TABLE CLASS="list" SUMMARY="Auftragsliste">
 <THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> ID <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> ID <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Nom</TH><TH>Usuari</TH><TH>Mida</TH><TH>P&agrave;gines</TH><TH>Estat</TH><TH>Control</TH></TR>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> ID <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> ID <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Name</TH><TH>Benutzer</TH><TH>Grösse</TH><TH>Seiten</TH><TH>Status</TH><TH>Steuerung</TH></TR>
 </THEAD>
 <TBODY>
 {[job_id]
 <TR VALIGN="TOP">
 <TD><A HREF="{job_printer_uri}">{job_printer_name}</A>-{job_id}{?phone? ({phone}):}&nbsp;</TD>
-<TD>{?job_name=?Desconegut:{job_name}}&nbsp;</TD>
-<TD>{?job_originating_user_name=?Withheld:{job_originating_user_name}}&nbsp;</TD>
+<TD>{?job_name=?Unbekannt:{job_name}}&nbsp;</TD>
+<TD>{?job_originating_user_name=?Einbehalten:{job_originating_user_name}}&nbsp;</TD>
 <TD>{job_k_octets}k&nbsp;</TD>
-<TD>{job_media_sheets_completed=0?Desconegudes:{?job_media_sheets_completed}}&nbsp;</TD>
-<TD>{job_state=3?pendent des de<BR>{time_at_creation}:{job_state=4?pausada des de<BR>{time_at_creation}:
-{job_state=5?processant des de<BR>{time_at_processing}:{job_state=6?aturada:
-{job_state=7?cancel&middot;lada el<BR>{time_at_completed}:{job_state=8?avortada:completada el<BR>{time_at_completed}}}}}}}&nbsp;{job_printer_state_message?<BR>
+<TD>{job_media_sheets_completed=0?Unbekannt:{?job_media_sheets_completed}}&nbsp;</TD>
+<TD>{job_state=3?unerledigt seit<BR>{time_at_creation}:{job_state=4?angehalten seit<BR>{time_at_creation}:
+{job_state=5?verarbeitet seit<BR>{time_at_processing}:{job_state=6?gestoppt:
+{job_state=7?gelöscht am<BR>{time_at_completed}:{job_state=8?abgebrochen:beendet am<BR>{time_at_completed}}}}}}}&nbsp;{job_printer_state_message?<BR>
 <EM>"{job_printer_state_message}"</EM>:}</TD>
 <TD>
 {job_preserved>0?{job_state>5?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="restart-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}"><INPUT TYPE="SUBMIT" VALUE="Torna a imprimir"></FORM>:}:}
+<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="restart-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
+<INPUT TYPE="SUBMIT" VALUE="Auftrag neu drucken"></FORM>:}:}
 {job_state=4?
 <FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="release-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Allibera"></FORM>:}
+<INPUT TYPE="SUBMIT" VALUE="Auftrag freigeben"></FORM>:}
 {job_state=3?
 <FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="hold-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Pausa"></FORM>:}
+<INPUT TYPE="SUBMIT" VALUE="Auftrag anhalten"></FORM>:}
 {job_state<7?
 <FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Cancel&middot;la"></FORM>
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="move-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="SUBMIT" VALUE="Mou"></FORM>:}
+<INPUT TYPE="SUBMIT" VALUE="Auftrag löschen"></FORM>
+<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="move-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="SUBMIT" VALUE="Auftrag verschieben"></FORM>:}
 &nbsp;</TD>
 </TR>
 }
similarity index 75%
rename from templates/ca/list-available-printers.tmpl
rename to templates/de/list-available-printers.tmpl
index b771b5b..a19bf5b 100644 (file)
@@ -1,11 +1,7 @@
-<DIV CLASS="indent">
+<H2 CLASS="title">Verfügbare Drucker</H2>
 
-<H2 CLASS="title">Impressores disponibles</H2>
-
-{#device_uri=0?<P>No s'ha trobat cap impressora.</P>
+{#device_uri=0?<P>Keine Drucker gefunden.</P>
 :<UL>{[device_uri]
-<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Afegeix aquesta impressora"></FORM>
+<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Diesen Drucker hinzufügen"></FORM>
 {device_make_and_model} ({device_info})</LI>
 }</UL>}
-
-</DIV>
similarity index 73%
rename from templates/cs/modify-class.tmpl
rename to templates/de/modify-class.tmpl
index 9e4881a..fd0aa9a 100644 (file)
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Úprava třídy {printer_name}</H2>
+<H2 CLASS="title">Klasse {printer_name} ändern</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -9,15 +7,15 @@
 
 <TABLE>
 <TR>
-<TH CLASS="label">Popis:</TH>
+<TH CLASS="label">Beschreibung:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
 </TR>
 <TR>
-<TH CLASS="label">Umístění:</TH>
+<TH CLASS="label">Ort:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
 </TR>
 <TR>
-<TH CLASS="label">Členové:</TH>
+<TH CLASS="label">Mitglieder:</TH>
 <TD>
 <SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
 {[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
@@ -26,9 +24,8 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Upravit třídu"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Klasse ändern"></TD>
 </TR>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
similarity index 71%
rename from templates/cs/modify-printer.tmpl
rename to templates/de/modify-printer.tmpl
index 8fc48ed..72b4bc5 100644 (file)
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Úprava tiskárny {printer_name}</H2>
+<H2 CLASS="title">Modify {printer_name}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 
 <TABLE>
 <TR>
-<TH CLASS="label">Popis:</TH>
+<TH CLASS="label">Description:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Srozumitelný popis)</SMALL></TD>
+<SMALL>(Human-readable description such as "HP LaserJet with Duplexer")</SMALL></TD>
 </TR>
 <TR>
 <TH CLASS="label">Location:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Srozumitelný popis umístění)</SMALL></TD>
+<SMALL>(Human-readable location such as "Lab 1")</SMALL></TD>
 </TR>
 <TR>
-<TH CLASS="label">Připojení:</TH>
+<TH CLASS="label">Connection:</TH>
 <TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
 </TR>
 <TR>
-<TH CLASS="label">Sdílení:</TH>
+<TH CLASS="label">Sharing:</TH>
 <TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
-sdílet tuto tiskárnu</TD>
+Share This Printer</TD>
 </TR>
 <TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Pokračovat"></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Continue"></TD>
 </TR>
 </TABLE>
 
 </FORM>
-</DIV>
diff --git a/templates/de/norestart.tmpl b/templates/de/norestart.tmpl
new file mode 100644 (file)
index 0000000..a5f1214
--- /dev/null
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Einstellungen ändern</H2>
+
+<P>Der Server wurde nicht neu gestartet, da die Konfiguration nicht geändert wurde...</P>
diff --git a/templates/de/option-conflict.tmpl b/templates/de/option-conflict.tmpl
new file mode 100644 (file)
index 0000000..e1f2435
--- /dev/null
@@ -0,0 +1,7 @@
+<P><B>Fehler:</B> die folgenden Optionen stehen im Konflikt:</P>
+
+<UL>
+{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A>: {cchoice}</LI>
+}</UL>
+
+<P>Bitte ändern sie eine oder mehrere Einstellungen um die Konflikte zu lösen.</P>
similarity index 61%
rename from templates/cs/option-pickone.tmpl
rename to templates/de/option-pickone.tmpl
index 9c7e2a2..1467b36 100644 (file)
@@ -6,12 +6,12 @@
 {iscustom=1?<TABLE NAME="paramtable" id="{keyword}-params">{[params]
 <TR><TH CLASS="sublabel">{paramtext}:</TH>
 <TD>{params=Units?<SELECT NAME="{keyword-1}.{params}">
-<OPTION VALUE="pt"{paramvalue=pt? SELECTED:}>Body</OPTION>
-<OPTION VALUE="mm"{paramvalue=mm? SELECTED:}>Millimetry</OPTION>
-<OPTION VALUE="cm"{paramvalue=cm? SELECTED:}>Centimetry</OPTION>
-<OPTION VALUE="in"{paramvalue=in? SELECTED:}>Palce</OPTION>
-<OPTION VALUE="ft"{paramvalue=ft? SELECTED:}>Stopy</OPTION>
-<OPTION VALUE="m"{paramvalue=m? SELECTED:}>Metry</OPTION>
+<OPTION VALUE="pt"{paramvalue=pt? SELECTED:}>Punkte</OPTION>
+<OPTION VALUE="mm"{paramvalue=mm? SELECTED:}>Millimeter</OPTION>
+<OPTION VALUE="cm"{paramvalue=cm? SELECTED:}>Zentimeter</OPTION>
+<OPTION VALUE="in"{paramvalue=in? SELECTED:}>Zoll</OPTION>
+<OPTION VALUE="ft"{paramvalue=ft? SELECTED:}>Fuss</OPTION>
+<OPTION VALUE="m"{paramvalue=m? SELECTED:}>Meter</OPTION>
 </SELECT>:<INPUT TYPE="{inputtype}" NAME="{keyword-1}.{params}" VALUE="{paramvalue}">}</TD></TR>
 }</TABLE>
 </TD>:}
diff --git a/templates/de/option-trailer.tmpl b/templates/de/option-trailer.tmpl
new file mode 100644 (file)
index 0000000..7da5573
--- /dev/null
@@ -0,0 +1,5 @@
+</TABLE>
+
+<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="Standardeinstellungen festlegen"></P>
+
+</DIV>
\ No newline at end of file
similarity index 67%
rename from templates/ca/pager.tmpl
rename to templates/de/pager.tmpl
index ab134f1..1164045 100644 (file)
@@ -1,6 +1,6 @@
-<TABLE CLASS="inset" SUMMARY="Paging Bar">
+<TABLE CLASS="inset" SUMMARY="Seitenverwaltung">
 <TR>
-       <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="&#x25c0; Anterior"></FORM>:&nbsp;}</TD>
-       <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="Seg&uuml;ent &#x25b6;"></FORM>:&nbsp;}</TD>
+       <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="&#x25c0; Vorherige anzeigen"></FORM>:&nbsp;}</TD>
+       <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="Nächste anzeigen &#x25b6;"></FORM>:&nbsp;}</TD>
 </TR>
 </TABLE>
diff --git a/templates/de/printer-accept.tmpl b/templates/de/printer-accept.tmpl
new file mode 100644 (file)
index 0000000..4babd47
--- /dev/null
@@ -0,0 +1,5 @@
+<H2 CLASS="title">Aufträge von {is_class?Klasse:Drucker} {printer_name} akzeptieren</H2>
+
+<P>{is_class?Klasse:Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+aktzeptiert jetzt Aufträge.</P>
diff --git a/templates/de/printer-added.tmpl b/templates/de/printer-added.tmpl
new file mode 100644 (file)
index 0000000..b34529c
--- /dev/null
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Drucker hinzufügen</H2>
+
+<P>Drucker <A HREF="/printers/{printer_name}">{printer_name}</A> wurde erfolgreich
+hinzufügt.
diff --git a/templates/de/printer-cancel-jobs.tmpl b/templates/de/printer-cancel-jobs.tmpl
new file mode 100644 (file)
index 0000000..364284d
--- /dev/null
@@ -0,0 +1,5 @@
+<H2 CLASS="title">Aufträge auf {is_class?Class:Printer} {printer_name} löschen</H2>
+
+<P>Alle Aufträge auf {is_class?class:printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+wurden gelöscht.</P>
diff --git a/templates/de/printer-configured.tmpl b/templates/de/printer-configured.tmpl
new file mode 100644 (file)
index 0000000..fff957b
--- /dev/null
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Standardeinstellungen für {printer_name} festlegen</H2>
+
+<P>Standardeinstellungen für {OP=set-class-options?Klasse <A HREF="/classes/{printer_name}">:Drucker <A HREF="/printers/{printer_name}">}{printer_name}</A>
+wurden erfolgreich gesetzt.
similarity index 50%
rename from templates/ca/printer-confirm.tmpl
rename to templates/de/printer-confirm.tmpl
index 916bc30..b8735ab 100644 (file)
@@ -1,10 +1,8 @@
-<DIV CLASS="indent">
+<H2 CLASS="title">Delete Printer {printer_name}</H2>
 
-<H2 CLASS="title">Elimina la impressora {printer_name}</H2>
+<H2 CLASS="title">Drucker {printer_name} löschen</H2>
 
-<P><B>Av&iacute;s:</B> Esteu segur que voleu eliminar la impressora
-{printer_name}?</P>
+<P><B>Warnung:</B> Sind Sie sicher, dass Sie den Drucker
+{printer_name} löschen wollen?</P>
 
-<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Elimina la impressora"></FORM></P>
-
-</DIV>
+<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Drucker löschen"></FORM></P>
diff --git a/templates/de/printer-default.tmpl b/templates/de/printer-default.tmpl
new file mode 100644 (file)
index 0000000..3b35ee9
--- /dev/null
@@ -0,0 +1,9 @@
+<H2 CLASS="title">{is_class?Klasse:Drucker} {printer_name} als Standard festlegen</H2>
+
+<P>{is_class?Klasse:Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+wurde zum Standarddrucker für diesen Server gemacht.</P>
+
+<BLOCKQUOTE><B>Notiz:</B> Die Einstellungen des Standarddruckers
+welche von Benutzern mittels dem <TT>lpoptions</TT> Befehl gesetzt wurden,
+überschreiben diese Einstellung.</BLOCKQUOTE>
diff --git a/templates/de/printer-deleted.tmpl b/templates/de/printer-deleted.tmpl
new file mode 100644 (file)
index 0000000..c123e50
--- /dev/null
@@ -0,0 +1,3 @@
+<H2 CLASS="title">Drucker {printer_name} löschen</H2>
+
+<P>Drucker {printer_name} wurde erfolgreich gelöscht.
diff --git a/templates/de/printer-jobs-header.tmpl b/templates/de/printer-jobs-header.tmpl
new file mode 100644 (file)
index 0000000..0834c9c
--- /dev/null
@@ -0,0 +1 @@
+<H3 CLASS="title">Aufträge</H3>
diff --git a/templates/de/printer-modified.tmpl b/templates/de/printer-modified.tmpl
new file mode 100644 (file)
index 0000000..0289f9f
--- /dev/null
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Drucker {printer_name} ändern</H2>
+
+<P>Drucker <A HREF="/printers/{printer_name}">{printer_name}</A> wurde
+erfolgreich geändert.
diff --git a/templates/de/printer-reject.tmpl b/templates/de/printer-reject.tmpl
new file mode 100644 (file)
index 0000000..47f82cb
--- /dev/null
@@ -0,0 +1,5 @@
+<H2 CLASS="title">Aufträge für {is_class?die Klasse:den Drucker} {printer_name} ablehnen</H2>
+
+<P>{is_class?Die Klasse:Der Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+akzeptiert keine weiteren Aufträge.</P>
diff --git a/templates/de/printer-start.tmpl b/templates/de/printer-start.tmpl
new file mode 100644 (file)
index 0000000..c2d89c9
--- /dev/null
@@ -0,0 +1,5 @@
+<H2 CLASS="title">{is_class?Die Klasse:Den Drucker} {printer_name} fortfahren</H2>
+
+<P>{is_class?Die Klassen:Der Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+wird fortgesetzt.</P>
diff --git a/templates/de/printer-stop.tmpl b/templates/de/printer-stop.tmpl
new file mode 100644 (file)
index 0000000..d519f1a
--- /dev/null
@@ -0,0 +1,5 @@
+<H2 CLASS="title">{is_class?Die Klasse:Den Drucker} {printer_name} anhalten</H2>
+
+<P>{is_class?Die Klasse:Der Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+wurde angehalten.</P>
diff --git a/templates/de/printer.tmpl b/templates/de/printer.tmpl
new file mode 100644 (file)
index 0000000..2b9eb25
--- /dev/null
@@ -0,0 +1,43 @@
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
+({printer_state=3?Im Leerlauf:{printer_state=4?Beschäftigt:Angehalten}},
+{printer_is_accepting_jobs=0?Aufträge werden ablehnt:Aufträge werden akzeptiert},
+{server_is_sharing_printers=0?Keine (Server):{printer_is_shared=0?Keine:}} Netzfreigabe{default_name={printer_name}?, Standarddrucker:}, {printer_is_colormanaged=0?Kein Farbmanagement:Farbmanagement})</H2>
+
+<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
+<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
+<OPTION VALUE="">Wartung</OPTION>
+<OPTION VALUE="print-test-page">Testseite drucken</OPTION>
+{printer_commands~.*Clean.*?<OPTION VALUE="clean-print-heads">Druckköpfe reinigen</OPTION>:}
+{printer_commands~.*PrintSelfTestPage.*?<OPTION VALUE="print-self-test-page">Selbsttest-Seite drucken</OPTION>:}
+{printer_state=5?<OPTION VALUE="start-printer">Drucker starten</OPTION>:<OPTION VALUE="stop-printer">Drucker stoppen</OPTION>}
+{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Aufträge akzeptieren</OPTION>:<OPTION VALUE="reject-jobs">Aufträge ablehnen</OPTION>}
+<OPTION VALUE="move-jobs">Alle Aufträge verschieben</OPTION>
+<OPTION VALUE="purge-jobs">Alle Aufträge abbrechen</OPTION>
+</SELECT>
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
+</FORM>
+
+<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
+<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
+<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
+<OPTION VALUE="">Administration</OPTION>
+<OPTION VALUE="modify-printer">Drucker ändern</OPTION>
+<OPTION VALUE="delete-printer">Drucker löschen</OPTION>
+<OPTION VALUE="set-printer-options">Standardeinstellungen festlegen</OPTION>
+<OPTION VALUE="set-as-default">Als Standard festlegen</OPTION>
+<OPTION VALUE="set-allowed-users">Erlaubte Benutzer festlegen</OPTION>
+</SELECT>
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
+</FORM>
+
+<TABLE SUMMARY="{printer_name}">
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Beschreibung:</TH><TD>{printer_info}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Ort:</TH><TD>{printer_location}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Treiber:</TH><TD>{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Verbindung:</TH><TD>{device_uri}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Einstellungen:</TH><TD>job-sheets={job_sheets_default}
+media={media_default?{media_default}:unknown}
+{sides_default?sides={sides_default}:}</TD></TR>
+</TABLE>
diff --git a/templates/de/printers-header.tmpl b/templates/de/printers-header.tmpl
new file mode 100644 (file)
index 0000000..7ee520e
--- /dev/null
@@ -0,0 +1 @@
+<P ALIGN="CENTER">{total=0?Keine Drucker:Zeige {#printer_name} von {total} Drucker{total=1?:n}}.</P>
diff --git a/templates/de/printers.tmpl b/templates/de/printers.tmpl
new file mode 100644 (file)
index 0000000..360154f
--- /dev/null
@@ -0,0 +1,11 @@
+{#printer_name=0?:
+<TABLE CLASS="list" SUMMARY="Druckerliste">
+<THEAD>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Queue Name <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Queue Name <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Beschreibung</TH><TH>Ort</TH><TH>Marke und Modell</TH><TH>Status</TH></TR>
+</THEAD>
+<TBODY>
+{[printer_name]
+<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?Im Leerlauf:{printer_state=4?Beschäftigt:Angehalten}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
+}
+</TBODY>
+</TABLE></DIV>}
diff --git a/templates/de/restart.tmpl b/templates/de/restart.tmpl
new file mode 100644 (file)
index 0000000..f0e5cee
--- /dev/null
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Einstellungen ändern</H2>
+
+<P><IMG SRC="data:image/gif;base64,R0lGODlhEAAQAIQAAP///wAAAPDw8IqKiuDg4EZGRnp6egAAAFhYWCQkJKysrL6+vhQUFJycnAQEBDY2NmhoaP///////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQABQD/ACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAEFAB8ALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQBBQAfACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQBBQAfACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAQUAHwAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAQUAHwAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAEFAB8ALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAEFAB8ALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQBBQAfACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQBBQAfACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOw==" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+ALT="Busy Indicator"> Bitte warten bis der Server neu gestartet ist...</P>
diff --git a/templates/de/samba-export.tmpl b/templates/de/samba-export.tmpl
new file mode 100644 (file)
index 0000000..e856ff5
--- /dev/null
@@ -0,0 +1,55 @@
+<SCRIPT TYPE="text/javascript"><!--
+function select_printers() {
+  var list = document.export_samba.EXPORT_NAME;
+  var sel = document.export_samba.EXPORT_ALL.checked;
+
+  for (i = 0; i < list.length; i ++) {
+    list.options[i].selected = sel;
+  }
+}
+--></SCRIPT>
+
+<FORM METHOD="POST" ACTION="/admin/" NAME="export_samba">
+<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
+
+<H2 CLASS="title">Drucker für Samba freigeben</H2>
+
+{error?<P>Kann Drucker nicht für Samba freigeben\:</P>
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
+<P>Consult the <A HREF="/admin/log/error_log"
+TARGET="_blank">Fehlerprotokoll</A> Datei um mehr Informationen zu erhalten.</P>:
+<P>Diese Seite erlaubt es Ihnen Drucker für Samba bereitzustellen
+damit auf diese mittels Windows Clients über die Desktopsymbole
+<VAR>Netzwerk Nachbarn</VAR> oder <VAR>Netzwerkumgebung</VAR>
+zugegriffen werden kann. Sie müssen zuerst einen
+Windows PostScript Druckerteiber installieren wie diese in der Hilfe für <A
+HREF="/help/man-cupsaddsmb.html"
+TARGET="_blank">cupsaddsmb(8)</A> beschrieben ist.</P>}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Drucker:</TH>
+<TD>
+<SELECT NAME="EXPORT_NAME" SIZE="10" MULTIPLE>
+{[printer_name]<OPTION VALUE="{printer_name}"{export_all? SELECTED:{printer_export? SELECTED:}}>{printer_name}}
+</SELECT><BR>
+<INPUT TYPE="CHECKBOX" NAME="EXPORT_ALL"{export_all? CHECKED:}
+onChange="select_printers()"> Alle Drucker freigeben
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Samba Benutzername:</TH>
+<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (benötigt)</TD>
+</TR>
+<TR>
+<TH CLASS="label">Samba Passwort:</TH>
+<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (benötigt)</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Drucker für Samba freigeben"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/de/samba-exported.tmpl b/templates/de/samba-exported.tmpl
new file mode 100644 (file)
index 0000000..0e088ed
--- /dev/null
@@ -0,0 +1 @@
+<P>Drucker wurden erfolgreich für Samba freigegeben.</P>
similarity index 60%
rename from templates/ca/search.tmpl
rename to templates/de/search.tmpl
index b76afaa..c4e89b8 100644 (file)
@@ -2,9 +2,9 @@
 {WHICH_JOBS?<INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{WHICH_JOBS}">:}
 {ORDER?<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{ORDER}">:}
 
-<P ALIGN="CENTER"><B>Cerca a les 
-{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?classes:{SECTION=jobs?tasques:impressores}}}:</B>
+<P ALIGN="CENTER"><B>Suche in
+{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Klassen:{SECTION=jobs?Aufträgen:Drucker}}}:</B>
 <INPUT TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40"  PLACEHOLDER="" AUTOSAVE="org.cups.{SECTION}" RESULTS="20"> <INPUT
-TYPE="SUBMIT" VALUE="Cerca"> <INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Neteja"></P>
+TYPE="SUBMIT" VALUE="Suchen"> <INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Leeren"></P>
 
 </FORM>
similarity index 84%
rename from templates/cs/set-printer-options-header.tmpl
rename to templates/de/set-printer-options-header.tmpl
index 160ae6b..e0b64a3 100644 (file)
@@ -1,12 +1,10 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Nastavení parametrů u {printer_name}</H2>
+<H2 CLASS="title">Standardeinstellungen für {printer_name} festlegen</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
 <INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{HAVE_AUTOCONFIGURE?<INPUT TYPE="SUBMIT" NAME="AUTOCONFIGURE" VALUE="Nastavit výchozí parametry tiskárny">:}
+{HAVE_AUTOCONFIGURE?<INPUT TYPE="SUBMIT" NAME="AUTOCONFIGURE" VALUE="Frage Drucker nach Voreinstellungen">:}
 
 <SCRIPT TYPE="text/javascript"><!--
 function update_paramtable(option)
diff --git a/templates/de/subscription-added.tmpl b/templates/de/subscription-added.tmpl
new file mode 100644 (file)
index 0000000..813f47f
--- /dev/null
@@ -0,0 +1 @@
+<P>Subskription {subscription_name} wurde erfolgreich hinzugefügt.</P>
diff --git a/templates/de/subscription-canceled.tmpl b/templates/de/subscription-canceled.tmpl
new file mode 100644 (file)
index 0000000..18e71b9
--- /dev/null
@@ -0,0 +1 @@
+<P>Subskription #{notify_subscription_id} wurde gekündigt.</P>
diff --git a/templates/de/test-page.tmpl b/templates/de/test-page.tmpl
new file mode 100644 (file)
index 0000000..bc77673
--- /dev/null
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Drucker Testseite auf {printer_name}</H2>
+
+<P>Testseite gesendet; Auftrags-ID ist <A HREF="/{SECTION}/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
diff --git a/templates/de/trailer.tmpl b/templates/de/trailer.tmpl
new file mode 100644 (file)
index 0000000..7fbd1bc
--- /dev/null
@@ -0,0 +1,5 @@
+      </div>
+    </div>
+    <div class="footer">CUPS und das CUPS Logo sind Warenzeichen der <a href="http://www.apple.com">Apple Inc.</a> Copyright &copy; 2007-2015 Apple Inc. Alle Rechte vorbehalten.</div>
+  </body>
+</html>
similarity index 64%
rename from templates/ca/users.tmpl
rename to templates/de/users.tmpl
index cceeb02..6364ba9 100644 (file)
@@ -1,30 +1,27 @@
-<DIV CLASS="indent">
-
 <FORM METHOD="POST" ACTION="/admin">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
 <INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
 {IS_CLASS?<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="{IS_CLASS}">:}
 
-<H2 CLASS="title">Usuaris amb permisos per {printer_name}</H2>
+<H2 CLASS="title">Erlaubte Benutzer für {printer_name}</H2>
 
 <TABLE>
 <TR>
-<TH CLASS="label">Usuaris:</TH>
+<TH CLASS="label">Benutzer:</TH>
 <TD>
 <INPUT TYPE='TEXT' NAME='users' SIZE='60' VALUE='{?requesting_user_name_allowed}{?requesting_user_name_denied}'>
 <BR>
-<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-allowed' {requesting_user_name_allowed?checked:}>Permet imprimir a aquests usuaris
-<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>No permetis imprimir a aquests usuaris
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-allowed' {requesting_user_name_allowed?checked:}>Erlaube diesen Benutzern zu drucken
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Verbiete diesen Benutzern zu drucken
 </TD>
 </TR>
 <TR>
 <TD></TD>
 <TD>
-<INPUT TYPE="SUBMIT" VALUE="Aplica els permisos">
+<INPUT TYPE="SUBMIT" VALUE="Set Allowed Users">
 </TD>
 </TR>
 </TABLE>
 
 </FORM>
-</DIV>
index 8947382..d8f9bb1 100644 (file)
@@ -5,8 +5,6 @@ function reset_config()
 }
 </SCRIPT>
 
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Edit Configuration File</H2>
 
 <FORM NAME="cups" METHOD="POST" ACTION="/admin/">
@@ -20,5 +18,3 @@ function reset_config()
 onClick="reset_config();"></P>
 
 </FORM>
-
-</DIV>
index feaed0f..652537b 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{?title} {?printer_name} Error</H2>
 
 <P>Error:</P>
 
 <BLOCKQUOTE>Unknown operation "{op}"!</BLOCKQUOTE>
-
-</DIV>
index 8623573..2ac1b8f 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{?title} {?printer_name} Error</H2>
 
 <P>{?message?{message}:Error}:</P>
 
 <BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
index 6d61ebe..f163d28 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">A&ntilde;adir clase</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -37,4 +35,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index eedc3db..6ccd325 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">A&ntilde;adir impresora</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -44,4 +42,3 @@ Compartir esta impresora</TD>
 </TABLE>
 
 </FORM>
-</DIV>
index cce1f14..780dd55 100644 (file)
-<TABLE CLASS="indent" SUMMARY="Tareas de administraci&oacute;n">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">Impresoras</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir impresora"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Encontrar nuevas impresoras"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Administrar impresoras"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Exportar impresoras a Samba"></FORM>:}
-</P>
-
-<H2 CLASS="title">Clases</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir clase"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Administrar clases"></FORM>
-</P>
-
-<H2 CLASS="title">Trabajos</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Administrar trabajos"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">Servidor</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Editar archivo configuraci&oacute;n"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Ver archivo de registro de accesos"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Ver archivo de registro de errores"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Ver archivo de registro de p&aacute;ginas"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>Configuraci&oacute;n del servidor\:</B></P>
-
-<P><A HREF="/admin/">Avanzada <SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Compartir impresoras conectadas a este sistema<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&uacute;mero m&aacute;ximo de clientes\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Permitir la impresi&oacute;n desde Internet<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Anunciar la interfaz web<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Permitir administraci&oacute;n remota<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Usar autentificaci&oacute;n Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Permitir a los usuarios cancelar cualquier trabajo (no s&oacute;lo los suyos propios)<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Preservar el historial de trabajos<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&uacute;mero m&aacute;ximo de trabajos (0 sin l&iacute;mite)\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retener metadatos\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retener documentos\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Guardar informaci&oacute;n de depuraci&oacute;n para b&uacute;squeda de problemas<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tama&ntilde;o m&aacute;ximo del archivo de registro\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>Configuraci&oacute;n del servidor:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Avanzada <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Compartir impresoras conectadas a este sistema<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Permitir la impresi&oacute;n desde Internet<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Permitir administraci&oacute;n remota<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Usar autentificaci&oacute;n Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Permitir a los usuarios cancelar cualquier trabajo (no s&oacute;lo los suyos propios)<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Guardar informaci&oacute;n de depuraci&oacute;n para b&uacute;squeda de problemas</P>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Cambiar configuraci&oacute;n"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Subscripciones RSS</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir subscripci&oacute;n RSS"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="Subscripciones RSS">
-<THEAD><TR><TH>Nombre</TH><TH>Eventos</TH><TH>Nombre de la cola</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Cancelar subscripci&oacute;n RSS"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:Todas las colas}</TD></TR>}
-</TBODY>
-</TABLE>:}
+<div class="row">
+  <div class="halves">
+    <H2 CLASS="title">Impresoras</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir impresora"></FORM>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Encontrar nuevas impresoras"></FORM>
+    <FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Administrar impresoras"></FORM>
+    {have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Exportar impresoras a Samba"></FORM>:}
+    </P>
+
+    <H2 CLASS="title">Clases</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir clase"></FORM>
+    <FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Administrar clases"></FORM>
+    </P>
+
+    <H2 CLASS="title">Trabajos</H2>
+
+    <P>
+    <FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Administrar trabajos"></FORM>
+    </P>
+  </div>
+  <div class="halves">
+    <H2 CLASS="title">Servidor</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Editar archivo configuraci&oacute;n"></FORM>
+    <FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Ver archivo de registro de accesos"></FORM>
+    <FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Ver archivo de registro de errores"></FORM>
+    <FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Ver archivo de registro de p&aacute;ginas"></FORM>
+    </P>
+
+    {SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+    <BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+    <FORM METHOD="POST" ACTION="/admin">
+    <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+
+    {ADVANCEDSETTINGS?<P><B>Configuraci&oacute;n del servidor\:</B></P>
+
+    <P><A HREF="/admin/">Avanzada <SMALL>&#x25bc;</SMALL></A><BR>
+    <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+    <INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
+    <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Compartir impresoras conectadas a este sistema<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&uacute;mero m&aacute;ximo de clientes\:
+    <INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Permitir la impresi&oacute;n desde Internet<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Anunciar la interfaz web<BR>
+    <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Permitir administraci&oacute;n remota<BR>
+    {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Usar autentificaci&oacute;n Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+    <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Permitir a los usuarios cancelar cualquier trabajo (no s&oacute;lo los suyos propios)<BR>
+    <INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Preservar el historial de trabajos<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&uacute;mero m&aacute;ximo de trabajos (0 sin l&iacute;mite)\:
+    <INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retener metadatos\:
+    <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Retener documentos\:
+    <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
+    <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Guardar informaci&oacute;n de depuraci&oacute;n para b&uacute;squeda de problemas<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tama&ntilde;o m&aacute;ximo del archivo de registro\:
+    <INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
+
+    :<P><B>Configuraci&oacute;n del servidor:</B></P>
+
+    <P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Avanzada <SMALL>&#x25b6;</SMALL></A><BR>
+    <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+    <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Compartir impresoras conectadas a este sistema<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Permitir la impresi&oacute;n desde Internet<BR>
+    <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Permitir administraci&oacute;n remota<BR>
+    {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Usar autentificaci&oacute;n Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+    <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Permitir a los usuarios cancelar cualquier trabajo (no s&oacute;lo los suyos propios)<BR>
+    <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Guardar informaci&oacute;n de depuraci&oacute;n para b&uacute;squeda de problemas</P>
+
+    }
+    <P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Cambiar configuraci&oacute;n"></P>
+
+    </FORM>}
+  </div>
+</div>
+
+<div class="row">
+  <H2 CLASS="title">Subscripciones RSS</H2>
+
+  <P>
+  <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir subscripci&oacute;n RSS"></FORM>
+  </P>
+
+  {notify_subscription_id?<TABLE CLASS="list" SUMMARY="Subscripciones RSS">
+  <THEAD><TR><TH>Nombre</TH><TH>Eventos</TH><TH>Nombre de la cola</TH></TR></THEAD>
+  <TBODY>{[notify_subscription_id]
+  <TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
+  <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Cancelar subscripci&oacute;n RSS"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:Todas las colas}</TD></TR>}
+  </TBODY>
+  </TABLE>:}
+</div>
index 9f314fd..8e38af2 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Modificar {printer_name}:A&ntilde;adir impresora}</H2>
 
 {CUPS_GET_DEVICES_DONE?:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
@@ -50,5 +48,5 @@ VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
 </TR>
 </TABLE>
 
-</FORM>
-</DIV>
+</FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+ALT="Indicador de ocupado"> Buscando impresoras...</P>}
index c846de4..93ef242 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Modificar {printer_name}:A&ntilde;adir impresora}</H2>
 
 <FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -61,4 +59,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
 </TABLE>
 
 </FORM>
-</DIV>
index 497d4b1..8a5a4ba 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Modificar {printer_name}:A&ntilde;adir impresora}</H2>
 
 <FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -57,4 +55,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
 </TABLE>
 
 </FORM>
-</DIV>
index 1f734b9..0b05302 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Modificar {printer_name}:A&ntilde;adir impresora}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -49,4 +47,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
index 46ea17b..3b6e783 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Modificar {printer_name}:A&ntilde;adir impresora}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -41,4 +39,3 @@ en red"</A> para escoger el URI adecuado a usar con su impresora.</P>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 867c8d9..0767e80 100644 (file)
@@ -1,7 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">A&ntilde;adir clase</H2>
 
 <P>Se ha a&ntilde;adido con &eacute;xito la clase <A HREF="/classes/{printer_name}">{printer_name}</A>.
 
-</DIV>
index a30ff72..26f62c4 100644 (file)
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Borrar clase {printer_name}</H2>
 
 <P><B>Advertencia:</B> &iquest;Est&aacute; seguro de querer borrar la clase
 {printer_name}?</P>
 
 <P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Borrar clase"></FORM></P>
-
-</DIV>
index ced78ad..248a7de 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Borrar clase {printer_name}</H2>
 
 <P>Se ha borrado con &eacute;xito la clase {printer_name}.
-
-</DIV>
\ No newline at end of file
index f25951b..f571813 100644 (file)
@@ -1,3 +1 @@
-<DIV CLASS="indent">
 <H3 CLASS="title">Trabajos</H3>
-</DIV>
index d5ae2a7..42db8da 100644 (file)
@@ -1,6 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Modificar clase {printer_name}</H2>
 
 <P>Se ha modificado con &eacute;xito la clase <A HREF="/classes/{printer_name}">{printer_name}</A>.
-</DIV>
\ No newline at end of file
index 5eea4f1..78d4bb9 100644 (file)
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
 <H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
 ({printer_state=3?inactiva:{printer_state=4?procesando:en pausa}},
 {printer_is_accepting_jobs=0?rechazando trabajos:aceptando trabajos},
@@ -40,5 +39,3 @@
 media={media_default?{media_default}:desconocido}
 {sides_default?sides={sides_default}:}</TD></TR>
 </TABLE>
-
-</DIV>
index ba50560..fa843a7 100644 (file)
@@ -1,12 +1,8 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{title} en {printer_name}</H2>
 
 <P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
 ALIGN="ABSMIDDLE" ALT="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?anulado:completado}}}}}}{job_state=9?:{job_printer_state_message?,
+{job_state=7?cancelado:{job_state=8?interrumpido:completado}}}}}}{job_state=9?:{job_printer_state_message?,
 <EM>"{job_printer_state_message}"</EM>:}}</P>
-
-</DIV>
index a0c6634..817f8cc 100644 (file)
@@ -5,8 +5,6 @@ function reset_config()
 }
 </SCRIPT>
 
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Editar archivo de configuraci&oacute;n</H2>
 
 <FORM NAME="cups" METHOD="POST" ACTION="/admin/">
@@ -20,5 +18,3 @@ function reset_config()
 onClick="reset_config();"></P>
 
 </FORM>
-
-</DIV>
index d584108..7def5ce 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Error en {?printer_name}: {?title}</H2>
 
 <P>Error:</P>
 
 <BLOCKQUOTE>Operaci&oacute;n desconocida "{op}".</BLOCKQUOTE>
-
-</DIV>
index f652ea2..f149a1b 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Error en {?printer_name}: {?title}</H2>
 
 <P>{?message?{message}:Error}:</P>
 
 <BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
index b6c63b4..a6df94c 100644 (file)
@@ -1,29 +1,43 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-       {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;Inicio&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;Administraci&oacute;n&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;Clases&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;Ayuda&nbsp;en&nbsp;l&iacute;nea&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;Trabajos&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;Impresoras&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Buscar en la ayuda"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <link rel="stylesheet" href="/cups.css" type="text/css">
+    <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    {refresh_page?<meta http-equiv="refresh" content="{refresh_page}">:}
+    <meta http-equiv="X-UA-Compatible" content="IE=9">
+    <meta name="viewport" content="width=device-width">
+    <style>html{display:none;}</style>
+    <script type="text/javascript"><!--
+      /* Only display document if we are not in a frame... */
+      if (self == top) {
+        document.documentElement.style.display = 'block';
+      } else {
+        top.location = self.location;
+      }
+
+      /* Show an error if cookies are disabled */
+      function check_cookies() {
+       if (!navigator.cookieEnabled) {
+             document.getElementById('body').innerHTML = 'Esta p&aacute;gina usa cookies para prevenir ataques comunes de sitios. Por favor, active las cookies en su navegador.';
+       }
+      }
+    --></SCRIPT>
+    <title>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+  </head>
+  <body onload="check_cookies();">
+    <div class="header">
+      <ul>
+       <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+       <li><a href="/">Inicio</a></li>
+       <li><a {SECTION=admin?class="active" :}href="/admin">Administraci&oacute;n</a></li>
+       <li><a {SECTION=classes?class="active" :}href="/classes/">Clases</a></li>
+       <li><a {SECTION=help?class="active" :}href="/help/">Ayuda</a></li>
+       <li><a {SECTION=jobs?class="active" :}href="/jobs/">Trabajos</a></li>
+       <li><a {SECTION=printers?class="active" :}href="/printers/">Impresoras</a></li>
+      </ul>
+    </div>
+    <div class="body">
+      <div class="row">
+       <h1>{title}</h1>
index 3e7fef9..b05b4b1 100644 (file)
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
 <FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
 {TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
 
@@ -31,21 +30,12 @@ AUTOSAVE="org.cups.help" RESULTS="20">
 {QTEXT?</UL>:}
 :<P>No hay coincidencias.</P>}
 <HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Ver versi&oacute;n imprimible"></FORM>:
+{HELPTITLE?<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Ver versi&oacute;n imprimible"></FORM>:
 
 <H1>Ayuda en l&iacute;nea</H1>
 
-<P>Esta es la interfaz de ayuda en l&iacute;nea de CUPS. Introduzca las palabras
-a buscar aqu&iacute; encima o haga clic en cualquiera de los enlaces de la
-documentaci&oacute;n para visualizar la informaci&oacute;n de ayuda en l&iacute;nea.</P>
+<P>Esta es la interfaz de ayuda en l&iacute;nea de CUPS. Introduzca las palabras a buscar aqu&iacute; encima o haga clic en cualquiera de los enlaces de la documentaci&oacute;n para visualizar la informaci&oacute;n de ayuda en l&iacute;nea.</P>
 
-<P>Si es nuevo en CUPS, lea la p&aacute;gina "<a
-href="/help/overview.html">Informaci&oacute;n general de CUPS</a>". Los usuarios veteranos
-deber&iacute;an leer la p&aacute;gina "<a href="/help/whatsnew.html">Qu&eacute; hay de nuevo en CUPS
-1.6</a>".</P>
+<P>Si es nuevo en CUPS, lea la p&aacute;gina "<a href="/help/overview.html">Informaci&oacute;n general de CUPS</a>".</P>
 
-<P>La <A HREF="http://www.cups.org/">p&aacute;gina de inicio de CUPS</A> tambi&eacute;n
-proporciona muchos recursos, incluyendo foros de discusi&oacute;n de usuarios, respuestas
-a preguntas frecuentes, y un formulario para el env&iacute;o de informes de errores y
-peticiones de mejoras.</P>}
+<P>La <A HREF="http://www.cups.org/">p&aacute;gina de inicio de CUPS</A> tambi&eacute;n proporciona muchos recursos, incluyendo foros de discusi&oacute;n de usuarios, respuestas a preguntas frecuentes, y un formulario para el env&iacute;o de informes de errores y peticiones de mejoras.</P>}
index 6a41427..e8ef1bb 100644 (file)
@@ -1,7 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Cancelar trabajo {job_id}</H2>
 
 <P>Se ha cancelado el <A HREF="{job_printer_uri}">Trabajo {job_id}</A>.
 
-</DIV>
index 3136f9d..74257e6 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Retener trabajo {job_id}</H2>
 
 <P>Se ha retenido el <A HREF="{job_printer_uri}">Trabajo {job_id}</A>.
-
-</DIV>
index e6aac39..02639b3 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
@@ -23,5 +21,3 @@
 </TABLE>
 
 </FORM>
-
-</DIV>
index 8eb7a98..e2a1911 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{job_id?Mover trabajo {job_id}:Mover todos los trabajos}</H2>
 
 <P>Se {job_id?ha movido el <A HREF="/jobs/{job_id}">Trabajo {job_id}</A>:han movido todos los trabajos} a
 <A HREF="{job_printer_uri}">{job_printer_name}</A>.</P>
-
-</DIV>
index d925e5f..0b56ba5 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Liberar trabajo {job_id}</H2>
 
 <P>Se ha liberado el <A HREF="{job_printer_uri}">Trabajo {job_id}</A>.
-
-</DIV>
index ee6c8e5..6e71de4 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Reimprimir trabajo {job_id}</H2>
 
 <P>Se ha reiniciado el <A HREF="{job_printer_uri}">Trabajo {job_id}</A>.
-
-</DIV>
index fe8b51f..abb9914 100644 (file)
@@ -1,5 +1,5 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Mostrar trabajos activos"></FORM>}
+{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Mostrar trabajos activos"></FORM>}
 {?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Mostrar trabajos completados"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Mostrar todos los trabajos"></FORM>}</DIV>
+{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Mostrar todos los trabajos"></FORM>}
 
 <P ALIGN="CENTER">{total=0?No hay trabajos:Mostrando {#job_id} de {total} trabajo{total=1?:s}{?which_jobs=? activo{total=1?:s}:{which_jobs=all?: completado{total=1?:s}}}}.</P>
index 1187513..65fb6cb 100644 (file)
@@ -13,7 +13,7 @@
 <TD>{job_media_sheets_completed=0?Desconocido:{?job_media_sheets_completed}}&nbsp;</TD>
 <TD>{job_state=3?pendiente desde<BR>{time_at_creation}:{job_state=4?retenido desde<BR>{time_at_creation}:
 {job_state=5?en proceso desde<BR>{time_at_processing}:{job_state=6?parado:
-{job_state=7?cancelado el<BR>{time_at_completed}:{job_state=8?anulado:completado el<BR>{time_at_completed}}}}}}}&nbsp;{job_printer_state_message?<BR>
+{job_state=7?cancelado el<BR>{time_at_completed}:{job_state=8?interrumpido:completado el<BR>{time_at_completed}}}}}}}&nbsp;{job_printer_state_message?<BR>
 <EM>"{job_printer_state_message}"</EM>:}</TD>
 <TD>
 {job_preserved>0?{job_state>5?
index 51e0eb9..5ae28ce 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Impresoras disponibles</H2>
 
 {#device_uri=0?<P>No se encuentran impresoras.</P>
@@ -7,5 +5,3 @@
 <LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="A&ntilde;adir esta impresora"></FORM>
 {device_make_and_model} ({device_info})</LI>
 }</UL>}
-
-</DIV>
index a50b2bb..2e1da3d 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Modificar clase {printer_name}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -31,4 +29,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 3c09da0..d18d517 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Modificar {printer_name}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -39,4 +37,3 @@ Compartir esta impresora</TD>
 </TABLE>
 
 </FORM>
-</DIV>
index ac0f96b..5923a67 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Cambiar especificaciones</H2>
 
 <p>No se ha reiniciado el servidor debido a que no se han hecho
 cambios en la configuraci&oacute;n...</p>
-
-</DIV>
index 63fab1b..f9a8efe 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Aceptar trabajos de la {is_class?clase:impresora} {printer_name}</H2>
 
 <P>La {is_class?clase:impresora} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 ahora acepta trabajos.</P>
-
-</DIV>
index 88c565b..4661e65 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">A&ntilde;adir impresora</H2>
 
 <P>Se ha a&ntilde;adido con &eacute;xito la impresora <A HREF="/printers/{printer_name}">{printer_name}</A>.
-
-</DIV>
diff --git a/templates/es/printer-cancel-jobs.tmpl b/templates/es/printer-cancel-jobs.tmpl
new file mode 100644 (file)
index 0000000..35abeb4
--- /dev/null
@@ -0,0 +1,4 @@
+<H2 CLASS="title">Cancelar trabajos en {is_class?clase:impresora} {printer_name}</H2>
+
+<P>Se han cancelado todos los trabajos de la {is_class?clase:impresora} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>.</P>
index d382264..026677f 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Cambiar opciones predeterminadas de {printer_name}</H2>
 
 <P>Se han establecido con &eacute;xito las opciones predeterminadas de la
 {OP=set-class-options?clase <A HREF="/classes/{printer_name}">:impresora <A HREF="/printers/{printer_name}">}{printer_name}</A>.
-
-</DIV>
index 1de104a..71e4793 100644 (file)
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Borrar impresora {printer_name}</H2>
 
 <P><B>Advertencia:</B> &iquest;Est&aacute; seguro de querer borrar la impresora
 {printer_name}?</P>
 
 <P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Borrar impresora"></FORM></P>
-
-</DIV>
index 68b61f2..87a3c3c 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Poner la {is_class?clase:impresora} {printer_name} como predeterminada</H2>
 
 <P>Se ha puesto como predeterminada en el servidor la {is_class?clase:impresora} <A
@@ -9,5 +7,3 @@ HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>.</P>
 que haya sido activada por mediaci&oacute;n del comando
 <TT>lpoptions</TT> tiene mayor preferencia que este ajuste 
 predeterminado.</BLOCKQUOTE>
-
-</DIV>
index 8bf7db6..2cda454 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Borrar impresora {printer_name}</H2>
 
 <P>Se ha borrado con &eacute;xito la impresora {printer_name}.
-
-</DIV>
index f25951b..f571813 100644 (file)
@@ -1,3 +1 @@
-<DIV CLASS="indent">
 <H3 CLASS="title">Trabajos</H3>
-</DIV>
index 9035dce..328c6ea 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Modificar impresora {printer_name}</H2>
 
 <P>Se ha modificado con &eacute;xito la impresora <A HREF="/printers/{printer_name}">{printer_name}</A>.
-
-</DIV>
\ No newline at end of file
index 637e13e..8890935 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Rechazar trabajos de la {is_class?clase:impresora} {printer_name}</H2>
 
 <P>La {is_class?clase:impresora} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 ya no acepta trabajos.</P>
-
-</DIV>
index 117afcd..79695f6 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Reanudar la {is_class?clase:impresora} {printer_name}</H2>
 
 <P>La {is_class?clase:impresora} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 ha sido reanudada.</P>
-
-</DIV>
\ No newline at end of file
index af37494..0e9e267 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Pausar la {is_class?clase:impresora} {printer_name}</H2>
 
 <P>La {is_class?clase:impresora} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 ha sido puesta en pausa.</P>
-
-</DIV>
\ No newline at end of file
index f7642ac..7171289 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
 ({printer_state=3?inactiva:{printer_state=4?procesando:en pausa}},
 {printer_is_accepting_jobs=0?rechazando trabajos:aceptando trabajos},
@@ -15,9 +13,9 @@
 {printer_state=5?<OPTION VALUE="start-printer">Reanudar impresora</OPTION>:<OPTION VALUE="stop-printer">Pausar impresora</OPTION>}
 {printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Aceptar trabajos</OPTION>:<OPTION VALUE="reject-jobs">Rechazar trabajos</OPTION>}
 <OPTION VALUE="move-jobs">Mover todos los trabajos</OPTION>
-<OPTION VALUE="purge-jobs">Cancelar todos los trabajos</OPTION>
+<OPTION VALUE="cancel-jobs">Cancelar todos los trabajos</OPTION>
 </SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
 </FORM>
 
 <FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
 <OPTION VALUE="set-as-default">Poner como predeterminada del servidor</OPTION>
 <OPTION VALUE="set-allowed-users">Establecer usuarios permitidos</OPTION>
 </SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
 </FORM>
 
 <TABLE SUMMARY="{printer_name}">
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Descripci&oacute;n:</TH><TD>{printer_info}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Ubicaci&oacute;n:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Controlador:</TH><TD>{printer_make_and_model} ({color_supported=1?color:escala de grises}{sides_supported?, d&uacute;plex:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Controlador:</TH><TD>{printer_make_and_model} ({color_supported=1?color:escala de grises}{sides_supported=one-sided?:, d&uacute;plex})<BR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Conexi&oacute;n:</TH><TD>{device_uri}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Opciones predeterminadas:</TH><TD>job-sheets={job_sheets_default}
 media={media_default?{media_default}:desconocido}
 {sides_default?sides={sides_default}:}</TD></TR>
 </TABLE>
-
-</DIV>
index 607351d..0a20077 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Cambiar especificaciones</H2>
 
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+<P><IMG SRC="data:image/gif;base64,R0lGODlhEAAQAIQAAP///wAAAPDw8IqKiuDg4EZGRnp6egAAAFhYWCQkJKysrL6+vhQUFJycnAQEBDY2NmhoaP///////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQABQD/ACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAEFAB8ALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQBBQAfACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQBBQAfACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAQUAHwAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAQUAHwAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAEFAB8ALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAEFAB8ALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQBBQAfACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQBBQAfACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOw==" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
 ALT="Indicador de ocupado"> Por favor espere mientras se reinicia el servidor...</P>
-
-</DIV>
index 8a2740b..91a6074 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Establecer opciones predeterminadas de {printer_name}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
index 11adc70..b92988a 100644 (file)
@@ -12,5 +12,3 @@ for (var i = 0; i < paramtables.length; i++)
 }
 --></SCRIPT>
 </FORM>
-
-</DIV>
index 87ce96a..725b8bb 100644 (file)
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
 <P>Se ha a&ntilde;adido con &eacute;xito la subscripci&oacute;n {subscription_name}.</P>
-
-</DIV>
index d6ac171..8a68f54 100644 (file)
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
 <P>La subscripci&oacute;n #{notify_subscription_id} ha sido cancelada.</P>
-
-</DIV>
index 763dab5..d4fbffa 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Imprimir p&aacute;gina de prueba en {printer_name}</H2>
 
 <P>P&aacute;gina de prueba enviada; el n&uacute;mero del trabajo es el <A HREF="/{SECTION}/{printer_name}">
 {printer_name}-{job_id}</A>.</P>
-
-</DIV>
index 017693e..9bdd1a7 100644 (file)
@@ -1,8 +1,5 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS y el logo de CUPS son marcas registradas de
-<A HREF="http://www.apple.com">Apple, Inc.</A> Los derechos de copia de CUPS
-2007-2013 son de Apple Inc. Todos los derechos reservados.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+      </div>
+    </div>
+    <div class="footer">CUPS y el logo de CUPS son marcas registradas de <a href="http://www.apple.com">Apple Inc.</a> Derechos de autor &copy; 2007-2015 Apple Inc. Todos los derechos reservados.</div>
+  </body>
+</html>
index a8a645e..3d24a5a 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <FORM METHOD="POST" ACTION="/admin">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
@@ -27,4 +25,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
diff --git a/templates/fr/add-class.tmpl b/templates/fr/add-class.tmpl
deleted file mode 100644 (file)
index a4402d4..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Ajouter une classe</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Peux contenir n'importe quel caract&egrave;re sauf "/", "#", et espace)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Description:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Description compr&eacute;hensible comme "HP LaserJet Recto/Verso")</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Emplacement:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Emplacement compr&eacute;hensible comme "Lab 1")</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Membres:</TH>
-<TD>
-<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
-{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
-</SELECT>
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Ajouter la classe"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/add-printer.tmpl b/templates/fr/add-printer.tmpl
deleted file mode 100644 (file)
index 22dc07b..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Ajouter une imprimante</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
-<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
-<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
-<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
-{?current_make!?<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE" VALUE="{current_make}">:}
-{?current_make_and_model!?<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{current_make_and_model}">:}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?template_name}"><BR>
-<SMALL>(Peux contenir n'importe quel caract&egrave;re sauf "/", "#", et espace)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Description:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_INFO}"><BR>
-<SMALL>(Description compr&eacute;hensible comme "HP LaserJet Recto/Verso")</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Emplacement:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_LOCATION}"><BR>
-<SMALL>(Emplacement compr&eacute;hensible comme "Lab 1")</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Connexion:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Partage:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
-Partager cette imprimante</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continuer"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/add-rss-subscription.tmpl b/templates/fr/add-rss-subscription.tmpl
deleted file mode 100644 (file)
index e98ee1c..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription">
-
-<H2 CLASS="title">S'abonner &agrave; un flux RSS</H2>
-
-<TABLE SUMMARY="S'abonner &agrave; un flux RSS">
-<TR>
-<TH CLASS="label">Nom:</TH>
-<TD COLSPAN="5"><INPUT TYPE="TEXT" NAME="SUBSCRIPTION_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?SUBSCRIPTION_NAME}"><BR>
-<SMALL>(Peux contenir n'importe quel caract&egrave;re sauf "/", "#", et espace)</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">File:</TH>
-<TD COLSPAN="5"><SELECT NAME="PRINTER_URI" SIZE="10"><OPTION VALUE="#ALL#"{?PRINTER_URI=#ALL#? SELECTED:}>Toutes les files</OPTION>{[printer_name]<OPTION VALUE="{printer_uri_supported}"{?PRINTER_URI={printer_uri_supported}? SELECTED:}>{printer_name}</OPTION>}</SELECT></TD>
-</TR>
-<TR VALIGN="TOP">
-<TH CLASS="label">Ev&eacute;nements:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CREATED" {?EVENT_JOB_CREATED}>T&acirc;ches cr&eacute;es<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_COMPLETED" {?EVENT_JOB_COMPLETED}>T&acirc;ches finies<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_STOPPED" {?EVENT_JOB_STOPPED}>T&acirc;ches stopp&eacute;es<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CONFIG_CHANGED" {?EVENT_JOB_CONFIG_CHANGED}>Options de t&acirc;che modifi&eacute;es</TD>
-<TD>&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_STOPPED" {?EVENT_PRINTER_STOPPED}>Files arr&ecirc;t&eacute;es<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_ADDED" {?EVENT_PRINTER_ADDED}>File ajout&eacute;e<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_MODIFIED" {?EVENT_PRINTER_MODIFIED}>File modifi&eacute;e<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_DELETED" {?EVENT_PRINTER_DELETED}>File supprim&eacute;e</TD>
-<TD>&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STARTED" {?EVENT_SERVER_STARTED}>Serveur d&eacute;marr&eacute;<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STOPPED" {?EVENT_SERVER_STOPPED}>Serveur arr&ecirc;t&eacute;<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_RESTARTED" {?EVENT_SERVER_RESTARTED}>Serveur red&eacute;marr&eacute;<BR>
-<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Audit de s&eacute;curit&eacute; du serveur</TD>
-</TR>
-<TR>
-<TH CLASS="label">Nombre maximum d'&eacute;v&eacute;nements:</TH>
-<TD COLSPAN="5"><INPUT TYPE="NUMBER" NAME="MAX_EVENTS" SIZE="4" MAXLENGTH="4" VALUE="{MAX_EVENTS?{MAX_EVENTS}:20}"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD COLSPAN="5"><INPUT TYPE="SUBMIT" VALUE="S'abonner &agrave; un flux RSS"></TD>
-</TR>
-</TABLE>
-
-</FORM>
diff --git a/templates/fr/admin.tmpl b/templates/fr/admin.tmpl
deleted file mode 100644 (file)
index 304e77b..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<TABLE CLASS="indent" SUMMARY="T&acirc;ches d'Administration">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">Imprimantes</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Ajouter une imprimante"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Trouver de nouvelles imprimantes"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="G&eacute;rer les Imprimantes"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Exporter les imprimantes vers Samba"></FORM>:}
-</P>
-
-<H2 CLASS="title">Classes</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Ajouter une classe"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="G&eacute;rer les Classes"></FORM>
-</P>
-
-<H2 CLASS="title">T&acirc;ches</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="G&eacute;rer les T&acirc;ches"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">Serveur</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Editer le Fichier de Configuration"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Visualiser Access Log"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Visualiser Error Log"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Visualiser Page Log"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>Param&egrave;tres du serveur\:</B></P>
-
-<P><A HREF="/admin/">Avanc&eacute; <SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Partager les imprimantes connect&eacute;es &agrave; ce syst&egrave;me<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nombre maximum de clients\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Autoriser l'impression depuis Internet<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Annoncer l'interface Web<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Autoriser l'administration &agrave; distance<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Utiliser l'authentification Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Autoriser les utilisateurs &agrave; annuler n'importe quelle t&acirc;che (Pas seulement les leurs)<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Conserver l'historique des t&acirc;ches<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nombre de t&acirc;ches\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Conserver les meta-donn&eacute;es\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Conserver les documents\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Enregistrer les informations de debug pour la r&eacute;solution de probl&egrave;mes<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Taille maximum du fichier de log\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>Param&egrave;tres du Serveur:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Avanc&eacute; <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Partager les imprimantes connect&eacute;es &agrave; ce syst&egrave;me<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Autoriser l'impression depuis Internet<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Autoriser l'administration &agrave; distance<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Utiliser l'authentification Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Autoriser les utilisateurs &agrave; annuler n'importe quelle t&acirc;che (Pas seulement les leurs)<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Enregistrer les informations de debug pour la r&eacute;solution de probl&egrave;mes</P>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Modifier les param&egrave;tres"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Abonnements RSS</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Ajouter un abonnement RSS"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="Abonnements RSS">
-<THEAD><TR><TH>Nom</TH><TH>Ev&eacute;nements</TH><TH>Nom de la File</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Annuler l'abonnement RSS"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:Toutes les Files}</TD></TR>}
-</TBODY>
-</TABLE>:}
diff --git a/templates/fr/choose-device.tmpl b/templates/fr/choose-device.tmpl
deleted file mode 100644 (file)
index 2bcb430..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}</H2>
-
-{CUPS_GET_DEVICES_DONE?<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-
-<TABLE>
-{op=add-printer?:<TR>
-<TH CLASS="label">Connexion courante\:</TH>
-<TD><INPUT TYPE="RADIO" NAME="DEVICE_URI" VALUE="{current_device_uri}" CHECKED>
-{current_device_uri}</TD>
-</TR>}
-<TR>
-<TH CLASS="label">Imprimantes locales\:</TH>
-<TD>
-{[device_uri]{device_class!network?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
-:}}
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">Imprimantes R&eacute;seaux D&eacute;couvertes\:</TH>
-<TD>
-{[device_uri]{device_class=network?{device_uri~[a-z]+://?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
-:}:}}
-</TD>
-</TR>
-<TR>
-<TR>
-<TH CLASS="label">Autres Imprimantes R&eacute;seaux\:</TH>
-<TD>
-{[device_uri]{device_class=network?{device_uri~[a-z]+://?:<INPUT TYPE="RADIO" NAME="DEVICE_URI"
-VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
-{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
-}:}}
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continuer"></TD>
-</TR>
-</TABLE>
-
-</FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Indicateur d'occupation"> Recherche en cours...</P>}
-
-</DIV>
diff --git a/templates/fr/choose-make.tmpl b/templates/fr/choose-make.tmpl
deleted file mode 100644 (file)
index d48dfc1..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}</H2>
-
-<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
-<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
-<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
-<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
-
-<TABLE>
-{op=modify-printer?:<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
-</TR>}
-<TR>
-<TH CLASS="label">Description:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Emplacement:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Connexion:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Partage:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
-{?printer_is_shared=?Ne pas:{?printer_is_shared=0?Ne pas:}} Partager cette Imprimante</TD>
-</TR>
-<TR>
-<TH CLASS="label">Marque:</TH>
-<TD>
-<SELECT NAME="PPD_MAKE" SIZE="10">
-{[ppd_make]<OPTION VALUE="{ppd_make}" {?current_make={ppd_make}?SELECTED:}>{ppd_make}}
-</SELECT>
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continuer"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD>&nbsp;</TD>
-</TR>
-<TR>
-<TH CLASS="label">Ou donner un fichier PPD:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
-TYPE="FILE" NAME="PPD_FILE"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="{op=add-printer?Ajouter une imprimante:Modifier l'imprimante}"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/choose-model.tmpl b/templates/fr/choose-model.tmpl
deleted file mode 100644 (file)
index 5428153..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}</H2>
-
-<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
-<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
-<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
-<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
-<TABLE>
-{op=modify-printer?:<TR>
-<TH CLASS="label">Nom:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
-</TR>}
-<TR>
-<TH CLASS="label">Description:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Emplacement:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Connexion:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Partage:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
-{?printer_is_shared=?Ne pas:{?printer_is_shared=0?Ne pas:}} Partager cette imprimante</TD>
-</TR>
-<TR>
-<TH CLASS="label">Marque:</TH>
-<TD>{PPD_MAKE} <INPUT TYPE="SUBMIT" NAME="SELECT_MAKE" VALUE="Choisir un autre fabriquant"></TD>
-</TR>
-<TR>
-<TH CLASS="label">Mod&egrave;le:</TH>
-<TD>
-<SELECT NAME="PPD_NAME" SIZE="10">
-{op=add-printer?:<OPTION VALUE="__no_change__" SELECTED>Pilote courrant - {current_make_and_model}</OPTION>:}
-{[ppd_name]<OPTION VALUE="{ppd_name}" {op=modify-printer?:{?current_make_and_model={ppd_make_and_model}?SELECTED:}}>{ppd_make_and_model} ({ppd_natural_language})
-}</SELECT>
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">Ou donner un fichier PPD:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
-TYPE="FILE" NAME="PPD_FILE"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="{op=add-printer?Ajouter une imprimante:Modifier une imprimante}"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/choose-serial.tmpl b/templates/fr/choose-serial.tmpl
deleted file mode 100644 (file)
index a1c7204..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Connexion:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Baud/s:</TH>
-<TD><SELECT NAME="BAUDRATE">
-{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Parit&eacute;:</TH>
-<TD><SELECT NAME="PARITY">
-<OPTION VALUE="none" {?parity=none?SELECTED:}>Aucune
-<OPTION VALUE="even" {?parity=even?SELECTED:}>Paire
-<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Impaire
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Bits de donn&eacute;es:</TH>
-<TD><SELECT NAME="BITS">
-<OPTION {?bits=8?SELECTED:}>8
-<OPTION {?bits=7?SELECTED:}>7
-</SELECT></TD>
-</TR>
-<TR>
-<TH CLASS="label">Contr&ocirc;le de flux:</TH>
-<TD><SELECT NAME="FLOW">
-<OPTION VALUE="none" {?flow=none?SELECTED:}>Aucun
-<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (Logiciel)
-<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (Mat&egrave;riel)
-<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (Mat&egrave;riel)
-</SELECT></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continuer"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/choose-uri.tmpl b/templates/fr/choose-uri.tmpl
deleted file mode 100644 (file)
index 72b4a5e..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
-<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Connexion:</TH>
-<TD><INPUT TYPE="URL" SIZE="60" MAXLENGTH="1023" NAME="DEVICE_URI" VALUE="{current_device_uri?{current_device_uri}:{device_uri}}"></TD>
-</TR>
-<TR>
-<TD></TD>
-<TD>Exemples:
-<PRE>
-    http://hostname:631/ipp/
-    http://hostname:631/ipp/port1
-
-    ipp://hostname/ipp/
-    ipp://hostname/ipp/port1
-
-    lpd://hostname/queue
-
-    socket://hostname
-    socket://hostname:9100
-</PRE>
-
-<P>Cf. <A HREF="/help/network.html" TARGET="_blank">"Imprimantes
-R&eacute;seaux"</A> pour construire l'URI &agrave; employ&eacute;e avec votre imprimante.</P>
-
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continuer"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/class-added.tmpl b/templates/fr/class-added.tmpl
deleted file mode 100644 (file)
index 7ed1648..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Ajouter une Classe</H2>
-
-<P>La classe <A HREF="/classes/{printer_name}">{printer_name}</A> a &eacute;t&eacute; ajout&eacute;e
-avec succ&egrave;s.
-
-</DIV>
diff --git a/templates/fr/class-confirm.tmpl b/templates/fr/class-confirm.tmpl
deleted file mode 100644 (file)
index 276ec34..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Supprimer la classe {printer_name}</H2>
-
-<P><B>Attention:</B> Etes-vous sur(e) de vouloir supprimer la classe 
-{printer_name}?</P>
-
-<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Supprimer la classe"></FORM></P>
-
-</DIV>
diff --git a/templates/fr/class-deleted.tmpl b/templates/fr/class-deleted.tmpl
deleted file mode 100644 (file)
index 6f8aefa..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Supprimer la classe {printer_name}</H2>
-
-<P>La classe {printer_name} a &eacute;t&eacute; supprim&eacute;e avec succ&egrave;s.
-
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/class-jobs-header.tmpl b/templates/fr/class-jobs-header.tmpl
deleted file mode 100644 (file)
index 551f47e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<DIV CLASS="indent">
-<H3 CLASS="title">T&acirc;ches</H3>
-</DIV>
diff --git a/templates/fr/class-modified.tmpl b/templates/fr/class-modified.tmpl
deleted file mode 100644 (file)
index e4b8b5a..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifier la Classe {printer_name}</H2>
-
-<P>La classe <A HREF="/classes/{printer_name}">{printer_name}</A> a &eacute;t&eacute; 
-modifi&eacute;e avec succ&egrave;s.
-
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/class.tmpl b/templates/fr/class.tmpl
deleted file mode 100644 (file)
index 0d6d891..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<DIV CLASS="indent">
-<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?En attente:{printer_state=4?En cours d'impression:Arr&ecirc;t&eacute;}},
-{printer_is_accepting_jobs=0?Rejette les t&acirc;ches:Accepte les t&acirc;ches},
-{server_is_sharing_printers=0?Non:{printer_is_shared=0?Non:}} Partag&eacute;e{default_name={printer_name}?, Imprimante par d&eacute;faut:})</H2>
-
-<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
-<OPTION VALUE="">Maintenance</OPTION>
-<OPTION VALUE="print-test-page">Imprimer une page de test</OPTION>
-{printer_state=5?<OPTION VALUE="start-class">D&eacute;marrer la classe</OPTION>:<OPTION VALUE="stop-class">Arr&ecirc;ter la classe</OPTION>}
-{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Accepter les t&acirc;ches</OPTION>:<OPTION VALUE="reject-jobs">Rejeter les t&acirc;ches</OPTION>}
-<OPTION VALUE="move-jobs">Transf&eacute;rer toutes les t&acirc;ches</OPTION>
-<OPTION VALUE="purge-jobs">Annuler toutes les t&acirc;ches</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
-<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="1">
-<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
-<OPTION VALUE="">Administration</OPTION>
-<OPTION VALUE="modify-class">Modifier la classe</OPTION>
-<OPTION VALUE="delete-class">Supprimer la classe</OPTION>
-<OPTION VALUE="set-class-options">R&eacute;initialiser les options</OPTION>
-<OPTION VALUE="set-as-default">D&eacute;finir par d&eacute;faut</OPTION>
-<OPTION VALUE="set-allowed-users">D&eacute;finir les autorisations</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<TABLE SUMMARY="{printer_name}">
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Description:</TH><TD>{printer_info}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Emplacement:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Membres:</TH><TD>{?member_uris=?None:{member_uris}}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">D&eacute;fauts:</TH><TD>job-sheets={job_sheets_default}
-media={media_default?{media_default}:inconnu}
-{sides_default?sides={sides_default}:}</TD></TR>
-</TABLE>
-
-</DIV>
diff --git a/templates/fr/classes-header.tmpl b/templates/fr/classes-header.tmpl
deleted file mode 100644 (file)
index 3c4d1ba..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<P ALIGN="CENTER">{total=0?Pas de classes:Affichage de {#printer_name} classe{total=1?:s}} sur {total}.</P>
diff --git a/templates/fr/classes.tmpl b/templates/fr/classes.tmpl
deleted file mode 100644 (file)
index 0a04ebe..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{#printer_name=0?:
-<TABLE CLASS="list" SUMMARY="Liste des Classes">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Nom de la file <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Nom de la file <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Description</TH><TH>Emplacement</TH><TH>Membres</TH><TH>&Eacute;tat</TH></TR>
-</THEAD>
-<TBODY>
-{[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?Aucun:{member_uris}}</TD><TD>{printer_state=3?Inoccup&eacute;:{printer_state=4?En cours d'impression:En pause}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
-}
-</TBODY>
-</TABLE></DIV>}
diff --git a/templates/fr/command.tmpl b/templates/fr/command.tmpl
deleted file mode 100644 (file)
index bcd0f90..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{title} sur {printer_name}</H2>
-
-<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
-ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }Commandes de t&acirc;che d'impression
-{job_state=3?en attente:{job_state=4?retenu:
-{job_state=5?en cours d'impression:{job_state=6?arr&ecirc;t&eacute;:
-{job_state=7?annul&eacute;:{job_state=8?annul&eacute;:termin&eacute;}}}}}}{job_state=9?:{job_printer_state_message?,
-<EM>"{job_printer_state_message}"</EM>:}}</P>
-
-</DIV>
diff --git a/templates/fr/edit-config.tmpl b/templates/fr/edit-config.tmpl
deleted file mode 100644 (file)
index 62d1414..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<SCRIPT TYPE="text/javascript">
-function reset_config()
-{
-  document.cups.CUPSDCONF.value = "{?cupsdconf_default}";
-}
-</SCRIPT>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Edition du Fichier de Configuration</H2>
-
-<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-
-<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
-
-<P><INPUT TYPE="SUBMIT" NAME="SAVECHANGES" VALUE="Enregistrer les modifications">
-<INPUT TYPE="BUTTON" VALUE="Utiliser le fichier de configuration par d&eacute;faut"
-onClick="reset_config();"></P>
-
-</FORM>
-
-</DIV>
diff --git a/templates/fr/error-op.tmpl b/templates/fr/error-op.tmpl
deleted file mode 100644 (file)
index ba5c91c..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{?title} {?printer_name} Erreur</H2>
-
-<P>Erreur:</P>
-
-<BLOCKQUOTE>Op&eacute;ration inconnue "{op}"!</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/fr/error.tmpl b/templates/fr/error.tmpl
deleted file mode 100644 (file)
index 2ce2451..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{?title} {?printer_name} Erreur</H2>
-
-<P>{?message?{message}:Erreur}:</P>
-
-<BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/fr/header.tmpl.in b/templates/fr/header.tmpl.in
deleted file mode 100644 (file)
index d7f00c1..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-       {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;Accueil&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;Administration&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;Classes&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;Aide&nbsp;En&nbsp;Ligne&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;T&acirc;ches&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;Imprimantes&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
diff --git a/templates/fr/help-header.tmpl b/templates/fr/help-header.tmpl
deleted file mode 100644 (file)
index 751136d..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<DIV CLASS="indent">
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
-{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
-
-<P ALIGN="CENTER"><B>Rechercher dans
-{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:tous les documents}}:</B> <INPUT
-TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER=""
-AUTOSAVE="org.cups.help" RESULTS="20">
-<INPUT TYPE="SUBMIT" NAME="SEARCH" VALUE="Rechercher">
-<INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Vider"></P>
-
-</FORM>
-
-<!-- Bookmarks -->
-<DIV CLASS="sidebar"><TABLE CLASS="inset" SUMMARY="Contenus">
-<TR><TD>
-
-<H3 CLASS="title">Documents d'aide en ligne</H3>
-
-<P CLASS="l0"><A HREF="/help/{QUERY??QUERY={QUERY}:}">Tous les documents</A></P>
-<HR>
-
-{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
-}
-</TD></TR>
-</TABLE></DIV>
-
-{QUERY?<P>R&eacute;sultats de la recherche dans {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:tous les documents}}\:</P>
-{QTEXT?<UL>
-{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (in <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
-{QTEXT?</UL>:}
-:<P>Aucun r&eacute;sultat trouv&eacute;.</P>}
-<HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Voir la version imprimable"></FORM>:
-
-<H1>Aide en ligne</H1>
-
-<P>Voici l'interface d'aide en ligne de CUPS. Entrez ci-dessus les mots &agrave; rechercher
-ou cliquez sur un lien ci-contre pour afficher
-l'aide en ligne du document.</P>
-
-<P>Si vous &ecirc;tes un nouvel utilisateur de CUPS, lisez la page "<a
-href="/help/overview.html">Pr&eacute;sentation de CUPS</a>". Il est conseill&eacute; aux utilisateurs habitu&eacute;s
-de lire la page "<a href="/help/whatsnew.html">Quoi de neuf dans CUPS
-1.6</a>".</P>
-
-<P>La <A HREF="http://www.cups.org/">page d'accueil de CUPS</A> donne aussi
-acc&egrave;s &agrave; de nombreuses ressources, comme des forums de discussion pour les
-utilisateurs, des r&eacute;ponses aux questions fr&eacute;quentes, et un formulaire pour
-soumettre des rapports de bug ou des demandes pour de nouvelles fonctionnalit&eacute;s.</P>}
diff --git a/templates/fr/help-trailer.tmpl b/templates/fr/help-trailer.tmpl
deleted file mode 100644 (file)
index 4c1ebed..0000000
+++ /dev/null
@@ -1 +0,0 @@
-</DIV>
diff --git a/templates/fr/job-cancel.tmpl b/templates/fr/job-cancel.tmpl
deleted file mode 100644 (file)
index ab54269..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Annuler la T&acirc;che {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La t&acirc;che {job_id}</A> a &eacute;t&eacute; annul&eacute;e.
-
-</DIV>
diff --git a/templates/fr/job-hold.tmpl b/templates/fr/job-hold.tmpl
deleted file mode 100644 (file)
index 7c85916..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Retenir la t&acirc;che {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La t&acirc;che {job_id}</A> a &eacute;t&eacute; retenue.
-
-</DIV>
diff --git a/templates/fr/job-move.tmpl b/templates/fr/job-move.tmpl
deleted file mode 100644 (file)
index 4cca760..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<DIV CLASS="indent">
-
-<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{job_id?<INPUT TYPE="HIDDEN" NAME="JOB_ID" VALUE="{job_id}">:}
-
-<H2 CLASS="title">{job_id?Transf&eacute;rer la t&acirc;che {job_id}:Transf&eacute;rer toutes les t&acirc;ches}</H2>
-
-<TABLE>
-<TR>
-<TH CLASS="label">Nouvelle destination:</TH>
-<TD>
-<SELECT NAME="JOB_PRINTER_URI" SIZE="10">
-{[job_printer_uri]<OPTION VALUE="{job_printer_uri}">{job_printer_name}}
-</SELECT>
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="{job_id?Transf&eacute;rer la t&acirc;che:Transf&eacute;rer les t&acirc;ches}"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-
-</DIV>
diff --git a/templates/fr/job-moved.tmpl b/templates/fr/job-moved.tmpl
deleted file mode 100644 (file)
index ba28d33..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{job_id?Transf&eacute;rer la t&acirc;che {job_id}:Transf&eacute;rer toutes les t&acirc;ches}</H2>
-
-<P>{job_id?<A HREF="/jobs/{job_id}">Job {job_id}</A>:Toutes les t&acirc;ches} transf&eacute;r&eacute;e(s) vers
-<A HREF="/{is_class?classes:printers}/{job_printer_name}">{job_printer_name}</A>.</P>
-
-</DIV>
diff --git a/templates/fr/job-release.tmpl b/templates/fr/job-release.tmpl
deleted file mode 100644 (file)
index 4bfc1b9..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Lib&eacute;rer la T&acirc;che {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La t&acirc;che {job_id}</A> a &eacute;t&eacute; lib&eacute;r&eacute;e.
-
-</DIV>
diff --git a/templates/fr/job-restart.tmpl b/templates/fr/job-restart.tmpl
deleted file mode 100644 (file)
index 0858840..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">R&eacute;imprimer la T&acirc;che {job_id}</H2>
-
-<P><A HREF="{job_printer_uri}">La t&acirc;che {job_id}</A> a &eacute;t&eacute; relanc&eacute;e.
-
-</DIV>
diff --git a/templates/fr/jobs-header.tmpl b/templates/fr/jobs-header.tmpl
deleted file mode 100644 (file)
index c863005..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Affichage des t&acirc;ches actives"></FORM>}
-{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Affichage des t&acirc;ches termin&eacute;es"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Affichage de toutes les t&acirc;ches"></FORM>}</DIV>
-
-<P ALIGN="CENTER">{total=0?Pas de t&acirc;che:Affichage de {#job_id} t&acirc;che{total>1?s:}} {?which_jobs=?active{total>1?s:}:{which_jobs=all?:termin&eacute;e{total>1?s:}}} {total=0?:sur {total}} .</P>
diff --git a/templates/fr/jobs.tmpl b/templates/fr/jobs.tmpl
deleted file mode 100644 (file)
index c760d76..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-{#job_id=0?:
-<TABLE CLASS="list" SUMMARY="Listes des t&acirc;ches">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> ID <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> ID <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Nom</TH><TH>Utilisateur</TH><TH>Taille</TH><TH>Pages</TH><TH>&Eacute;tat</TH><TH>Contr&ocirc;le</TH></TR>
-</THEAD>
-<TBODY>
-{[job_id]
-<TR VALIGN="TOP">
-<TD><A HREF="{job_printer_uri}">{job_printer_name}</A>-{job_id}{?phone? ({phone}):}&nbsp;</TD>
-<TD>{?job_name=?Inconnu:{job_name}}&nbsp;</TD>
-<TD>{?job_originating_user_name=?Withheld:{job_originating_user_name}}&nbsp;</TD>
-<TD>{job_k_octets}k&nbsp;</TD>
-<TD>{job_media_sheets_completed=0?Inconnu:{?job_media_sheets_completed}}&nbsp;</TD>
-<TD>{job_state=3?en attente depuis<BR>{time_at_creation}:{job_state=4?retenu depuis<BR>{time_at_creation}:
-{job_state=5?en cours d'impression depuis<BR>{time_at_processing}:{job_state=6?arr&ecirc;t&eacute;:
-{job_state=7?annul&eacute; &acirc;<BR>{time_at_completed}:{job_state=8?annul&eacute;:termin&eacute; &agrave;<BR>{time_at_completed}}}}}}}&nbsp;{job_printer_state_message?<BR>
-<EM>"{job_printer_state_message}"</EM>:}</TD>
-<TD>
-{job_preserved>0?{job_state>5?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="restart-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}"><INPUT TYPE="SUBMIT" VALUE="R&eacute;imprimer la t&acirc;che"></FORM>:}:}
-{job_state=4?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="release-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Lib&eacute;rer la t&acirc;che"></FORM>:}
-{job_state=3?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="hold-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Retenir la t&acirc;che"></FORM>:}
-{job_state<7?
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
-<INPUT TYPE="SUBMIT" VALUE="Annuler la t&acirc;che"></FORM>
-<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="move-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="SUBMIT" VALUE="Transf&eacute;rer la t&acirc;che"></FORM>:}
-&nbsp;</TD>
-</TR>
-}
-</TBODY>
-</TABLE>
-}
diff --git a/templates/fr/list-available-printers.tmpl b/templates/fr/list-available-printers.tmpl
deleted file mode 100644 (file)
index dcc9937..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Imprimantes Disponibles</H2>
-
-{#device_uri=0?<P>Aucune imprimante trouv&eacute;e.</P>
-:<UL>{[device_uri]
-<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Ajouter cette imprimante"></FORM>
-{device_make_and_model} ({device_info})</LI>
-}</UL>}
-
-</DIV>
diff --git a/templates/fr/modify-class.tmpl b/templates/fr/modify-class.tmpl
deleted file mode 100644 (file)
index 791c560..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifier la Classe {printer_name}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Description:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
-</TR>
-<TR>
-<TH CLASS="label">Emplacement:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
-</TR>
-<TR>
-<TH CLASS="label">Membres:</TH>
-<TD>
-<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
-{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
-</SELECT>
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Modifier la classe"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/modify-printer.tmpl b/templates/fr/modify-printer.tmpl
deleted file mode 100644 (file)
index 03e1b66..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifier {printer_name}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
-<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
-<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
-<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-
-<TABLE>
-<TR>
-<TH CLASS="label">Description:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Description compr&eacute;hensible comme "HP LaserJet Recto/Verso")</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Emplacement:</TH>
-<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>(Emplacement compr&eacute;hensible comme "Lab 1")</SMALL></TD>
-</TR>
-<TR>
-<TH CLASS="label">Connexion:</TH>
-<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
-</TR>
-<TR>
-<TH CLASS="label">Partage:</TH>
-<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}>
-Partager cette imprimante</TD>
-</TR>
-<TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Continuer"></TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
diff --git a/templates/fr/norestart.tmpl b/templates/fr/norestart.tmpl
deleted file mode 100644 (file)
index 95965c6..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifier les Param&egrave;tres</H2>
-
-<P>Le serveur n'a pas &eacute;t&eacute; red&eacute;marr&eacute; car la configuration
-n'a pas &eacute;t&eacute; modifi&eacute;e...</P>
-
-</DIV>
diff --git a/templates/fr/option-conflict.tmpl b/templates/fr/option-conflict.tmpl
deleted file mode 100644 (file)
index 7077aac..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<P><B>Erreur:</B> Les options suivantes sont incompatibles entre elles:</P>
-
-<UL>
-{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A>: {cchoice}</LI>
-}</UL>
-
-<P>Veuillez modifier une ou plusieurs de ces options pour r&eacute;soudre les conflits.</P>
diff --git a/templates/fr/option-pickone.tmpl b/templates/fr/option-pickone.tmpl
deleted file mode 100644 (file)
index 3e3deeb..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-<TR>
-<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
-<TD><SELECT NAME="{keyword}" ID="select-{keyword}" ONCHANGE="update_paramtable('{keyword}')">
-{[choices]<OPTION {choices={defchoice-1}?SELECTED:} VALUE="{choices}">{text}}
-</SELECT>
-{iscustom=1?<TABLE NAME="paramtable" id="{keyword}-params">{[params]
-<TR><TH CLASS="sublabel">{paramtext}:</TH>
-<TD>{params=Units?<SELECT NAME="{keyword-1}.{params}">
-<OPTION VALUE="pt"{paramvalue=pt? SELECTED:}>Points</OPTION>
-<OPTION VALUE="mm"{paramvalue=mm? SELECTED:}>Millim&eagrave;tres</OPTION>
-<OPTION VALUE="cm"{paramvalue=cm? SELECTED:}>Centim&eagrave;tres</OPTION>
-<OPTION VALUE="in"{paramvalue=in? SELECTED:}>Pouces</OPTION>
-<OPTION VALUE="ft"{paramvalue=ft? SELECTED:}>Pieds</OPTION>
-<OPTION VALUE="m"{paramvalue=m? SELECTED:}>M&egrave;tres</OPTION>
-</SELECT>:<INPUT TYPE="{inputtype}" NAME="{keyword-1}.{params}" VALUE="{paramvalue}">}</TD></TR>
-}</TABLE>
-</TD>:}
-</TR>
diff --git a/templates/fr/option-trailer.tmpl b/templates/fr/option-trailer.tmpl
deleted file mode 100644 (file)
index ceff313..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-</TABLE>
-
-<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="D&eacute;finir les options par d&eacute;faut"></P>
-
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/pager.tmpl b/templates/fr/pager.tmpl
deleted file mode 100644 (file)
index c4e7ba5..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<TABLE CLASS="inset" SUMMARY="Mise en Page">
-<TR>
-       <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="&#x25c0; Montrer les pr&eacute;c&eacute;dentes"></FORM>:&nbsp;}</TD>
-       <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="Montrer les suivantes &#x25b6;"></FORM>:&nbsp;}</TD>
-</TR>
-</TABLE>
diff --git a/templates/fr/printer-accept.tmpl b/templates/fr/printer-accept.tmpl
deleted file mode 100644 (file)
index cc25a09..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Accepte les T&acirc;ches sur {is_class?la classe:l'imprimante} {printer_name}</H2>
-
-<P>{is_class?La classe:L'imprimante} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-accepte d&eacute;sormais les t&acirc;ches d'impression.</P>
-
-</DIV>
diff --git a/templates/fr/printer-added.tmpl b/templates/fr/printer-added.tmpl
deleted file mode 100644 (file)
index ce0a3b4..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Ajouter une imprimante</H2>
-
-<P>L'imprimante <A HREF="/printers/{printer_name}">{printer_name}</A> a &eacute;t&eacute; ajout&eacute;e
-avec succ&egrave;s.
-
-</DIV>
diff --git a/templates/fr/printer-configured.tmpl b/templates/fr/printer-configured.tmpl
deleted file mode 100644 (file)
index 79ccb15..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">D&eacute;finir les options par d&eacute;faut pour {printer_name}</H2>
-
-<P>{OP=set-class-options?Class <A HREF="/classes/{printer_name}">:l'imprimante <A HREF="/printers/{printer_name}">}{printer_name}</A>
- a &eacute;t&eacute; configur&eacute;e avec succ&egrave;s.
-
-</DIV>
diff --git a/templates/fr/printer-confirm.tmpl b/templates/fr/printer-confirm.tmpl
deleted file mode 100644 (file)
index 715ddd1..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Supprimer l'imprimante {printer_name}</H2>
-
-<P><B>Warning:</B> Etes-vous s&ucirc;r(e) de vouloir supprimer l'imprimante 
-{printer_name}?</P>
-
-<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Supprimer l'imprimante"></FORM></P>
-
-</DIV>
diff --git a/templates/fr/printer-default.tmpl b/templates/fr/printer-default.tmpl
deleted file mode 100644 (file)
index d7f3703..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">D&eacute;finir {is_class?la classe:l'imprimante} {printer_name} comme imprimante par d&eacute;faut</H2>
-
-<P>{is_class?La classe:L'imprimante} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-a &eacute;t&eacute; d&eacute;finie comme imprimante par d&eacute;faut du serveur.</P>
-
-<BLOCKQUOTE><B>Note:</B> Tout param&egrave;tre utilisateur d&eacute;fini via la commande 
-<TT>lpoptions</TT> sera prioritaire sur le param&egrave;tre d&eacute;fini i&ccedil;i.
-</BLOCKQUOTE>
-
-</DIV>
diff --git a/templates/fr/printer-deleted.tmpl b/templates/fr/printer-deleted.tmpl
deleted file mode 100644 (file)
index 43af955..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Supprimer l'imprimante {printer_name}</H2>
-
-<P>L'imprimante {printer_name} a &eacute;t&eacute; supprim&eacute;e avec succ&egrave;s.
-
-</DIV>
diff --git a/templates/fr/printer-jobs-header.tmpl b/templates/fr/printer-jobs-header.tmpl
deleted file mode 100644 (file)
index 551f47e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<DIV CLASS="indent">
-<H3 CLASS="title">T&acirc;ches</H3>
-</DIV>
diff --git a/templates/fr/printer-modified.tmpl b/templates/fr/printer-modified.tmpl
deleted file mode 100644 (file)
index db962dc..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifier l'Imprimante {printer_name}</H2>
-
-<P>L'imprimante <A HREF="/printers/{printer_name}">{printer_name}</A> a &eacute;t&eacute;
-modifi&eacute;e avec succ&egrave;s.
-
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/printer-purge.tmpl b/templates/fr/printer-purge.tmpl
deleted file mode 100644 (file)
index ce167b9..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Purger les T&acirc;ches sur {is_class?la classe:l'imprimante} {printer_name}</H2>
-
-<P>Toutes les t&acirc;ches de {is_class?la classe:l'imprimante} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-ont &eacute;t&eacute; purg&eacute;es.</P> 
-
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/printer-reject.tmpl b/templates/fr/printer-reject.tmpl
deleted file mode 100644 (file)
index 36edcb8..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Rejeter les T&acirc;ches sur {is_class?Classe:Imprimante} {printer_name}</H2>
-
-<P>{is_class?La classe:L'imprimante} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-n'accepte plus les t&acirc;ches d'impression.</P>
-
-</DIV>
diff --git a/templates/fr/printer-start.tmpl b/templates/fr/printer-start.tmpl
deleted file mode 100644 (file)
index f476c62..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">D&eacute;marrer {is_class?la classe:l'imprimante} {printer_name}</H2>
-
-<P>{is_class?La classe:L'imprimante} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-a &eacute;t&eacute; d&eacute;marr&eacute;e.</P>
-
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/printer-stop.tmpl b/templates/fr/printer-stop.tmpl
deleted file mode 100644 (file)
index eb36fb5..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Arr&ecirc;ter {is_class?la classe:l'imprimante} {printer_name}</H2>
-
-<P>{is_class?La classe:L'imprimante} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-a &eacute;t&eacute; arr&ecirc;t&eacute;e.</P>
-
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/printer.tmpl b/templates/fr/printer.tmpl
deleted file mode 100644 (file)
index b5e89f0..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?Inoccup&eacute;e:{printer_state=4?En cours d'impression:En pause}},
-{printer_is_accepting_jobs=0?Rejette les t&acirc;ches:Accepte les t&acirc;ches},
-{server_is_sharing_printers=0?Non:{printer_is_shared=0?Non:}} Partag&eacute;e{default_name={printer_name}?, Imprimante par d&eacute;faut:})</H2>
-
-<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
-<OPTION VALUE="">Maintenance</OPTION>
-<OPTION VALUE="print-test-page">Imprimer une page de test</OPTION>
-{printer_commands~.*Clean.*?<OPTION VALUE="clean-print-heads">Nettoyer les t&ecirc;tes d'impression</OPTION>:}
-{printer_commands~.*PrintSelfTestPage.*?<OPTION VALUE="print-self-test-page">Imprimer la page de test de l'imprimante</OPTION>:}
-{printer_state=5?<OPTION VALUE="start-printer">D&eacute;marrer l'imprimante</OPTION>:<OPTION VALUE="stop-printer">Arr&ecirc;ter l'imprimante</OPTION>}
-{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Accepter les t&acirc;ches</OPTION>:<OPTION VALUE="reject-jobs">Rejeter les t&acirc;ches</OPTION>}
-<OPTION VALUE="move-jobs">Transf&eacute;rer toutes les t&acirc;ches</OPTION>
-<OPTION VALUE="purge-jobs">Purger toutes les t&acirc;ches</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
-<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
-<OPTION VALUE="">Administration</OPTION>
-<OPTION VALUE="modify-printer">Modifier l'imprimante</OPTION>
-<OPTION VALUE="delete-printer">Supprimer l'imprimante</OPTION>
-<OPTION VALUE="set-printer-options">D&eacute;finir les options de l'imprimante</OPTION>
-<OPTION VALUE="set-as-default">D&eacute;finir par d&eacute;faut</OPTION>
-<OPTION VALUE="set-allowed-users">D&eacute;finir les autorisations</OPTION>
-</SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
-</FORM>
-
-<TABLE SUMMARY="{printer_name}">
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Description:</TH><TD>{printer_info}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Emplacement:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Pilote:</TH><TD>{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})<BR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Connexion:</TH><TD>{device_uri}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">D&eacute;fauts:</TH><TD>job-sheets={job_sheets_default}
-media={media_default?{media_default}:inconnu}
-{sides_default?sides={sides_default}:}</TD></TR>
-</TABLE>
-
-</DIV>
\ No newline at end of file
diff --git a/templates/fr/printers-header.tmpl b/templates/fr/printers-header.tmpl
deleted file mode 100644 (file)
index fe6753f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<P ALIGN="CENTER">{total=0?Pas d'imprimante:Affichage de {#printer_name} sur {total} imprimante{total>1?s:}}.</P>
diff --git a/templates/fr/printers.tmpl b/templates/fr/printers.tmpl
deleted file mode 100644 (file)
index 2abc59c..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{#printer_name=0?:
-<TABLE CLASS="list" SUMMARY="Liste des Imprimantes">
-<THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Nom de la file <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Nom de la file <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Description</TH><TH>Emplacement</TH><TH>Marque et Mod&egrave;le</TH><TH>&Eacute;tat</TH></TR>
-</THEAD>
-<TBODY>
-{[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?Inoccup&eacute;e:{printer_state=4?En cours d'impression:En pause}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
-}
-</TBODY>
-</TABLE></DIV>}
diff --git a/templates/fr/restart.tmpl b/templates/fr/restart.tmpl
deleted file mode 100644 (file)
index da164b7..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Modifier les Param&egrave;tres</H2>
-
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Busy Indicator"> Veuillez patienter pendant que le serveur red&eacute;marre...</P>
-
-</DIV>
diff --git a/templates/fr/samba-export.tmpl b/templates/fr/samba-export.tmpl
deleted file mode 100644 (file)
index 94ff4fd..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-<SCRIPT TYPE="text/javascript"><!--
-function select_printers() {
-  var list = document.export_samba.EXPORT_NAME;
-  var sel = document.export_samba.EXPORT_ALL.checked;
-
-  for (i = 0; i < list.length; i ++) {
-    list.options[i].selected = sel;
-  }
-}
---></SCRIPT>
-
-<FORM METHOD="POST" ACTION="/admin/" NAME="export_samba">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
-
-<H2 CLASS="title">Exporter les Imprimantes vers Samba</H2>
-
-{error?<P>Impossible d'exporter les imprimantes vers Samba\:</P>
-<BLOCKQUOTE>{error}</BLOCKQUOTE>
-<P>Consulter le fichier <A HREF="/admin/log/error_log"
-TARGET="_blank">error_log</A> pour plus d'informations.</P>:
-<P>Cette page vous permet d'exporter des imprimantes vers Samba de sorte que des
-clients Windows puissent y acc&eacute;der via l'ic&oacirc;ne <VAR>Voisinage r&eacute;seau</VAR> ou
-<VAR>Favoris r&eacute;seau</VAR> du bureau. Vous devez au pr&eacute;alable installer les
-pilotes Windows d'imprimante PostScript : cf. la page <i>man</i> <A
-HREF="/help/man-cupsaddsmb.html"
-TARGET="_blank">cupsaddsmb(8)</A>.</P>}
-
-<TABLE>
-<TR>
-<TH CLASS="label">Imprimantes:</TH>
-<TD>
-<SELECT NAME="EXPORT_NAME" SIZE="10" MULTIPLE>
-{[printer_name]<OPTION VALUE="{printer_name}"{export_all? SELECTED:{printer_export? SELECTED:}}>{printer_name}}
-</SELECT><BR>
-<INPUT TYPE="CHECKBOX" NAME="EXPORT_ALL"{export_all? CHECKED:}
-onChange="select_printers()"> Exporter toutes les imprimantes
-</TD>
-</TR>
-<TR>
-<TH CLASS="label">Utilisateur Samba:</TH>
-<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (required)</TD>
-</TR>
-<TR>
-<TH CLASS="label">Mot de passe Samba:</TH>
-<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (required)</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD><INPUT TYPE="SUBMIT" VALUE="Exporter les imprimantes vers Samba"></TD>
-</TR>
-</TABLE>
-
-</FORM>
diff --git a/templates/fr/samba-exported.tmpl b/templates/fr/samba-exported.tmpl
deleted file mode 100644 (file)
index d4ad778..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<P>Les imprimantes ont &eacute;t&eacute; export&eacute;es vers Samba avec succ&egrave;s.</P>
diff --git a/templates/fr/search.tmpl b/templates/fr/search.tmpl
deleted file mode 100644 (file)
index 50b1b4e..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<FORM ACTION="/{SECTION}/{?SEARCH_DEST}" METHOD="GET">
-{WHICH_JOBS?<INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{WHICH_JOBS}">:}
-{ORDER?<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{ORDER}">:}
-
-<P ALIGN="CENTER"><B>Rechercher dans
-{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?les classes:{SECTION=jobs?les t&acirc;ches:les imprimantes}}}:</B>
-<INPUT TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40"  PLACEHOLDER="" AUTOSAVE="org.cups.{SECTION}" RESULTS="20"> <INPUT
-TYPE="SUBMIT" VALUE="Rechercher"> <INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Vider"></P>
-
-</FORM>
diff --git a/templates/fr/set-printer-options-header.tmpl b/templates/fr/set-printer-options-header.tmpl
deleted file mode 100644 (file)
index 12e0b1d..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">D&eacute;finir les Options pour {printer_name}</H2>
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
-{HAVE_AUTOCONFIGURE?<INPUT TYPE="SUBMIT" NAME="AUTOCONFIGURE" VALUE="Interroger l'imprimante pour les options par d&eacute;faut">:}
-
-<SCRIPT TYPE="text/javascript"><!--
-function update_paramtable(option)
-{
-  var cb = document.getElementById("select-" + option)
-  var paramstable = document.getElementById(option + "-params");
-  if (cb.value == "Custom")
-    paramstable.style.display = "table";
-  else
-    paramstable.style.display = "none";
-}
---></SCRIPT>
-
-<H3 CLASS="title">{[group_id]
-<A HREF="#{group_id}">{group}</A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</H3>
-
-<DIV CLASS="tabs">
diff --git a/templates/fr/subscription-added.tmpl b/templates/fr/subscription-added.tmpl
deleted file mode 100644 (file)
index 54ffe8f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">
-
-<P>L'abonnement au flux RSS {subscription_name} a &eacute;t&eacute; ajout&eacute; avec succ&egrave;s.</P>
-
-</DIV>
diff --git a/templates/fr/subscription-canceled.tmpl b/templates/fr/subscription-canceled.tmpl
deleted file mode 100644 (file)
index 54fbcef..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<DIV CLASS="indent">
-
-<P>L'abonnement #{notify_subscription_id} au flux RSS a &eacute;t&eacute; annul&eacute;.</P>
-
-</DIV>
diff --git a/templates/fr/test-page.tmpl b/templates/fr/test-page.tmpl
deleted file mode 100644 (file)
index 8be7c6f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Imprimer une Page de Test sur {printer_name}</H2>
-
-<P>La page de test a &eacute;t&eacute; envoy&eacute;e; l'identifiant de la t&acirc;che est <A HREF="/{SECTION}/{printer_name}">
-{printer_name}-{job_id}</A>.</P>
-
-</DIV>
diff --git a/templates/fr/trailer.tmpl b/templates/fr/trailer.tmpl
deleted file mode 100644 (file)
index f3a46c2..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS et le logo CUPS sont des marques d&eacute;pos&eacute;es de
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS est sous copyright 2007-2013 Apple
-Inc. Tous droits r&eacute;serv&eacute;s.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
diff --git a/templates/fr/users.tmpl b/templates/fr/users.tmpl
deleted file mode 100644 (file)
index cb9a052..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<DIV CLASS="indent">
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
-<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
-{IS_CLASS?<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="{IS_CLASS}">:}
-
-<H2 CLASS="title">Utilisateurs autoris&eacute;s &agrave; utiliser {printer_name}</H2>
-
-<TABLE>
-<TR>
-<TH CLASS="label">Utilisateurs:</TH>
-<TD>
-<INPUT TYPE='TEXT' NAME='users' SIZE='60' VALUE='{?requesting_user_name_allowed}{?requesting_user_name_denied}'>
-<BR>
-<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-allowed' {requesting_user_name_allowed?checked:}>Autoriser ces utilisateurs &agrave; imprimer
-<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Emp&ecirc;cher ces utilisateurs d'imprimer
-</TD>
-</TR>
-<TR>
-<TD></TD>
-<TD>
-<INPUT TYPE="SUBMIT" VALUE="D&eacute;finir les autorisations">
-</TD>
-</TR>
-</TABLE>
-
-</FORM>
-</DIV>
index a383725..a4beb53 100644 (file)
@@ -1,29 +1,43 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-       {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;Home&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;Administration&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;Classes&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;Online&nbsp;Help&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;Jobs&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;Printers&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <link rel="stylesheet" href="/cups.css" type="text/css">
+    <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    {refresh_page?<meta http-equiv="refresh" content="{refresh_page}">:}
+    <meta http-equiv="X-UA-Compatible" content="IE=9">
+    <meta name="viewport" content="width=device-width">
+    <style>html{display:none;}</style>
+    <script type="text/javascript"><!--
+      /* Only display document if we are not in a frame... */
+      if (self == top) {
+        document.documentElement.style.display = 'block';
+      } else {
+        top.location = self.location;
+      }
+
+      /* Show an error if cookies are disabled */
+      function check_cookies() {
+       if (!navigator.cookieEnabled) {
+             document.getElementById('body').innerHTML = 'This page uses cookies to prevent common cross-site attacks. Please enable cookies in your browser.';
+       }
+      }
+    --></SCRIPT>
+    <title>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+  </head>
+  <body onload="check_cookies();">
+    <div class="header">
+      <ul>
+       <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+       <li><a href="/">Home</a></li>
+       <li><a {SECTION=admin?class="active" :}href="/admin">Administration</a></li>
+       <li><a {SECTION=classes?class="active" :}href="/classes/">Classes</a></li>
+       <li><a {SECTION=help?class="active" :}href="/help/">Help</a></li>
+       <li><a {SECTION=jobs?class="active" :}href="/jobs/">Jobs</a></li>
+       <li><a {SECTION=printers?class="active" :}href="/printers/">Printers</a></li>
+      </ul>
+    </div>
+    <div class="body">
+      <div class="row">
+       <h1>{title}</h1>
index 09741b5..86343e7 100644 (file)
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
 <FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
 {TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
 
@@ -31,21 +30,12 @@ AUTOSAVE="org.cups.help" RESULTS="20">
 {QTEXT?</UL>:}
 :<P>No matches found.</P>}
 <HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="View Printable Version"></FORM>:
+{HELPTITLE?<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="View Printable Version"></FORM>:
 
 <H1>Online Help</H1>
 
-<P>This is the CUPS online help interface. Enter search words
-above or click on any of the documentation links to display
-online help information.</P>
+<P>This is the CUPS online help interface. Enter search words above or click on any of the documentation links to display online help information.</P>
 
-<P>If you are new to CUPS, read the "<a
-href="/help/overview.html">Overview of CUPS</a>" page. Veteran users
-should read the "<a href="/help/whatsnew.html">What's New in CUPS
-1.6</a>" page.</P>
+<P>If you are new to CUPS, read the "<a href="/help/overview.html">Overview of CUPS</a>" page.</P>
 
-<P>The <A HREF="http://www.cups.org/">CUPS home page</A> also
-provides many resources including user discussion forums, answers
-to frequently-asked questions, and a form for submitting bug
-reports and feature requests.</P>}
+<P>The <A HREF="http://www.cups.org/">CUPS home page</A> also provides many resources including user discussion forums, answers to frequently-asked questions, and a form for submitting bug reports and feature requests.</P>}
index b4e9166..7dfa642 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">クラスの追加</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
 <TR>
 <TH CLASS="label">説明:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>("HP LaserJet with Duplexer" のように人が読みやすい説明)</SMALL></TD>
+<SMALL>("両面ありHP LaserJet" のように人が読みやすい説明)</SMALL></TD>
 </TR>
 <TR>
 <TH CLASS="label">場所:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>("Lab 1" のように人が読みやすい場所)</SMALL></TD>
+<SMALL>("研究室1" のように人が読みやすい場所)</SMALL></TD>
 </TR>
 <TR>
 <TH CLASS="label">メンバー:</TH>
@@ -37,4 +35,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 00fab5c..13d5e20 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">新しいプリンターの追加</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
 <TR>
 <TH CLASS="label">説明:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_INFO}"><BR>
-<SMALL>("HP LaserJet with Duplexer" のように人が読みやすい説明)</SMALL></TD>
+<SMALL>("両面ありHP LaserJet" のように人が読みやすい説明)</SMALL></TD>
 </TR>
 <TR>
 <TH CLASS="label">場所:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_LOCATION}"><BR>
-<SMALL>("Lab 1" のように人が読みやすい場所)</SMALL></TD>
+<SMALL>("研究室1" のように人が読みやすい場所)</SMALL></TD>
 </TR>
 <TR>
 <TH CLASS="label">接続:</TH>
@@ -44,4 +42,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 53cb2da..13d6f13 100644 (file)
-<TABLE CLASS="indent" SUMMARY="管理者タスク">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">プリンター</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="プリンターの追加"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="新しいプリンターの検索"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="プリンターの管理"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="プリンターを Samba にエクスポート"></FORM>:}
-</P>
-
-<H2 CLASS="title">クラス</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="クラスの追加"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="クラスの管理"></FORM>
-</P>
-
-<H2 CLASS="title">ジョブ</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="ジョブの管理"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">サーバー</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="設定ファイルの編集"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="アクセスログの表示"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="エラーログの表示"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="ページログの表示"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>サーバー設定\:</B></P>
-
-<P><A HREF="/admin/">詳細 <SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> このシステムに接続されているプリンターを共有<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大クライアント数\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> インターネットからの印刷を許可<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> ウェブインターフェイスを公開<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> リモート管理を許可<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Kerberos 認証を使用 (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> 所有者以外のユーザーにもジョブのキャンセルを許可<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> ジョブの履歴を保存<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大ジョブ数 (0 は無制限)\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;メタデータを保持\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ドキュメントを保持\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> トラブルシューティングのためにデバッグ情報を保存<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大ログファイルサイズ\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>サーバー設定:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">詳細 <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> このシステムに接続されているプリンターを共有<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> インターネットからの印刷を許可<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> リモート管理を許可<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Kerberos 認証を使用 (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> 所有者以外のユーザーにもジョブのキャンセルを許可<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> トラブルシューティングのためにデバッグ情報を保存</P>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="設定の変更"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">RSS 購読</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="RSS 購読の追加"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS 購読">
-<THEAD><TR><TH>名前</TH><TH>イベント</TH><TH>キュー名</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="RSS 購読のキャンセル"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:すべてのキュー}</TD></TR>}
-</TBODY>
-</TABLE>:}
+<div class="row">
+  <div class="halves">
+    <H2 CLASS="title">プリンター</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="プリンターの追加"></FORM>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="新しいプリンターの検索"></FORM>
+    <FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="プリンターの管理"></FORM>
+    {have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="プリンターを Samba にエクスポート"></FORM>:}
+    </P>
+
+    <H2 CLASS="title">クラス</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="クラスの追加"></FORM>
+    <FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="クラスの管理"></FORM>
+    </P>
+
+    <H2 CLASS="title">ジョブ</H2>
+
+    <P>
+    <FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="ジョブの管理"></FORM>
+    </P>
+  </div>
+  <div class="halves">
+    <H2 CLASS="title">サーバー</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="設定ファイルの編集"></FORM>
+    <FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="アクセスログの表示"></FORM>
+    <FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="エラーログの表示"></FORM>
+    <FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="ページログの表示"></FORM>
+    </P>
+
+    {SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+    <BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+    <FORM METHOD="POST" ACTION="/admin">
+    <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+
+    {ADVANCEDSETTINGS?<P><B>サーバー設定\:</B></P>
+
+    <P><A HREF="/admin/">詳細 <SMALL>&#x25bc;</SMALL></A><BR>
+    <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+    <INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
+    <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> このシステムに接続されているプリンターを共有<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大クライアント数\:
+    <INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> インターネットからの印刷を許可<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> ウェブインターフェイスを公開<BR>
+    <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> リモート管理を許可<BR>
+    {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Kerberos 認証を使用 (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+    <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> 所有者以外のユーザーにもジョブのキャンセルを許可<BR>
+    <INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> ジョブの履歴を保存<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大ジョブ数 (0 は無制限)\:
+    <INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;メタデータを保持\:
+    <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ドキュメントを保持\:
+    <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
+    <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> トラブルシューティングのためにデバッグ情報を保存<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大ログファイルサイズ\:
+    <INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
+
+    :<P><B>サーバー設定:</B></P>
+
+    <P><A HREF="/admin/?ADVANCEDSETTINGS=YES">詳細 <SMALL>&#x25b6;</SMALL></A><BR>
+    <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+    <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> このシステムに接続されているプリンターを共有<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> インターネットからの印刷を許可<BR>
+    <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> リモート管理を許可<BR>
+    {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Kerberos 認証を使用 (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+    <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> 所有者以外のユーザーにもジョブのキャンセルを許可<BR>
+    <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> トラブルシューティングのためにデバッグ情報を保存</P>
+
+    }
+    <P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="設定の変更"></P>
+
+    </FORM>}
+  </div>
+</div>
+
+<div class="row">
+  <H2 CLASS="title">RSS 購読</H2>
+
+  <P>
+  <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="RSS 購読の追加"></FORM>
+  </P>
+
+  {notify_subscription_id?<TABLE CLASS="list" SUMMARY="RSS 購読">
+  <THEAD><TR><TH>名前</TH><TH>イベント</TH><TH>キュー名</TH></TR></THEAD>
+  <TBODY>{[notify_subscription_id]
+  <TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
+  <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="RSS 購読のキャンセル"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:すべてのキュー}</TD></TR>}
+  </TBODY>
+  </TABLE>:}
+</div>
\ No newline at end of file
index 83b1c6a..3a4fe74 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?{printer_name} の変更:プリンターの追加}</H2>
 
 {CUPS_GET_DEVICES_DONE?<FORM METHOD="POST" ACTION="/admin">
@@ -49,5 +47,3 @@ VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
 
 </FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
 ALT="Busy Indicator"> プリンターを探しています...</P>}
-
-</DIV>
index 7d2d923..eacc7d5 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?{printer_name}の変更:プリンターの追加}</H2>
 
 <FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -61,4 +59,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index e82cece..daf1375 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?{printer_name}の変更:プリンターの追加}</H2>
 
 <FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -57,4 +55,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 924b84a..48b4a66 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?{printer_name}の変更:プリンターの追加}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -49,4 +47,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 2c687be..cf44206 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?{printer_name}の変更:プリンターの追加}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -40,4 +38,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 284aa9f..f444cf6 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">クラスの追加</H2>
 
 <P>クラス <A HREF="/classes/{printer_name}">{printer_name}</A> は正しく追加されました。
-
-</DIV>
index 6ab315d..c275afa 100644 (file)
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">クラス {printer_name} の削除</H2>
 
 <P><B>警告:</B> 本当にクラス 
 {printer_name} を削除してもよいですか?</P>
 
 <P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="クラスの削除"></FORM></P>
-
-</DIV>
index 6941321..be9b5e8 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">クラス {printer_name} の削除</H2>
 
 <P>クラス {printer_name} は正しく削除されました。
-
-</DIV>
\ No newline at end of file
index 1d5d887..d12840e 100644 (file)
@@ -1,3 +1 @@
-<DIV CLASS="indent">
 <H3 CLASS="title">ジョブ</H3>
-</DIV>
index be65f13..6c9256b 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">クラス {printer_name} の変更</H2>
 
 <P>クラス <A HREF="/classes/{printer_name}">{printer_name}</A> は正しく変更されました。
-
-</DIV>
\ No newline at end of file
index b71ea7e..a5becb6 100644 (file)
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
 <H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
 ({printer_state=3?待機中:{printer_state=4?処理中:停止}},
 {printer_is_accepting_jobs=0?ジョブを拒否中:ジョブを受け付け中},
@@ -37,8 +36,6 @@
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">場所:</TH><TD>{printer_location}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">メンバー:</TH><TD>{?member_uris=?なし:{member_uris}}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">デフォルト:</TH><TD>job-sheets={job_sheets_default}
-media={media_default?{media_default}:unknown}
+media={media_default?{media_default}:不明}
 {sides_default?sides={sides_default}:}</TD></TR>
 </TABLE>
-
-</DIV>
index f892335..0aa3a39 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{printer_name} の {title}</H2>
 
 <P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
@@ -8,5 +6,3 @@ ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }プリンターコマンドジョブ
 {job_state=5?処理中:{job_state=6?停止中:
 {job_state=7?キャンセル:{job_state=8?破棄:完了}}}}}}{job_state=9?:{job_printer_state_message?,
 <EM>"{job_printer_state_message}"</EM>:}}</P>
-
-</DIV>
index dfd7dc9..b2a4b8f 100644 (file)
@@ -5,9 +5,7 @@ function reset_config()
 }
 </SCRIPT>
 
-<DIV CLASS="indent">
-
-<H2 CLASS="title">設定ファイルの設定</H2>
+<H2 CLASS="title">設定ファイルの編集</H2>
 
 <FORM NAME="cups" METHOD="POST" ACTION="/admin/">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -20,5 +18,3 @@ function reset_config()
 onClick="reset_config();"></P>
 
 </FORM>
-
-</DIV>
index 89ffbae..b5e94fb 100644 (file)
@@ -1,9 +1,6 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{?title} {?printer_name} のエラー</H2>
 
 <P>エラー:</P>
 
 <BLOCKQUOTE>"{op}" は未知の操作です!</BLOCKQUOTE>
 
-</DIV>
index d67ce36..0ed35fc 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{?title} {?printer_name} のエラー</H2>
 
 <P>{?message?{message}:エラー}:</P>
 
 <BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
index 71a39f1..86298ac 100644 (file)
@@ -1,29 +1,35 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-       {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;ホーム&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;管理&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;クラス&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;ヘルプ&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;ジョブ&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;プリンター&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <link rel="stylesheet" href="/cups.css" type="text/css">
+    <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    {refresh_page?<meta http-equiv="refresh" content="{refresh_page}">:}
+    <meta http-equiv="X-UA-Compatible" content="IE=9">
+    <meta name="viewport" content="width=device-width">
+    <script type="text/javascript"><!--
+      /* Show an error if cookies are disabled */
+      function check_cookies() {
+       if (!navigator.cookieEnabled) {
+             document.getElementById('body').innerHTML = 'This page uses cookies to prevent common cross-site attacks. Please enable cookies in your browser.';
+       }
+      }
+    --></SCRIPT>
+    <title>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+  </head>
+  <body onload="check_cookies();">
+    <div class="header">
+      <ul>
+       <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+       <li><a href="/">ホーム</a></li>
+       <li><a {SECTION=admin?class="active" :}href="/admin">管理</a></li>
+       <li><a {SECTION=classes?class="active" :}href="/classes/">クラス</a></li>
+       <li><a {SECTION=help?class="active" :}href="/help/">ヘルプ</a></li>
+       <li><a {SECTION=jobs?class="active" :}href="/jobs/">ジョブ</a></li>
+       <li><a {SECTION=printers?class="active" :}href="/printers/">プリンター</a></li>
+      </ul>
+    </div>
+    <div class="body">
+      <div class="row">
+       <h1>{title}</h1>
index 4a1f0ff..118d15c 100644 (file)
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
 <FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
 {TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
 
@@ -31,8 +30,7 @@ AUTOSAVE="org.cups.help" RESULTS="20">
 {QTEXT?</UL>:}
 :<P>マッチするものは見つかりませんでした。</P>}
 <HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="印刷可能なバージョンの表示"></FORM>:
+{HELPTITLE?<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="印刷可能なバージョンの表示"></FORM>:
 
 <H1>オンラインヘルプ</H1>
 
@@ -41,9 +39,7 @@ AUTOSAVE="org.cups.help" RESULTS="20">
 ドキュメントリンクのいずれかをクリックしてください。</P>
 
 <P>あなたが CUPS について初心者なら、 "<a
-href="/help/overview.html">CUPS の概要</a>" ページを読んでください。
-上級ユーザーは、 "<a href="/help/whatsnew.html">CUPS 1.6 の新機能</a>"
-ページを読むべきです。</P>
+href="/help/overview.html">CUPS の概要</a>" ページを読んでください。</P>
 
 <P><A HREF="http://www.cups.org/">CUPS ホームページ</A> でも、
 ユーザーディスカッションフォーラム、FAQ、
index aa10295..c6fd085 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">ジョブ {job_id} のキャンセル</H2>
 
 <P><A HREF="{job_printer_uri}">ジョブ {job_id}</A> はキャンセルされました。
-
-</DIV>
index baae237..014a48f 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">ジョブ {job_id} の保留</H2>
 
 <P><A HREF="{job_printer_uri}">ジョブ {job_id}</A> は印刷を保留されました。
-
-</DIV>
index 54da7e0..ce3072e 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
@@ -23,5 +21,3 @@
 </TABLE>
 
 </FORM>
-
-</DIV>
index c415359..b76b64d 100644 (file)
@@ -1,8 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{job_id?ジョブ {job_id} の移動:すべてのジョブの移動}</H2>
 
 <P>{job_id?<A HREF="/jobs/{job_id}">ジョブ {job_id}</A>:すべてのジョブ} は
 <A HREF="/{is_class?classes:printers}/{job_printer_name}">{job_printer_name}</A> に移動しました。</P>
 
-</DIV>
index fd9f89d..025571f 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">ジョブ {job_id} の解放</H2>
 
 <P><A HREF="{job_printer_uri}">ジョブ {job_id}</A> は印刷から解放されました。
-
-</DIV>
index 493a4ac..8b8c0f6 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">ジョブ {job_id} の再印刷</H2>
 
 <P><A HREF="{job_printer_uri}">ジョブ {job_id}</A> は再印刷されました。
-
-</DIV>
index 8c1c3a5..20b544a 100644 (file)
@@ -1,5 +1,5 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="アクティブなジョブを表示"></FORM>}
+{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="アクティブなジョブを表示"></FORM>}
 {?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="完了したジョブを表示"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="すべてのジョブを表示"></FORM>}</DIV>
+{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="すべてのジョブを表示"></FORM>}
 
 <P ALIGN="CENTER">{total=0?ジョブはありません:{total} 個の{?which_jobs=?アクティブな:{which_jobs=all?:完了した}}ジョブのうち {#job_id} 個を表示中}}。</P>
index f70b5aa..e84227d 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">利用可能なプリンター</H2>
 
 {#device_uri=0?<P>プリンターが見つかりません。</P>
@@ -7,5 +5,3 @@
 <LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="このプリンターを追加"></FORM>
 {device_make_and_model} ({device_info})</LI>
 }</UL>}
-
-</DIV>
index a41010f..f552bdf 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">クラス {printer_name} の変更</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -31,4 +29,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 009af6d..bb9aeac 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{printer_name} の変更</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
 <TR>
 <TH CLASS="label">説明:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>("HP LaserJet with Duplexer" のように人が読みやすい説明)</SMALL></TD>
+<SMALL>("両面ありHP LaserJet" のように人が読みやすい説明)</SMALL></TD>
 </TR>
 <TR>
 <TH CLASS="label">場所:</TH>
 <TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
-<SMALL>("Lab 1" のように人が読みやすい場所)</SMALL></TD>
+<SMALL>("研究室1" のように人が読みやすい場所)</SMALL></TD>
 </TR>
 <TR>
 <TH CLASS="label">接続:</TH>
@@ -39,4 +37,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
index 4740433..7007f3b 100644 (file)
@@ -1,7 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">設定変更</H2>
 
 <P>設定に何も変更が行われなかったため、サーバーは再起動されませんでした...</P>
 
-</DIV>
index f13c662..6a97d85 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{is_class?クラス:プリンター} {printer_name} のジョブの受け付け</H2>
 
 <P>{is_class?クラス:プリンター} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 はジョブを受け付けるようになりました。</P>
-
-</DIV>
index c07a832..be475f2 100644 (file)
@@ -1,6 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">プリンターの追加</H2>
 
 <P>プリンター <A HREF="/printers/{printer_name}">{printer_name}</A> は正しく追加されました。
-</DIV>
+
diff --git a/templates/ja/printer-cancel-jobs.tmpl b/templates/ja/printer-cancel-jobs.tmpl
new file mode 100644 (file)
index 0000000..f6a1598
--- /dev/null
@@ -0,0 +1,5 @@
+<H2 CLASS="title">Cancel Jobs On {is_class?クラス:プリンター} {printer_name} のジョブのキャンセル</H2>
+
+<P>{is_class?クラス:プリンター} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+のすべてのジョブはキャンセルされました。</P>
index 1045943..190fb9b 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{printer_name} のデフォルトオプションの設定</H2>
 
 <P>{OP=set-class-options?クラス <A HREF="/classes/{printer_name}">:プリンター <A HREF="/printers/{printer_name}">}{printer_name}</A>
 のデフォルトオプションは正しく設定されました。
-
-</DIV>
index 6fdb52c..bdbaf3d 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">プリンター {printer_name} の削除</H2>
 
 <P><B>警告:</B> 本当にプリンター {printer_name} を削除してよいですか?</P>
 
 <P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="プリンターの削除"></FORM></P>
-
-</DIV>
index fccfc0d..cc5398c 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{is_class?クラス:プリンター} {printer_name} をデフォルトに設定</H2>
 
 <P>{is_class?クラス:プリンター} <A
@@ -8,5 +6,3 @@ HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 
 <BLOCKQUOTE><B>注意:</B> <TT>lpoptions</TT> コマンドで設定されたユーザーのデフォルトは、
 このサーバーのデフォルト設定を上書きします。</BLOCKQUOTE>
-
-</DIV>
index 2f2759b..0aa3adb 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">プリンター {printer_name} の削除</H2>
 
 <P>プリンター {printer_name} は正しく削除されました。
-
-</DIV>
index 1d5d887..d12840e 100644 (file)
@@ -1,3 +1 @@
-<DIV CLASS="indent">
 <H3 CLASS="title">ジョブ</H3>
-</DIV>
index a22e7da..d2ed7b5 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">プリンター {printer_name} の変更</H2>
 
 <P>プリンター <A HREF="/printers/{printer_name}">{printer_name}</A>
 は正しく変更されました。
-
-</DIV>
\ No newline at end of file
diff --git a/templates/ja/printer-purge.tmpl b/templates/ja/printer-purge.tmpl
deleted file mode 100644 (file)
index 4ba6cbc..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">{is_class?クラス:プリンター} {printer_name} のジョブの全削除</H2>
-
-<P>{is_class?クラス:プリンター} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-からすべてのジョブを削除しました。</P>
-
-</DIV>
\ No newline at end of file
index ba7cc52..cc64bbc 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{is_class?クラス:プリンター} {printer_name} のジョブの拒否</H2>
 
 <P>{is_class?クラス:プリンター} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 はジョブを受け付けなくなりました。</P>
-
-</DIV>
index 138829d..a13725f 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{is_class?クラス:プリンター} {printer_name} の再開</H2>
 
 <P>{is_class?クラス:プリンター} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 は再開しました。</P>
-
-</DIV>
\ No newline at end of file
index cc74c1b..6c3cbd1 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{is_class?クラス:プリンター} {printer_name} の停止</H2>
 
 <P>{is_class?クラス:プリンター} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 は停止しました。</P>
-
-</DIV>
\ No newline at end of file
index a95b71e..2b82c61 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
 ({printer_state=3?待機中:{printer_state=4?処理中:一時停止中}},
 {printer_is_accepting_jobs=0?ジョブを拒否中:ジョブを受け付け中},
@@ -17,7 +15,7 @@
 <OPTION VALUE="move-jobs">すべてのジョブの移動</OPTION>
 <OPTION VALUE="purge-jobs">すべてのジョブをキャンセル</OPTION>
 </SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="進む"></NOSCRIPT>
 </FORM>
 
 <FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
 <OPTION VALUE="set-as-default">サーバーのデフォルトの設定</OPTION>
 <OPTION VALUE="set-allowed-users">許可するユーザーの設定</OPTION>
 </SELECT>
-<INPUT TYPE="SUBMIT" VALUE="進む" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="進む"></NOSCRIPT>
 </FORM>
 
 <TABLE SUMMARY="{printer_name}">
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">説明:</TH><TD>{printer_info}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">場所:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">プリンタードライバー:</TH><TD>{printer_make_and_model} ({color_supported=1?カラー:白黒}{sides_supported?, 両面可:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">プリンタードライバー:</TH><TD>{printer_make_and_model} ({color_supported=1?カラー:白黒}{sides_supported=one-sided?:, 両面可})<BR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">接続:</TH><TD>{device_uri}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">デフォルト設定:</TH><TD>バナー={job_sheets_default}
-用紙サイズ={media_default?{media_default}:unknown}
+用紙サイズ={media_default?{media_default}:不明}
 {sides_default?両面指定={sides_default}:}</TD></TR>
 </TABLE>
-
-</DIV>
\ No newline at end of file
index d8504ef..70c537e 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">設定の変更</H2>
 
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+<P><IMG SRC="data:image/gif;base64,R0lGODlhEAAQAIQAAP///wAAAPDw8IqKiuDg4EZGRnp6egAAAFhYWCQkJKysrL6+vhQUFJycnAQEBDY2NmhoaP///////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQABQD/ACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAEFAB8ALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQBBQAfACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQBBQAfACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAQUAHwAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAQUAHwAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAEFAB8ALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAEFAB8ALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQBBQAfACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQBBQAfACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOw==" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
 ALT="Busy Indicator"> サーバーが再起動する間しばらくお待ちください...</P>
-
-</DIV>
index cd8df91..4ab07db 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{printer_name} のデフォルトオプションの変更</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
index 11adc70..b92988a 100644 (file)
@@ -12,5 +12,3 @@ for (var i = 0; i < paramtables.length; i++)
 }
 --></SCRIPT>
 </FORM>
-
-</DIV>
index e4ab98c..60339c1 100644 (file)
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
 <P>{subscription_name} の購読は正しく追加されました。</P>
-
-</DIV>
index 8787dad..8065225 100644 (file)
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
 <P>購読 #{notify_subscription_id} はキャンセルされました。</P>
-
-</DIV>
index 6cdaa87..b460010 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{printer_name} のテストページ印刷</H2>
 
 <P>テストページを送信しました; ジョブ ID は <A HREF="/{SECTION}/{printer_name}">
 {printer_name}-{job_id}</A> です。</P>
-
-</DIV>
index e804b75..74447af 100644 (file)
@@ -1,8 +1,5 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS and the CUPS logo are trademarks of
-<A HREF="http://www.apple.com">Apple Inc.</A> CUPS is copyright 2007-2013 Apple
-Inc. All rights reserved.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+      </div>
+    </div>
+    <div class="footer">CUPS and the CUPS logo are trademarks of <a href="http://www.apple.com">Apple Inc.</a> Copyright &copy; 2007-2015 Apple Inc. All rights reserved.</div>
+  </body>
+</html>
index b998c6b..4ba9855 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <FORM METHOD="POST" ACTION="/admin">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
@@ -27,4 +25,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
index 3e8fd4d..0b0106e 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Cancel Job {job_id}</H2>
 
 <P><A HREF="{job_printer_uri}">Job {job_id}</A> has been canceled.
-
-</DIV>
index 58ce97f..3b5cd6a 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Hold Job {job_id}</H2>
 
 <P><A HREF="{job_printer_uri}">Job {job_id}</A> has been held from printing.
-
-</DIV>
index 6ef0ff1..c2f7046 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
@@ -23,5 +21,3 @@
 </TABLE>
 
 </FORM>
-
-</DIV>
index c4db096..4893e24 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{job_id?Move Job {job_id}:Move All Jobs}</H2>
 
 <P>{job_id?<A HREF="/jobs/{job_id}">Job {job_id}</A>:All jobs} moved to
 <A HREF="/{is_class?classes:printers}/{job_printer_name}">{job_printer_name}</A>.</P>
-
-</DIV>
index 8eb9a96..fe93793 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Release Job {job_id}</H2>
 
 <P><A HREF="{job_printer_uri}">Job {job_id}</A> has been released for printing.
-
-</DIV>
index b91ced9..b5dfd95 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Reprint Job {job_id}</H2>
 
 <P><A HREF="{job_printer_uri}">Job {job_id}</A> has been restarted.
-
-</DIV>
index e7547ba..a8a365b 100644 (file)
@@ -1,5 +1,5 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Show Active Jobs"></FORM>}
+{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Show Active Jobs"></FORM>}
 {?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Show Completed Jobs"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Show All Jobs"></FORM>}</DIV>
+{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Show All Jobs"></FORM>}
 
 <P ALIGN="CENTER">{total=0?No jobs:Showing {#job_id} of {total} {?which_jobs=?active:{which_jobs=all?:completed}} job{total=1?:s}}.</P>
index a594439..9fe7b12 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Available Printers</H2>
 
 {#device_uri=0?<P>No printers found.</P>
@@ -7,5 +5,3 @@
 <LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Add This Printer"></FORM>
 {device_make_and_model} ({device_info})</LI>
 }</UL>}
-
-</DIV>
index 31f7b9c..1aa4fe6 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Modify Class {printer_name}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -31,4 +29,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index bdf3df6..72b4bc5 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Modify {printer_name}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -39,4 +37,3 @@ Share This Printer</TD>
 </TABLE>
 
 </FORM>
-</DIV>
index 6b31203..70bf3d3 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Change Settings</H2>
 
 <P>The server was not restarted because no changes were made to
 the configuration...</P>
-
-</DIV>
index 3e987ce..db5d8da 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Accept Jobs On {is_class?Class:Printer} {printer_name}</H2>
 
 <P>{is_class?Class:Printer} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 is now accepting jobs.</P>
-
-</DIV>
index 9a6e798..0ccf6d3 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Add Printer</H2>
 
 <P>Printer <A HREF="/printers/{printer_name}">{printer_name}</A> has been added
 successfully.
-
-</DIV>
diff --git a/templates/printer-cancel-jobs.tmpl b/templates/printer-cancel-jobs.tmpl
new file mode 100644 (file)
index 0000000..4376646
--- /dev/null
@@ -0,0 +1,5 @@
+<H2 CLASS="title">Cancel Jobs On {is_class?Class:Printer} {printer_name}</H2>
+
+<P>All jobs on {is_class?class:printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+have been canceled.</P>
index 6f8104e..7bce3f9 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Set Default Options for {printer_name}</H2>
 
 <P>{OP=set-class-options?Class <A HREF="/classes/{printer_name}">:Printer <A HREF="/printers/{printer_name}">}{printer_name}</A>
 default options have been set successfully.
-
-</DIV>
index fce9e34..c1b2b17 100644 (file)
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Delete Printer {printer_name}</H2>
 
 <P><B>Warning:</B> Are you sure you want to delete printer
 {printer_name}?</P>
 
 <P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Delete Printer"></FORM></P>
-
-</DIV>
index 72a7b5e..af21dca 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Set {is_class?Class:Printer} {printer_name} As Default</H2>
 
 <P>{is_class?Class:Printer} <A
@@ -9,5 +7,3 @@ has been made the default printer on the server.</P>
 <BLOCKQUOTE><B>Note:</B> Any user default that has been set via
 the <TT>lpoptions</TT> command will override this default
 setting.</BLOCKQUOTE>
-
-</DIV>
index d8a31ae..ea462ce 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Delete Printer {printer_name}</H2>
 
 <P>Printer {printer_name} has been deleted successfully.
-
-</DIV>
index ba46f10..61e5151 100644 (file)
@@ -1,3 +1 @@
-<DIV CLASS="indent">
 <H3 CLASS="title">Jobs</H3>
-</DIV>
index b61e8e3..1193a48 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Modify Printer {printer_name}</H2>
 
 <P>Printer <A HREF="/printers/{printer_name}">{printer_name}</A> has been
 modified successfully.
-
-</DIV>
\ No newline at end of file
diff --git a/templates/printer-purge.tmpl b/templates/printer-purge.tmpl
deleted file mode 100644 (file)
index 8cf7c14..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Purge Jobs On {is_class?Class:Printer} {printer_name}</H2>
-
-<P>{is_class?Class:Printer} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-has been purged of all jobs.</P>
-
-</DIV>
\ No newline at end of file
index 5f1c791..823c7e5 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Reject Jobs On {is_class?Class:Printer} {printer_name}</H2>
 
 <P>{is_class?Class:Printer} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 is no longer accepting jobs.</P>
-
-</DIV>
index 3eaed13..76d44ed 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Resume {is_class?Class:Printer} {printer_name}</H2>
 
 <P>{is_class?Class:Printer} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 has been resumed.</P>
-
-</DIV>
\ No newline at end of file
index b74e871..8c264b2 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Pause {is_class?Class:Printer} {printer_name}</H2>
 
 <P>{is_class?Class:Printer} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 has been paused.</P>
-
-</DIV>
\ No newline at end of file
index 78fc08b..705f69f 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
 ({printer_state=3?Idle:{printer_state=4?Processing:Paused}},
 {printer_is_accepting_jobs=0?Rejecting Jobs:Accepting Jobs},
@@ -15,9 +13,9 @@
 {printer_state=5?<OPTION VALUE="start-printer">Resume Printer</OPTION>:<OPTION VALUE="stop-printer">Pause Printer</OPTION>}
 {printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Accept Jobs</OPTION>:<OPTION VALUE="reject-jobs">Reject Jobs</OPTION>}
 <OPTION VALUE="move-jobs">Move All Jobs</OPTION>
-<OPTION VALUE="purge-jobs">Cancel All Jobs</OPTION>
+<OPTION VALUE="cancel-jobs">Cancel All Jobs</OPTION>
 </SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
 </FORM>
 
 <FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
 <OPTION VALUE="set-as-default">Set As Server Default</OPTION>
 <OPTION VALUE="set-allowed-users">Set Allowed Users</OPTION>
 </SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
 </FORM>
 
 <TABLE SUMMARY="{printer_name}">
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Description:</TH><TD>{printer_info}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Location:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Driver:</TH><TD>{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Driver:</TH><TD>{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported=one-sided?:, 2-sided printing})<BR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Connection:</TH><TD>{device_uri}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Defaults:</TH><TD>job-sheets={job_sheets_default}
 media={media_default?{media_default}:unknown}
 {sides_default?sides={sides_default}:}</TD></TR>
 </TABLE>
-
-</DIV>
\ No newline at end of file
index bdfca87..47d39d0 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Change Settings</H2>
 
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+<P><IMG SRC="data:image/gif;base64,R0lGODlhEAAQAIQAAP///wAAAPDw8IqKiuDg4EZGRnp6egAAAFhYWCQkJKysrL6+vhQUFJycnAQEBDY2NmhoaP///////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQABQD/ACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAEFAB8ALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQBBQAfACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQBBQAfACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAQUAHwAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAQUAHwAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAEFAB8ALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAEFAB8ALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQBBQAfACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQBBQAfACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOw==" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
 ALT="Busy Indicator"> Please stand by while the server restarts...</P>
-
-</DIV>
index a119d86..d67c4ad 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Новая группа</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -37,4 +35,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 6690d88..824b913 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Добавление принтера</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -44,4 +42,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index ae2aab2..49a168c 100644 (file)
-<TABLE CLASS="indent" SUMMARY="Администрирование">
-<TR><TD VALIGN="TOP">
-
-<H2 CLASS="title">Принтеры</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Добавить принтер"></FORM>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Найти новый принтер"></FORM>
-<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Управление принтерами"></FORM>
-{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Экспортировать принтер в Samba"></FORM>:}
-</P>
-
-<H2 CLASS="title">Группы</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Добавить группу"></FORM>
-<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Управление группами"></FORM>
-</P>
-
-<H2 CLASS="title">Задания</H2>
-
-<P>
-<FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Управление заданиями"></FORM>
-</P>
-
-</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-
-<H2 CLASS="title">Сервер</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Редактировать конфигурационный файл"></FORM>
-<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать журнал заданий"></FORM>
-<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать журнал ошибок"></FORM>
-<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать журнал страниц"></FORM>
-</P>
-
-{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
-<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
-
-<FORM METHOD="POST" ACTION="/admin">
-<INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
-
-{ADVANCEDSETTINGS?<P><B>Параметры сервера\:</B></P>
-
-<P><A HREF="/admin/">Дополнительные параметры<SMALL>&#x25bc;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Показать принтеры, использующиеся в других системах<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Протоколы\:
-<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Разрешить печать из интернета<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Анонсировать веб-интерфейс<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Разрешить удаленное администрирование<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Разрешить аутентификацию Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Разрешать пользователям отменять любое задание(не только их собственные)<BR>
-<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Вести журнал заданий<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Количество заданий\:
-<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Записывать метаданные(Retain Metadata)\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Существующие документы(Retain Documents)\:
-<INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Сохранять отладочную информацию в журнале<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Максимальный размер журнала ошибок\:
-<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
-
-:<P><B>Параметры сервера:</B></P>
-
-<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Дополнительные параметры <SMALL>&#x25b6;</SMALL></A><BR>
-<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
-<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Разрешить совместный доступ к принтерам, подключенным к этой системе<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Разрешить печать из Интернета<BR>
-<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Разрешить удаленное администрирование<BR>
-{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Разрешить аутентификацию Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
-<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Разрешить пользователям отменять любое задание(не только их собственные)<BR>
-<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Сохранять отладочную информацию в журнале</P>
-
-}
-<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Сохранить"></P>
-
-</FORM>}
-
-</TD></TR>
-</TABLE>
-
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Подписка по RSS</H2>
-
-<P>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Добавить подписку по RSS"></FORM>
-</P>
-
-</DIV>
-
-{notify_subscription_id?<TABLE CLASS="list" SUMMARY="Подписки по RSS">
-<THEAD><TR><TH>Название</TH><TH>События</TH><TH>Очередь</TH></TR></THEAD>
-<TBODY>{[notify_subscription_id]
-<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
-<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Отменить подписку по RSS"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:Все очереди}</TD></TR>}
-</TBODY>
-</TABLE>:}
+<div class="row">
+  <div class="halves">
+    <H2 CLASS="title">Принтеры</H2>
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Добавить принтер"></FORM>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Найти новый принтер"></FORM>
+    <FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Управление принтерами"></FORM>
+    {have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Экспортировать принтер в Samba"></FORM>:}
+    </P>
+
+    <H2 CLASS="title">Группы</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Добавить группу"></FORM>
+    <FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Управление группами"></FORM>
+    </P>
+
+    <H2 CLASS="title">Задания</H2>
+
+    <P>
+    <FORM ACTION="/jobs/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Управление заданиями"></FORM>
+    </P>
+  </div>
+  <div class="halves">
+    <H2 CLASS="title">Сервер</H2>
+
+    <P>
+    <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Редактировать конфигурационный файл"></FORM>
+    <FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать журнал заданий"></FORM>
+    <FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать журнал ошибок"></FORM>
+    <FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать журнал страниц"></FORM>
+    </P>
+
+    {SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+    <BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+    <FORM METHOD="POST" ACTION="/admin">
+    <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
+
+    {ADVANCEDSETTINGS?<P><B>Параметры сервера\:</B></P>
+
+    <P><A HREF="/admin/">Дополнительные параметры<SMALL>&#x25bc;</SMALL></A><BR>
+    <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+    <INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
+    <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Разрешить совместный доступ к принтерам, подключенным к этой системе<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Максимум клиентов\:
+    <INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Разрешить печать из интернет<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Разрешить доступ через веб-интерфейс<BR>
+    <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Разрешить удаленное администрирование<BR>
+    {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Разрешить аутентификацию Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+    <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Разрешать пользователям отменять любое задание(не только их собственные)<BR>
+    <INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOBS" {?preserve_jobs}> Вести журнал заданий<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Количество заданий (0 без ограничений)\:
+    <INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Записывать метаданные(Retain Metadata)\:
+    <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_HISTORY" VALUE="{?preserve_job_history}" SIZE="6"><BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Существующие документы(Retain Documents)\:
+    <INPUT TYPE="TEXT" NAME="PRESERVE_JOB_FILES" VALUE="{?preserve_job_files}" SIZE="6"><BR>
+    <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Сохранять отладочную информацию в журнале<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Максимальный размер журнала\:
+    <INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
+
+    :<P><B>Параметры сервера:</B></P>
+
+    <P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Дополнительные параметры <SMALL>&#x25b6;</SMALL></A><BR>
+    <INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+    <INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Разрешить совместный доступ к принтерам, подключенным к этой системе<BR>
+    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Разрешить печать из 
+    интернет<BR>
+    <INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Разрешить удаленное администрирование<BR>
+    {have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Разрешить аутентификацию Kerberos (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+    <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Разрешить пользователям отменять любое задание(не только их собственные)<BR>
+    <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Сохранять отладочную информацию в журнале</P>
+
+    }
+    <P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Сохранить"></P>
+
+    </FORM>}
+  </div>
+</div>
+
+<div class="row">
+  <H2 CLASS="title">Подписка по RSS</H2>
+
+  <P>
+  <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Добавить подписку по RSS"></FORM>
+  </P>
+
+  {notify_subscription_id?<TABLE CLASS="list" SUMMARY="Подписки по RSS">
+  <THEAD><TR><TH>Название</TH><TH>События</TH><TH>Очередь</TH></TR></THEAD>
+  <TBODY>{[notify_subscription_id]
+  <TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
+  <FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="Отменить подписку по RSS"></FORM>&nbsp;</TD><TD>{notify_events}</TD><TD NOWRAP>&nbsp;{notify_printer_name?{notify_printer_name}:Все очереди}</TD></TR>}
+  </TBODY>
+  </TABLE>:}
+</div>
\ No newline at end of file
index 3472f5f..8b63ac6 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Изменение {printer_name}:Добавление принтера}</H2>
 
 {CUPS_GET_DEVICES_DONE?<FORM METHOD="POST" ACTION="/admin">
@@ -9,12 +7,12 @@
 
 <TABLE>
 {op=add-printer?:<TR>
-<TH CLASS="label">ТекÑ\83Ñ\89ее Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87ение\:</TH>
+<TH CLASS="label">СейÑ\87аÑ\81 Ð¿Ð¾Ð´ÐºÐ»Ñ\8eÑ\87ен\:</TH>
 <TD><INPUT TYPE="RADIO" NAME="DEVICE_URI" VALUE="{current_device_uri}" CHECKED>
 {current_device_uri}</TD>
 </TR>}
 <TR>
-<TH CLASS="label">Ð\9bокалÑ\8cные принтеры\:</TH>
+<TH CLASS="label">УÑ\81Ñ\82ановленные принтеры\:</TH>
 <TD>
 {[device_uri]{device_class!network?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
 VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
@@ -23,7 +21,7 @@ VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
 </TD>
 </TR>
 <TR>
-<TH CLASS="label">Ð\9eбнаÑ\80Ñ\83женные сетевые принтеры\:</TH>
+<TH CLASS="label">Ð\9dайденные сетевые принтеры\:</TH>
 <TD>
 {[device_uri]{device_class=network?{device_uri~[a-z]+://?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
 VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
@@ -48,6 +46,4 @@ VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
 </TABLE>
 
 </FORM>:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Busy Indicator"> Поиск принтеров...</P>}
-
-</DIV>
+ALT="Ожидание"> Поиск принтеров...</P>}
index 55b91db..d5ef7fe 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Изменение {printer_name}:Добавление принтера}</H2>
 
 <FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -61,4 +59,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index b666329..2f0d6d9 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Изменение {printer_name}:Добавление принтера}</H2>
 
 <FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
@@ -57,4 +55,3 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 5a953a2..2c8d6c7 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Изменение {printer_name}:Добавление принтера}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
 </SELECT></TD>
 </TR>
 <TR>
-<TH CLASS="label">Ð\9fеÑ\87аÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86:</TH>
+<TH CLASS="label">ЧеÑ\82ноÑ\81Ñ\82Ñ\8c:</TH>
 <TD><SELECT NAME="PARITY">
-<OPTION VALUE="none" {?parity=none?SELECTED:}>Все
-<OPTION VALUE="even" {?parity=even?SELECTED:}>Только четные
-<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Только нечетные
+<OPTION VALUE="none" {?parity=none?SELECTED:}>None
+<OPTION VALUE="even" {?parity=even?SELECTED:}>Even
+<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Odd
 </SELECT></TD>
 </TR>
 <TR>
@@ -49,4 +47,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 3c843f0..fff9231 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{op=modify-printer?Изменение {printer_name}:Добавление принтера}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -40,4 +38,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 626cfec..f0bf6cd 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Новая группа</H2>
 
 <P>Группа <A HREF="/classes/{printer_name}">{printer_name}</A> успешно добавлена.
-
-</DIV>
index 0eb87ef..9ea80aa 100644 (file)
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Удаление группы {printer_name}</H2>
 
 <P><B>Предупреждение:</B> Вы действительно хотите удалить группу
 {printer_name}?</P>
 
 <P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Удалить группу"></FORM></P>
-
-</DIV>
index 08f5999..c0b64d9 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Удаление группы {printer_name}</H2>
 
 <P>Группа {printer_name} успешно удалена.
-
-</DIV>
\ No newline at end of file
index 8487cbb..8bcaa81 100644 (file)
@@ -1,3 +1 @@
-<DIV CLASS="indent">
 <H3 CLASS="title">Задания</H3>
-</DIV>
index 986a02b..5f23e08 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Изменение группы {printer_name}</H2>
 
 <P>Группа <A HREF="/classes/{printer_name}">{printer_name}</A> успешно изменена.
-
-</DIV>
\ No newline at end of file
index 643cbae..a5aadff 100644 (file)
@@ -1,7 +1,6 @@
-<DIV CLASS="indent">
 <H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?Idle:{printer_state=4?печать:приостановлен}},
-{printer_is_accepting_jobs=0?Ð\9dе Ð¿Ñ\80инимаеÑ\82 Ð·Ð°Ð´Ð°Ð½Ð¸Ñ\8f\9fринимает задания},
+({printer_state=3?ожидает:{printer_state=4?печать:приостановлен}},
+{printer_is_accepting_jobs=0?не Ð¿Ñ\80инимаеÑ\82 Ð·Ð°Ð´Ð°Ð½Ð¸Ñ\8f:принимает задания},
 {server_is_sharing_printers=0?нет совместного доступа:{printer_is_shared=0?нет совместного доступа:разрешен совместный доступ}} {default_name={printer_name}?, Сервер по умолчанию:})</H2>
 
 <FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
@@ -9,15 +8,15 @@
 <SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
 <OPTION VALUE="">Обслуживание</OPTION>
 <OPTION VALUE="print-test-page">Печать пробной страницы</OPTION>
-{printer_state=5?<OPTION VALUE="start-class">Ð\94аннÑ\8bе Ð³Ñ\80Ñ\83ппÑ\8b</OPTION>:<OPTION VALUE="stop-class">Ð\9fÑ\80иостановить группу</OPTION>}
+{printer_state=5?<OPTION VALUE="start-class">Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\83</OPTION>:<OPTION VALUE="stop-class">Ð\9eстановить группу</OPTION>}
 {printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Принимать задания</OPTION>:<OPTION VALUE="reject-jobs">Не принимать задания</OPTION>}
 <OPTION VALUE="move-jobs">Переместить все задания</OPTION>
 <OPTION VALUE="purge-jobs">Отменить все задания</OPTION>
 </SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Сохранить" STYLE="display: none;">
+<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
 </FORM>
 
-<FORM METHOD="POST" ACTION="{admin_uri}" NAME="Администрирование">
+<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
 <INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="1">
@@ -29,7 +28,7 @@
 <OPTION VALUE="set-as-default">Установить как принтер по умолчанию</OPTION>
 <OPTION VALUE="set-allowed-users">Список разрешенных пользователей</OPTION>
 </SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Сохранить" STYLE="display: none;">
+<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
 </FORM>
 
 <TABLE SUMMARY="{printer_name}">
@@ -40,5 +39,3 @@
 media={media_default?{media_default}:неизвестный}
 {sides_default?sides={sides_default}:}</TD></TR>
 </TABLE>
-
-</DIV>
index 5038bea..9b90b76 100644 (file)
@@ -1,11 +1,11 @@
 {#printer_name=0?:
 <TABLE CLASS="list" SUMMARY="Список групп">
 <THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Ð\9eÑ\87еÑ\80едÑ\8c <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Ð\9eÑ\87еÑ\80едÑ\8c <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Описание</TH><TH>Расположение</TH><TH>Состав</TH><TH>Статус</TH></TR>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Ð\9dаименование <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Ð\9dаименование <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Описание</TH><TH>Расположение</TH><TH>Состав</TH><TH>Статус</TH></TR>
 </THEAD>
 <TBODY>
 {[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?Ð\9dеÑ\82 Ð¿Ñ\80инÑ\82еÑ\80ов:{member_uris}}</TD><TD>{printer_state=3?Ð\92 Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ð¸:{printer_state=4?Ð\9fеÑ\87аÑ\82аеÑ\82\9fриостановлен}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
+<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?Ð\9dеÑ\82 Ð¿Ñ\80инÑ\82еÑ\80ов:{member_uris}}</TD><TD>{printer_state=3?ожидаеÑ\82:{printer_state=4?пеÑ\87аÑ\82аеÑ\82:приостановлен}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
 }
 </TBODY>
 </TABLE></DIV>}
index 4dc7b4e..09c26fd 100644 (file)
@@ -1,12 +1,8 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{title} для {printer_name}</H2>
 
 <P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
-ALIGN="ABSMIDDLE" ALT="Ð\98ндикаÑ\82оÑ\80 Ð·Ð°Ð½Ñ\8fÑ\82оÑ\81Ñ\82и"> }Обработка задания
+ALIGN="ABSMIDDLE" ALT="Ð\9eжидание"> }Обработка задания
 {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?,
 <EM>"{job_printer_state_message}"</EM>:}}</P>
-
-</DIV>
index d194059..69ebd0f 100644 (file)
@@ -5,9 +5,7 @@ function reset_config()
 }
 </SCRIPT>
 
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Редактирование конфигурационного файла</H2>
+<H2 CLASS="title">Редактирование файла конфигурации</H2>
 
 <FORM NAME="cups" METHOD="POST" ACTION="/admin/">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
@@ -16,9 +14,7 @@ function reset_config()
 <TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
 
 <P><INPUT TYPE="SUBMIT" NAME="SAVECHANGES" VALUE="Сохранить изменения">
-<INPUT TYPE="BUTTON" VALUE="СбÑ\80оÑ\81иÑ\82Ñ\8c Ð²Ñ\81е изменения"
+<INPUT TYPE="BUTTON" VALUE="Ð\9eÑ\82мениÑ\82Ñ\8c изменения"
 onClick="reset_config();"></P>
 
 </FORM>
-
-</DIV>
index 922976f..6e7dfb1 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{?title} {?printer_name} - ошибка </H2>
 
 <P>Ошибка:</P>
 
 <BLOCKQUOTE>Неизвестная операция "{op}"!</BLOCKQUOTE>
-
-</DIV>
index 4a35c8f..da563c3 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{?title} {?printer_name} - ошибка</H2>
 
 <P>{?message?{message}:Ошибка}:</P>
 
 <BLOCKQUOTE>{error}</BLOCKQUOTE>
-
-</DIV>
index 6d16855..e5f0689 100644 (file)
@@ -1,29 +1,43 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
-<HEAD>
-       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
-       <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
-       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
-       <LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
-       {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
-</HEAD>
-<BODY>
-<TABLE CLASS="page" SUMMARY="{title}">
-<TR><TD CLASS="body">
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
-<TR HEIGHT="36">
-<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
-SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
-<TD CLASS="unsel"><A HREF="/">&nbsp;&nbsp;Начало&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin">&nbsp;&nbsp;Администрирование&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/">&nbsp;&nbsp;Группы&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/">&nbsp;&nbsp;Справка&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/">&nbsp;&nbsp;Задания&nbsp;&nbsp;</A></TD>
-<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/">&nbsp;&nbsp;Принтеры&nbsp;&nbsp;</A></TD>
-<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
-TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Поиск по справке"
-VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
-<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
-</TR>
-<TR><TD COLSPAN="9">&nbsp;</TD></TR>
-</TABLE>
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <link rel="stylesheet" href="/cups.css" type="text/css">
+    <link rel="shortcut icon" href="/apple-touch-icon.png" type="image/png">
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    {refresh_page?<meta http-equiv="refresh" content="{refresh_page}">:}
+    <meta http-equiv="X-UA-Compatible" content="IE=9">
+    <meta name="viewport" content="width=device-width">
+    <style>html{display:none;}</style>
+    <script type="text/javascript"><!--
+      /* Only display document if we are not in a frame... */
+      if (self == top) {
+        document.documentElement.style.display = 'block';
+      } else {
+        top.location = self.location;
+      }
+
+      /* Show an error if cookies are disabled */
+      function check_cookies() {
+       if (!navigator.cookieEnabled) {
+             document.getElementById('body').innerHTML = 'Эта страница использует cookies. Пожалуйста включите cookies в вашем браузере.';
+       }
+      }
+    --></SCRIPT>
+    <title>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</title>
+  </head>
+  <body onload="check_cookies();">
+    <div class="header">
+      <ul>
+       <li><a href="http://www.cups.org/" target="_blank">CUPS.org</a></li>
+       <li><a href="/">Начало</a></li>
+       <li><a {SECTION=admin?class="active" :}href="/admin">Администрирование</a></li>
+       <li><a {SECTION=classes?class="active" :}href="/classes/">Группы</a></li>
+       <li><a {SECTION=help?class="active" :}href="/help/">Справка</a></li>
+       <li><a {SECTION=jobs?class="active" :}href="/jobs/">Задания</a></li>
+       <li><a {SECTION=printers?class="active" :}href="/printers/">Принтеры</a></li>
+      </ul>
+    </div>
+    <div class="body">
+      <div class="row">
+       <h1>{title}</h1>
index d618a66..fdd361a 100644 (file)
@@ -1,4 +1,3 @@
-<DIV CLASS="indent">
 <FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
 {TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
 
@@ -31,8 +30,7 @@ AUTOSAVE="org.cups.help" RESULTS="20">
 {QTEXT?</UL>:}
 :<P>Не найдено совпадений.</P>}
 <HR NOSHADE>:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>
-<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Показать версию для печати"></FORM>:
+{HELPTITLE?<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Показать версию для печати"></FORM>:
 
 <H1>Справка</H1>
 
index cba5644..5cd5fd5 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Отмена задания {job_id}</H2>
 
 <P><A HREF="{job_printer_uri}">Задание {job_id}</A> отменено.
-
-</DIV>
index 162e4a4..ea56f5b 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Приостановка задания {job_id}</H2>
 
 <P><A HREF="{job_printer_uri}">Задание {job_id}</A> приостановлено.
-
-</DIV>
index 598e4db..3c4e0be 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
@@ -23,5 +21,3 @@
 </TABLE>
 
 </FORM>
-
-</DIV>
index e5bd656..66ecf8e 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">{job_id?Перемещение задания {job_id}:Перемещение всех заданий}</H2>
 
 <P>{job_id?<A HREF="/jobs/{job_id}">Задание {job_id}</A>:Все задания} перемещены на
 <A HREF="/{is_class?группы:принтеры}/{job_printer_name}">{job_printer_name}</A>.</P>
-
-</DIV>
index 1cad15a..379cd81 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Разблокирование задания {job_id}</H2>
 
 <P><A HREF="{job_printer_uri}">Задание {job_id}</A> разблокировано.
-
-</DIV>
index 490fc3a..2a1810c 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Перезапуск задания {job_id}</H2>
 
 <P><A HREF="{job_printer_uri}">Задание {job_id}</A> запущено заново.
-
-</DIV>
index 7b645b5..6692c44 100644 (file)
@@ -1,5 +1,5 @@
-<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать активные задания"></FORM>}
+{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Показать активные задания"></FORM>}
 {?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Показать завершенные задания"></FORM>}
-{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Показать все задания"></FORM>}</DIV>
+{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Показать все задания"></FORM>}
 
 <P ALIGN="CENTER">{total=0?Нет заданий:Задание {#job_id} из {total} {?which_jobs=?активных:{which_jobs=all?:завершенных}}}.</P>
index 90d3c94..651de12 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Доступные принтеры</H2>
 
 {#device_uri=0?<P>Не обнаружено ни одного принтера.</P>
@@ -7,5 +5,3 @@
 <LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Локальный принтер"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Добавить этот принтер"></FORM>
 {device_make_and_model} ({device_info})</LI>
 }</UL>}
-
-</DIV>
index a85698a..6549bc6 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Изменение группы {printer_name}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -31,4 +29,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
\ No newline at end of file
index 8ec523f..b7371f8 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Изменение принтера {printer_name}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
@@ -39,4 +37,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
index a08a467..b567976 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Применение изменений</H2>
 
 <P>Сервер не был перезапущен,поскольку не произошло изменений в конфигурации...</P>
-
-</DIV>
index f80e946..9fb252e 100644 (file)
@@ -1,5 +1,5 @@
 </TABLE>
 
-<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="Сохранить параметры по умолчанию"></P>
+<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="Сохранить параметры"></P>
 
 </DIV>
\ No newline at end of file
index 3c5dc62..0d0459b 100644 (file)
@@ -1,6 +1,6 @@
 <TABLE CLASS="inset" SUMMARY="Просмотр по страницам">
 <TR>
-       <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="&#x25c0; Предварительный просмотр"></FORM>:&nbsp;}</TD>
-       <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="Ð\9fоказаÑ\82Ñ\8c Ñ\81ледÑ\83Ñ\8eÑ\89Ñ\83Ñ\8e &#x25b6;"></FORM>:&nbsp;}</TD>
+       <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="&#x25c0; Предыдущая"></FORM>:&nbsp;}</TD>
+       <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="СледÑ\83Ñ\8eÑ\89аÑ\8f &#x25b6;"></FORM>:&nbsp;}</TD>
 </TR>
 </TABLE>
index 24d100d..4818dff 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Прием заданий {is_class?в группу:на принтер} {printer_name}</H2>
 
 <P>{is_class?Группа:Принтер} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 теперь принимает задания.</P>
-
-</DIV>
index cc78407..c2b3df2 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Добавить принтер</H2>
 
 <P>Принтер <A HREF="/printers/{printer_name}">{printer_name}</A> успешно добавлен.
-
-</DIV>
diff --git a/templates/ru/printer-cancel-jobs.tmpl b/templates/ru/printer-cancel-jobs.tmpl
new file mode 100644 (file)
index 0000000..cd2ad45
--- /dev/null
@@ -0,0 +1,5 @@
+<H2 CLASS="title">Отмена заданий для {is_class?Class:Printer} {printer_name}</H2>
+
+<P>Все задания для {is_class?class:printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+были отменены.</P>
index 33c4c14..74da095 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Настройки по умолчанию для {printer_name}</H2>
 
 <P>{OP=set-class-options?Группа <A HREF="/classes/{printer_name}">:Принтер <A HREF="/printers/{printer_name}">}{printer_name}</A>
-теперь используют параметры по умолчанию.
-
-</DIV>
+теперь использует параметры по умолчанию.
index 86b6360..3d502d3 100644 (file)
@@ -1,10 +1,6 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Удаление принтера {printer_name}</H2>
 
 <P><B>Предупреждение:</B> вы действительно хотите удалить принтер
 {printer_name}?</P>
 
 <P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Удалить принтер"></FORM></P>
-
-</DIV>
index 474f4b8..fd77139 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Установка {is_class?группы:принтера} {printer_name} по умолчанию</H2>
 
 <P>{is_class?Группа:Принтер} <A
@@ -7,6 +5,4 @@ HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 установлены на сервере по умолчанию для новых заданий.</P>
 
 <BLOCKQUOTE><B>Примечания:</B> вы можете переопределить это поведение с помощью команды
-the <TT>lpoptions</TT>.</BLOCKQUOTE>
-
-</DIV>
+ <TT>lpoptions</TT>.</BLOCKQUOTE>
index 43593c7..4b28027 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Удаление принтера {printer_name}</H2>
 
 <P>Принтер {printer_name} успешно удален.
-
-</DIV>
index 8487cbb..8bcaa81 100644 (file)
@@ -1,3 +1 @@
-<DIV CLASS="indent">
 <H3 CLASS="title">Задания</H3>
-</DIV>
index 21c502f..93df272 100644 (file)
@@ -1,7 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Изменение принтера {printer_name}</H2>
 
-<P>Параметры принтера <A HREF="/printers/{printer_name}">{printer_name}</A> успешно изменены.
-
-</DIV>
\ No newline at end of file
+<P>Параметры принтера <A HREF="/printers/{printer_name}">{printer_name}</A> успешно изменены.
\ No newline at end of file
diff --git a/templates/ru/printer-purge.tmpl b/templates/ru/printer-purge.tmpl
deleted file mode 100644 (file)
index c2768c8..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<DIV CLASS="indent">
-
-<H2 CLASS="title">Очистка всех заданий для {is_class?группы:принтера} {printer_name}</H2>
-
-<P>Все задания для {is_class?группы:принтера} <A
-HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-очищены.</P>
-
-</DIV>
\ No newline at end of file
index 012e161..d8a4722 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Отмена заданий для {is_class?группы:принтера} {printer_name}</H2>
 
 <P>{is_class?Группа:Принтер} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 больше не принимает задания.</P>
-
-</DIV>
index cb02c79..d7e8fb8 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Возобновить работу {is_class?группы:принтера} {printer_name}</H2>
 
 <P>{is_class?Группа:Принтер} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
-теперь принимают задания.</P>
-
-</DIV>
\ No newline at end of file
+теперь принимает задания.</P>
index d9fa7fc..d9b5035 100644 (file)
@@ -1,9 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Приостановить {is_class?группу:принтер} {printer_name}</H2>
 
 <P>{is_class?Группа:Принтер} <A
 HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
 {is_class?была приостановлена:был приостановлен}.</P>
-
-</DIV>
\ No newline at end of file
index 90bc7b3..a2e9b40 100644 (file)
@@ -1,7 +1,5 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
-({printer_state=3?в Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ð¸:{printer_state=4?печать:приостановлен}},
+({printer_state=3?ожидаеÑ\82:{printer_state=4?печать:приостановлен}},
 {printer_is_accepting_jobs=0?не принимает задания:принимает задания},
 {server_is_sharing_printers=0?нет совместного доступа:{printer_is_shared=0?нет совместного доступа:разрешен совместный доступ}} {default_name={printer_name}?, По умолчанию:})</H2>
 
@@ -15,9 +13,9 @@
 {printer_state=5?<OPTION VALUE="start-printer">Восстановить печать</OPTION>:<OPTION VALUE="stop-printer">Приостановить принтер</OPTION>}
 {printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Принимать задания</OPTION>:<OPTION VALUE="reject-jobs">Не принимать задания</OPTION>}
 <OPTION VALUE="move-jobs">Переместить все задания</OPTION>
-<OPTION VALUE="purge-jobs">Ð\97акÑ\80Ñ\8bть все задания</OPTION>
+<OPTION VALUE="purge-jobs">Ð\9eÑ\82менить все задания</OPTION>
 </SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
 </FORM>
 
 <FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
 <OPTION VALUE="set-as-default">Установить как принтер по умолчанию</OPTION>
 <OPTION VALUE="set-allowed-users">Список разрешенных пользователей</OPTION>
 </SELECT>
-<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+<NOSCRIPT><INPUT TYPE="SUBMIT" VALUE="Go"></NOSCRIPT>
 </FORM>
 
 <TABLE SUMMARY="{printer_name}">
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Описание:</TH><TD>{printer_info}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Расположение:</TH><TD>{printer_location}</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Драйвер:</TH><TD>{printer_make_and_model} ({color_supported=1?цветной:черно-белый}{sides_supported?, дуплексная печать:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Драйвер:</TH><TD>{printer_make_and_model} ({color_supported=1?цветной:черно-белый}{sides_supported=one-sided?:, дуплексная печать})<BR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">Подключение:</TH><TD>{device_uri}</TD></TR>
 <TR><TH ALIGN="RIGHT" VALIGN="TOP">По умолчанию:</TH><TD>job-sheets={job_sheets_default}
-media={media_default?{media_default}:неизвестный}
+media={media_default?{media_default}:unknown}
 {sides_default?sides={sides_default}:}</TD></TR>
 </TABLE>
-
-</DIV>
\ No newline at end of file
index 79feae5..939835c 100644 (file)
@@ -1,11 +1,11 @@
 {#printer_name=0?:
 <TABLE CLASS="list" SUMMARY="Список принтеров">
 <THEAD>
-<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Ð\9eÑ\87еÑ\80едÑ\8c <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Ð\9eÑ\87еÑ\80едÑ\8c <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Описание</TH><TH>Расположение</TH><TH>Драйвер</TH><TH>Статус</TH></TR>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&amp;WHICH_JOBS={?WHICH_JOBS}&amp;FIRST={FIRST}&amp;ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>&#x25b2;</SMALL> Ð\9dаименование <SMALL>&#x25b2;</SMALL>:<SMALL>&#x25bc;</SMALL> Ð\9dаименование <SMALL>&#x25bc;</SMALL>}</A></TH><TH>Описание</TH><TH>Расположение</TH><TH>Драйвер</TH><TH>Статус</TH></TR>
 </THEAD>
 <TBODY>
 {[printer_name]
-<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?Idle:{printer_state=4?Печатает:Приостановлен}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
+<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?ожидает:{printer_state=4?печатает:приостановлен}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
 }
 </TBODY>
 </TABLE></DIV>}
index c32a5ae..c8fb265 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Применение изменений параметров</H2>
 
-<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
-ALT="Ожидание"> Дождитесь перезагрузки сервера...</P>
-
-</DIV>
+<P><IMG SRC="data:image/gif;base64,R0lGODlhEAAQAIQAAP///wAAAPDw8IqKiuDg4EZGRnp6egAAAFhYWCQkJKysrL6+vhQUFJycnAQEBDY2NmhoaP///////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQABQD/ACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAEFAB8ALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQBBQAfACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQBBQAfACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkEAQUAHwAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkEAQUAHwAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAEFAB8ALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkEAQUAHwAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAEFAB8ALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQBBQAfACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQBBQAfACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOw==" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+ALT="Ожидание"> Дождитесь перезапуска сервера...</P>
index f338bc6..b5f136c 100644 (file)
@@ -3,7 +3,7 @@
 {ORDER?<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{ORDER}">:}
 
 <P ALIGN="CENTER"><B>Поиск
-{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?группы:{SECTION=jobs?задания:принтеры}}}:</B>
+{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?группы:{SECTION=jobs?задания:принтера}}}:</B>
 <INPUT TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40"  PLACEHOLDER="" AUTOSAVE="org.cups.{SECTION}" RESULTS="20"> <INPUT
 TYPE="SUBMIT" VALUE="Поиск"> <INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Очистить"></P>
 
index e5c79dd..59a5a79 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Установить параметры по умолчанию для {printer_name}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
index 11adc70..b92988a 100644 (file)
@@ -12,5 +12,3 @@ for (var i = 0; i < paramtables.length; i++)
 }
 --></SCRIPT>
 </FORM>
-
-</DIV>
index f2b4642..b5c60ab 100644 (file)
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
 <P>Подписка {subscription_name} была успешно добавлена.</P>
-
-</DIV>
index 5daed1f..1518cbe 100644 (file)
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
 <P>Подписка #{notify_subscription_id} была отменена.</P>
-
-</DIV>
index 6dc1ba1..ce8837c 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Печать пробной страницы на {printer_name}</H2>
 
 <P>Пробная страница отправлена на печать;Номер задания <A HREF="/{SECTION}/{printer_name}">
 {printer_name}-{job_id}</A>.</P>
-
-</DIV>
index 09de926..ef87fea 100644 (file)
@@ -1,7 +1,6 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS, а так же логотип CUPS являются зарегистрированными торговыми марками
-<A HREF="http://www.apple.com">Apple Inc.</A> Авторские права на CUPS принадлежат (2007-2013) компании Apple Inc. Все права защищены.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+      </div>
+    </div>
+    <div class="footer">CUPS, а так же логотип CUPS являются зарегистрированными торговыми марками
+<A HREF="http://www.apple.com">Apple Inc.</A> Авторские права на CUPS принадлежат (2007-2014) компании Apple Inc. Все права защищены.</div>
+  </body>
+</html>
index ee718b2..6f3aca5 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <FORM METHOD="POST" ACTION="/admin">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
@@ -27,4 +25,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
index 3e7db46..91e0981 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Set Default Options for {printer_name}</H2>
 
 <FORM METHOD="POST" ACTION="/admin">
index 11adc70..b92988a 100644 (file)
@@ -12,5 +12,3 @@ for (var i = 0; i < paramtables.length; i++)
 }
 --></SCRIPT>
 </FORM>
-
-</DIV>
index c288b36..6153d79 100644 (file)
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
 <P>Subscription {subscription_name} has been added successfully.</P>
-
-</DIV>
index 86f2c10..46662cc 100644 (file)
@@ -1,5 +1 @@
-<DIV CLASS="indent">
-
 <P>Subscription #{notify_subscription_id} has been canceled.</P>
-
-</DIV>
index 59e314a..44a74f2 100644 (file)
@@ -1,8 +1,4 @@
-<DIV CLASS="indent">
-
 <H2 CLASS="title">Print Test Page On {printer_name}</H2>
 
 <P>Test page sent; job ID is <A HREF="/{SECTION}/{printer_name}">
 {printer_name}-{job_id}</A>.</P>
-
-</DIV>
index c66986a..74447af 100644 (file)
@@ -1,8 +1,5 @@
-</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR><TD CLASS="trailer">CUPS and the CUPS logo are trademarks of
-<A HREF="http://www.apple.com">Apple Inc.</A> Copyright 2007-2013 Apple
-Inc. All rights reserved.</TD></TR>
-</TABLE>
-</BODY>
-</HTML>
+      </div>
+    </div>
+    <div class="footer">CUPS and the CUPS logo are trademarks of <a href="http://www.apple.com">Apple Inc.</a> Copyright &copy; 2007-2015 Apple Inc. All rights reserved.</div>
+  </body>
+</html>
index 0889f3f..c88e033 100644 (file)
@@ -1,5 +1,3 @@
-<DIV CLASS="indent">
-
 <FORM METHOD="POST" ACTION="/admin">
 <INPUT TYPE="HIDDEN" NAME="org.cups.sid" VALUE="{$org.cups.sid}">
 <INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
@@ -27,4 +25,3 @@
 </TABLE>
 
 </FORM>
-</DIV>
index fbd2a97..ab75c98 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: 4.1-requests.test 8144 2008-11-19 19:23:12Z mike $"
+# "$Id: 4.1-requests.test 11398 2013-11-06 20:11:11Z msweet $"
 #
 #   Verify that the server requires the following attributes:
 #
        STATUS server-error-version-not-supported
 }
 #
-# End of "$Id: 4.1-requests.test 8144 2008-11-19 19:23:12Z mike $"
+# End of "$Id: 4.1-requests.test 11398 2013-11-06 20:11:11Z msweet $"
 #
index 67c515d..4052ee7 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: 4.2-cups-printer-ops.test 6379 2007-03-21 14:57:22Z mike $"
+# "$Id: 4.2-cups-printer-ops.test 11798 2014-04-07 15:18:44Z msweet $"
 #
 #   Verify that the CUPS printer operations work.
 #
        ATTR uri device-uri file:/tmp/Test1
        ATTR enum printer-state 3
        ATTR boolean printer-is-accepting-jobs true
+       ATTR text printer-info "Test Printer 1"
 
        FILE testps.ppd
 
 }
 
 #
-# End of "$Id: 4.2-cups-printer-ops.test 6379 2007-03-21 14:57:22Z mike $"
+# End of "$Id: 4.2-cups-printer-ops.test 11798 2014-04-07 15:18:44Z msweet $"
 #
index 2f2236b..fbfa3b9 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: 4.3-job-ops.test 7550 2008-05-12 16:40:40Z mike $"
+# "$Id: 4.3-job-ops.test 11398 2013-11-06 20:11:11Z msweet $"
 #
 #   Verify that the IPP job operations work.
 #
 }
 
 #
-# End of "$Id: 4.3-job-ops.test 7550 2008-05-12 16:40:40Z mike $"
+# End of "$Id: 4.3-job-ops.test 11398 2013-11-06 20:11:11Z msweet $"
 #
index f6cf820..e0a18a3 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: 4.4-subscription-ops.test 6635 2007-07-09 20:34:48Z mike $"
+# "$Id: 4.4-subscription-ops.test 11398 2013-11-06 20:11:11Z msweet $"
 #
 #   Verify that the CUPS subscription operations work.
 #
 }
 
 #
-# End of "$Id: 4.4-subscription-ops.test 6635 2007-07-09 20:34:48Z mike $"
+# End of "$Id: 4.4-subscription-ops.test 11398 2013-11-06 20:11:11Z msweet $"
 #
index e4a8ed4..c6158da 100644 (file)
@@ -1,17 +1,17 @@
 #!/bin/sh
 #
-# "$Id: 5.1-lpadmin.sh 7494 2008-04-25 18:36:46Z mike $"
+# "$Id: 5.1-lpadmin.sh 12393 2014-12-19 15:33:22Z msweet $"
 #
-#   Test the lpadmin command.
+# Test the lpadmin command.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 1997-2005 by Easy Software Products, all rights reserved.
+# Copyright 2007-2013 by Apple Inc.
+# Copyright 1997-2005 by Easy Software Products, all rights reserved.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 echo "Add Printer Test"
@@ -22,7 +22,12 @@ if test $? != 0; then
        echo "    FAILED"
        exit 1
 else
-       echo "    PASSED"
+       if test -f $CUPS_SERVERROOT/ppd/Test3.ppd; then
+               echo "    PASSED"
+       else
+               echo "    FAILED (No PPD)"
+               exit 1
+       fi
 fi
 echo ""
 
@@ -52,8 +57,8 @@ echo ""
 
 echo "Add Shared Printer Test"
 echo ""
-echo "    lpadmin -p Test3 -E -v ipp://localhost:8631/printers/Test2 -m raw"
-$VALGRIND ../systemv/lpadmin -p Test3 -E -v ipp://localhost:8631/printers/Test2 -m raw 2>&1
+echo "    lpadmin -p Test3 -E -v ipp://localhost:$IPP_PORT/printers/Test2 -m raw"
+$VALGRIND ../systemv/lpadmin -p Test3 -E -v ipp://localhost:$IPP_PORT/printers/Test2 -m raw 2>&1
 if test $? != 0; then
        echo "    FAILED"
        exit 1
@@ -63,5 +68,5 @@ fi
 echo ""
 
 #
-# End of "$Id: 5.1-lpadmin.sh 7494 2008-04-25 18:36:46Z mike $".
+# End of "$Id: 5.1-lpadmin.sh 12393 2014-12-19 15:33:22Z msweet $".
 #
index ff15a87..3797ab0 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# "$Id: 5.2-lpc.sh 6649 2007-07-11 21:46:42Z mike $"
+# "$Id: 5.2-lpc.sh 11398 2013-11-06 20:11:11Z msweet $"
 #
 #   Test the lpc command.
 #
@@ -27,5 +27,5 @@ fi
 echo ""
 
 #
-# End of "$Id: 5.2-lpc.sh 6649 2007-07-11 21:46:42Z mike $".
+# End of "$Id: 5.2-lpc.sh 11398 2013-11-06 20:11:11Z msweet $".
 #
index 633508c..8c9491a 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# "$Id: 5.3-lpq.sh 6649 2007-07-11 21:46:42Z mike $"
+# "$Id: 5.3-lpq.sh 11398 2013-11-06 20:11:11Z msweet $"
 #
 #   Test the lpq command.
 #
@@ -27,5 +27,5 @@ fi
 echo ""
 
 #
-# End of "$Id: 5.3-lpq.sh 6649 2007-07-11 21:46:42Z mike $".
+# End of "$Id: 5.3-lpq.sh 11398 2013-11-06 20:11:11Z msweet $".
 #
index b2e38f1..9d9a182 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# "$Id: 5.4-lpstat.sh 6649 2007-07-11 21:46:42Z mike $"
+# "$Id: 5.4-lpstat.sh 12490 2015-02-06 18:45:48Z msweet $"
 #
 #   Test the lpstat command.
 #
@@ -30,7 +30,7 @@ echo "LPSTAT Test"
 echo ""
 echo "    lpstat -H"
 server="`$VALGRIND ../systemv/lpstat -H 2>&1`"
-if test $? != 0 -o "x$server" != xlocalhost:8631; then
+if test $? != 0 -o "x$server" != x$CUPS_SERVER; then
        echo "    FAILED ($server)"
        exit 1
 else
@@ -39,5 +39,5 @@ fi
 echo ""
 
 #
-# End of "$Id: 5.4-lpstat.sh 6649 2007-07-11 21:46:42Z mike $".
+# End of "$Id: 5.4-lpstat.sh 12490 2015-02-06 18:45:48Z msweet $".
 #
index aa326a8..8d67330 100644 (file)
@@ -1,10 +1,10 @@
 #!/bin/sh
 #
-# "$Id: 5.5-lp.sh 7415 2008-03-31 22:33:20Z mike $"
+# "$Id: 5.5-lp.sh 12066 2014-07-30 18:30:44Z msweet $"
 #
 #   Test the lp command.
 #
-#   Copyright 2007-2012 by Apple Inc.
+#   Copyright 2007-2014 by Apple Inc.
 #   Copyright 1997-2005 by Easy Software Products, all rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -55,6 +55,7 @@ echo ""
 echo "    lp -d Test1 testfile.jpg"
 echo "    lp -d Test2 testfile.jpg"
 i=0
+pids=""
 while test $i -lt $1; do
        j=1
        while test $j -le $2; do
@@ -63,12 +64,13 @@ while test $i -lt $1; do
        done
 
        $VALGRIND ../systemv/lp -d Test1 testfile.jpg 2>&1 &
+       pids="$pids $!"
        $VALGRIND ../systemv/lp -d Test2 testfile.jpg 2>&1 &
-       lppid=$!
+       pids="$pids $!"
 
        i=`expr $i + 1`
 done
-wait $lppid
+wait $pids
 if test $? != 0; then
        echo "    FAILED"
        exit 1
@@ -79,6 +81,19 @@ echo ""
 
 ./waitjobs.sh
 
+echo "LPSTAT Completed Jobs Order Test"
+echo ""
+echo "    lpstat -W completed -o"
+$VALGRIND ../systemv/lpstat -W completed -o | tee $BASE/lpstat-completed.txt
+if test "`uniq -d $BASE/lpstat-completed.txt`" != ""; then
+       echo "    FAILED"
+       exit 1
+else
+       echo "    PASSED"
+fi
+echo ""
+
+
 #
-# End of "$Id: 5.5-lp.sh 7415 2008-03-31 22:33:20Z mike $".
+# End of "$Id: 5.5-lp.sh 12066 2014-07-30 18:30:44Z msweet $".
 #
index 9a26e75..c918ab2 100644 (file)
@@ -1,10 +1,10 @@
 #!/bin/sh
 #
-# "$Id: 5.6-lpr.sh 7409 2008-03-29 00:26:03Z mike $"
+# "$Id: 5.6-lpr.sh 12065 2014-07-30 17:56:35Z msweet $"
 #
 #   Test the lpr command.
 #
-#   Copyright 2007-2012 by Apple Inc.
+#   Copyright 2007-2014 by Apple Inc.
 #   Copyright 1997-2005 by Easy Software Products, all rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -55,6 +55,7 @@ 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
@@ -63,12 +64,13 @@ while test $i -lt $1; do
        done
 
        $VALGRIND ../berkeley/lpr -P Test1 testfile.jpg 2>&1 &
+       pids="$pids $!"
        $VALGRIND ../berkeley/lpr -P Test2 testfile.jpg 2>&1 &
-       lprpid=$!
+       pids="$pids $!"
 
        i=`expr $i + 1`
 done
-wait $lppid
+wait $pids
 if test $? != 0; then
        echo "    FAILED"
        exit 1
@@ -80,5 +82,5 @@ echo ""
 ./waitjobs.sh
 
 #
-# End of "$Id: 5.6-lpr.sh 7409 2008-03-29 00:26:03Z mike $".
+# End of "$Id: 5.6-lpr.sh 12065 2014-07-30 17:56:35Z msweet $".
 #
index 4b96920..fd89569 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# "$Id: 5.7-lprm.sh 7409 2008-03-29 00:26:03Z mike $"
+# "$Id: 5.7-lprm.sh 11398 2013-11-06 20:11:11Z msweet $"
 #
 #   Test the lprm command.
 #
@@ -43,5 +43,5 @@ fi
 echo ""
 
 #
-# End of "$Id: 5.7-lprm.sh 7409 2008-03-29 00:26:03Z mike $".
+# End of "$Id: 5.7-lprm.sh 11398 2013-11-06 20:11:11Z msweet $".
 #
index 88b7dd4..321b75b 100644 (file)
@@ -1,10 +1,10 @@
 #!/bin/sh
 #
-# "$Id: 5.8-cancel.sh 7409 2008-03-29 00:26:03Z mike $"
+# "$Id: 5.8-cancel.sh 11398 2013-11-06 20:11:11Z msweet $"
 #
 #   Test the cancel command.
 #
-#   Copyright 2007-2011 by Apple Inc.
+#   Copyright 2007-2013 by Apple Inc.
 #   Copyright 1997-2006 by Easy Software Products, all rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -40,6 +40,18 @@ else
 fi
 echo ""
 
+echo "Purge All Test"
+echo ""
+echo "    cancel -a -x"
+$VALGRIND ../systemv/cancel -a -x 2>&1
+if test $? != 0; then
+       echo "    FAILED"
+       exit 1
+else
+       echo "    PASSED"
+fi
+echo ""
+
 #
-# End of "$Id: 5.8-cancel.sh 7409 2008-03-29 00:26:03Z mike $".
+# End of "$Id: 5.8-cancel.sh 11398 2013-11-06 20:11:11Z msweet $".
 #
index a6ea364..416ac58 100644 (file)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# "$Id: 5.9-lpinfo.sh 7711 2008-07-02 04:39:27Z mike $"
+# "$Id: 5.9-lpinfo.sh 11398 2013-11-06 20:11:11Z msweet $"
 #
 #   Test the lpinfo command.
 #
@@ -51,5 +51,5 @@ fi
 echo ""
 
 #
-# End of "$Id: 5.9-lpinfo.sh 7711 2008-07-02 04:39:27Z mike $".
+# End of "$Id: 5.9-lpinfo.sh 11398 2013-11-06 20:11:11Z msweet $".
 #
index 69b96a6..e2822d0 100644 (file)
@@ -1,18 +1,29 @@
-ippserver.o: ippserver.c ../cups/cups-private.h ../cups/string-private.h \
+ippfind.o: ippfind.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h
+ippinfra.o: ippinfra.c ../config.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/string-private.h \
+  ../cups/thread-private.h
+ippproxy.o: ippproxy.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
+ippserver.o: ippserver.c ../config.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/string-private.h \
+  ../cups/thread-private.h
 ipptool.o: ipptool.c ../cups/cups-private.h ../cups/string-private.h \
   ../config.h ../cups/debug-private.h ../cups/versioning.h \
-  ../cups/ipp-private.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/http-private.h ../cups/md5-private.h \
-  ../cups/language-private.h ../cups/transcode.h ../cups/language.h \
-  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h \
+  ../cups/array-private.h ../cups/array.h ../cups/ipp-private.h \
+  ../cups/ipp.h ../cups/http.h ../cups/http-private.h ../cups/language.h \
+  ../cups/md5-private.h ../cups/language-private.h ../cups/transcode.h \
+  ../cups/pwg-private.h ../cups/cups.h ../cups/file.h ../cups/pwg.h \
   ../cups/ppd-private.h ../cups/ppd.h ../cups/thread-private.h \
   ../cups/file-private.h
 xmltotest.o: xmltotest.c ../config.h ../cups/cups.h ../cups/file.h \
   ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h \
-  ../cups/language.h
+  ../cups/language.h ../cups/pwg.h
index 4974b7c..01af7cc 100644 (file)
@@ -1,9 +1,9 @@
 #
-# "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $"
+# "$Id: Makefile 12414 2015-01-21 00:02:04Z msweet $"
 #
 #   IPP test makefile for CUPS.
 #
-#   Copyright 2007-2012 by Apple Inc.
+#   Copyright 2007-2014 by Apple Inc.
 #   Copyright 1997-2006 by Easy Software Products, all rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -40,16 +40,27 @@ TESTFILES   =       \
                        create-printer-subscription.test \
                        get-completed-jobs.test \
                        get-jobs.test \
+                       get-notifications.test \
                        get-printer-attributes.test \
+                       get-subscriptions.test \
                        ipp-1.1.test \
                        ipp-2.0.test \
                        ipp-2.1.test \
-                       ipp-2.2.test
+                       ipp-2.2.test \
+                       ipp-everywhere.test \
+                       print-job.test \
+                       print-job-deflate.test \
+                       print-job-gzip.test \
+                       validate-job.test
 OBJS           =       \
+                       ippfind.o \
+                       ippinfra.o \
+                       ippproxy.o \
                        ippserver.o \
                        ipptool.o \
                        xmltotest.o
 TARGETS                =       \
+                       $(IPPFIND_BIN) \
                        ippserver \
                        ipptool \
                        ipptool-static
@@ -81,7 +92,7 @@ unittests:
 #
 
 clean:
-       $(RM) $(TARGETS) $(OBJS)
+       $(RM) $(TARGETS) $(OBJS) ippfind-static ippinfra ippinfra-shared ippproxy ippproxy-shared ippserver-shared
 
 
 #
@@ -122,9 +133,15 @@ install-exec:
        echo Installing ipptool in $(BINDIR)...
        $(INSTALL_DIR) -m 755 $(BINDIR)
        $(INSTALL_BIN) ipptool $(BINDIR)
+       if test -x ippfind; then \
+               $(INSTALL_BIN) ippfind $(BINDIR); \
+       fi
        if test "x$(SYMROOT)" != "x"; then \
                $(INSTALL_DIR) $(SYMROOT); \
+               cp ippfind $(SYMROOT); \
+               dsymutil $(SYMROOT)/ippfind; \
                cp ipptool $(SYMROOT); \
+               dsymutil $(SYMROOT)/ipptool; \
        fi
 
 
@@ -158,6 +175,56 @@ uninstall:
 
 
 #
+# ippfind
+#
+
+ippfind:       ippfind.o ../cups/$(LIBCUPS) ../cups/$(LIBCUPSSTATIC)
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o $@ ippfind.o $(LIBS)
+       echo Linking $@-static...
+       $(CC) $(LDFLAGS) -o $@-static ippfind.o  ../cups/$(LIBCUPSSTATIC) \
+               $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
+#
+# ippinfra
+#
+
+ippinfra:      ippinfra.o ../cups/$(LIBCUPSSTATIC)
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o $@ ippinfra.o  ../cups/$(LIBCUPSSTATIC) \
+               $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
+#
+# ippinfra-shared
+#
+
+ippinfra-shared:       ippinfra.o ../cups/$(LIBCUPS)
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o $@ ippinfra.o $(LIBS)
+
+
+#
+# ippproxy
+#
+
+ippproxy:      ippproxy.o ../cups/$(LIBCUPSSTATIC)
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o $@ ippproxy.o  ../cups/$(LIBCUPSSTATIC) \
+               $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ)
+
+
+#
+# ippproxy-shared
+#
+
+ippproxy-shared:       ippproxy.o ../cups/$(LIBCUPS)
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o $@ ippproxy.o $(LIBS)
+
+
+#
 # ippserver
 #
 
@@ -214,5 +281,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 11173 2013-07-23 12:31:34Z msweet $".
+# End of "$Id: Makefile 12414 2015-01-21 00:02:04Z msweet $".
 #
index cb37f22..1c74769 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: get-jobs.test 9702 2011-04-20 21:16:08Z mike $"
+# "$Id: cancel-current-job.test 11398 2013-11-06 20:11:11Z msweet $"
 #
 #   Cancel the currently printing job.
 #
@@ -61,5 +61,5 @@
 
 
 #
-# End of "$Id: get-jobs.test 9702 2011-04-20 21:16:08Z mike $".
+# End of "$Id: cancel-current-job.test 11398 2013-11-06 20:11:11Z msweet $".
 #
index 6195917..eefb1e6 100644 (file)
@@ -1,26 +1,52 @@
 #
-# "$Id$"
+# "$Id: create-printer-subscription.test 11896 2014-05-27 15:00:06Z msweet $"
 #
-#   Create a printer subscription.
+# Create a printer subscription.
 #
-#   Copyright 2007-2010 by Apple Inc.
-#   Copyright 2001-2006 by Easy Software Products. All rights reserved.
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 2001-2006 by Easy Software Products. All rights reserved.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 # Usage:
 #
-#   ./ipptool -d recipient=uri printer-uri create-printer-subscription.test
+#   ./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 printer subscription"
+       NAME "Create a pull printer subscription"
+       SKIP-IF-DEFINED recipient
 
        # The operation to use
        OPERATION Create-Printer-Subscription
@@ -32,8 +58,8 @@
        ATTR uri printer-uri $uri
 
         GROUP subscription-attributes-tag
-       ATTR uri notify-recipient $recipient
-       ATTR keyword notify-events printer-state-changed
+       ATTR keyword notify-pull-method ippget
+       ATTR keyword notify-events printer-config-changed,printer-state-changed
 
        # What statuses are OK?
        STATUS successful-ok
@@ -45,5 +71,5 @@
 
 
 #
-# End of "$Id$"
+# End of "$Id: create-printer-subscription.test 11896 2014-05-27 15:00:06Z msweet $"
 #
diff --git a/test/everywhere/bonjour-tests.sh b/test/everywhere/bonjour-tests.sh
new file mode 100755 (executable)
index 0000000..1a24852
--- /dev/null
@@ -0,0 +1 @@
+#!/bin/sh
diff --git a/test/everywhere/document-format-tests.sh b/test/everywhere/document-format-tests.sh
new file mode 100755 (executable)
index 0000000..1a24852
--- /dev/null
@@ -0,0 +1 @@
+#!/bin/sh
diff --git a/test/everywhere/document-format-tests.test b/test/everywhere/document-format-tests.test
new file mode 100644 (file)
index 0000000..5bcf6c0
--- /dev/null
@@ -0,0 +1,9689 @@
+#
+# "$Id: ipp-everywhere.test 11398 2013-11-06 20:11:11Z msweet $"
+#
+#   IPP Everywhere test suite.
+#
+#   Copyright 2007-2013 by Apple Inc.
+#   Copyright 2001-2006 by Easy Software Products. All rights reserved.
+#
+#   These coded instructions, statements, and computer programs are the
+#   property of Apple Inc. and are protected by Federal copyright
+#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+#   which should have been included with this file.  If this file is
+#   file is missing or damaged, see the license at "http://www.cups.org/".
+#
+# 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 3600dpi 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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+
+       STATUS successful-ok
+       STATUS server-error-busy REPEAT-MATCH
+}
+
+
+#
+# End of "$Id: ipp-everywhere.test 11398 2013-11-06 20:11:11Z msweet $".
+#
diff --git a/test/everywhere/ipp-tests.sh b/test/everywhere/ipp-tests.sh
new file mode 100755 (executable)
index 0000000..1a24852
--- /dev/null
@@ -0,0 +1 @@
+#!/bin/sh
diff --git a/test/everywhere/ipp-tests.test b/test/everywhere/ipp-tests.test
new file mode 100644 (file)
index 0000000..0fb6486
--- /dev/null
@@ -0,0 +1,12086 @@
+#
+# "$Id$"
+#
+# IPP Everywhere Printer Self-Certification - IPP Tests
+#
+# Copyright 2007-2014 by Apple Inc.
+# Copyright 2001-2006 by Easy Software Products. All rights reserved.
+#
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
+#
+
+# All tests are done using IPP/2.0
+VERSION 2.0
+
+# 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)$$/"
+
+# Regular expressions for URI schemes:
+#
+#   HTTP_URI_SCHEME - Matches strings beginning with http:// or https://
+#   IPP_URI_SCHEME  - Matches strings beginning with ipp:// or ipps://
+
+DEFINE HTTP_URI_SCHEME "/^https?://.+$$/"
+DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
+
+
+# Test that a request-id value of 0 is not accepted.
+#
+# Required by: RFC 2911 section 3.1.1
+{
+       NAME "I1. RFC 2911 section 3.1.1: Bad request-id value 0"
+       REQUEST-ID 0
+       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
+
+       STATUS client-error-bad-request
+       EXPECT !printer-uri-supported
+}
+
+
+# Test that the first two attributes must be attributes-charset and
+# attributes-natural-language.
+#
+# Required by: RFC 2911 section 3.1.4
+{
+       NAME "I2. RFC 2911 section 3.1.4: No Operation Attributes"
+       REQUEST-ID random
+       OPERATION Get-Printer-Attributes
+       GROUP operation-attributes-tag
+
+       STATUS client-error-bad-request
+       EXPECT !printer-uri-supported
+}
+{
+       NAME "I3. RFC 2911 section 3.1.4: attributes-charset"
+       OPERATION Get-Printer-Attributes
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR uri printer-uri $uri
+
+       STATUS client-error-bad-request
+       EXPECT !printer-uri-supported
+}
+{
+       NAME "I4. RFC 2911 section 3.1.4: attributes-natural-language"
+       OPERATION Get-Printer-Attributes
+       GROUP operation-attributes-tag
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+
+       STATUS client-error-bad-request
+       EXPECT !printer-uri-supported
+}
+{
+       NAME "I5. RFC 2911 section 3.1.4: attributes-natural-language + attributes-charset"
+       OPERATION Get-Printer-Attributes
+       GROUP operation-attributes-tag
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR charset attributes-charset utf-8
+       ATTR uri printer-uri $uri
+
+       STATUS client-error-bad-request
+       EXPECT !printer-uri-supported
+}
+{
+       NAME "I6. RFC 2911 section 3.1.4: attributes-charset + attributes-natural-language"
+       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
+
+       STATUS successful-ok
+       EXPECT printer-uri-supported OF-TYPE uri WITH-ALL-VALUES "$IPP_URI_SCHEME"
+}
+
+
+# Test that bad IPP versions are not supported.
+#
+# Required by: RFC 2911 section 3.1.8
+{
+       # The name of the test...
+       NAME "I7. RFC 2911 section 3.1.8: Unsupported IPP version 0.0"
+       VERSION 0.0
+       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
+
+       STATUS server-error-version-not-supported
+       EXPECT !printer-uri-supported
+}
+
+
+# Test that printer operations require the printer-uri operation attribute.
+#
+# Required by: RFC 2911 section 3.2
+{
+       NAME "I8. RFC 2911 section 3.2: No printer-uri operation attribute"
+       OPERATION Get-Printer-Attributes
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+
+       STATUS client-error-bad-request
+       EXPECT !printer-uri-supported
+}
+
+
+# Test Print-Job operation
+#
+# Required by: RFC 2911 section 3.2.1
+{
+       NAME "I9. RFC 2911 section 3.2.1: Print-Job Operation"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name $filename
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name $filename
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format $filetype
+       FILE $filename
+
+       STATUS successful-ok
+       STATUS client-error-document-format-not-supported
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state WITH-VALUE 7,8,9 DEFINE-MATCH PRINT_JOB_COMPLETED
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+# Test Validate-Job operation
+#
+# Required by: RFC 2911 section 3.2.3
+{
+       NAME "I10. RFC 2911 section 3.2.3: Validate-Job Operation"
+       OPERATION Validate-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name $filename
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name $filename
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format $filetype
+
+       STATUS successful-ok
+}
+
+
+# Test Get-Printer-Attributes operation
+#
+# Required by: RFC 2911 section 3.2.5
+{
+       NAME "I11. RFC 2911 section 3.2.5: Get-Printer-Attributes Operation (default)"
+       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 $filetype
+
+       STATUS successful-ok
+
+       # Display some useful information to identify the test
+       DISPLAY color-supported
+       DISPLAY compression-supported
+       DISPLAY document-format-supported
+       DISPLAY finishings-supported
+       DISPLAY ipp-versions-supported
+       DISPLAY job-sheets-supported
+       DISPLAY media-supported
+       DISPLAY number-up-supported
+       DISPLAY operations-supported
+       DISPLAY pages-per-minute
+       DISPLAY pages-per-minute-color
+       DISPLAY print-quality-supported
+       DISPLAY printer-uri-supported
+       DISPLAY reference-uri-schemes-supported
+       DISPLAY sizes-supported
+       DISPLAY uri-authentication-supported
+       DISPLAY uri-security-supported
+
+       # Operations
+       EXPECT operations-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 0x0002 # Print-Job
+       EXPECT operations-supported WITH-VALUE 0x0004 # Validate-Job
+       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
+
+       # 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 ?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-hold-until-default IF-DEFINED OPTIONAL_HOLD_JOB
+       EXPECT job-hold-until-supported IF-DEFINED OPTIONAL_HOLD_JOB
+       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-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-default OF-TYPE no-value|keyword|name IN-GROUP printer-attributes-tag COUNT 1
+       EXPECT ?media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+       EXPECT ?media-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag
+       EXPECT ?multiple-document-handling-default OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
+       EXPECT ?multiple-document-handling-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
+       EXPECT ?number-up-default OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT ?number-up-supported OF-TYPE integer|rangeOfInteger IN-GROUP printer-attributes-tag WITH-VALUE >0
+       EXPECT ?number-up-supported WITH-VALUE 1
+       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 ?pages-ranges-supported OF-TYPE boolean 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-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
+       EXPECT ?sides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
+
+       # Job template attributes for specific tests...
+       EXPECT copies-supported WITH-VALUE >1 DEFINE-MATCH OPTIONAL_COPIES
+       EXPECT document-format-supported WITH-VALUE "application/pdf" DEFINE-MATCH OPTIONAL_PDF
+       EXPECT document-format-supported WITH-VALUE "application/postscript" DEFINE-MATCH OPTIONAL_POSTSCRIPT
+       EXPECT document-format-supported WITH-VALUE "image/jpeg" DEFINE-MATCH OPTIONAL_JPEG
+       EXPECT job-sheets-supported WITH-VALUE "standard" DEFINE-MATCH OPTIONAL_STANDARD_SHEET
+       EXPECT media-supported WITH-VALUE "a4" DEFINE-VALUE OPTIONAL_A4_MEDIA
+       EXPECT media-supported WITH-VALUE "iso-a4" DEFINE-VALUE OPTIONAL_A4_MEDIA
+       EXPECT media-supported WITH-VALUE "iso_a4_210x297mm" DEFINE-VALUE OPTIONAL_A4_MEDIA
+       EXPECT media-supported WITH-VALUE "letter" DEFINE-VALUE OPTIONAL_LETTER_MEDIA
+       EXPECT media-supported WITH-VALUE "na-letter" DEFINE-VALUE OPTIONAL_LETTER_MEDIA
+       EXPECT media-supported WITH-VALUE "na_letter_8.5x11in" DEFINE-VALUE OPTIONAL_LETTER_MEDIA
+       EXPECT media-supported WITH-VALUE "index-4x6" DEFINE-VALUE OPTIONAL_4X6_MEDIA
+       EXPECT media-supported WITH-VALUE "na_index-4x6_4x6in" DEFINE-VALUE OPTIONAL_4X6_MEDIA
+       EXPECT number-up-supported WITH-VALUE 2 DEFINE-MATCH OPTIONAL_2UP
+       EXPECT print-quality WITH-VALUE 3 DEFINE-MATCH OPTIONAL_DRAFT_QUALITY
+       EXPECT print-quality WITH-VALUE 4 DEFINE-MATCH OPTIONAL_NORMAL_QUALITY
+       EXPECT print-quality WITH-VALUE 5 DEFINE-MATCH OPTIONAL_BEST_QUALITY
+       EXPECT sides-supported WITH-VALUE "two-sided-long-edge" DEFINE-MATCH OPTIONAL_DUPLEX
+
+       # Printer description attributes
+       EXPECT ?color-supported OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
+       EXPECT ?job-impressions-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag COUNT 1
+       EXPECT ?job-k-octets-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag COUNT 1
+       EXPECT ?job-media-sheets-supported OF-TYPE rangeOfInteger IN-GROUP printer-attributes-tag COUNT 1
+       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 ?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
+       EXPECT ?printer-driver-installer OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1
+       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-message-from-operator 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 WITH-VALUE "$HTTP_URI_SCHEME"
+       EXPECT ?printer-more-info-manufacturer OF-TYPE uri IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
+       EXPECT ?printer-state-message OF-TYPE text IN-GROUP printer-attributes-tag
+       EXPECT ?reference-uri-schemes-supported OF-TYPE uriScheme IN-GROUP printer-attributes-tag
+       EXPECT reference-uri-schemes-supported WITH-VALUE "ftp" IF-DEFINED OPTIONAL_PRINT_URI
+       EXPECT reference-uri-schemes-supported WITH-VALUE "ftp" IF-DEFINED OPTIONAL_SEND_URI IF-NOT-DEFINED OPTIONAL_PRINT_URI
+       EXPECT charset-configured OF-TYPE charset IN-GROUP printer-attributes-tag COUNT 1
+       EXPECT charset-supported OF-TYPE charset IN-GROUP printer-attributes-tag WITH-VALUE utf-8
+       EXPECT compression-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE none
+       EXPECT document-format-default OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag COUNT 1
+       EXPECT document-format-supported OF-TYPE mimeMediaType IN-GROUP printer-attributes-tag
+       EXPECT generated-natural-language-supported OF-TYPE naturalLanguage IN-GROUP printer-attributes-tag
+       EXPECT ipp-versions-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE 1.1
+       EXPECT natural-language-configured OF-TYPE naturalLanguage IN-GROUP printer-attributes-tag COUNT 1
+       EXPECT pdl-override-supported OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1
+       EXPECT printer-is-accepting-jobs OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
+       EXPECT printer-name OF-TYPE name IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/"
+       EXPECT printer-state OF-TYPE enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5
+       EXPECT printer-state-reasons OF-TYPE keyword IN-GROUP printer-attributes-tag
+       EXPECT printer-up-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT printer-uri-supported OF-TYPE uri IN-GROUP printer-attributes-tag SAME-COUNT-AS uri-security-supported WITH-ALL-VALUES "$IPP_URI_SCHEME"
+       EXPECT queued-job-count OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1
+       EXPECT uri-authentication-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
+       EXPECT uri-security-supported OF-TYPE keyword IN-GROUP printer-attributes-tag SAME-COUNT-AS uri-authentication-supported
+}
+
+
+# Test Get-Printer-Attributes operation with requested-attributes
+#
+# Required by: RFC 2911 section 3.2.5
+{
+       NAME "I12. RFC 2911 section 3.2.5: Get-Printer-Attributes Operation (requested-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 $filetype
+       ATTR keyword requested-attributes printer-uri-supported
+
+       STATUS successful-ok
+
+       EXPECT printer-uri-supported OF-TYPE uri IN-GROUP printer-attributes-tag WITH-ALL-VALUES "$IPP_URI_SCHEME"
+       EXPECT !printer-name
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+       NAME "I13. RFC 2911 section 3.2.6: Get-Jobs Operation (default)"
+       OPERATION Get-Jobs
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+
+       STATUS successful-ok
+       EXPECT ?job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT ?job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT !job-printer-uri
+       EXPECT !job-more-info
+       EXPECT !job-name
+       EXPECT !job-originating-user-name
+       EXPECT !job-state
+       EXPECT !job-state-reasons
+       EXPECT !job-state-message
+       EXPECT !job-detailed-status-messages
+       EXPECT !number-of-documents
+       EXPECT !output-device-assigned
+       EXPECT !time-at-creation
+       EXPECT !time-at-processing
+       EXPECT !time-at-completed
+       EXPECT !job-printer-up-time
+       EXPECT !date-time-at-creation
+       EXPECT !date-time-at-processing
+       EXPECT !date-time-at-completed
+       EXPECT !number-of-intervening-jobs
+       EXPECT !job-message-from-operator
+       EXPECT !job-k-octets
+       EXPECT !job-impressions
+       EXPECT !job-media-sheets
+       EXPECT !job-k-octets-processed
+       EXPECT !job-impressions-completed
+       EXPECT !job-media-sheets-completed
+
+       EXPECT !copies
+       EXPECT !finishings
+       EXPECT !job-hold-until
+       EXPECT !job-priority
+       EXPECT !job-sheets
+       EXPECT !media
+       EXPECT !multiple-document-handling
+       EXPECT !number-up
+       EXPECT !orientation-requested
+       EXPECT !pages-ranges
+       EXPECT !print-quality
+       EXPECT !printer-resolution
+       EXPECT !sides
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+       SKIP-IF-DEFINED PRINT_JOB_COMPLETED
+
+       NAME "I14. RFC 2911 section 3.2.6: Get-Jobs Operation (requested-attributes)"
+       OPERATION Get-Jobs
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR keyword requested-attributes all
+
+       STATUS successful-ok
+       EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
+       EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-message-from-operator OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-k-octets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-impressions OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-media-sheets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-k-octets-processed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-impressions-completed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-media-sheets-completed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+
+       EXPECT ?copies OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT ?finishings OF-TYPE enum IN-GROUP job-attributes-tag
+       EXPECT ?job-hold-until OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-priority OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0,<101
+       EXPECT ?job-sheets OF-TYPE keyword|name IN-GROUP job-attributes-tag
+       EXPECT ?media OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?multiple-document-handling OF-TYPE keyword IN-GROUP job-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
+       EXPECT ?number-up OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT ?orientation-requested OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
+       EXPECT ?pages-ranges OF-TYPE rangeOfInteger IN-GROUP job-attributes-tag
+       EXPECT ?print-quality OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5
+       EXPECT ?printer-resolution OF-TYPE resolution IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?sides OF-TYPE keyword IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+       SKIP-IF-DEFINED PRINT_JOB_COMPLETED
+
+       NAME "RFC 2911 section 3.2.6: Get-Jobs Operation (my-jobs)"
+       OPERATION Get-Jobs
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR boolean my-jobs true
+
+       STATUS successful-ok
+       EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT !job-printer-uri
+       EXPECT !job-more-info
+       EXPECT !job-name
+       EXPECT !job-originating-user-name
+       EXPECT !job-state
+       EXPECT !job-state-reasons
+       EXPECT !job-state-message
+       EXPECT !job-detailed-status-messages
+       EXPECT !number-of-documents
+       EXPECT !output-device-assigned
+       EXPECT !time-at-creation
+       EXPECT !time-at-processing
+       EXPECT !time-at-completed
+       EXPECT !job-printer-up-time
+       EXPECT !date-time-at-creation
+       EXPECT !date-time-at-processing
+       EXPECT !date-time-at-completed
+       EXPECT !number-of-intervening-jobs
+       EXPECT !job-message-from-operator
+       EXPECT !job-k-octets
+       EXPECT !job-impressions
+       EXPECT !job-media-sheets
+       EXPECT !job-k-octets-processed
+       EXPECT !job-impressions-completed
+       EXPECT !job-media-sheets-completed
+
+       EXPECT !copies
+       EXPECT !finishings
+       EXPECT !job-hold-until
+       EXPECT !job-priority
+       EXPECT !job-sheets
+       EXPECT !media
+       EXPECT !multiple-document-handling
+       EXPECT !number-up
+       EXPECT !orientation-requested
+       EXPECT !pages-ranges
+       EXPECT !print-quality
+       EXPECT !printer-resolution
+       EXPECT !sides
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+       SKIP-IF-DEFINED PRINT_JOB_COMPLETED
+
+       # Skip this test when doing authenticated printing since we'll always
+       # use the authenticated username over the requesting-user-name value.
+       SKIP-IF-DEFINED uriuser
+
+       NAME "RFC 2911 section 3.2.6: Get-Jobs Operation (my-jobs different user)"
+       OPERATION Get-Jobs
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name not-$user
+       ATTR boolean my-jobs true
+
+       STATUS successful-ok
+       EXPECT !job-id
+       EXPECT !job-uri
+       EXPECT !job-printer-uri
+       EXPECT !job-more-info
+       EXPECT !job-name
+       EXPECT !job-originating-user-name
+       EXPECT !job-state
+       EXPECT !job-state-reasons
+       EXPECT !job-state-message
+       EXPECT !job-detailed-status-messages
+       EXPECT !number-of-documents
+       EXPECT !output-device-assigned
+       EXPECT !time-at-creation
+       EXPECT !time-at-processing
+       EXPECT !time-at-completed
+       EXPECT !job-printer-up-time
+       EXPECT !date-time-at-creation
+       EXPECT !date-time-at-processing
+       EXPECT !date-time-at-completed
+       EXPECT !number-of-intervening-jobs
+       EXPECT !job-message-from-operator
+       EXPECT !job-k-octets
+       EXPECT !job-impressions
+       EXPECT !job-media-sheets
+       EXPECT !job-k-octets-processed
+       EXPECT !job-impressions-completed
+       EXPECT !job-media-sheets-completed
+
+       EXPECT !copies
+       EXPECT !finishings
+       EXPECT !job-hold-until
+       EXPECT !job-priority
+       EXPECT !job-sheets
+       EXPECT !media
+       EXPECT !multiple-document-handling
+       EXPECT !number-up
+       EXPECT !orientation-requested
+       EXPECT !pages-ranges
+       EXPECT !print-quality
+       EXPECT !printer-resolution
+       EXPECT !sides
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+       SKIP-IF-DEFINED PRINT_JOB_COMPLETED
+
+       NAME "RFC 2911 section 3.2.6: Get-Jobs Operation (which-jobs=not-completed)"
+       OPERATION Get-Jobs
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR keyword which-jobs not-completed
+
+       STATUS successful-ok
+       EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT !job-printer-uri
+       EXPECT !job-more-info
+       EXPECT !job-name
+       EXPECT !job-originating-user-name
+       EXPECT !job-state
+       EXPECT !job-state-reasons
+       EXPECT !job-state-message
+       EXPECT !job-detailed-status-messages
+       EXPECT !number-of-documents
+       EXPECT !output-device-assigned
+       EXPECT !time-at-creation
+       EXPECT !time-at-processing
+       EXPECT !time-at-completed
+       EXPECT !job-printer-up-time
+       EXPECT !date-time-at-creation
+       EXPECT !date-time-at-processing
+       EXPECT !date-time-at-completed
+       EXPECT !number-of-intervening-jobs
+       EXPECT !job-message-from-operator
+       EXPECT !job-k-octets
+       EXPECT !job-impressions
+       EXPECT !job-media-sheets
+       EXPECT !job-k-octets-processed
+       EXPECT !job-impressions-completed
+       EXPECT !job-media-sheets-completed
+
+       EXPECT !copies
+       EXPECT !finishings
+       EXPECT !job-hold-until
+       EXPECT !job-priority
+       EXPECT !job-sheets
+       EXPECT !media
+       EXPECT !multiple-document-handling
+       EXPECT !number-up
+       EXPECT !orientation-requested
+       EXPECT !pages-ranges
+       EXPECT !print-quality
+       EXPECT !printer-resolution
+       EXPECT !sides
+}
+
+
+# Wait for job to complete...
+{
+       SKIP-IF-NOT-DEFINED job-id
+
+       NAME "Get-Job-Attributes Until Job Complete"
+       OPERATION Get-Job-Attributes
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage 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-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >6 REPEAT-NO-MATCH REPEAT-LIMIT 30
+       DISPLAY job-state
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+       NAME "RFC 2911 section 3.2.6: Get-Jobs Operation (which-jobs=completed)"
+       OPERATION Get-Jobs
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR keyword which-jobs completed
+
+       STATUS successful-ok
+       EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT !job-printer-uri
+       EXPECT !job-more-info
+       EXPECT !job-name
+       EXPECT !job-originating-user-name
+       EXPECT !job-state
+       EXPECT !job-state-reasons
+       EXPECT !job-state-message
+       EXPECT !job-detailed-status-messages
+       EXPECT !number-of-documents
+       EXPECT !output-device-assigned
+       EXPECT !time-at-creation
+       EXPECT !time-at-processing
+       EXPECT !time-at-completed
+       EXPECT !job-printer-up-time
+       EXPECT !date-time-at-creation
+       EXPECT !date-time-at-processing
+       EXPECT !date-time-at-completed
+       EXPECT !number-of-intervening-jobs
+       EXPECT !job-message-from-operator
+       EXPECT !job-k-octets
+       EXPECT !job-impressions
+       EXPECT !job-media-sheets
+       EXPECT !job-k-octets-processed
+       EXPECT !job-impressions-completed
+       EXPECT !job-media-sheets-completed
+
+       EXPECT !copies
+       EXPECT !finishings
+       EXPECT !job-hold-until
+       EXPECT !job-priority
+       EXPECT !job-sheets
+       EXPECT !media
+       EXPECT !multiple-document-handling
+       EXPECT !number-up
+       EXPECT !orientation-requested
+       EXPECT !pages-ranges
+       EXPECT !print-quality
+       EXPECT !printer-resolution
+       EXPECT !sides
+}
+
+
+# Test Get-Jobs operation
+#
+# Required by: RFC 2911 section 3.2.6
+{
+       SKIP-IF-DEFINED PRINT_JOB_COMPLETED
+
+       NAME "RFC 2911 section 3.2.6: Get-Jobs Operation (which-jobs, requested-attributes)"
+       OPERATION Get-Jobs
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR keyword requested-attributes all
+       ATTR keyword which-jobs completed
+
+       STATUS successful-ok
+       EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
+       EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-message-from-operator OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-k-octets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-impressions OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-media-sheets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-k-octets-processed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-impressions-completed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-media-sheets-completed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+
+       EXPECT ?copies OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT ?finishings OF-TYPE enum IN-GROUP job-attributes-tag
+       EXPECT ?job-hold-until OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-priority OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0,<101
+       EXPECT ?job-sheets OF-TYPE keyword|name IN-GROUP job-attributes-tag
+       EXPECT ?media OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?multiple-document-handling OF-TYPE keyword IN-GROUP job-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
+       EXPECT ?number-up OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT ?orientation-requested OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
+       EXPECT ?pages-ranges OF-TYPE rangeOfInteger IN-GROUP job-attributes-tag
+       EXPECT ?print-quality OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5
+       EXPECT ?printer-resolution OF-TYPE resolution IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?sides OF-TYPE keyword IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
+}
+
+
+# Test Cancel-Job operation
+#
+# Required by: RFC 2911 section 3.3.3
+{
+       NAME "RFC 2911 section 3.3.3: Cancel-Job Operation (completed job)"
+       OPERATION Cancel-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR integer job-id $job-id
+       ATTR name requesting-user-name $user
+
+       STATUS client-error-not-possible
+}
+
+
+# Test Print-Job operation
+#
+# Required by: RFC 2911 section 3.2.1
+{
+       NAME "RFC 2911 section 3.2.1: Print-Job Operation"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name $filename
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name $filename
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format $filetype
+       FILE $filename
+
+       STATUS successful-ok
+       STATUS client-error-document-format-not-supported
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test Cancel-Job operation
+#
+# Required by: RFC 2911 section 3.3.3
+{
+       NAME "RFC 2911 section 3.3.3: Cancel-Job Operation (pending/processing job)"
+       OPERATION Cancel-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR integer job-id $job-id
+       ATTR name requesting-user-name $user
+
+       STATUS successful-ok
+       STATUS client-error-not-possible
+}
+
+
+# Test Get-Job-Attributes operation
+#
+# Required by: RFC 2911 section 3.3.4
+{
+       NAME "RFC 2911 section 3.3.4: Get-Job-Attributes Operation"
+       OPERATION Get-Job-Attributes
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage 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 OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
+       EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-message-from-operator OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-k-octets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-impressions OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-media-sheets OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-k-octets-processed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-impressions-completed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-media-sheets-completed OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
+
+       EXPECT ?copies OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT ?finishings OF-TYPE enum IN-GROUP job-attributes-tag
+       EXPECT ?job-hold-until OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-priority OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0,<101
+       EXPECT ?job-sheets OF-TYPE keyword|name IN-GROUP job-attributes-tag
+       EXPECT ?media OF-TYPE keyword|name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?multiple-document-handling OF-TYPE keyword IN-GROUP job-attributes-tag WITH-VALUE "/^(single-document|separate-documents-uncollated-copies|separate-documents-collated-copies|single-document-new-sheet)$$/"
+       EXPECT ?number-up OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT ?orientation-requested OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
+       EXPECT ?pages-ranges OF-TYPE rangeOfInteger IN-GROUP job-attributes-tag
+       EXPECT ?print-quality OF-TYPE enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE 3,4,5
+       EXPECT ?printer-resolution OF-TYPE resolution IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?sides OF-TYPE keyword IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
+}
+
+
+# Test Print-URI operation
+#
+# Defined by: RFC 2911 section 3.2.2
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_PRINT_URI
+       SKIP-IF-NOT-DEFINED document-uri
+
+       NAME "RFC 2911 section 3.2.2: Print-URI Operation"
+       OPERATION Print-URI
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name $filename
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name $filename
+       ATTR keyword compression none
+       ATTR uri document-uri $document-uri
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test Print-URI operation with bad document-uri
+#
+# Defined by: RFC 2911 section 3.2.2
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_PRINT_URI
+       SKIP-IF-NOT-DEFINED document-uri
+
+       NAME "Print-URI with bad URI: Print-URI Operation"
+       OPERATION Print-URI
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name $filename
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name $filename
+       ATTR keyword compression none
+       ATTR uri document-uri "bogus://bogus"
+
+       STATUS client-error-uri-scheme-not-supported
+
+       EXPECT !job-uri
+       EXPECT !job-id
+       EXPECT !job-state
+       EXPECT !job-state-reasons
+       EXPECT !job-state-message
+}
+
+
+# Test Create-Job and Send-Document operations
+#
+# Defined by: RFC 2911 section 3.2.4 and 3.3.1
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+       SKIP-IF-NOT-DEFINED OPTIONAL_SEND_DOCUMENT
+
+       NAME "RFC 2911 section 3.2.4: Create-Job Operation"
+       OPERATION Create-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name $filename
+       ATTR boolean ipp-attribute-fidelity false
+
+       STATUS successful-ok
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+       SKIP-IF-NOT-DEFINED OPTIONAL_SEND_DOCUMENT
+       SKIP-PREVIOUS-ERROR yes
+
+       NAME "RFC 2911 section 3.3.1: Send-Document Operation"
+       OPERATION Send-Document
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR integer job-id $job-id
+       ATTR name requesting-user-name $user
+       ATTR boolean last-document true
+       ATTR name document-name $filename
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format $filetype
+       FILE $filename
+
+       STATUS successful-ok
+       STATUS client-error-document-format-not-supported
+       STATUS server-error-job-canceled
+}
+
+# Test Create-Job and Send-Document operations (no last-document)
+#
+# Defined by: RFC 2911 section 3.2.4 and 3.3.1
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+       SKIP-IF-NOT-DEFINED OPTIONAL_SEND_DOCUMENT
+
+       NAME "Send-Document missing last-document: Create-Job Operation"
+       OPERATION Create-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name $filename
+       ATTR boolean ipp-attribute-fidelity false
+
+       STATUS successful-ok
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+       SKIP-IF-NOT-DEFINED OPTIONAL_SEND_DOCUMENT
+       SKIP-PREVIOUS-ERROR yes
+
+       NAME "Send-Document missing last-document: Send-Document Operation"
+       OPERATION Send-Document
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR integer job-id $job-id
+       ATTR name requesting-user-name $user
+       ATTR name document-name $filename
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format $filetype
+       FILE $filename
+
+       STATUS client-error-bad-request
+}
+
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+       SKIP-IF-NOT-DEFINED OPTIONAL_SEND_DOCUMENT
+       SKIP-PREVIOUS-ERROR yes
+
+       NAME "RFC 2911 section 3.3.3: Cancel-Job Operation"
+       OPERATION Cancel-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR integer job-id $job-id
+       ATTR name requesting-user-name $user
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+}
+
+# Test Create-Job and Send-URI operations
+#
+# Defined by: RFC 2911 section 3.2.4 and 3.3.2
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+       SKIP-IF-NOT-DEFINED OPTIONAL_SEND_URI
+       SKIP-IF-NOT-DEFINED document-uri
+
+       NAME "RFC 2911 section 3.2.4: Create-Job Operation"
+       OPERATION Create-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name $filename
+       ATTR boolean ipp-attribute-fidelity false
+
+       STATUS successful-ok
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+       SKIP-IF-NOT-DEFINED OPTIONAL_SEND_URI
+       SKIP-IF-NOT-DEFINED document-uri
+       SKIP-PREVIOUS-ERROR yes
+
+       NAME "RFC 2911 section 3.3.2: Send-URI Operation"
+       OPERATION Send-URI
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR integer job-id $job-id
+       ATTR name requesting-user-name $user
+       ATTR boolean last-document true
+       ATTR name document-name $filename
+       ATTR keyword compression none
+       ATTR uri document-uri $document-uri
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+}
+
+
+# Test Create-Job and Send-URI operations (bad URI)
+#
+# Defined by: RFC 2911 section 3.2.4 and 3.3.2
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+       SKIP-IF-NOT-DEFINED OPTIONAL_SEND_URI
+
+       NAME "Send-URI with bad URI: Create-Job Operation"
+       OPERATION Create-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name $filename
+       ATTR boolean ipp-attribute-fidelity false
+
+       STATUS successful-ok
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+       SKIP-IF-NOT-DEFINED OPTIONAL_SEND_URI
+       SKIP-IF-NOT-DEFINED document-uri
+       SKIP-PREVIOUS-ERROR yes
+
+       NAME "Send-URI with bad URI: Send-URI Operation (bad URI)"
+       OPERATION Send-URI
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR integer job-id $job-id
+       ATTR name requesting-user-name $user
+       ATTR boolean last-document true
+       ATTR name document-name $filename
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format $filetype
+       ATTR uri document-uri "bogus://bogus"
+
+       STATUS client-error-uri-scheme-not-supported
+}
+
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_CREATE_JOB
+       SKIP-IF-NOT-DEFINED OPTIONAL_SEND_URI
+       SKIP-PREVIOUS-ERROR yes
+
+       NAME "Send-URI with bad URI: Cancel-Job Operation"
+       OPERATION Cancel-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR integer job-id $job-id
+       ATTR name requesting-user-name $user
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+}
+
+
+# Test multiple copy output
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_COPIES
+
+       NAME "Print-Job with copies"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name $filename
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name $filename
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format $filetype
+       GROUP job-attributes-tag
+       ATTR integer copies 2
+       FILE $filename
+
+       STATUS successful-ok
+       STATUS client-error-document-format-not-supported
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test PDF output
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+       SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+
+       NAME "Print-Job with A4 PDF"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "A4 Test Document"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-a4.pdf
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/pdf
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_A4_MEDIA
+       FILE document-a4.pdf
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+       SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_DUPLEX
+
+       NAME "Print-Job with A4 PDF, Duplex"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "A4 Test Document, Duplex"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-a4.pdf
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/pdf
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_A4_MEDIA
+       ATTR keyword sides two-sided-long-edge
+       FILE document-a4.pdf
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+       SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+
+       NAME "Print-Job with US Letter PDF"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "US Letter Test Document"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-letter.pdf
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/pdf
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_LETTER_MEDIA
+       FILE document-letter.pdf
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+       SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_DUPLEX
+
+       NAME "Print-Job with US Letter PDF, Duplex"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "US Letter Test Document, Duplex"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-letter.pdf
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/pdf
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_LETTER_MEDIA
+       ATTR keyword sides two-sided-long-edge
+       FILE document-letter.pdf
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test PostScript output
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+       SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+
+       NAME "Print-Job with A4 PostScript"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "A4 Test Document, Duplex"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-a4.ps
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/postscript
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_LETTER_MEDIA
+       FILE document-a4.ps
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+       SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_DUPLEX
+
+       NAME "Print-Job with A4 PostScript, Duplex"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "US Letter Test Document"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-a4.ps
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/postscript
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_A4_MEDIA
+       ATTR keyword sides two-sided-long-edge
+       FILE document-a4.ps
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+       SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+
+       NAME "Print-Job with US Letter PostScript"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "US Letter Test Document, Duplex"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-letter.ps
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/postscript
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_LETTER_MEDIA
+       FILE document-letter.ps
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+       SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_DUPLEX
+
+       NAME "Print-Job with US Letter PostScript, Duplex"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "A4 Test Document"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-letter.ps
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/postscript
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_LETTER_MEDIA
+       ATTR keyword sides two-sided-long-edge
+       FILE document-letter.ps
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test JPEG output
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+       SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+
+       NAME "Print-Job with Color JPEG on A4"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "Color JPEG on A4"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name color.jpg
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format image/jpeg
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_A4_MEDIA
+       FILE color.jpg
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+       SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+
+       NAME "Print-Job with Color JPEG on US Letter"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "Color JPEG on US Letter"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name color.jpg
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format image/jpeg
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_LETTER_MEDIA
+       FILE color.jpg
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+       SKIP-IF-NOT-DEFINED OPTIONAL_4X6_MEDIA
+
+       NAME "Print-Job with Color JPEG on 4x6"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "Color JPEG on 4x6"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name color.jpg
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format image/jpeg
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_4X6_MEDIA
+       FILE color.jpg
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+       SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+
+       NAME "Print-Job with Grayscale JPEG on A4"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "Grayscale JPEG on A4"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name gray.jpg
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format image/jpeg
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_A4_MEDIA
+       FILE gray.jpg
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+       SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+
+       NAME "Print-Job with Grayscale JPEG on US Letter"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "Grayscale JPEG on US Letter"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name gray.jpg
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format image/jpeg
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_LETTER_MEDIA
+       FILE gray.jpg
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+       SKIP-IF-NOT-DEFINED OPTIONAL_4X6_MEDIA
+
+       NAME "Print-Job with Grayscale JPEG on 4x6"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "Grayscale JPEG on 4x6"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name gray.jpg
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format image/jpeg
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_4X6_MEDIA
+       FILE gray.jpg
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Print-Job with job-sheets
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+       SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_STANDARD_SHEET
+
+       NAME "Print-Job with A4 PDF and Standard Sheet"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "A4 Test Document w/Standard Sheet"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-a4.pdf
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/pdf
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_A4_MEDIA
+       ATTR keyword job-sheets standard
+       FILE document-a4.pdf
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+       SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_STANDARD_SHEET
+
+       NAME "Print-Job with US Letter PDF and Standard Sheet"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "US Letter Test Document w/Standard Sheet"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-a4.pdf
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/pdf
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_LETTER_MEDIA
+       ATTR keyword job-sheets standard
+       FILE document-a4.pdf
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+       SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_STANDARD_SHEET
+
+       NAME "Print-Job with A4 PDF and Standard Sheet"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "A4 Test Document w/Standard Sheet"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-a4.ps
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/postscript
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_A4_MEDIA
+       ATTR keyword job-sheets standard
+       FILE document-a4.ps
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+       SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_STANDARD_SHEET
+
+       NAME "Print-Job with US Letter PDF and Standard Sheet"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "US Letter Test Document w/Standard Sheet"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-a4.ps
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/postscript
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_LETTER_MEDIA
+       ATTR keyword job-sheets standard
+       FILE document-a4.ps
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test number-up output
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+       SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_2UP
+
+       NAME "Print-Job with A4 PDF, 2-Up"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "A4 Test Document; 2-Up"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-a4.pdf
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/pdf
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_A4_MEDIA
+       ATTR integer number-up 2
+       FILE document-a4.pdf
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+       SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_2UP
+
+       NAME "Print-Job with US Letter PDF, 2-Up"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "US Letter Test Document; 2-Up"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-letter.pdf
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/pdf
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_LETTER_MEDIA
+       ATTR integer number-up 2
+       FILE document-letter.pdf
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+       SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_2UP
+
+       NAME "Print-Job with A4 PDF, 2-Up"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "A4 Test Document; 2-Up"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-a4.ps
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/postscript
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_A4_MEDIA
+       ATTR integer number-up 2
+       FILE document-a4.ps
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_POSTSCRIPT
+       SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_2UP
+
+       NAME "Print-Job with US Letter PDF, 2-Up"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "US Letter Test Document; 2-Up"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-letter.ps
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/postscript
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_LETTER_MEDIA
+       ATTR integer number-up 2
+       FILE document-letter.ps
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test output with print-quality...
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+       SKIP-IF-NOT-DEFINED OPTIONAL_4X6_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_DRAFT_QUALITY
+
+       NAME "Print-Job with JPEG on 4x6, Draft Quality"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "4x6 Color JPEG; Draft Quality"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name color.jpg
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format image/jpeg
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_4X6_MEDIA
+       ATTR enum print-quality 3
+       FILE color.jpg
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+       SKIP-IF-NOT-DEFINED OPTIONAL_4X6_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_NORMAL_QUALITY
+
+       NAME "Print-Job with JPEG on 4x6, Normal Quality"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "4x6 Color JPEG; Normal Quality"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name color.jpg
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format image/jpeg
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_4X6_MEDIA
+       ATTR enum print-quality 4
+       FILE color.jpg
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_JPEG
+       SKIP-IF-NOT-DEFINED OPTIONAL_4X6_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_HIGH_QUALITY
+
+       NAME "Print-Job with JPEG on 4x6, High Quality"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "4x6 Color JPEG; High Quality"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name color.jpg
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format image/jpeg
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_4X6_MEDIA
+       ATTR enum print-quality 5
+       FILE color.jpg
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+       SKIP-IF-NOT-DEFINED OPTIONAL_A4_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_DRAFT_QUALITY
+
+       NAME "Print-Job with A4 PDF, Draft Quality"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "A4 Test Document; 2-Up"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-a4.pdf
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/pdf
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_A4_MEDIA
+       ATTR enum print-quality 3
+       FILE document-a4.pdf
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-DEFINED NOPRINT
+       SKIP-IF-NOT-DEFINED OPTIONAL_PDF
+       SKIP-IF-NOT-DEFINED OPTIONAL_LETTER_MEDIA
+       SKIP-IF-NOT-DEFINED OPTIONAL_DRAFT_QUALITY
+
+       NAME "Print-Job with US Letter PDF, Draft Quality"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "US Letter Test Document; 2-Up"
+       ATTR boolean ipp-attribute-fidelity false
+       ATTR name document-name document-letter.pdf
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format application/pdf
+       GROUP job-attributes-tag
+       ATTR keyword media $OPTIONAL_LETTER_MEDIA
+       ATTR enum print-quality 3
+       FILE document-letter.pdf
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+
+# Test hold/release in the context of Print-Job w/job-hold-until + Release-Job
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_HOLD_JOB
+
+       NAME "Print-Job with job-hold-until"
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR name requesting-user-name $user
+       ATTR name job-name "Test Document w/Hold"
+       ATTR name document-name $filename
+       ATTR keyword compression none
+       ATTR mimeMediaType document-format $filetype
+       GROUP job-attributes-tag
+       ATTR keyword job-hold-until indefinite
+       FILE $filename
+
+       STATUS successful-ok
+       STATUS server-error-job-canceled
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
+
+       EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE >0
+       EXPECT job-state OF-TYPE unknown|enum COUNT 1 IN-GROUP job-attributes-tag
+              WITH-VALUE 3,4,5,6,7,8,9
+       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag
+       EXPECT ?number-of-intervening-jobs OF-TYPE integer
+              IN-GROUP job-attributes-tag WITH-VALUE >-1
+}
+
+{
+       SKIP-IF-NOT-DEFINED OPTIONAL_HOLD_JOB
+
+       NAME "Release-Job"
+       OPERATION Release-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR naturalLanguage attributes-natural-language en
+       ATTR uri printer-uri $uri
+       ATTR integer job-id $job-id
+       ATTR name requesting-user-name $user
+
+       STATUS successful-ok
+       STATUS client-error-not-possible
+}
+
+
+# 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
+}
+
+
+# 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 3600dpi 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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+
+       STATUS successful-ok
+       STATUS server-error-busy REPEAT-MATCH
+}
+
+
+#
+# End of "$Id: ipp-everywhere.test 11398 2013-11-06 20:11:11Z msweet $".
+#
diff --git a/test/fax-job.test b/test/fax-job.test
new file mode 100644 (file)
index 0000000..dd35532
--- /dev/null
@@ -0,0 +1,59 @@
+# Fax a test page using Create-Job + Send-Document
+#
+# Usage:
+#
+#    ./ipptest -f filename ipp://... fax-job.test
+{
+       # The name of the test...
+       NAME "Create FaxOut Job for 555-1212 and an IPP destination"
+
+       # The operation to use
+       OPERATION Create-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
+
+       GROUP job-attributes-tag
+       ATTR collection destination-uris {
+               MEMBER uri destination-uri tel:4055551212
+       },{
+               MEMBER uri destination-uri ipp://11.22.33.44/ipp/print
+               MEMBER enum print-quality 5
+               MEMBER keyword media na_letter_8.5x11in
+       }
+
+       # 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
+}
+{
+       # The name of the test...
+       NAME "Send FaxOut Document"
+
+       # The operation to use
+       OPERATION Send-Document
+
+       # 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 integer job-id $job-id
+       ATTR name requesting-user-name $user
+       ATTR mimetype document-format $filetype
+       ATTR boolean last-document true
+
+       FILE $filename
+
+       # What statuses are OK?
+       STATUS successful-ok
+       STATUS successful-ok-ignored-or-substituted-attributes
+}
index eca2279..504ab82 100644 (file)
@@ -1,9 +1,9 @@
 #
-# "$Id$"
+# "$Id: get-completed-jobs.test 12088 2014-08-07 01:09:21Z msweet $"
 #
 #   Get list of completed jobs.
 #
-#   Copyright 2007-2012 by Apple Inc.
+#   Copyright 2007-2014 by Apple Inc.
 #   Copyright 2001-2006 by Easy Software Products. All rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -32,7 +32,7 @@
        ATTR uri printer-uri $uri
        ATTR keyword which-jobs completed
        ATTR keyword requested-attributes
-            job-id,job-state,job-state-reasons,job-name,job-originating-user-name,job-media-sheets-completed
+            job-id,job-uri,job-state,job-state-reasons,job-name,job-originating-user-name,job-media-sheets-completed
 
        # What statuses are OK?
        STATUS successful-ok
@@ -47,5 +47,5 @@
 
 
 #
-# End of "$Id$".
+# End of "$Id: get-completed-jobs.test 12088 2014-08-07 01:09:21Z msweet $".
 #
diff --git a/test/get-job-template-attributes.test b/test/get-job-template-attributes.test
new file mode 100644 (file)
index 0000000..0330160
--- /dev/null
@@ -0,0 +1,24 @@
+# Get printer Job Template attributes using get-printer-attributes
+{
+       # The name of the test...
+       NAME "Get printer Job Template attributes using Get-Printer-Attributes"
+
+       # The operation to use
+       OPERATION Get-Printer-Attributes
+
+       # 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 keyword requested-attributes job-template,media-col-database
+
+       # What statuses are OK?
+       STATUS successful-ok
+       STATUS successful-ok-ignored-or-substituted-attributes
+
+       # What attributes do we expect?
+       EXPECT copies-default
+       EXPECT copies-supported
+       EXPECT media-col-database
+}
index 13b9959..d8cc514 100644 (file)
@@ -1,9 +1,9 @@
 #
-# "$Id: get-jobs.test 9702 2011-04-20 21:16:08Z mike $"
+# "$Id: get-jobs.test 12088 2014-08-07 01:09:21Z msweet $"
 #
 #   Get list of not-completed jobs.
 #
-#   Copyright 2007-2012 by Apple Inc.
+#   Copyright 2007-2014 by Apple Inc.
 #   Copyright 2001-2006 by Easy Software Products. All rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -31,7 +31,7 @@
        ATTR language attributes-natural-language en
        ATTR uri printer-uri $uri
        ATTR keyword requested-attributes
-            job-id,job-state,job-state-reasons,job-name,job-originating-user-name,job-media-sheets,job-media-sheets-completed,job-impressions,job-impressions-completed
+            job-id,job-uri,job-state,job-state-reasons,job-name,job-originating-user-name,job-media-sheets,job-media-sheets-completed,job-impressions,job-impressions-completed
 
        # What statuses are OK?
        STATUS successful-ok
@@ -49,5 +49,5 @@
 
 
 #
-# End of "$Id: get-jobs.test 9702 2011-04-20 21:16:08Z mike $".
+# End of "$Id: get-jobs.test 12088 2014-08-07 01:09:21Z msweet $".
 #
diff --git a/test/get-notifications.test b/test/get-notifications.test
new file mode 100644 (file)
index 0000000..874d214
--- /dev/null
@@ -0,0 +1,46 @@
+#
+# "$Id: get-notifications.test 11398 2013-11-06 20:11:11Z msweet $"
+#
+#   Get subscription events.
+#
+#   Copyright 2007-2013 by Apple Inc.
+#   Copyright 2001-2006 by Easy Software Products. All rights reserved.
+#
+#   These coded instructions, statements, and computer programs are the
+#   property of Apple Inc. and are protected by Federal copyright
+#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+#   which should have been included with this file.  If this file is
+#   file is missing or damaged, see the license at "http://www.cups.org/".
+#
+# Usage:
+#
+#   ./ipptool -d id=NNN printer-uri get-notifications.test
+#
+
+{
+       # The name of the test...
+       NAME "Get events using Get-Notifications"
+
+       # The operation to use
+       OPERATION Get-Notifications
+
+       # 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
+       ATTR integer notify-subscription-ids $id
+
+       # What statuses are OK?
+       STATUS successful-ok
+
+       # What attributes do we expect?
+       EXPECT notify-event OF-TYPE keyword
+       DISPLAY notify-event
+       DISPLAY notify-text
+}
+
+
+#
+# End of "$Id: get-notifications.test 11398 2013-11-06 20:11:11Z msweet $"
+#
index c123c3e..adfb457 100644 (file)
@@ -17,7 +17,7 @@
        ATTR charset attributes-charset utf-8
        ATTR language attributes-natural-language en
        ATTR uri printer-uri $uri
-       ATTR keyword requested-attributes printer-defaults,printer-description,media-col-database
+       ATTR keyword requested-attributes all,media-col-database
 
        # What statuses are OK?
        STATUS successful-ok
diff --git a/test/get-printer-description-attributes.test b/test/get-printer-description-attributes.test
new file mode 100644 (file)
index 0000000..b1d8138
--- /dev/null
@@ -0,0 +1,43 @@
+# Get Printer Description attributes using get-printer-attributes
+{
+       # The name of the test...
+       NAME "Get Printer Description attributes using Get-Printer-Attributes"
+
+       # The operation to use
+       OPERATION Get-Printer-Attributes
+
+       # 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 keyword requested-attributes printer-description
+
+       # What statuses are OK?
+       STATUS successful-ok
+       STATUS successful-ok-ignored-or-substituted-attributes
+
+       # What attributes do we expect?
+       EXPECT printer-name
+       EXPECT printer-uri-supported
+       EXPECT uri-security-supported
+       EXPECT uri-authentication-supported
+       EXPECT printer-state
+       EXPECT printer-state-reasons
+       EXPECT ipp-versions-supported
+       EXPECT operations-supported
+       EXPECT charset-configured
+       EXPECT charset-supported
+       EXPECT natural-language-configured
+       EXPECT generated-natural-language-supported
+       EXPECT document-format-default
+       EXPECT document-format-supported
+       EXPECT printer-is-accepting-jobs
+       EXPECT queued-job-count
+       EXPECT pdl-override-supported
+       EXPECT printer-up-time
+       EXPECT compression-supported
+       EXPECT !copies-default
+       EXPECT !copies-supported
+       EXPECT !media-col-database
+}
diff --git a/test/identify-printer-display.test b/test/identify-printer-display.test
new file mode 100644 (file)
index 0000000..4957a26
--- /dev/null
@@ -0,0 +1,21 @@
+# Make the printer display a message
+{
+       # The name of the test...
+       NAME "Identify Printer with Message"
+
+       # The operation to use
+       OPERATION Identify-Printer
+
+       # 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 keyword identify-actions display
+       ATTR text message "Hello\, World!"
+
+       # What statuses are OK?
+       STATUS successful-ok
+       STATUS successful-ok-ignored-or-substituted-attributes
+}
diff --git a/test/identify-printer-multiple.test b/test/identify-printer-multiple.test
new file mode 100644 (file)
index 0000000..79b2580
--- /dev/null
@@ -0,0 +1,21 @@
+# Make the printer display a message and beep
+{
+       # The name of the test...
+       NAME "Identify Printer with Message and Beep"
+
+       # The operation to use
+       OPERATION Identify-Printer
+
+       # 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 keyword identify-actions sound,display
+       ATTR text message "Hello\, World!"
+
+       # What statuses are OK?
+       STATUS successful-ok
+       STATUS successful-ok-ignored-or-substituted-attributes
+}
diff --git a/test/identify-printer.test b/test/identify-printer.test
new file mode 100644 (file)
index 0000000..b97bb71
--- /dev/null
@@ -0,0 +1,20 @@
+# Make the printer beep
+{
+       # The name of the test...
+       NAME "Identify Printer with Sound"
+
+       # The operation to use
+       OPERATION Identify-Printer
+
+       # 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 keyword identify-actions sound
+
+       # What statuses are OK?
+       STATUS successful-ok
+       STATUS successful-ok-ignored-or-substituted-attributes
+}
index 4fd0ad7..0d4c646 100644 (file)
@@ -1,9 +1,9 @@
 #
-# "$Id$"
+# "$Id: ipp-1.1.test 12661 2015-05-25 14:30:52Z msweet $"
 #
 #   IPP/1.1 test suite.
 #
-#   Copyright 2007-2012 by Apple Inc.
+#   Copyright 2007-2015 by Apple Inc.
 #   Copyright 2001-2006 by Easy Software Products. All rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -156,7 +156,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        STATUS successful-ok
        STATUS client-error-document-format-not-supported
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -324,7 +324,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        EXPECT natural-language-configured OF-TYPE naturalLanguage IN-GROUP printer-attributes-tag COUNT 1
        EXPECT pdl-override-supported OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1
        EXPECT printer-is-accepting-jobs OF-TYPE boolean IN-GROUP printer-attributes-tag COUNT 1
-       EXPECT printer-name OF-TYPE name IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{1,127}$$/"
+       EXPECT printer-name OF-TYPE name IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^.{0,127}$$/"
        EXPECT printer-state OF-TYPE enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5
        EXPECT printer-state-reasons OF-TYPE keyword IN-GROUP printer-attributes-tag
        EXPECT printer-up-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0
@@ -429,22 +429,22 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        ATTR keyword requested-attributes all
 
        STATUS successful-ok
-       EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
-       EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
-       EXPECT job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT ?job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT ?job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT ?job-printer-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT ?job-more-info OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$HTTP_URI_SCHEME"
-       EXPECT job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
-       EXPECT job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
-       EXPECT job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
-       EXPECT job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
+       EXPECT ?job-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-originating-user-name OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?job-state OF-TYPE unknown|enum IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >2,<10
+       EXPECT ?job-state-reasons OF-TYPE keyword IN-GROUP job-attributes-tag
        EXPECT ?job-state-message OF-TYPE text IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?job-detailed-status-messages OF-TYPE text IN-GROUP job-attributes-tag
        EXPECT ?number-of-documents OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?output-device-assigned OF-TYPE name IN-GROUP job-attributes-tag COUNT 1
-       EXPECT time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
-       EXPECT time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
-       EXPECT time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
-       EXPECT job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
+       EXPECT ?time-at-creation OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT ?time-at-processing OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT ?time-at-completed OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >-1
+       EXPECT ?job-printer-up-time OF-TYPE no-value|integer IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?date-time-at-creation OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?date-time-at-processing OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
        EXPECT ?date-time-at-completed OF-TYPE no-value|dateTime IN-GROUP job-attributes-tag COUNT 1
@@ -489,8 +489,8 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        ATTR boolean my-jobs true
 
        STATUS successful-ok
-       EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
-       EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT ?job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT ?job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT !job-printer-uri
        EXPECT !job-more-info
        EXPECT !job-name
@@ -613,8 +613,8 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        ATTR keyword which-jobs not-completed
 
        STATUS successful-ok
-       EXPECT job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
-       EXPECT job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
+       EXPECT ?job-id OF-TYPE integer IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE >0
+       EXPECT ?job-uri OF-TYPE uri IN-GROUP job-attributes-tag COUNT 1 WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT !job-printer-uri
        EXPECT !job-more-info
        EXPECT !job-name
@@ -833,7 +833,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        STATUS successful-ok
        STATUS client-error-document-format-not-supported
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -945,7 +945,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1262,7 +1262,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
        STATUS successful-ok
        STATUS client-error-document-format-not-supported
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1300,7 +1300,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1338,7 +1338,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1374,7 +1374,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1412,7 +1412,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1450,7 +1450,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1488,7 +1488,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1524,7 +1524,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1562,7 +1562,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1600,7 +1600,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1636,7 +1636,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1672,7 +1672,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1708,7 +1708,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1744,7 +1744,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1780,7 +1780,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1820,7 +1820,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1858,7 +1858,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1896,7 +1896,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1934,7 +1934,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -1974,7 +1974,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2012,7 +2012,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2050,7 +2050,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2088,7 +2088,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2128,7 +2128,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2166,7 +2166,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2204,7 +2204,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2242,7 +2242,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2280,7 +2280,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2315,7 +2315,7 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
        STATUS successful-ok
        STATUS server-error-job-canceled
-       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 10
+       STATUS server-error-busy REPEAT-MATCH REPEAT-LIMIT 30
 
        EXPECT job-uri OF-TYPE uri COUNT 1 IN-GROUP job-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
        EXPECT job-id OF-TYPE integer COUNT 1 IN-GROUP job-attributes-tag
@@ -2346,5 +2346,5 @@ DEFINE IPP_URI_SCHEME "/^ipps?://.+$$/"
 
 
 #
-# End of "$Id$".
+# End of "$Id: ipp-1.1.test 12661 2015-05-25 14:30:52Z msweet $".
 #
index 0ee0e94..370ec4a 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id$"
+# "$Id: ipp-2.0.test 11398 2013-11-06 20:11:11Z msweet $"
 #
 #   IPP/2.0 test suite.
 #
@@ -111,5 +111,5 @@ DEFINE MEDIA_REGEX "/^(choice(_((custom|na|asme|roc|oe|roll)_[a-z0-9][-a-z0-9]*_
 
 
 #
-# End of "$Id$".
+# End of "$Id: ipp-2.0.test 11398 2013-11-06 20:11:11Z msweet $".
 #
index e8ddae4..ca48351 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id$"
+# "$Id: ipp-2.1.test 11398 2013-11-06 20:11:11Z msweet $"
 #
 #   IPP/2.1 test suite.
 #
@@ -92,5 +92,5 @@ INCLUDE "ipp-2.0.test"
 
 
 #
-# End of "$Id$".
+# End of "$Id: ipp-2.1.test 11398 2013-11-06 20:11:11Z msweet $".
 #
index 3042ec2..a6eb7a7 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id$"
+# "$Id: ipp-2.2.test 11398 2013-11-06 20:11:11Z msweet $"
 #
 #   IPP/2.2 test suite.
 #
@@ -82,5 +82,5 @@ INCLUDE "ipp-2.1.test"
 
 
 #
-# End of "$Id$".
+# End of "$Id: ipp-2.2.test 11398 2013-11-06 20:11:11Z msweet $".
 #
diff --git a/test/ipp-everywhere.test b/test/ipp-everywhere.test
new file mode 100644 (file)
index 0000000..5bcf6c0
--- /dev/null
@@ -0,0 +1,9689 @@
+#
+# "$Id: ipp-everywhere.test 11398 2013-11-06 20:11:11Z msweet $"
+#
+#   IPP Everywhere test suite.
+#
+#   Copyright 2007-2013 by Apple Inc.
+#   Copyright 2001-2006 by Easy Software Products. All rights reserved.
+#
+#   These coded instructions, statements, and computer programs are the
+#   property of Apple Inc. and are protected by Federal copyright
+#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+#   which should have been included with this file.  If this file is
+#   file is missing or damaged, see the license at "http://www.cups.org/".
+#
+# 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 3600dpi 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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/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-20111130/srgb-8/onepage-letter-srgb-8-720dpi.pwg
+
+       STATUS successful-ok
+       STATUS server-error-busy REPEAT-MATCH
+}
+
+
+#
+# End of "$Id: ipp-everywhere.test 11398 2013-11-06 20:11:11Z msweet $".
+#
diff --git a/test/ippdiscover.c b/test/ippdiscover.c
new file mode 100644 (file)
index 0000000..cd35401
--- /dev/null
@@ -0,0 +1,829 @@
+/*
+ * "$Id: ippdiscover.c 10983 2013-05-13 23:57:32Z msweet $"
+ *
+ *   ippdiscover command for CUPS.
+ *
+ *   Copyright 2007-2013 by Apple Inc.
+ *   Copyright 1997-2007 by Easy Software Products.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ *   This file is subject to the Apple OS-Developed Software exception.
+ *
+ * Contents:
+ *
+ */
+
+
+/*
+ * Include necessary headers.
+ */
+
+#include <cups/cups-private.h>
+#ifdef HAVE_DNSSD
+#  include <dns_sd.h>
+#  ifdef WIN32
+#    pragma comment(lib, "dnssd.lib")
+#  endif /* WIN32 */
+#endif /* HAVE_DNSSD */
+#ifdef HAVE_AVAHI
+#  include <avahi-client/client.h>
+#  include <avahi-client/lookup.h>
+#  include <avahi-common/simple-watch.h>
+#  include <avahi-common/domain.h>
+#  include <avahi-common/error.h>
+#  include <avahi-common/malloc.h>
+#define kDNSServiceMaxDomainName AVAHI_DOMAIN_NAME_MAX
+#endif /* HAVE_AVAHI */
+
+
+/*
+ * Local globals...
+ */
+
+#ifdef HAVE_AVAHI
+static int             got_data = 0;   /* Got data from poll? */
+static AvahiSimplePoll *simple_poll = NULL;
+                                       /* Poll information */
+#endif /* HAVE_AVAHI */
+static const char      *program = NULL;/* Program to run */
+
+
+/*
+ * 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)
+                                       __attribute__((nonnull(1,5,6,7,8)));
+static void DNSSD_API  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            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_cb(AvahiClient *client, AvahiClientState state,
+                                 void *simple_poll);
+static int             poll_cb(struct pollfd *pollfds, unsigned int num_pollfds,
+                               int timeout, void *context);
+static void            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 */
+
+static void            resolve_and_run(const char *name, const char *type,
+                                       const char *domain);
+static void            unquote(char *dst, const char *src, size_t dstsize);
+static void            usage(void) __attribute__((noreturn));
+
+
+/*
+ * 'main()' - Browse for printers and run the specified command.
+ */
+
+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 */
+               *name = NULL,           /* Service name */
+               *type = "_ipp._tcp",    /* Service type */
+               *domain = "local.";     /* Service domain */
+#ifdef HAVE_DNSSD
+  DNSServiceRef        ref;                    /* Browsing service reference */
+#endif /* HAVE_DNSSD */
+#ifdef HAVE_AVAHI
+  AvahiClient  *client;                /* Client information */
+  int          error;                  /* Error code, if any */
+#endif /* HAVE_AVAHI */
+
+
+  for (i = 1; i < argc; i ++)
+    if (!strcmp(argv[i], "snmp"))
+      snmponly = 1;
+    else if (!strcmp(argv[i], "ipp"))
+      ipponly = 1;
+    else
+    {
+      puts("Usage: ./ipp-printers [{ipp | snmp}]");
+      return (1);
+    }
+
+ /*
+  * Create an array to track devices...
+  */
+
+  devices = cupsArrayNew((cups_array_func_t)compare_devices, NULL);
+
+ /*
+  * Browse for different kinds of printers...
+  */
+
+  if (DNSServiceCreateConnection(&main_ref) != kDNSServiceErr_NoError)
+  {
+    perror("ERROR: Unable to create service connection");
+    return (1);
+  }
+
+  fd = DNSServiceRefSockFD(main_ref);
+
+  ipp_ref = main_ref;
+  DNSServiceBrowse(&ipp_ref, kDNSServiceFlagsShareConnection, 0,
+                   "_ipp._tcp", NULL, browse_callback, devices);
+
+ /*
+  * Loop until we are killed...
+  */
+
+  progress();
+
+  for (;;)
+  {
+    FD_ZERO(&input);
+    FD_SET(fd, &input);
+
+    timeout.tv_sec  = 2;
+    timeout.tv_usec = 500000;
+
+    if (select(fd + 1, &input, NULL, NULL, &timeout) <= 0)
+    {
+      time_t curtime = time(NULL);
+
+      for (device = (cups_device_t *)cupsArrayFirst(devices);
+           device;
+          device = (cups_device_t *)cupsArrayNext(devices))
+        if (!device->got_resolve)
+        {
+          if (!device->ref)
+            break;
+
+          if ((curtime - device->resolve_time) > 10)
+          {
+            device->got_resolve = -1;
+           fprintf(stderr, "\rUnable to resolve \"%s\": timeout\n",
+                   device->name);
+           progress();
+         }
+          else
+            break;
+        }
+
+      if (!device)
+        break;
+    }
+
+    if (FD_ISSET(fd, &input))
+    {
+     /*
+      * Process results of our browsing...
+      */
+
+      progress();
+      DNSServiceProcessResult(main_ref);
+    }
+    else
+    {
+     /*
+      * Query any devices we've found...
+      */
+
+      DNSServiceErrorType      status; /* DNS query status */
+      int                      count;  /* Number of queries */
+
+
+      for (device = (cups_device_t *)cupsArrayFirst(devices), count = 0;
+           device;
+          device = (cups_device_t *)cupsArrayNext(devices))
+      {
+        if (!device->ref && !device->sent)
+       {
+        /*
+         * Found the device, now get the TXT record(s) for it...
+         */
+
+          if (count < 50)
+         {
+           device->resolve_time = time(NULL);
+           device->ref          = main_ref;
+
+           status = DNSServiceResolve(&(device->ref),
+                                      kDNSServiceFlagsShareConnection,
+                                      0, device->name, device->regtype,
+                                      device->domain, resolve_callback,
+                                      device);
+            if (status != kDNSServiceErr_NoError)
+            {
+             fprintf(stderr, "\rUnable to resolve \"%s\": %d\n",
+                     device->name, status);
+             progress();
+           }
+           else
+             count ++;
+          }
+       }
+       else if (!device->sent && device->got_resolve)
+       {
+        /*
+         * Got the TXT records, now report the device...
+         */
+
+         DNSServiceRefDeallocate(device->ref);
+         device->ref  = 0;
+         device->sent = 1;
+        }
+      }
+    }
+  }
+
+#ifndef DEBUG
+  fprintf(stderr, "\rFound %d printers. Now querying for capabilities...\n",
+          cupsArrayCount(devices));
+#endif /* !DEBUG */
+
+  puts("#!/bin/sh -x");
+  puts("test -d results && rm -rf results");
+  puts("mkdir results");
+  puts("CUPS_DEBUG_LEVEL=6; export CUPS_DEBUG_LEVEL");
+  puts("CUPS_DEBUG_FILTER='^(ipp|http|_ipp|_http|cupsGetResponse|cupsSend|"
+       "cupsWrite|cupsDo).*'; export CUPS_DEBUG_FILTER");
+
+  for (device = (cups_device_t *)cupsArrayFirst(devices);
+       device;
+       device = (cups_device_t *)cupsArrayNext(devices))
+  {
+    if (device->got_resolve <= 0 || device->cups_shared)
+      continue;
+
+#ifdef DEBUG
+    fprintf(stderr, "Checking \"%s\" (got_resolve=%d, cups_shared=%d, uri=%s)\n",
+            device->name, device->got_resolve, device->cups_shared, device->uri);
+#else
+    fprintf(stderr, "Checking \"%s\"...\n", device->name);
+#endif /* DEBUG */
+
+    if ((http = httpConnect(device->host, device->port)) == NULL)
+    {
+      fprintf(stderr, "Failed to connect to \"%s\": %s\n", device->name,
+              cupsLastErrorString());
+      continue;
+    }
+
+    request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
+                 device->uri);
+
+    response = cupsDoRequest(http, request, device->rp);
+
+    if (cupsLastError() > IPP_OK_SUBST)
+      fprintf(stderr, "Failed to query \"%s\": %s\n", device->name,
+              cupsLastErrorString());
+    else
+    {
+      if ((attr = ippFindAttribute(response, "ipp-versions-supported",
+                                  IPP_TAG_KEYWORD)) != NULL)
+      {
+       version = attr->values[0].string.text;
+
+       for (i = 1; i < attr->num_values; i ++)
+         if (strcmp(attr->values[i].string.text, version) > 0)
+           version = attr->values[i].string.text;
+      }
+      else
+       version = "1.0";
+
+      testfile = NULL;
+
+      if ((attr = ippFindAttribute(response, "document-format-supported",
+                                   IPP_TAG_MIMETYPE)) != NULL)
+      {
+       /*
+        * Figure out the test file for printing, preferring PDF and PostScript
+        * over JPEG and plain text...
+        */
+
+        for (i = 0; i < attr->num_values; i ++)
+        {
+          if (!strcasecmp(attr->values[i].string.text, "application/pdf"))
+          {
+            testfile = "testfile.pdf";
+            break;
+          }
+          else if (!strcasecmp(attr->values[i].string.text,
+                               "application/postscript"))
+            testfile = "testfile.ps";
+          else if (!strcasecmp(attr->values[i].string.text, "image/jpeg") &&
+                   !testfile)
+            testfile = "testfile.jpg";
+          else if (!strcasecmp(attr->values[i].string.text, "text/plain") &&
+                   !testfile)
+            testfile = "testfile.txt";
+          else if (!strcasecmp(attr->values[i].string.text,
+                               "application/vnd.hp-PCL") && !testfile)
+            testfile = "testfile.pcl";
+        }
+
+        if (!testfile)
+        {
+          fprintf(stderr,
+                  "Printer \"%s\" reports the following IPP file formats:\n",
+                  device->name);
+          for (i = 0; i < attr->num_values; i ++)
+            fprintf(stderr, "    \"%s\"\n", attr->values[i].string.text);
+        }
+      }
+
+      if (!testfile && device->pdl)
+      {
+       char    *pdl,                   /* Copy of pdl string */
+               *start, *end;           /* Pointers into pdl string */
+
+
+        pdl = strdup(device->pdl);
+       for (start = device->pdl; start && *start; start = end)
+       {
+         if ((end = strchr(start, ',')) != NULL)
+           *end++ = '\0';
+
+         if (!strcasecmp(start, "application/pdf"))
+         {
+           testfile = "testfile.pdf";
+           break;
+         }
+         else if (!strcasecmp(start, "application/postscript"))
+           testfile = "testfile.ps";
+         else if (!strcasecmp(start, "image/jpeg") && !testfile)
+           testfile = "testfile.jpg";
+         else if (!strcasecmp(start, "text/plain") && !testfile)
+           testfile = "testfile.txt";
+         else if (!strcasecmp(start, "application/vnd.hp-PCL") && !testfile)
+           testfile = "testfile.pcl";
+       }
+       free(pdl);
+
+        if (testfile)
+        {
+         fprintf(stderr,
+                 "Using \"%s\" for printer \"%s\" based on TXT record pdl "
+                 "info.\n", testfile, device->name);
+        }
+        else
+        {
+         fprintf(stderr,
+                 "Printer \"%s\" reports the following TXT file formats:\n",
+                 device->name);
+         fprintf(stderr, "    \"%s\"\n", device->pdl);
+       }
+      }
+
+      if (!device->ty &&
+         (attr = ippFindAttribute(response, "printer-make-and-model",
+                                  IPP_TAG_TEXT)) != NULL)
+       device->ty = strdup(attr->values[0].string.text);
+
+      if (strcmp(version, "1.0") && testfile && device->ty)
+      {
+       char            filename[1024], /* Filename */
+                       *fileptr;       /* Pointer into filename */
+       const char      *typtr;         /* Pointer into ty */
+
+        if (!strncasecmp(device->ty, "DeskJet", 7) ||
+            !strncasecmp(device->ty, "DesignJet", 9) ||
+            !strncasecmp(device->ty, "OfficeJet", 9) ||
+            !strncasecmp(device->ty, "Photosmart", 10))
+          strlcpy(filename, "HP_", sizeof(filename));
+        else
+          filename[0] = '\0';
+
+       fileptr = filename + strlen(filename);
+
+        if (!strncasecmp(device->ty, "Lexmark International Lexmark", 29))
+          typtr = device->ty + 22;
+        else
+          typtr = device->ty;
+
+       while (*typtr && fileptr < (filename + sizeof(filename) - 1))
+       {
+         if (isalnum(*typtr & 255) || *typtr == '-')
+           *fileptr++ = *typtr++;
+         else
+         {
+           *fileptr++ = '_';
+           typtr++;
+         }
+       }
+
+       *fileptr = '\0';
+
+        printf("# %s\n", device->name);
+        printf("echo \"Testing %s...\"\n", device->name);
+
+        if (!ipponly)
+        {
+         printf("echo \"snmpwalk -c public -v 1 -Cc %s 1.3.6.1.2.1.25 "
+                "1.3.6.1.2.1.43 1.3.6.1.4.1.2699.1\" > results/%s.snmpwalk\n",
+                device->host, filename);
+         printf("snmpwalk -c public -v 1 -Cc %s 1.3.6.1.2.1.25 "
+                "1.3.6.1.2.1.43 1.3.6.1.4.1.2699.1 | "
+                "tee -a results/%s.snmpwalk\n",
+                device->host, filename);
+        }
+
+        if (!snmponly)
+        {
+         printf("echo \"./ipptool-static -tIf %s -T 30 -d NOPRINT=1 -V %s %s "
+                "ipp-%s.test\" > results/%s.log\n", testfile, version,
+                device->uri, version, filename);
+         printf("CUPS_DEBUG_LOG=results/%s.debug_log "
+                "./ipptool-static -tIf %s -T 30 -d NOPRINT=1 -V %s %s "
+                "ipp-%s.test | tee -a results/%s.log\n", filename,
+                testfile, version, device->uri,
+                version, filename);
+        }
+
+       puts("");
+      }
+      else if (!device->ty)
+       fprintf(stderr,
+               "Ignoring \"%s\" since it doesn't provide a make and model.\n",
+               device->name);
+      else if (!testfile)
+       fprintf(stderr,
+               "Ignoring \"%s\" since it does not support a common format.\n",
+               device->name);
+      else
+       fprintf(stderr, "Ignoring \"%s\" since it only supports IPP/1.0.\n",
+               device->name);
+    }
+
+    ippDelete(response);
+    httpClose(http);
+  }
+
+  return (0);
+}
+
+
+/*
+ * 'browse_callback()' - Browse devices.
+ */
+
+static void
+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 - Devices array */
+{
+#ifdef DEBUG
+  fprintf(stderr, "browse_callback(sdRef=%p, flags=%x, "
+                  "interfaceIndex=%d, errorCode=%d, serviceName=\"%s\", "
+                 "regtype=\"%s\", replyDomain=\"%s\", context=%p)\n",
+          sdRef, flags, interfaceIndex, errorCode,
+         serviceName ? serviceName : "(null)",
+         regtype ? regtype : "(null)",
+         replyDomain ? replyDomain : "(null)",
+         context);
+#endif /* DEBUG */
+
+ /*
+  * Only process "add" data...
+  */
+
+  if (errorCode != kDNSServiceErr_NoError || !(flags & kDNSServiceFlagsAdd))
+    return;
+
+ /*
+  * Get the device...
+  */
+
+  get_device((cups_array_t *)context, serviceName, regtype, replyDomain);
+}
+
+
+/*
+ * 'compare_devices()' - Compare two devices.
+ */
+
+static int                             /* O - Result of comparison */
+compare_devices(cups_device_t *a,      /* I - First device */
+                cups_device_t *b)      /* I - Second device */
+{
+  int retval = strcmp(a->name, b->name);
+
+  if (retval)
+    return (retval);
+  else
+    return (-strcmp(a->regtype, b->regtype));
+}
+
+
+/*
+ * 'get_device()' - Create or update a device.
+ */
+
+static cups_device_t *                 /* O - Device */
+get_device(cups_array_t *devices,      /* I - Device array */
+           const char   *serviceName,  /* I - Name of service/device */
+           const char   *regtype,      /* I - Type of service */
+           const char   *replyDomain)  /* I - Service domain */
+{
+  cups_device_t        key,                    /* Search key */
+               *device;                /* Device */
+  char         fullName[kDNSServiceMaxDomainName];
+                                       /* Full name for query */
+
+
+ /*
+  * See if this is a new device...
+  */
+
+  key.name    = (char *)serviceName;
+  key.regtype = (char *)regtype;
+
+  for (device = cupsArrayFind(devices, &key);
+       device;
+       device = cupsArrayNext(devices))
+    if (strcasecmp(device->name, key.name))
+      break;
+    else
+    {
+      if (!strcasecmp(device->domain, "local.") &&
+          strcasecmp(device->domain, replyDomain))
+      {
+       /*
+        * Update the .local listing to use the "global" domain name instead.
+       * The backend will try local lookups first, then the global domain name.
+       */
+
+        free(device->domain);
+       device->domain = strdup(replyDomain);
+
+       DNSServiceConstructFullName(fullName, device->name, regtype,
+                                   replyDomain);
+       free(device->fullName);
+       device->fullName = strdup(fullName);
+      }
+
+      return (device);
+    }
+
+ /*
+  * Yes, add the device...
+  */
+
+  device          = calloc(sizeof(cups_device_t), 1);
+  device->name    = strdup(serviceName);
+  device->domain  = strdup(replyDomain);
+  device->regtype = strdup(regtype);
+
+  cupsArrayAdd(devices, device);
+
+ /*
+  * Set the "full name" of this service, which is used for queries...
+  */
+
+  DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain);
+  device->fullName = strdup(fullName);
+
+#ifdef DEBUG
+  fprintf(stderr, "get_device: fullName=\"%s\"...\n", fullName);
+#endif /* DEBUG */
+
+  return (device);
+}
+
+
+/*
+ * 'progress()' - Show query progress.
+ */
+
+static void
+progress(void)
+{
+#ifndef DEBUG
+  const char   *chars = "|/-\\";
+  static int   count = 0;
+
+
+  fprintf(stderr, "\rLooking for printers %c", chars[count]);
+  fflush(stderr);
+  count = (count + 1) & 3;
+#endif /* !DEBUG */
+}
+
+
+/*
+ * 'resolve_callback()' - Process resolve data.
+ */
+
+static void
+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 - Device */
+{
+  char         temp[257],              /* TXT key value */
+               uri[1024];              /* Printer URI */
+  const void   *value;                 /* Value from TXT record */
+  uint8_t      valueLen;               /* Length of value */
+  cups_device_t        *device = (cups_device_t *)context;
+                                       /* Device */
+
+
+#ifdef DEBUG
+  fprintf(stderr, "\rresolve_callback(sdRef=%p, flags=%x, "
+                  "interfaceIndex=%d, errorCode=%d, fullName=\"%s\", "
+                 "hostTarget=\"%s\", port=%d, txtLen=%u, txtRecord=%p, "
+                 "context=%p)\n",
+          sdRef, flags, interfaceIndex, errorCode,
+         fullName ? fullName : "(null)", hostTarget ? hostTarget : "(null)",
+         ntohs(port), txtLen, txtRecord, context);
+#endif /* DEBUG */
+
+ /*
+  * Only process "add" data...
+  */
+
+  if (errorCode != kDNSServiceErr_NoError)
+    return;
+
+  device->got_resolve = 1;
+  device->host        = strdup(hostTarget);
+  device->port        = ntohs(port);
+
+ /*
+  * Extract the "remote printer" key from the TXT record and save the URI...
+  */
+
+  if ((value = TXTRecordGetValuePtr(txtLen, txtRecord, "rp",
+                                    &valueLen)) != NULL)
+  {
+    if (((char *)value)[0] == '/')
+    {
+     /*
+      * "rp" value (incorrectly) has a leading slash already...
+      */
+
+      memcpy(temp, value, valueLen);
+      temp[valueLen] = '\0';
+    }
+    else
+    {
+     /*
+      * Convert to resource by concatenating with a leading "/"...
+      */
+
+      temp[0] = '/';
+      memcpy(temp + 1, value, valueLen);
+      temp[valueLen + 1] = '\0';
+    }
+  }
+  else
+  {
+   /*
+    * Default "rp" value is blank, mapping to a path of "/"...
+    */
+
+    temp[0] = '/';
+    temp[1] = '\0';
+  }
+
+  if (!strncmp(temp, "/printers/", 10))
+    device->cups_shared = -1;
+
+  httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp",
+                  NULL, hostTarget, ntohs(port), temp);
+  device->uri = strdup(uri);
+  device->rp  = strdup(temp);
+
+  if ((value = TXTRecordGetValuePtr(txtLen, txtRecord, "ty",
+                                    &valueLen)) != NULL)
+  {
+    memcpy(temp, value, valueLen);
+    temp[valueLen] = '\0';
+
+    device->ty = strdup(temp);
+  }
+
+  if ((value = TXTRecordGetValuePtr(txtLen, txtRecord, "pdl",
+                                    &valueLen)) != NULL)
+  {
+    memcpy(temp, value, valueLen);
+    temp[valueLen] = '\0';
+
+    device->pdl = strdup(temp);
+  }
+
+  if ((value = TXTRecordGetValuePtr(txtLen, txtRecord, "printer-type",
+                                    &valueLen)) != NULL)
+    device->cups_shared = 1;
+
+  if (device->cups_shared)
+    fprintf(stderr, "\rIgnoring CUPS printer %s\n", uri);
+  else
+    fprintf(stderr, "\rFound IPP printer %s\n", uri);
+
+  progress();
+}
+
+
+/*
+ * 'unquote()' - Unquote a name string.
+ */
+
+static void
+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';
+}
+
+
+/*
+ * 'usage()' - Show program usage and exit.
+ */
+
+static void
+usage(void)
+{
+  _cupsLangPuts(stdout, _("Usage: ippdiscover [options] -a\n"
+                          "       ippdiscover [options] \"service name\"\n"
+                          "\n"
+                          "Options:"));
+  _cupsLangPuts(stdout, _("  -a                      Browse for all services."));
+  _cupsLangPuts(stdout, _("  -d domain               Browse/resolve in specified domain."));
+  _cupsLangPuts(stdout, _("  -p program              Run specified program for each service."));
+  _cupsLangPuts(stdout, _("  -t type                 Browse/resolve with specified type."));
+
+  exit(0);
+}
+
+
+/*
+ * End of "$Id: ippdiscover.c 10983 2013-05-13 23:57:32Z msweet $".
+ */
diff --git a/test/ippfind.c b/test/ippfind.c
new file mode 100644 (file)
index 0000000..78b608e
--- /dev/null
@@ -0,0 +1,2847 @@
+/*
+ * "$Id: ippfind.c 12638 2015-05-19 02:36:15Z msweet $"
+ *
+ * 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-2015 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * Include necessary headers.
+ */
+
+#define _CUPS_NO_DEPRECATED
+#include <cups/cups-private.h>
+#ifdef WIN32
+#  include <process.h>
+#  include <sys/timeb.h>
+#else
+#  include <sys/wait.h>
+#endif /* WIN32 */
+#include <regex.h>
+#ifdef HAVE_DNSSD
+#  include <dns_sd.h>
+#elif defined(HAVE_AVAHI)
+#  include <avahi-client/client.h>
+#  include <avahi-client/lookup.h>
+#  include <avahi-common/simple-watch.h>
+#  include <avahi-common/domain.h>
+#  include <avahi-common/error.h>
+#  include <avahi-common/malloc.h>
+#  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_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         *key;                   /* TXT record key */
+  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)
+                                       __attribute__((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)
+                                             __attribute__((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)
+                                    __attribute__((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)
+                                        __attribute__((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) __attribute__((noreturn));
+static void            show_version(void) __attribute__((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",
+    "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], "--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 '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 (buf[0] == '_')
+    {
+      regtype = buf;
+    }
+    else if ((regtype = strstr(buf, "._")) != NULL)
+    {
+      name = buf;
+      *regtype++ = '\0';
+    }
+    else
+    {
+      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);
+
+#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...
+      */
+
+#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));
+
+      if (name)
+        printf("name=\"%s\"\n", name);
+
+      printf("regtype=\"%s\"\n", regtype);
+
+      if (domain)
+        printf("domain=\"%s\"\n", domain);
+
+      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 */
+{
+  int                  logic,          /* Logical operation */
+                       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_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->key, service->num_txt,
+                                service->txt) != NULL;
+          break;
+      case IPPFIND_OP_TXT_REGEX :
+          val = cupsGetOption(expression->key, 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", 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)
+    temp->key = (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, "");
+  _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, _("  --help                  Show this help."));
+  _cupsLangPuts(stderr, _("  --version               Show program version."));
+  _cupsLangPuts(stderr, "");
+  _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, "");
+  _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, "");
+  _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, "");
+  _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);
+}
+
+
+/*
+ * End of "$Id: ippfind.c 12638 2015-05-19 02:36:15Z msweet $".
+ */
diff --git a/test/ippinfra.c b/test/ippinfra.c
new file mode 100644 (file)
index 0000000..0a4a367
--- /dev/null
@@ -0,0 +1,7125 @@
+/*
+ * "$Id: ippinfra.c 12237 2014-11-03 13:07:32Z msweet $"
+ *
+ * Sample IPP INFRA server for CUPS.
+ *
+ * Copyright 2010-2014 by Apple Inc.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * Disable private and deprecated stuff so we can verify that the public API
+ * is sufficient to implement a server.
+ */
+
+#define _IPP_PRIVATE_STRUCTURES 0      /* Disable private IPP stuff */
+#define _CUPS_NO_DEPRECATED 1          /* Disable deprecated stuff */
+
+
+/*
+ * Include necessary headers...
+ */
+
+#include <config.h>                    /* CUPS configuration header */
+#include <cups/cups.h>                 /* Public API */
+#include <cups/string-private.h>       /* CUPS string functions */
+#include <cups/thread-private.h>       /* For multithreading functions */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <sys/stat.h>
+
+#ifdef WIN32
+#  include <fcntl.h>
+#  include <io.h>
+#  include <process.h>
+#  define WEXITSTATUS(s) (s)
+#  include <winsock2.h>
+typedef ULONG nfds_t;
+#  define poll WSAPoll
+#else
+extern char **environ;
+
+#  include <sys/fcntl.h>
+#  include <sys/wait.h>
+#  include <poll.h>
+#endif /* WIN32 */
+
+#ifdef HAVE_SYS_MOUNT_H
+#  include <sys/mount.h>
+#endif /* HAVE_SYS_MOUNT_H */
+#ifdef HAVE_SYS_STATFS_H
+#  include <sys/statfs.h>
+#endif /* HAVE_SYS_STATFS_H */
+#ifdef HAVE_SYS_STATVFS_H
+#  include <sys/statvfs.h>
+#endif /* HAVE_SYS_STATVFS_H */
+#ifdef HAVE_SYS_VFS_H
+#  include <sys/vfs.h>
+#endif /* HAVE_SYS_VFS_H */
+
+#ifdef HAVE_PTHREAD_H
+typedef pthread_cond_t _cups_cond_t;
+#  define _CUPS_COND_INITIALIZER PTHREAD_COND_INITIALIZER
+#  define _cupsCondBroadcast(c) pthread_cond_broadcast(c)
+#  define _cupsCondDeinit(c)   pthread_cond_destroy(c)
+#  define _cupsCondInit(c)     pthread_cond_init((c), NULL)
+#  define _cupsCondWait(c,m)   pthread_cond_wait((c),(m))
+#  define _cupsMutexDeinit(m)  pthread_mutex_destroy(m)
+#  define _cupsRWDeinit(rw)    pthread_rwlock_destroy(rw)
+#else
+typedef char _cups_cond_t;
+#  define _CUPS_COND_INITIALIZER 0
+#  define _cupsCondBroadcast(c)
+#  define _cupsCondDeinit(c)
+#  define _cupsCondInit(c)     *(c)=0
+#  define _cupsCondWait(c,m)   0
+#  define _cupsMutexDeinit(m)
+#  define _cupsRWDeinit(rw)
+#endif /* HAVE_PTHREAD_H */
+
+
+/*
+ * Constants...
+ */
+
+/* New IPP operation codes from IPP INFRA */
+#  define _IPP_OP_ACKNOWLEDGE_DOCUMENT                 (ipp_op_t)0x003f
+#  define _IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER         (ipp_op_t)0x0040
+#  define _IPP_OP_ACKNOWLEDGE_JOB                      (ipp_op_t)0x0041
+#  define _IPP_OP_FETCH_DOCUMENT                       (ipp_op_t)0x0042
+#  define _IPP_OP_FETCH_JOB                            (ipp_op_t)0x0043
+#  define _IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES         (ipp_op_t)0x0044
+#  define _IPP_OP_UPDATE_ACTIVE_JOBS                   (ipp_op_t)0x0045
+#  define _IPP_OP_UPDATE_DOCUMENT_STATUS               (ipp_op_t)0x0047
+#  define _IPP_OP_UPDATE_JOB_STATUS                    (ipp_op_t)0x0048
+#  define _IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES      (ipp_op_t)0x0049
+#  define _IPP_OP_DEREGISTER_OUTPUT_DEVICE             (ipp_op_t)0x204b
+
+/* New IPP status code from IPP INFRA */
+#  define _IPP_STATUS_ERROR_NOT_FETCHABLE              (ipp_status_t)0x0420
+
+/* Maximum lease duration value from RFC 3995 - 2^26-1 or ~2 years */
+#  define _IPP_NOTIFY_LEASE_DURATION_MAX               67108863
+/* But a value of 0 means "never expires"... */
+#  define _IPP_NOTIFY_LEASE_DURATION_FOREVER           0
+/* Default duration is 1 day */
+#  define _IPP_NOTIFY_LEASE_DURATION_DEFAULT           86400
+
+
+/*
+ * Event mask enumeration...
+ */
+
+enum _ipp_event_e                      /* notify-events bit values */
+{
+  _IPP_EVENT_DOCUMENT_COMPLETED = 0x00000001,
+  _IPP_EVENT_DOCUMENT_CONFIG_CHANGED = 0x00000002,
+  _IPP_EVENT_DOCUMENT_CREATED = 0x00000004,
+  _IPP_EVENT_DOCUMENT_FETCHABLE = 0x00000008,
+  _IPP_EVENT_DOCUMENT_STATE_CHANGED = 0x00000010,
+  _IPP_EVENT_DOCUMENT_STOPPED = 0x00000020,
+  _IPP_EVENT_JOB_COMPLETED = 0x00000040,
+  _IPP_EVENT_JOB_CONFIG_CHANGED = 0x00000080,
+  _IPP_EVENT_JOB_CREATED = 0x00000100,
+  _IPP_EVENT_JOB_FETCHABLE = 0x00000200,
+  _IPP_EVENT_JOB_PROGRESS = 0x00000400,
+  _IPP_EVENT_JOB_STATE_CHANGED = 0x00000800,
+  _IPP_EVENT_JOB_STOPPED = 0x00001000,
+  _IPP_EVENT_PRINTER_CONFIG_CHANGED = 0x00002000,
+  _IPP_EVENT_PRINTER_FINISHINGS_CHANGED = 0x00004000,
+  _IPP_EVENT_PRINTER_MEDIA_CHANGED = 0x00008000,
+  _IPP_EVENT_PRINTER_QUEUE_ORDER_CHANGED = 0x00010000,
+  _IPP_EVENT_PRINTER_RESTARTED = 0x00020000,
+  _IPP_EVENT_PRINTER_SHUTDOWN = 0x00040000,
+  _IPP_EVENT_PRINTER_STATE_CHANGED = 0x00080000,
+  _IPP_EVENT_PRINTER_STOPPED = 0x00100000,
+
+  /* "Wildcard" values... */
+  _IPP_EVENT_NONE = 0x00000000,                /* Nothing */
+  _IPP_EVENT_DOCUMENT_ALL = 0x0000003f,
+  _IPP_EVENT_DOCUMENT_STATE_ALL = 0x00000037,
+  _IPP_EVENT_JOB_ALL = 0x00001fc0,
+  _IPP_EVENT_JOB_STATE_ALL = 0x00001940,
+  _IPP_EVENT_PRINTER_ALL = 0x001fe000,
+  _IPP_EVENT_PRINTER_CONFIG_ALL = 0x0000e000,
+  _IPP_EVENT_PRINTER_STATE_ALL = 0x001e0000,
+  _IPP_EVENT_ALL = 0x001fffff          /* Everything */
+};
+typedef unsigned int _ipp_event_t;     /* Bitfield for notify-events */
+#define _IPP_EVENT_DEFAULT _IPP_EVENT_JOB_COMPLETED
+#define _IPP_EVENT_DEFAULT_STRING "job-completed"
+static const char * const _ipp_events[] =
+{                                      /* Strings for bits */
+  "document-completed",
+  "document-config-changed",
+  "document-created",
+  "document-fetchable",
+  "document-state-changed",
+  "document-stopped",
+  "job-completed",
+  "job-config-changed",
+  "job-created",
+  "job-fetchable",
+  "job-progress",
+  "job-state-changed",
+  "job-stopped",
+  "printer-config-changed",
+  "printer-finishings-changed",
+  "printer-media-changed",
+  "printer-queue-order-changed",
+  "printer-restarted",
+  "printer-shutdown",
+  "printer-state-changed",
+  "printer-stopped"
+};
+
+enum _ipp_jreason_e                    /* job-state-reasons bit values */
+{
+  _IPP_JREASON_NONE = 0x00000000,      /* none */
+  _IPP_JREASON_ABORTED_BY_SYSTEM = 0x00000001,
+  _IPP_JREASON_COMPRESSION_ERROR = 0x00000002,
+  _IPP_JREASON_DOCUMENT_ACCESS_ERROR = 0x00000004,
+  _IPP_JREASON_DOCUMENT_FORMAT_ERROR = 0x00000008,
+  _IPP_JREASON_DOCUMENT_PASSWORD_ERROR = 0x00000010,
+  _IPP_JREASON_DOCUMENT_PERMISSION_ERROR = 0x00000020,
+  _IPP_JREASON_DOCUMENT_SECURITY_ERROR = 0x00000040,
+  _IPP_JREASON_DOCUMENT_UNPRINTABLE_ERROR = 0x00000080,
+  _IPP_JREASON_ERRORS_DETECTED = 0x00000100,
+  _IPP_JREASON_JOB_CANCELED_AT_DEVICE = 0x00000200,
+  _IPP_JREASON_JOB_CANCELED_BY_USER = 0x00000400,
+  _IPP_JREASON_JOB_COMPLETED_SUCCESSFULLY = 0x00000800,
+  _IPP_JREASON_JOB_COMPLETED_WITH_ERRORS = 0x00001000,
+  _IPP_JREASON_JOB_COMPLETED_WITH_WARNINGS = 0x00002000,
+  _IPP_JREASON_JOB_DATA_INSUFFICIENT = 0x00004000,
+  _IPP_JREASON_JOB_FETCHABLE = 0x00008000,
+  _IPP_JREASON_JOB_INCOMING = 0x00010000,
+  _IPP_JREASON_JOB_PASSWORD_WAIT = 0x00020000,
+  _IPP_JREASON_JOB_PRINTING = 0x00040000,
+  _IPP_JREASON_JOB_QUEUED = 0x00080000,
+  _IPP_JREASON_JOB_SPOOLING = 0x00100000,
+  _IPP_JREASON_JOB_STOPPED = 0x00200000,
+  _IPP_JREASON_JOB_TRANSFORMING = 0x00400000,
+  _IPP_JREASON_PRINTER_STOPPED = 0x00800000,
+  _IPP_JREASON_PRINTER_STOPPED_PARTLY = 0x01000000,
+  _IPP_JREASON_PROCESSING_TO_STOP_POINT = 0x02000000,
+  _IPP_JREASON_QUEUED_IN_DEVICE = 0x04000000,
+  _IPP_JREASON_WARNINGS_DETECTED = 0x08000000
+};
+typedef unsigned int _ipp_jreason_t;   /* Bitfield for job-state-reasons */
+static const char * const _ipp_jreasons[] =
+{                                      /* Strings for bits */
+  "aborted-by-system",
+  "compression-error",
+  "document-access-error",
+  "document-format-error",
+  "document-password-error",
+  "document-permission-error",
+  "document-security-error",
+  "document-unprintable-error",
+  "errors-detected",
+  "job-canceled-at-device",
+  "job-canceled-by-user",
+  "job-completed-successfully",
+  "job-completed-with-errors",
+  "job-completed-with-warnings",
+  "job-data-insufficient",
+  "job-fetchable",
+  "job-incoming",
+  "job-password-wait",
+  "job-printing",
+  "job-queued",
+  "job-spooling",
+  "job-stopped",
+  "job-transforming",
+  "printer-stopped",
+  "printer-stopped-partly",
+  "processing-to-stop-point",
+  "queued-in-device",
+  "warnings-detected"
+};
+
+enum _ipp_preason_e                    /* printer-state-reasons bit values */
+{
+  _IPP_PREASON_NONE = 0x0000,          /* none */
+  _IPP_PREASON_OTHER = 0x0001,         /* other */
+  _IPP_PREASON_COVER_OPEN = 0x0002,    /* cover-open */
+  _IPP_PREASON_INPUT_TRAY_MISSING = 0x0004,
+                                       /* input-tray-missing */
+  _IPP_PREASON_MARKER_SUPPLY_EMPTY = 0x0008,
+                                       /* marker-supply-empty */
+  _IPP_PREASON_MARKER_SUPPLY_LOW = 0x0010,
+                                       /* marker-supply-low */
+  _IPP_PREASON_MARKER_WASTE_ALMOST_FULL = 0x0020,
+                                       /* marker-waste-almost-full */
+  _IPP_PREASON_MARKER_WASTE_FULL = 0x0040,
+                                       /* marker-waste-full */
+  _IPP_PREASON_MEDIA_EMPTY = 0x0080,   /* media-empty */
+  _IPP_PREASON_MEDIA_JAM = 0x0100,     /* media-jam */
+  _IPP_PREASON_MEDIA_LOW = 0x0200,     /* media-low */
+  _IPP_PREASON_MEDIA_NEEDED = 0x0400,  /* media-needed */
+  _IPP_PREASON_MOVING_TO_PAUSED = 0x0800,
+                                       /* moving-to-paused */
+  _IPP_PREASON_PAUSED = 0x1000,                /* paused */
+  _IPP_PREASON_SPOOL_AREA_FULL = 0x2000,/* spool-area-full */
+  _IPP_PREASON_TONER_EMPTY = 0x4000,   /* toner-empty */
+  _IPP_PREASON_TONER_LOW = 0x8000      /* toner-low */
+};
+typedef unsigned int _ipp_preason_t;   /* Bitfield for printer-state-reasons */
+static const char * const _ipp_preasons[] =
+{                                      /* Strings for bits */
+  "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"
+};
+
+
+/*
+ * Structures...
+ */
+
+typedef struct _ipp_filter_s           /**** Attribute filter ****/
+{
+  cups_array_t         *ra;            /* Requested attributes */
+  ipp_tag_t            group_tag;      /* Group to copy */
+} _ipp_filter_t;
+
+typedef struct _ipp_job_s _ipp_job_t;
+
+typedef struct _ipp_device_s           /**** Output Device data ****/
+{
+  _cups_rwlock_t       rwlock;         /* Printer lock */
+  char                 *name,          /* printer-name (mapped to output-device) */
+                       *uuid;          /* output-device-uuid */
+  ipp_t                        *attrs;         /* All printer attributes */
+  ipp_pstate_t         state;          /* printer-state value */
+  _ipp_preason_t       reasons;        /* printer-state-reasons values */
+} _ipp_device_t;
+
+typedef struct _ipp_printer_s          /**** Printer data ****/
+{
+  _cups_rwlock_t       rwlock;         /* Printer lock */
+  int                  ipv4,           /* IPv4 listener */
+                       ipv6;           /* IPv6 listener */
+  char                 *name,          /* printer-name */
+                       *directory,     /* Spool directory */
+                       *hostname,      /* Hostname */
+                       *uri,           /* printer-uri-supported */
+                       *proxy_user,    /* Proxy username */
+                       *proxy_pass;    /* Proxy password */
+  int                  port;           /* Port */
+  size_t               urilen;         /* Length of printer URI */
+  cups_array_t         *devices;       /* Associated devices */
+  ipp_t                        *attrs;         /* Static attributes */
+  ipp_t                        *dev_attrs;     /* Current device attributes */
+  time_t               start_time;     /* Startup time */
+  time_t               config_time;    /* printer-config-change-time */
+  ipp_pstate_t         state,          /* printer-state value */
+                       dev_state;      /* Current device printer-state value */
+  _ipp_preason_t       state_reasons,  /* printer-state-reasons values */
+                       dev_reasons;    /* Current device printer-state-reasons values */
+  time_t               state_time;     /* printer-state-change-time */
+  cups_array_t         *jobs,          /* Jobs */
+                       *active_jobs,   /* Active jobs */
+                       *completed_jobs;/* Completed jobs */
+  _ipp_job_t           *processing_job;/* Current processing job */
+  int                  next_job_id;    /* Next job-id value */
+  cups_array_t         *subscriptions; /* Subscriptions */
+  int                  next_sub_id;    /* Next notify-subscription-id value */
+} _ipp_printer_t;
+
+struct _ipp_job_s                      /**** Job data ****/
+{
+  int                  id;             /* job-id */
+  _cups_rwlock_t       rwlock;         /* Job lock */
+  const char           *name,          /* job-name */
+                       *username,      /* job-originating-user-name */
+                       *format;        /* document-format */
+  int                  priority;       /* job-priority */
+  char                 *dev_uuid;      /* output-device-uuid-assigned */
+  ipp_jstate_t         state,          /* job-state value */
+                       dev_state;      /* output-device-job-state value */
+  _ipp_jreason_t       state_reasons,  /* job-state-reasons values */
+                       dev_state_reasons;
+                                       /* output-device-job-state-reasons values */
+  char                 *dev_state_message;
+                                       /* output-device-job-state-message value */
+  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;         /* Attributes */
+  int                  cancel;         /* Non-zero when job canceled */
+  char                 *filename;      /* Print file name */
+  int                  fd;             /* Print file descriptor */
+  _ipp_printer_t       *printer;       /* Printer */
+};
+
+typedef struct _ipp_subscription_s     /**** Subscription data ****/
+{
+  int                  id;             /* notify-subscription-id */
+  const char           *uuid;          /* notify-subscription-uuid */
+  _cups_rwlock_t       rwlock;         /* Subscription lock */
+  _ipp_event_t         mask;           /* Event mask */
+  _ipp_printer_t       *printer;       /* Printer */
+  _ipp_job_t           *job;           /* Job, if any */
+  ipp_t                        *attrs;         /* Attributes */
+  const char           *username;      /* notify-subscriber-user-name */
+  int                  lease;          /* notify-lease-duration */
+  int                  interval;       /* notify-time-interval */
+  time_t               expire;         /* Lease expiration time */
+  int                  first_sequence, /* First notify-sequence-number in cache */
+                       last_sequence;  /* Last notify-sequence-number used */
+  cups_array_t         *events;        /* Events (ipp_t *'s) */
+  int                  pending_delete; /* Non-zero when the subscription is about to be deleted/canceled */
+} _ipp_subscription_t;
+
+typedef struct _ipp_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[32];   /* Client authenticated username */
+  _ipp_printer_t       *printer;       /* Printer */
+  _ipp_job_t           *job;           /* Current job, if any */
+  int                  fetch_compression,
+                                       /* Compress file? */
+                       fetch_file;     /* File to fetch */
+} _ipp_client_t;
+
+
+/*
+ * Local functions...
+ */
+
+static void            add_event(_ipp_printer_t *printer, _ipp_job_t *job, _ipp_event_t event, const char *message, ...) __attribute__((__format__(__printf__, 4, 5)));
+static void            check_jobs(_ipp_printer_t *printer);
+static void            clean_jobs(_ipp_printer_t *printer);
+static int             compare_active_jobs(_ipp_job_t *a, _ipp_job_t *b);
+static int             compare_completed_jobs(_ipp_job_t *a, _ipp_job_t *b);
+static int             compare_devices(_ipp_device_t *a, _ipp_device_t *b);
+static int             compare_jobs(_ipp_job_t *a, _ipp_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(_ipp_client_t *client,
+                                           _ipp_job_t *job, cups_array_t *ra);
+static void            copy_job_state_reasons(ipp_t *ipp, ipp_tag_t group_tag, _ipp_job_t *job);
+static void            copy_printer_state_reasons(ipp_t *ipp, ipp_tag_t group_tag, _ipp_printer_t *printer);
+static void            copy_subscription_attributes(_ipp_client_t *client, _ipp_subscription_t *sub, cups_array_t *ra);
+static _ipp_client_t   *create_client(_ipp_printer_t *printer, int sock);
+static _ipp_device_t   *create_device(_ipp_client_t *client);
+static _ipp_job_t      *create_job(_ipp_client_t *client);
+static void            create_job_filename(_ipp_printer_t *printer, _ipp_job_t *job, const char *format, char *fname, size_t fnamesize);
+static int             create_listener(int family, int port);
+static _ipp_subscription_t *create_subscription(_ipp_printer_t *printer, _ipp_job_t *job, int interval, int lease, const char *username, ipp_attribute_t *notify_events, ipp_attribute_t *notify_attributes, ipp_attribute_t *notify_user_data);
+static _ipp_printer_t  *create_printer(const char *servername, int port, const char *name, const char *directory, const char *proxy_user, const char *proxy_pass);
+static void            debug_attributes(const char *title, ipp_t *ipp,
+                                        int response);
+static void            delete_client(_ipp_client_t *client);
+static void            delete_device(_ipp_device_t *device);
+static void            delete_job(_ipp_job_t *job);
+static void            delete_printer(_ipp_printer_t *printer);
+static void            delete_subscription(_ipp_subscription_t *sub);
+static int             filter_cb(_ipp_filter_t *filter, ipp_t *dst, ipp_attribute_t *attr);
+static _ipp_device_t   *find_device(_ipp_client_t *client);
+static _ipp_job_t      *find_job(_ipp_client_t *client, int job_id);
+static _ipp_subscription_t *find_subscription(_ipp_client_t *client, int sub_id);
+static _ipp_jreason_t  get_job_state_reasons_bits(ipp_attribute_t *attr);
+static _ipp_event_t    get_notify_events_bits(ipp_attribute_t *attr);
+static const char      *get_notify_subscribed_event(_ipp_event_t event);
+static _ipp_preason_t  get_printer_state_reasons_bits(ipp_attribute_t *attr);
+static void            html_escape(_ipp_client_t *client, const char *s,
+                                   size_t slen);
+static void            html_footer(_ipp_client_t *client);
+static void            html_header(_ipp_client_t *client, const char *title);
+static void            html_printf(_ipp_client_t *client, const char *format, ...) __attribute__((__format__(__printf__, 2, 3)));
+static void            ipp_acknowledge_document(_ipp_client_t *client);
+static void            ipp_acknowledge_identify_printer(_ipp_client_t *client);
+static void            ipp_acknowledge_job(_ipp_client_t *client);
+static void            ipp_cancel_job(_ipp_client_t *client);
+static void            ipp_cancel_my_jobs(_ipp_client_t *client);
+static void            ipp_cancel_subscription(_ipp_client_t *client);
+static void            ipp_close_job(_ipp_client_t *client);
+static void            ipp_create_job(_ipp_client_t *client);
+static void            ipp_create_xxx_subscriptions(_ipp_client_t *client);
+static void            ipp_deregister_output_device(_ipp_client_t *client);
+static void            ipp_fetch_document(_ipp_client_t *client);
+static void            ipp_fetch_job(_ipp_client_t *client);
+static void            ipp_get_document_attributes(_ipp_client_t *client);
+static void            ipp_get_documents(_ipp_client_t *client);
+static void            ipp_get_job_attributes(_ipp_client_t *client);
+static void            ipp_get_jobs(_ipp_client_t *client);
+static void            ipp_get_notifications(_ipp_client_t *client);
+static void            ipp_get_output_device_attributes(_ipp_client_t *client);
+static void            ipp_get_printer_attributes(_ipp_client_t *client);
+static void            ipp_get_printer_supported_values(_ipp_client_t *client);
+static void            ipp_get_subscription_attributes(_ipp_client_t *client);
+static void            ipp_get_subscriptions(_ipp_client_t *client);
+static void            ipp_identify_printer(_ipp_client_t *client);
+static void            ipp_print_job(_ipp_client_t *client);
+static void            ipp_print_uri(_ipp_client_t *client);
+static void            ipp_renew_subscription(_ipp_client_t *client);
+static void            ipp_send_document(_ipp_client_t *client);
+static void            ipp_send_uri(_ipp_client_t *client);
+static void            ipp_update_active_jobs(_ipp_client_t *client);
+static void            ipp_update_document_status(_ipp_client_t *client);
+static void            ipp_update_job_status(_ipp_client_t *client);
+static void            ipp_update_output_device_attributes(_ipp_client_t *client);
+static void            ipp_validate_document(_ipp_client_t *client);
+static void            ipp_validate_job(_ipp_client_t *client);
+//static int           parse_options(_ipp_client_t *client, cups_option_t **options);
+static void            *process_client(_ipp_client_t *client);
+static int             process_http(_ipp_client_t *client);
+static int             process_ipp(_ipp_client_t *client);
+static void            *process_job(_ipp_job_t *job);
+static int             respond_http(_ipp_client_t *client, http_status_t code,
+                                    const char *content_coding,
+                                    const char *type, size_t length);
+static void            respond_ipp(_ipp_client_t *client, ipp_status_t status,
+                                   const char *message, ...)
+                       __attribute__ ((__format__ (__printf__, 3, 4)));
+static void            respond_unsupported(_ipp_client_t *client,
+                                           ipp_attribute_t *attr);
+static void            run_printer(_ipp_printer_t *printer);
+static char            *time_string(time_t tv, char *buffer, size_t bufsize);
+static void            update_device_attributes_no_lock(_ipp_printer_t *printer);
+static void            update_device_state_no_lock(_ipp_printer_t *printer);
+static void            usage(int status) __attribute__((noreturn));
+static int             valid_doc_attributes(_ipp_client_t *client);
+static int             valid_job_attributes(_ipp_client_t *client);
+
+
+/*
+ * Globals...
+ */
+
+static int             KeepFiles = 0,
+                       Verbosity = 0;
+//static _cups_mutex_t SubscriptionMutex = _CUPS_MUTEX_INITIALIZER;
+static _cups_cond_t    SubscriptionCondition = _CUPS_COND_INITIALIZER;
+
+
+/*
+ * 'main()' - Main entry to the sample infrastructure 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 */
+               *servername = NULL,     /* Server host name */
+               *name = NULL;           /* Printer name */
+#ifdef HAVE_SSL
+  const char   *keypath = NULL;        /* Keychain path */
+#endif /* HAVE_SSL */
+  int          port = 0;               /* Port number (0 = auto) */
+  char         directory[1024] = "",   /* Spool directory */
+               hostname[1024],         /* Auto-detected hostname */
+               proxy_user[256] = "",   /* Proxy username */
+               *proxy_pass = NULL;     /* Proxy password */
+  _ipp_printer_t *printer;             /* Printer object */
+
+
+ /*
+  * Parse command-line arguments...
+  */
+
+  for (i = 1; i < argc; i ++)
+    if (argv[i][0] == '-')
+    {
+      for (opt = argv[i] + 1; *opt; opt ++)
+      {
+        switch (*opt)
+       {
+#ifdef HAVE_SSL
+         case 'K' : /* -K keypath */
+             i ++;
+             if (i >= argc)
+               usage(1);
+             keypath = argv[i];
+             break;
+#endif /* HAVE_SSL */
+
+         case 'd' : /* -d spool-directory */
+             i ++;
+             if (i >= argc)
+               usage(1);
+             strlcpy(directory, argv[i], sizeof(directory));
+             break;
+
+          case 'h' : /* -h (show help) */
+             usage(0);
+
+         case 'k' : /* -k (keep files) */
+             KeepFiles = 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);
+             port = atoi(argv[i]);
+             break;
+
+          case 'u' : /* -u user:pass */
+             i ++;
+             if (i >= argc)
+               usage(1);
+             strlcpy(proxy_user, argv[i], sizeof(proxy_user));
+             if ((proxy_pass = strchr(proxy_user, ':')) != NULL)
+               *proxy_pass++ = '\0';
+             break;
+
+         case 'v' : /* -v (be verbose) */
+             Verbosity ++;
+             break;
+
+          default : /* Unknown */
+             fprintf(stderr, "Unknown option \"-%c\".\n", *opt);
+             usage(1);
+       }
+      }
+    }
+    else if (!name)
+    {
+      name = argv[i];
+    }
+    else
+    {
+      fprintf(stderr, "Unexpected command-line argument \"%s\"\n", argv[i]);
+      usage(1);
+    }
+
+  if (!name)
+    usage(1);
+
+ /*
+  * Apply defaults as needed...
+  */
+
+  if (!servername)
+    servername = httpGetHostname(NULL, hostname, sizeof(hostname));
+
+  if (!port)
+  {
+#ifdef WIN32
+   /*
+    * Windows is almost always used as a single user system, so use a default port
+    * number of 8631.
+    */
+
+    port = 8631;
+
+#else
+   /*
+    * Use 8000 + UID mod 1000 for the default port number...
+    */
+
+    port = 8000 + ((int)getuid() % 1000);
+#endif /* WIN32 */
+
+    fprintf(stderr, "Listening on port %d.\n", port);
+  }
+
+  if (!directory[0])
+  {
+    snprintf(directory, sizeof(directory), "/tmp/ippserver.%d", (int)getpid());
+
+    if (mkdir(directory, 0777) && errno != EEXIST)
+    {
+      fprintf(stderr, "Unable to create spool directory \"%s\": %s\n",
+             directory, strerror(errno));
+      usage(1);
+    }
+
+    if (Verbosity)
+      fprintf(stderr, "Using spool directory \"%s\".\n", directory);
+  }
+
+  if (!proxy_user[0])
+  {
+    strlcpy(proxy_user, "test", sizeof(proxy_user));
+
+    if (Verbosity)
+      fputs("Using proxy username \"test\".\n", stderr);
+  }
+
+  if (!proxy_pass)
+  {
+    proxy_pass = "test123";
+
+    if (Verbosity)
+      fputs("Using proxy password \"test123\".\n", stderr);
+  }
+
+#ifdef HAVE_SSL
+  cupsSetServerCredentials(keypath, servername, 1);
+#endif /* HAVE_SSL */
+
+ /*
+  * Create the printer...
+  */
+
+  if ((printer = create_printer(servername, port, name, directory, proxy_user, proxy_pass)) == NULL)
+    return (1);
+
+ /*
+  * Run the print service...
+  */
+
+  run_printer(printer);
+
+ /*
+  * Destroy the printer and exit...
+  */
+
+  delete_printer(printer);
+
+  return (0);
+}
+
+
+/*
+ * 'add_event()' - Add an event to a subscription.
+ */
+
+static void
+add_event(_ipp_printer_t *printer,     /* I - Printer */
+          _ipp_job_t     *job,         /* I - Job, if any */
+         _ipp_event_t   event,         /* I - Event */
+         const char     *message,      /* I - Printf-style notify-text message */
+         ...)                          /* I - Additional printf arguments */
+{
+  _ipp_subscription_t *sub;            /* Current subscription */
+  ipp_t                *n;                     /* Notify attributes */
+  char         text[1024];             /* notify-text value */
+  va_list      ap;                     /* Argument pointer */
+
+
+  va_start(ap, message);
+  vsnprintf(text, sizeof(text), message, ap);
+  va_end(ap);
+
+  for (sub = (_ipp_subscription_t *)cupsArrayFirst(printer->subscriptions);
+       sub;
+       sub = (_ipp_subscription_t *)cupsArrayNext(printer->subscriptions))
+  {
+    if (sub->mask & event && (!sub->job || job == sub->job))
+    {
+      _cupsRWLockWrite(&sub->rwlock);
+
+      n = ippNew();
+      ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_CHARSET, "notify-charset", NULL, "utf-8");
+      ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_LANGUAGE, "notify-natural-language", NULL, "en");
+      ippAddInteger(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, "notify-printer-up-time", time(NULL) - printer->start_time);
+      ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_URI, "notify-printer-uri", NULL, printer->uri);
+      if (job)
+       ippAddInteger(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, "notify-job-id", job->id);
+      ippAddInteger(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, "notify-subcription-id", sub->id);
+      ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_URI, "notify-subscription-uuid", NULL, sub->uuid);
+      ippAddInteger(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, "notify-sequence-number", ++ sub->last_sequence);
+      ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "notify-subscribed-event", NULL, get_notify_subscribed_event(event));
+      ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_TEXT, "notify-text", NULL, text);
+      if (event & _IPP_EVENT_PRINTER_ALL)
+      {
+       ippAddInteger(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM, "printer-state", printer->state);
+       copy_printer_state_reasons(n, IPP_TAG_EVENT_NOTIFICATION, printer);
+      }
+      if (event & _IPP_EVENT_JOB_ALL)
+      {
+       ippAddInteger(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM, "job-state", job->state);
+       copy_job_state_reasons(n, IPP_TAG_EVENT_NOTIFICATION, job);
+       if (event == _IPP_EVENT_JOB_CREATED)
+       {
+         ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME, "job-name", NULL, job->name);
+         ippAddString(n, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME, "job-originating-user-name", NULL, job->username);
+       }
+      }
+
+      cupsArrayAdd(sub->events, n);
+      if (cupsArrayCount(sub->events) > 100)
+      {
+        n = (ipp_t *)cupsArrayFirst(sub->events);
+       cupsArrayRemove(sub->events, n);
+       ippDelete(n);
+       sub->first_sequence ++;
+      }
+
+      _cupsRWUnlock(&sub->rwlock);
+      _cupsCondBroadcast(&SubscriptionCondition);
+    }
+  }
+}
+
+
+/*
+ * 'check_jobs()' - Check for new jobs to process.
+ */
+
+static void
+check_jobs(_ipp_printer_t *printer)    /* I - Printer */
+{
+  _ipp_job_t   *job;                   /* Current job */
+
+
+  if (printer->processing_job)
+    return;
+
+  _cupsRWLockWrite(&(printer->rwlock));
+  for (job = (_ipp_job_t *)cupsArrayFirst(printer->active_jobs);
+       job;
+       job = (_ipp_job_t *)cupsArrayNext(printer->active_jobs))
+  {
+    if (job->state == IPP_JSTATE_PENDING)
+    {
+      if (!_cupsThreadCreate((_cups_thread_func_t)process_job, job))
+      {
+        job->state     = IPP_JSTATE_ABORTED;
+       job->completed = time(NULL);
+
+        add_event(printer, job, _IPP_EVENT_JOB_COMPLETED, "Job aborted because creation of processing thread failed.");
+      }
+      break;
+    }
+  }
+  _cupsRWUnlock(&(printer->rwlock));
+}
+
+
+/*
+ * 'clean_jobs()' - Clean out old (completed) jobs.
+ */
+
+static void
+clean_jobs(_ipp_printer_t *printer)    /* I - Printer */
+{
+  _ipp_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 = (_ipp_job_t *)cupsArrayFirst(printer->jobs);
+       job;
+       job = (_ipp_job_t *)cupsArrayNext(printer->jobs))
+    if (job->completed && job->completed < cleantime)
+    {
+      cupsArrayRemove(printer->jobs, job);
+      delete_job(job);
+    }
+    else
+      break;
+  _cupsRWUnlock(&(printer->rwlock));
+}
+
+
+/*
+ * 'compare_active_jobs()' - Compare two active jobs.
+ */
+
+static int                             /* O - Result of comparison */
+compare_active_jobs(_ipp_job_t *a,     /* I - First job */
+                    _ipp_job_t *b)     /* I - Second job */
+{
+  int  diff;                           /* Difference */
+
+
+  if ((diff = b->priority - a->priority) == 0)
+    diff = b->id - a->id;
+
+  return (diff);
+}
+
+
+/*
+ * 'compare_completed_jobs()' - Compare two completed jobs.
+ */
+
+static int                             /* O - Result of comparison */
+compare_completed_jobs(_ipp_job_t *a,  /* I - First job */
+                       _ipp_job_t *b)  /* I - Second job */
+{
+  int  diff;                           /* Difference */
+
+
+  if ((diff = a->completed - b->completed) == 0)
+    diff = b->id - a->id;
+
+  return (diff);
+}
+
+
+/*
+ * 'compare_devices()' - Compare two devices...
+ */
+
+static int                             /* O - Result of comparison */
+compare_devices(_ipp_device_t *a,      /* I - First device */
+                _ipp_device_t *b)      /* I - Second device */
+{
+  return (strcmp(a->uuid, b->uuid));
+}
+
+
+/*
+ * 'compare_jobs()' - Compare two jobs.
+ */
+
+static int                             /* O - Result of comparison */
+compare_jobs(_ipp_job_t *a,            /* I - First job */
+             _ipp_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? */
+{
+  _ipp_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(
+    _ipp_client_t *client,             /* I - Client */
+    _ipp_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", job->state);
+
+  if (!ra || cupsArrayFind(ra, "job-state-message"))
+  {
+    if (job->dev_state_message)
+    {
+      ippAddString(client->response, IPP_TAG_JOB, IPP_TAG_TEXT, "job-state-message", NULL, job->dev_state_message);
+    }
+    else
+    {
+      const char *message = "";                /* Message string */
+
+      switch (job->state)
+      {
+       case IPP_JSTATE_PENDING :
+           message = "Job pending.";
+           break;
+
+       case IPP_JSTATE_HELD :
+           if (job->state_reasons & _IPP_JREASON_JOB_INCOMING)
+             message = "Job incoming.";
+           else if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_ZERO))
+             message = "Job held.";
+           else
+             message = "Job created.";
+           break;
+
+       case IPP_JSTATE_PROCESSING :
+           if (job->state_reasons & _IPP_JREASON_PROCESSING_TO_STOP_POINT)
+           {
+             if (job->cancel)
+               message = "Cancel in progress.";
+             else
+               message = "Abort in progress.";
+           }
+           else
+             message = "Job printing.";
+           break;
+
+       case IPP_JSTATE_STOPPED :
+           message = "Job stopped.";
+           break;
+
+       case IPP_JSTATE_CANCELED :
+           message = "Job canceled.";
+           break;
+
+       case IPP_JSTATE_ABORTED :
+           message = "Job aborted.";
+           break;
+
+       case IPP_JSTATE_COMPLETED :
+           message = "Job completed.";
+           break;
+      }
+
+      ippAddString(client->response, IPP_TAG_JOB, IPP_CONST_TAG(IPP_TAG_TEXT), "job-state-message", NULL, message);
+    }
+  }
+
+  if (!ra || cupsArrayFind(ra, "job-state-reasons"))
+    copy_job_state_reasons(client->response, IPP_TAG_JOB, job);
+/*
+    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));
+}
+
+
+/*
+ * 'copy_job_state_reasons()' - Copy printer-state-reasons values.
+ */
+
+static void
+copy_job_state_reasons(
+    ipp_t      *ipp,                   /* I - Attributes */
+    ipp_tag_t  group_tag,              /* I - Group */
+    _ipp_job_t *job)                   /* I - Printer */
+{
+  _ipp_jreason_t       creasons;       /* Combined job-state-reasons */
+
+
+  creasons = job->state_reasons | job->dev_state_reasons;
+
+  if (!creasons)
+  {
+    ippAddString(ipp, group_tag, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", NULL, "none");
+  }
+  else
+  {
+    int                        i,              /* Looping var */
+                       num_reasons = 0;/* Number of reasons */
+    _ipp_jreason_t     reason;         /* Current reason */
+    const char         *reasons[32];   /* Reason strings */
+
+    for (i = 0, reason = 1; i < (int)(sizeof(_ipp_jreasons) / sizeof(_ipp_jreasons[0])); i ++, reason <<= 1)
+    {
+      if (creasons & reason)
+        reasons[num_reasons ++] = _ipp_jreasons[i];
+    }
+
+    ippAddStrings(ipp, group_tag, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons", num_reasons, NULL, reasons);
+  }
+}
+
+
+/*
+ * 'copy_printer_state_reasons()' - Copy printer-state-reasons values.
+ */
+
+static void
+copy_printer_state_reasons(
+    ipp_t          *ipp,               /* I - Attributes */
+    ipp_tag_t      group_tag,          /* I - Group */
+    _ipp_printer_t *printer)           /* I - Printer */
+{
+  _ipp_preason_t       creasons = printer->state_reasons | printer->dev_reasons;
+                                       /* Combined reasons */
+
+
+  if (creasons == _IPP_PREASON_NONE)
+  {
+    ippAddString(ipp, group_tag, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-state-reasons", NULL, "none");
+  }
+  else
+  {
+    int                        i,              /* Looping var */                               num_reasons = 0;/* Number of reasons */
+    _ipp_preason_t     reason;         /* Current reason */
+    const char         *reasons[32];   /* Reason strings */
+
+    for (i = 0, reason = 1; i < (int)(sizeof(_ipp_preasons) / sizeof(_ipp_preasons[0])); i ++, reason <<= 1)
+    {
+      if (creasons & reason)
+       reasons[num_reasons ++] = _ipp_preasons[i];
+    }
+
+    ippAddStrings(ipp, group_tag, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-state-reasons", num_reasons, NULL, reasons);
+  }
+}
+
+
+/*
+ * 'copy_sub_attrs()' - Copy job attributes to the response.
+ */
+
+static void
+copy_subscription_attributes(
+    _ipp_client_t       *client,       /* I - Client */
+    _ipp_subscription_t *sub,          /* I - Subscription */
+    cups_array_t        *ra)           /* I - requested-attributes */
+{
+  copy_attributes(client->response, sub->attrs, ra, IPP_TAG_SUBSCRIPTION, 0);
+
+  if (!ra || cupsArrayFind(ra, "notify-lease-expiration-time"))
+    ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-lease-expiration-time", (int)(sub->expire - client->printer->start_time));
+
+  if (!ra || cupsArrayFind(ra, "notify-printer-up-time"))
+    ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-printer-up-time", (int)(time(NULL) - client->printer->start_time));
+
+  if (!ra || cupsArrayFind(ra, "notify-sequence-number"))
+    ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-sequence-number", sub->last_sequence);
+}
+
+
+/*
+ * 'create_client()' - Accept a new network connection and create a client
+ *                     object.
+ */
+
+static _ipp_client_t *                 /* O - Client */
+create_client(_ipp_printer_t *printer, /* I - Printer */
+              int            sock)     /* I - Listen socket */
+{
+  _ipp_client_t        *client;                /* Client */
+
+
+  if ((client = calloc(1, sizeof(_ipp_client_t))) == NULL)
+  {
+    perror("Unable to allocate memory for client");
+    return (NULL);
+  }
+
+  client->printer    = printer;
+  client->fetch_file = -1;
+
+ /*
+  * 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_device()' - Create an output device tracking object.
+ */
+
+static _ipp_device_t *                 /* O - Device */
+create_device(_ipp_client_t *client)   /* I - Client */
+{
+  _ipp_device_t                *device;        /* Device */
+  ipp_attribute_t      *uuid;          /* output-device-uuid */
+
+
+  if ((uuid = ippFindAttribute(client->request, "output-device-uuid", IPP_TAG_URI)) == NULL)
+    return (NULL);
+
+  if ((device = calloc(1, sizeof(_ipp_device_t))) == NULL)
+    return (NULL);
+
+  _cupsRWInit(&device->rwlock);
+
+  device->uuid  = strdup(ippGetString(uuid, 0, NULL));
+  device->state = IPP_PSTATE_STOPPED;
+
+  _cupsRWLockWrite(&client->printer->rwlock);
+  cupsArrayAdd(client->printer->devices, device);
+  _cupsRWUnlock(&client->printer->rwlock);
+
+  return (device);
+}
+
+
+/*
+ * 'create_job()' - Create a new job object from a Print-Job or Create-Job
+ *                  request.
+ */
+
+static _ipp_job_t *                    /* O - Job */
+create_job(_ipp_client_t *client)      /* I - Client */
+{
+  _ipp_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));
+
+ /*
+  * Allocate and initialize the job object...
+  */
+
+  if ((job = calloc(1, sizeof(_ipp_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, "job-priority", IPP_TAG_INTEGER)) != NULL)
+    job->priority = ippGetInteger(attr, 0);
+  else
+    job->priority = 50;
+
+  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);
+  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);
+  cupsArrayAdd(client->printer->active_jobs, job);
+
+  _cupsRWUnlock(&(client->printer->rwlock));
+
+  return (job);
+}
+
+
+/*
+ * 'create_job_filename()' - Create the filename for a document in a job.
+ */
+
+static void create_job_filename(
+    _ipp_printer_t *printer,           /* I - Printer */
+    _ipp_job_t     *job,               /* I - Job */
+    const char     *format,            /* I - Format or NULL */
+    char           *fname,             /* I - Filename buffer */
+    size_t         fnamesize)          /* I - Size of filename buffer */
+{
+  char                 name[256],      /* "Safe" filename */
+                       *nameptr;       /* Pointer into filename */
+  const char           *ext,           /* Filename extension */
+                       *job_name;      /* job-name value */
+  ipp_attribute_t      *job_name_attr; /* job-name attribute */
+
+
+ /*
+  * Make a name from the job-name attribute...
+  */
+
+  if ((job_name_attr = ippFindAttribute(job->attrs, "job-name", IPP_TAG_NAME)) != NULL)
+    job_name = ippGetString(job_name_attr, 0, NULL);
+  else
+    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++ = '_';
+
+  *nameptr = '\0';
+
+ /*
+  * Figure out the extension...
+  */
+
+  if (!format)
+    format = job->format;
+
+  if (!strcasecmp(format, "image/jpeg"))
+    ext = "jpg";
+  else if (!strcasecmp(format, "image/png"))
+    ext = "png";
+  else if (!strcasecmp(format, "image/pwg-raster"))
+    ext = "ras";
+  else if (!strcasecmp(format, "image/urf"))
+    ext = "urf";
+  else if (!strcasecmp(format, "application/pdf"))
+    ext = "pdf";
+  else if (!strcasecmp(format, "application/postscript"))
+    ext = "ps";
+  else
+    ext = "prn";
+
+ /*
+  * Create a filename with the job-id, job-name, and document-format (extension)...
+  */
+
+  snprintf(fname, fnamesize, "%s/%d-%s.%s", printer->directory, job->id, name, ext);
+}
+
+
+/*
+ * 'create_listener()' - Create a listener socket.
+ */
+
+static int                             /* O - Listener socket or -1 on error */
+create_listener(int family,            /* I - Address family */
+                int port)              /* I - Port number */
+{
+  int                  sock;           /* Listener socket */
+  http_addrlist_t      *addrlist;      /* Listen address */
+  char                 service[255];   /* Service port */
+
+
+  snprintf(service, sizeof(service), "%d", port);
+  if ((addrlist = httpAddrGetList(NULL, family, service)) == NULL)
+    return (-1);
+
+  sock = httpAddrListen(&(addrlist->addr), port);
+
+  httpAddrFreeList(addrlist);
+
+  return (sock);
+}
+
+
+/*
+ * 'create_printer()' - Create, register, and listen for connections to a
+ *                      printer object.
+ */
+
+static _ipp_printer_t *                        /* O - Printer */
+create_printer(const char *servername, /* I - Server hostname (NULL for default) */
+               int        port,                /* I - Port number */
+               const char *name,       /* I - printer-name */
+              const char *directory,   /* I - Spool directory */
+              const char *proxy_user,  /* I - Proxy account username */
+              const char *proxy_pass)  /* I - Proxy account password */
+{
+  _ipp_printer_t       *printer;       /* Printer */
+  char                 uri[1024],      /* Printer 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 */
+#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.0",
+    "1.1",
+    "2.0"
+  };
+  static const char * const features[] =/* ipp-features-supported values */
+  {
+    "document-object",
+    "ipp-everywhere",
+    "infrastructure-printer",
+    "page-overrides"
+  };
+  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_GET_PRINTER_SUPPORTED_VALUES,
+    IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS,
+    IPP_OP_CREATE_JOB_SUBSCRIPTIONS,
+    IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES,
+    IPP_OP_GET_SUBSCRIPTIONS,
+    IPP_OP_RENEW_SUBSCRIPTION,
+    IPP_OP_CANCEL_SUBSCRIPTION,
+    IPP_OP_GET_NOTIFICATIONS,
+    IPP_OP_GET_DOCUMENT_ATTRIBUTES,
+    IPP_OP_GET_DOCUMENTS,
+    IPP_OP_CANCEL_MY_JOBS,
+    IPP_OP_CLOSE_JOB,
+    IPP_OP_IDENTIFY_PRINTER,
+    IPP_OP_VALIDATE_DOCUMENT,
+    _IPP_OP_ACKNOWLEDGE_DOCUMENT,
+    _IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER,
+    _IPP_OP_ACKNOWLEDGE_JOB,
+    _IPP_OP_FETCH_DOCUMENT,
+    _IPP_OP_FETCH_JOB,
+    _IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES,
+    _IPP_OP_UPDATE_ACTIVE_JOBS,
+    _IPP_OP_UPDATE_DOCUMENT_STATUS,
+    _IPP_OP_UPDATE_JOB_STATUS,
+    _IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES,
+    _IPP_OP_DEREGISTER_OUTPUT_DEVICE
+  };
+  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 notify_attributes[] =
+  {                                    /* notify-attributes-supported */
+    "printer-state-change-time",
+    "notify-lease-expiration-time",
+    "notify-subscriber-user-name"
+  };
+  static const char * const reference_uri_schemes_supported[] =
+  {                                    /* reference-uri-schemes-supported */
+    "file",
+    "ftp",
+    "http"
+#ifdef HAVE_SSL
+    , "https"
+#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"
+  };
+
+
+ /*
+  * Allocate memory for the printer...
+  */
+
+  if ((printer = calloc(1, sizeof(_ipp_printer_t))) == NULL)
+  {
+    perror("ippserver: Unable to allocate memory for printer");
+    return (NULL);
+  }
+
+  printer->ipv4           = -1;
+  printer->ipv6           = -1;
+  printer->name           = strdup(name);
+  printer->directory      = strdup(directory);
+  printer->hostname       = strdup(servername);
+  printer->port           = port;
+  printer->start_time     = time(NULL);
+  printer->config_time    = printer->start_time;
+  printer->state          = IPP_PSTATE_IDLE;
+  printer->state_reasons  = _IPP_PREASON_NONE;
+  printer->state_time     = printer->start_time;
+  printer->jobs           = cupsArrayNew3((cups_array_func_t)compare_jobs, NULL, NULL, 0, NULL, (cups_afree_func_t)delete_job);
+  printer->active_jobs    = cupsArrayNew((cups_array_func_t)compare_active_jobs, NULL);
+  printer->completed_jobs = cupsArrayNew((cups_array_func_t)compare_completed_jobs, NULL);
+  printer->next_job_id    = 1;
+
+  httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
+                 printer->hostname, printer->port, "/ipp/print");
+  printer->uri    = strdup(uri);
+  printer->urilen = strlen(uri);
+
+  if (proxy_user)
+    printer->proxy_user = strdup(proxy_user);
+  if (proxy_pass)
+    printer->proxy_pass = strdup(proxy_pass);
+
+  printer->devices = cupsArrayNew((cups_array_func_t)compare_devices, NULL);
+
+  _cupsRWInit(&(printer->rwlock));
+
+ /*
+  * Create the listener sockets...
+  */
+
+  if ((printer->ipv4 = create_listener(AF_INET, printer->port)) < 0)
+  {
+    perror("Unable to create IPv4 listener");
+    goto bad_printer;
+  }
+
+  if ((printer->ipv6 = create_listener(AF_INET6, printer->port)) < 0)
+  {
+    perror("Unable to create IPv6 listener");
+    goto bad_printer;
+  }
+
+ /*
+  * Prepare values for the printer attributes...
+  */
+
+  httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), "http", NULL, printer->hostname, printer->port, "/");
+  httpAssembleURI(HTTP_URI_CODING_ALL, supplyurl, sizeof(supplyurl), "http", NULL, printer->hostname, printer->port, "/supplies");
+
+  if (Verbosity)
+  {
+    fprintf(stderr, "printer-more-info=\"%s\"\n", adminurl);
+    fprintf(stderr, "printer-supply-info-uri=\"%s\"\n", supplyurl);
+    fprintf(stderr, "printer-uri=\"%s\"\n", uri);
+  }
+
+ /*
+  * 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 */
+
+ /*
+  * Create the printer attributes.  This list of attributes is sorted to improve
+  * performance when the client provides a requested-attributes attribute...
+  */
+
+  printer->attrs = ippNew();
+
+  /* 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 */
+  ippAddStrings(printer->attrs, IPP_TAG_PRINTER,
+                IPP_CONST_TAG(IPP_TAG_KEYWORD),
+               "compression-supported",
+               (int)(sizeof(compressions) / sizeof(compressions[0])), NULL,
+               compressions);
+
+  /* generated-natural-language-supported */
+  ippAddString(printer->attrs, IPP_TAG_PRINTER,
+               IPP_CONST_TAG(IPP_TAG_LANGUAGE),
+               "generated-natural-language-supported", NULL, "en");
+
+  /* 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 */
+  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-versions-supported", sizeof(versions) / sizeof(versions[0]), NULL, versions);
+
+  /* ippget-event-life */
+  ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "ippget-event-life", 300);
+
+  /* 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", 100);
+
+  /* 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");
+
+  /* notify-attributes-supported */
+  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-attributes-supported", sizeof(notify_attributes) / sizeof(notify_attributes[0]), NULL, notify_attributes);
+
+  /* notify-events-default */
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-events-default", NULL, "job-completed");
+
+  /* notify-events-supported */
+  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-events-supported", sizeof(_ipp_events) / sizeof(_ipp_events[0]), NULL, _ipp_events);
+
+  /* notify-lease-duration-default */
+  ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "notify-lease-duration-default", 86400);
+
+  /* notify-lease-duration-supported */
+  ippAddRange(printer->attrs, IPP_TAG_PRINTER, "notify-lease-duration-supported", 0, _IPP_NOTIFY_LEASE_DURATION_MAX);
+
+  /* notify-max-events-supported */
+  ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "notify-lease-duration-default", (int)(sizeof(_ipp_events) / sizeof(_ipp_events[0])));
+
+  /* notify-pull-method-supported */
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-pull-method-supported", NULL, "ippget");
+
+  /* operations-supported */
+  ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
+                "operations-supported", sizeof(ops) / sizeof(ops[0]), ops);
+
+  /* printer-get-attributes-supported */
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-get-attributes-supported", NULL, "document-format");
+
+  /* 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-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-supply-info-uri */
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, supplyurl);
+
+  /* printer-uri-supported */
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uri-supported", NULL, uri);
+
+  /* printer-uuid */
+  httpAssembleUUID(printer->hostname, port, name, 0, uuid, sizeof(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 */
+  ippAddString(printer->attrs, IPP_TAG_PRINTER,
+               IPP_CONST_TAG(IPP_TAG_KEYWORD),
+               "uri-authentication-supported", NULL, "basic");
+
+  /* uri-security-supported */
+  ippAddString(printer->attrs, IPP_TAG_PRINTER,
+               IPP_CONST_TAG(IPP_TAG_KEYWORD),
+               "uri-security-supported", NULL, "tls");
+
+  /* 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);
+
+ /*
+  * Return it!
+  */
+
+  return (printer);
+
+
+ /*
+  * If we get here we were unable to create the printer...
+  */
+
+  bad_printer:
+
+  delete_printer(printer);
+  return (NULL);
+}
+
+
+/*
+ * 'create_subscription()' - Create a new subscription object from a
+ *                           Print-Job, Create-Job, or Create-xxx-Subscription
+ *                           request.
+ */
+
+static _ipp_subscription_t *           /* O - Subscription object */
+create_subscription(
+    _ipp_printer_t  *printer,          /* I - Printer */
+    _ipp_job_t      *job,              /* I - Job, if any */
+    int             interval,          /* I - Interval for progress events */
+    int             lease,             /* I - Lease duration */
+    const char      *username,         /* I - User creating the subscription */
+    ipp_attribute_t *notify_events,    /* I - Events to monitor */
+    ipp_attribute_t *notify_attributes,        /* I - Attributes to report */
+    ipp_attribute_t *notify_user_data) /* I - User data, if any */
+{
+  _ipp_subscription_t  *sub;           /* Subscription */
+  ipp_attribute_t      *attr;          /* Subscription attribute */
+  char                 uuid[64];       /* notify-subscription-uuid value */
+
+
+ /*
+  * Allocate and initialize the subscription object...
+  */
+
+  if ((sub = calloc(1, sizeof(_ipp_subscription_t))) == NULL)
+  {
+    perror("Unable to allocate memory for subscription");
+    return (NULL);
+  }
+
+  _cupsRWLockWrite(&(printer->rwlock));
+
+  sub->id       = printer->next_sub_id ++;
+  sub->mask     = notify_events ? get_notify_events_bits(notify_events) : _IPP_EVENT_DEFAULT;
+  sub->printer  = printer;
+  sub->job      = job;
+  sub->interval = interval;
+  sub->lease    = lease;
+  sub->attrs    = ippNew();
+
+  if (lease)
+    sub->expire = time(NULL) + sub->lease;
+  else
+    sub->expire = INT_MAX;
+
+  _cupsRWInit(&(sub->rwlock));
+
+ /*
+  * Add subscription description attributes and add to the subscriptions
+  * array...
+  */
+
+  ippAddInteger(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-subscription-id", sub->id);
+
+  httpAssembleUUID(printer->hostname, printer->port, printer->name, -sub->id, uuid, sizeof(uuid));
+  attr = ippAddString(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, "notify-subscription-uuid", NULL, uuid);
+  sub->uuid = ippGetString(attr, 0, NULL);
+
+  ippAddString(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, "notify-printer-uri", NULL, printer->uri);
+
+  if (job)
+    ippAddInteger(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-job-id", job->id);
+  else
+    ippAddInteger(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-lease-duration", sub->lease);
+
+  attr = ippAddString(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_TAG_NAME, "notify-subscriber-user-name", NULL, username);
+  sub->username = ippGetString(attr, 0, NULL);
+
+  if (notify_events)
+    ippCopyAttribute(sub->attrs, notify_events, 0);
+  else
+    ippAddString(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-events", NULL, _IPP_EVENT_DEFAULT_STRING);
+
+  ippAddString(sub->attrs, IPP_TAG_SUBSCRIPTION, IPP_CONST_TAG(IPP_TAG_KEYWORD), "notify-pull-method", NULL, "ippget");
+
+  if (notify_attributes)
+    ippCopyAttribute(sub->attrs, notify_attributes, 0);
+
+  if (notify_user_data)
+    ippCopyAttribute(sub->attrs, notify_user_data, 0);
+
+  sub->events = cupsArrayNew3(NULL, NULL, NULL, 0, NULL, (cups_afree_func_t)ippDelete);
+
+  cupsArrayAdd(printer->subscriptions, sub);
+
+  _cupsRWUnlock(&(printer->rwlock));
+
+  return (sub);
+}
+
+
+/*
+ * '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(_ipp_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_device()' - Remove a device from a printer.
+ *
+ * Note: Caller is responsible for locking the printer object.
+ */
+
+static void
+delete_device(_ipp_device_t *device)   /* I - Device */
+{
+ /*
+  * Free memory used for the device...
+  */
+
+  _cupsRWDeinit(&device->rwlock);
+
+  if (device->name)
+    free(device->name);
+
+  free(device->uuid);
+
+  ippDelete(device->attrs);
+
+  free(device);
+}
+
+
+/*
+ * 'delete_job()' - Remove from the printer and free all memory used by a job
+ *                  object.
+ */
+
+static void
+delete_job(_ipp_job_t *job)            /* I - Job */
+{
+  if (Verbosity)
+    fprintf(stderr, "Removing job #%d from history.\n", job->id);
+
+  _cupsRWLockWrite(&job->rwlock);
+
+  ippDelete(job->attrs);
+
+  if (job->filename)
+  {
+    if (!KeepFiles)
+      unlink(job->filename);
+
+    free(job->filename);
+  }
+
+  _cupsRWDeinit(&job->rwlock);
+
+  free(job);
+}
+
+
+/*
+ * 'delete_printer()' - Unregister, close listen sockets, and free all memory
+ *                      used by a printer object.
+ */
+
+static void
+delete_printer(_ipp_printer_t *printer)        /* I - Printer */
+{
+  _cupsRWLockWrite(&printer->rwlock);
+
+  if (printer->ipv4 >= 0)
+    close(printer->ipv4);
+
+  if (printer->ipv6 >= 0)
+    close(printer->ipv6);
+
+  if (printer->name)
+    free(printer->name);
+  if (printer->directory)
+    free(printer->directory);
+  if (printer->hostname)
+    free(printer->hostname);
+  if (printer->uri)
+    free(printer->uri);
+  if (printer->proxy_user)
+    free(printer->proxy_user);
+  if (printer->proxy_pass)
+    free(printer->proxy_pass);
+
+
+  ippDelete(printer->attrs);
+  ippDelete(printer->dev_attrs);
+
+  cupsArrayDelete(printer->active_jobs);
+  cupsArrayDelete(printer->completed_jobs);
+  cupsArrayDelete(printer->jobs);
+  cupsArrayDelete(printer->subscriptions);
+
+  _cupsRWDeinit(&printer->rwlock);
+
+  free(printer);
+}
+
+
+/*
+ * 'delete_subscription()' - Delete a subscription.
+ */
+
+static void
+delete_subscription(
+    _ipp_subscription_t *sub)          /* I - Subscription */
+{
+  sub->pending_delete = 1;
+
+  _cupsCondBroadcast(&SubscriptionCondition);
+
+  _cupsRWLockWrite(&sub->rwlock);
+
+  ippDelete(sub->attrs);
+  cupsArrayDelete(sub->events);
+
+  _cupsRWDeinit(&sub->rwlock);
+
+  free(sub);
+}
+
+
+/*
+ * 'filter_cb()' - Filter printer attributes based on the requested array.
+ */
+
+static int                             /* O - 1 to copy, 0 to ignore */
+filter_cb(_ipp_filter_t   *filter,     /* I - Filter parameters */
+          ipp_t           *dst,                /* I - Destination (unused) */
+         ipp_attribute_t *attr)        /* I - Source attribute */
+{
+ /*
+  * Filter attributes as needed...
+  */
+
+  (void)dst;
+
+  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_device()' - Find a device.
+ */
+
+static _ipp_device_t *                 /* I - Device */
+find_device(_ipp_client_t *client)     /* I - Client */
+{
+  ipp_attribute_t      *uuid;          /* output-device-uuid */
+  _ipp_device_t                key,            /* Search key */
+                       *device;        /* Matching device */
+
+
+  if ((uuid = ippFindAttribute(client->request, "output-device-uuid", IPP_TAG_URI)) == NULL)
+    return (NULL);
+
+  key.uuid = (char *)ippGetString(uuid, 0, NULL);
+
+  _cupsRWLockRead(&client->printer->rwlock);
+  device = (_ipp_device_t *)cupsArrayFind(client->printer->devices, &key);
+  _cupsRWUnlock(&client->printer->rwlock);
+
+  return (device);
+}
+
+
+/*
+ * 'find_job()' - Find a job specified in a request.
+ */
+
+static _ipp_job_t *                    /* O - Job or NULL */
+find_job(_ipp_client_t *client,                /* I - Client */
+         int           job_id)         /* I - Job ID to find or 0 to lookup */
+{
+  ipp_attribute_t      *attr;          /* job-id or job-uri attribute */
+  _ipp_job_t           key,            /* Job search key */
+                       *job;           /* Matching job, if any */
+
+
+  if (job_id > 0)
+  {
+    key.id = job_id;
+  }
+  else 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 = (_ipp_job_t *)cupsArrayFind(client->printer->jobs, &key);
+  _cupsRWUnlock(&(client->printer->rwlock));
+
+  return (job);
+}
+
+
+/*
+ * 'find_subscription()' - Find a subcription.
+ */
+
+static _ipp_subscription_t *           /* O - Subscription */
+find_subscription(_ipp_client_t *client,/* I - Client */
+                  int           sub_id)        /* I - Subscription ID or 0 */
+{
+  ipp_attribute_t      *notify_subscription_id;
+                                       /* notify-subscription-id */
+  _ipp_subscription_t  key,            /* Search key */
+                       *sub;           /* Matching subscription */
+
+
+  if (sub_id > 0)
+    key.id = sub_id;
+  else if ((notify_subscription_id = ippFindAttribute(client->request, "notify-subscription-id", IPP_TAG_INTEGER)) == NULL)
+    return (NULL);
+  else
+    key.id = ippGetInteger(notify_subscription_id, 0);
+
+  _cupsRWLockRead(&client->printer->rwlock);
+  sub = (_ipp_subscription_t *)cupsArrayFind(client->printer->subscriptions, &key);
+  _cupsRWUnlock(&client->printer->rwlock);
+
+  return (sub);
+}
+
+
+/*
+ * 'get_job_state_reasons_bits()' - Get the bits associates with "job-state-reasons" values.
+ */
+
+static _ipp_jreason_t                  /* O - Bits */
+get_job_state_reasons_bits(
+    ipp_attribute_t *attr)             /* I - "job-state-reasons" attribute */
+{
+  int                  i, j,           /* Looping vars */
+                       count;          /* Number of "job-state-reasons" values */
+  const char           *keyword;       /* "job-state-reasons" value */
+  _ipp_jreason_t       jreasons = _IPP_JREASON_NONE;
+                                       /* Bits for "job-state-reasons" values */
+
+
+  count = ippGetCount(attr);
+  for (i = 0; i < count; i ++)
+  {
+    keyword = ippGetString(attr, i, NULL);
+
+    for (j = 0; j < (int)(sizeof(_ipp_jreasons) / sizeof(_ipp_jreasons[0])); j ++)
+    {
+      if (!strcmp(keyword, _ipp_jreasons[j]))
+      {
+        jreasons |= 1 << j;
+       break;
+      }
+    }
+  }
+
+  return (jreasons);
+}
+
+
+/*
+ * 'get_notify_event_bits()' - Get the bits associated with "notify-events" values.
+ */
+
+static _ipp_event_t                    /* O - Bits */
+get_notify_events_bits(
+    ipp_attribute_t *attr)             /* I - "notify-events" attribute */
+{
+  int          i, j,                   /* Looping vars */
+               count;                  /* Number of "notify-events" values */
+  const char   *keyword;               /* "notify-events" value */
+  _ipp_event_t events = _IPP_EVENT_NONE;
+                                       /* Bits for "notify-events" values */
+
+
+  count = ippGetCount(attr);
+  for (i = 0; i < count; i ++)
+  {
+    keyword = ippGetString(attr, i, NULL);
+
+    for (j = 0; j < (int)(sizeof(_ipp_events) / sizeof(_ipp_events[0])); j ++)
+    {
+      if (!strcmp(keyword, _ipp_jreasons[j]))
+      {
+        events |= 1 << j;
+       break;
+      }
+    }
+  }
+
+  return (events);
+}
+
+
+/*
+ * 'get_notify_subscribed_event()' - Get the event name.
+ */
+
+static const char *                    /* O - Event name */
+get_notify_subscribed_event(
+    _ipp_event_t event)                        /* I - Event bit */
+{
+  int          i;                      /* Looping var */
+  _ipp_event_t mask;                   /* Current mask */
+
+  for (i = 0, mask = 1; i < (int)(sizeof(_ipp_events) / sizeof(_ipp_events[0])); i ++, mask <<= 1)
+    if (event & mask)
+      return (_ipp_events[i]);
+
+  return ("none");
+}
+
+
+/*
+ * 'get_printer_state_reasons_bits()' - Get the bits associated with "printer-state-reasons" values.
+ */
+
+static _ipp_preason_t                  /* O - Bits */
+get_printer_state_reasons_bits(
+    ipp_attribute_t *attr)             /* I - "printer-state-reasons" bits */
+{
+  int                  i, j,           /* Looping vars */
+                       count;          /* Number of "printer-state-reasons" values */
+  const char           *keyword;       /* "printer-state-reasons" value */
+  _ipp_preason_t       preasons = _IPP_PREASON_NONE;
+                                       /* Bits for "printer-state-reasons" values */
+
+
+  count = ippGetCount(attr);
+  for (i = 0; i < count; i ++)
+  {
+    keyword = ippGetString(attr, i, NULL);
+
+    for (j = 0; j < (int)(sizeof(_ipp_preasons) / sizeof(_ipp_preasons[0])); j ++)
+    {
+      if (!strcmp(keyword, _ipp_preasons[j]))
+      {
+        preasons |= 1 << j;
+       break;
+      }
+    }
+  }
+
+  return (preasons);
+}
+
+
+/*
+ * 'html_escape()' - Write a HTML-safe string.
+ */
+
+static void
+html_escape(_ipp_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, "&amp;", 5);
+      else
+        httpWrite2(client->http, "&lt;", 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(_ipp_client_t *client)     /* I - Client */
+{
+  html_printf(client,
+             "</div>\n"
+             "</body>\n"
+             "</html>\n");
+  httpWrite2(client->http, "", 0);
+}
+
+
+/*
+ * 'html_header()' - Show the web interface header and title.
+ */
+
+static void
+html_header(_ipp_client_t *client,     /* I - Client */
+            const char    *title)      /* I - Title */
+{
+  html_printf(client,
+             "<!doctype html>\n"
+             "<html>\n"
+             "<head>\n"
+             "<title>%s</title>\n"
+             "<link rel=\"shortcut icon\" href=\"/icon.png\" type=\"image/png\">\n"
+             "<link rel=\"apple-touch-icon\" href=\"/icon.png\" type=\"image/png\">\n"
+             "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\">\n"
+             "<meta name=\"viewport\" content=\"width=device-width\">\n"
+             "<style>\n"
+             "body { font-family: sans-serif; margin: 0; }\n"
+             "div.body { padding: 0px 10px 10px; }\n"
+             "blockquote { background: #dfd; border-radius: 5px; color: #006; padding: 10px; }\n"
+             "table.form { border-collapse: collapse; margin-top: 10px; width: 100%%; }\n"
+             "table.form td, table.form th { padding: 5px 2px; width: 50%%; }\n"
+             "table.form th { text-align: right; }\n"
+             "table.striped { border-bottom: solid thin black; border-collapse: collapse; width: 100%%; }\n"
+             "table.striped tr:nth-child(even) { background: #fcfcfc; }\n"
+             "table.striped tr:nth-child(odd) { background: #f0f0f0; }\n"
+             "table.striped th { background: white; border-bottom: solid thin black; text-align: left; vertical-align: bottom; }\n"
+             "table.striped td { margin: 0; padding: 5px; vertical-align: top; }\n"
+             "table.nav { border-collapse: collapse; width: 100%%; }\n"
+             "table.nav td { margin: 0; text-align: center; }\n"
+             "td.nav a, td.nav a:active, td.nav a:hover, td.nav a:hover:link, td.nav a:hover:link:visited, td.nav a:link, td.nav a:link:visited, td.nav a:visited { background: inherit; color: inherit; font-size: 80%%; text-decoration: none; }\n"
+             "td.nav { background: #333; color: #fff; padding: 4px 8px; width: 33%%; }\n"
+             "td.nav.sel { background: #fff; color: #000; font-weight: bold; }\n"
+             "td.nav:hover { background: #666; color: #fff; }\n"
+             "td.nav:active { background: #000; color: #ff0; }\n"
+             "</style>\n"
+             "</head>\n"
+             "<body>\n"
+             "<table class=\"nav\"><tr>"
+             "<td class=\"nav%s\"><a href=\"/\">Status</a></td>"
+             "<td class=\"nav%s\"><a href=\"/supplies\">Supplies</a></td>"
+             "<td class=\"nav%s\"><a href=\"/media\">Media</a></td>"
+             "</tr></table>\n"
+             "<div class=\"body\">\n", title, !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(_ipp_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_acknowledge_document()' - Acknowledge receipt of a document.
+ */
+
+static void
+ipp_acknowledge_document(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_device_t                *device;        /* Device */
+  _ipp_job_t           *job;           /* Job */
+  ipp_attribute_t      *attr;          /* Attribute */
+
+
+  if ((device = find_device(client)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+    return;
+  }
+
+  if ((job = find_job(client, 0)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job was not found.");
+    return;
+  }
+
+  if (!job->dev_uuid || strcmp(job->dev_uuid, device->uuid))
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job not assigned to device.");
+    return;
+  }
+
+  if ((attr = ippFindAttribute(client->request, "document-number", IPP_TAG_ZERO)) == NULL || ippGetGroupTag(attr) != IPP_TAG_OPERATION || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetCount(attr) != 1 || ippGetInteger(attr, 0) != 1)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, attr ? "Bad document-number attribute." : "Missing document-number attribute.");
+    return;
+  }
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_acknowledge_identify_printer()' - Acknowledge an identify command.
+ */
+
+static void
+ipp_acknowledge_identify_printer(
+    _ipp_client_t *client)             /* I - Client */
+{
+  // TODO: Implement this!
+  respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Need to implement this.");
+}
+
+
+/*
+ * 'ipp_acknowledge_job()' - Acknowledge receipt of a job.
+ */
+
+static void
+ipp_acknowledge_job(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_device_t                *device;        /* Device */
+  _ipp_job_t           *job;           /* Job */
+
+
+  if ((device = find_device(client)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+    return;
+  }
+
+  if ((job = find_job(client, 0)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job was not found.");
+    return;
+  }
+
+  if (job->dev_uuid && strcmp(job->dev_uuid, device->uuid))
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_AUTHORIZED, "Job not assigned to device.");
+    return;
+  }
+
+  if (!(job->state_reasons & _IPP_JREASON_JOB_FETCHABLE))
+  {
+    respond_ipp(client, _IPP_STATUS_ERROR_NOT_FETCHABLE, "Job not fetchable.");
+    return;
+  }
+
+  if (!job->dev_uuid)
+    job->dev_uuid = strdup(device->uuid);
+
+  job->state_reasons &= (_ipp_jreason_t)~_IPP_JREASON_JOB_FETCHABLE;
+
+  add_event(client->printer, job, _IPP_EVENT_JOB_STATE_CHANGED, "Job acknowledged.");
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_cancel_job()' - Cancel a job.
+ */
+
+static void
+ipp_cancel_job(_ipp_client_t *client)  /* I - Client */
+{
+  _ipp_job_t           *job;           /* Job information */
+
+
+ /*
+  * Get the job...
+  */
+
+  if ((job = find_job(client, 0)) == 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));
+
+        add_event(client->printer, job, _IPP_EVENT_JOB_COMPLETED, NULL);
+
+       respond_ipp(client, IPP_STATUS_OK, NULL);
+        break;
+  }
+}
+
+
+/*
+ * 'ipp_cancel_my_jobs()' - Cancel a user's jobs.
+ */
+
+static void
+ipp_cancel_my_jobs(
+    _ipp_client_t *client)             /* I - Client */
+{
+  // TODO: Implement this!
+  respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Need to implement this.");
+}
+
+
+/*
+ * 'ipp_cancel_subscription()' - Cancel a subscription.
+ */
+
+static void
+ipp_cancel_subscription(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_subscription_t  *sub;           /* Subscription */
+
+
+  if ((sub = find_subscription(client, 0)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Subscription was not found.");
+    return;
+  }
+
+  _cupsRWLockWrite(&client->printer->rwlock);
+  cupsArrayRemove(client->printer->subscriptions, sub);
+  delete_subscription(sub);
+  _cupsRWUnlock(&client->printer->rwlock);
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_close_job()' - Close an open job.
+ */
+
+static void
+ipp_close_job(_ipp_client_t *client)   /* I - Client */
+{
+  _ipp_job_t           *job;           /* Job information */
+
+
+ /*
+  * Get the job...
+  */
+
+  if ((job = find_job(client, 0)) == 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(_ipp_client_t *client)  /* I - Client */
+{
+  _ipp_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_TOO_MANY_JOBS, "Too many jobs are queued.");
+    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);
+
+ /*
+  * Add any subscriptions...
+  */
+
+  client->job = job;
+  ipp_create_xxx_subscriptions(client);
+}
+
+
+/*
+ * 'ipp_create_xxx_subscriptions()' - Create job and printer subscriptions.
+ */
+
+static void
+ipp_create_xxx_subscriptions(
+    _ipp_client_t *client)
+{
+  _ipp_subscription_t  *sub;           /* Subscription */
+  ipp_attribute_t      *attr;          /* Subscription attribute */
+  const char           *username;      /* requesting-user-name or
+                                          authenticated username */
+  int                  num_subs = 0,   /* Number of subscriptions */
+                       ok_subs = 0;    /* Number of good subscriptions */
+
+
+ /*
+  * For the Create-xxx-Subscriptions operations, queue up a successful-ok
+  * response...
+  */
+
+  if (ippGetOperation(client->request) == IPP_OP_CREATE_JOB_SUBSCRIPTIONS || ippGetOperation(client->request) == IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS)
+    respond_ipp(client, IPP_STATUS_OK, NULL);
+
+ /*
+  * Get the authenticated user name, if any...
+  */
+
+  if (client->username[0])
+    username = client->username;
+  else if ((attr = ippFindAttribute(client->request, "requesting-user-name", IPP_TAG_NAME)) != NULL && ippGetGroupTag(attr) == IPP_TAG_OPERATION && ippGetCount(attr) == 1)
+    username = ippGetString(attr, 0, NULL);
+  else
+    username = "guest";
+
+ /*
+  * Skip past the initial attributes to the first subscription group.
+  */
+
+  attr = ippFirstAttribute(client->request);
+  while (attr && ippGetGroupTag(attr) != IPP_TAG_SUBSCRIPTION)
+    attr = ippNextAttribute(client->request);
+
+  while (attr)
+  {
+    _ipp_job_t         *job = NULL;    /* Job */
+    const char         *attrname,      /* Attribute name */
+                       *pullmethod = NULL;
+                                       /* notify-pull-method */
+    ipp_attribute_t    *notify_attributes = NULL,
+                                       /* notify-attributes */
+                       *notify_events = NULL,
+                                       /* notify-events */
+                       *notify_user_data = NULL;
+                                       /* notify-user-data */
+    int                        interval = 0,   /* notify-time-interval */
+                       lease = _IPP_NOTIFY_LEASE_DURATION_DEFAULT;
+                                       /* notify-lease-duration */
+    ipp_status_t       status = IPP_STATUS_OK;
+                                       /* notify-status-code */
+
+    num_subs ++;
+
+    while (attr)
+    {
+      if ((attrname = ippGetName(attr)) == NULL)
+        break;
+
+      if (!strcmp(attrname, "notify-recipient-uri"))
+      {
+       /*
+        * Push notifications not supported.
+       */
+
+        status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+       ippCopyAttribute(client->response, attr, 0);
+      }
+      else if (!strcmp(attrname, "notify-pull-method"))
+      {
+       pullmethod = ippGetString(attr, 0, NULL);
+
+        if (ippGetValueTag(attr) != IPP_TAG_KEYWORD || ippGetCount(attr) != 1 || !pullmethod || strcmp(pullmethod, "ippget"))
+       {
+          ippCopyAttribute(client->response, attr, 0);
+         pullmethod = NULL;
+         status     = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+       }
+      }
+      else if (!strcmp(attrname, "notify-attributes"))
+      {
+        if (ippGetValueTag(attr) != IPP_TAG_KEYWORD)
+       {
+         status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+         ippCopyAttribute(client->response, attr, 0);
+       }
+
+       notify_attributes = attr;
+      }
+      else if (!strcmp(attrname, "notify-charset"))
+      {
+        if (ippGetValueTag(attr) != IPP_TAG_CHARSET || ippGetCount(attr) != 1 ||
+           (strcmp(ippGetString(attr, 0, NULL), "us-ascii") && strcmp(ippGetString(attr, 0, NULL), "utf-8")))
+       {
+         status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+         ippCopyAttribute(client->response, attr, 0);
+       }
+      }
+      else if (!strcmp(attrname, "notify-natural-language"))
+      {
+        if (ippGetValueTag(attr) !=  IPP_TAG_LANGUAGE || ippGetCount(attr) != 1 || strcmp(ippGetString(attr, 0, NULL), "en"))
+        {
+         status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+         ippCopyAttribute(client->response, attr, 0);
+       }
+      }
+      else if (!strcmp(attrname, "notify-user-data"))
+      {
+        int    datalen;                /* Length of data */
+
+        if (ippGetValueTag(attr) != IPP_TAG_STRING || ippGetCount(attr) != 1 || !ippGetOctetString(attr, 0, &datalen) || datalen > 63)
+       {
+         status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+         ippCopyAttribute(client->response, attr, 0);
+       }
+       else
+         notify_user_data = attr;
+      }
+      else if (!strcmp(attrname, "notify-events"))
+      {
+        if (ippGetValueTag(attr) != IPP_TAG_KEYWORD)
+       {
+         status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+         ippCopyAttribute(client->response, attr, 0);
+       }
+       else
+          notify_events = attr;
+      }
+      else if (!strcmp(attrname, "notify-lease-duration"))
+      {
+        if (ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetCount(attr) != 1 || ippGetInteger(attr, 0) < 0)
+       {
+         status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+         ippCopyAttribute(client->response, attr, 0);
+       }
+       else
+          lease = ippGetInteger(attr, 0);
+      }
+      else if (!strcmp(attrname, "notify-time-interval"))
+      {
+        if (ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetCount(attr) != 1 || ippGetInteger(attr, 0) < 0)
+       {
+         status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+         ippCopyAttribute(client->response, attr, 0);
+       }
+       else
+          interval = ippGetInteger(attr, 0);
+      }
+      else if (!strcmp(attrname, "notify-job-id"))
+      {
+        if (ippGetOperation(client->request) != IPP_OP_CREATE_JOB_SUBSCRIPTIONS || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetInteger(attr, 0) < 1)
+        {
+         status = IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES;
+         ippCopyAttribute(client->response, attr, 0);
+       }
+       else if ((job = find_job(client, ippGetInteger(attr, 0))) == NULL)
+       {
+         status = IPP_STATUS_ERROR_NOT_FOUND;
+         ippCopyAttribute(client->response, attr, 0);
+       }
+      }
+
+      attr = ippNextAttribute(client->request);
+    }
+
+    if (status)
+    {
+      ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, "notify-status-code", status);
+    }
+    else if (!pullmethod)
+    {
+      ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, "notify-status-code", IPP_STATUS_ERROR_BAD_REQUEST);
+    }
+    else
+    {
+      switch (ippGetOperation(client->request))
+      {
+       case IPP_OP_PRINT_JOB :
+       case IPP_OP_PRINT_URI :
+       case IPP_OP_CREATE_JOB :
+           job = client->job;
+           break;
+
+       default :
+           break;
+      }
+
+      if ((sub = create_subscription(client->printer, job, interval, lease, username, notify_events, notify_attributes, notify_user_data)) == NULL)
+      {
+        ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-subscription-id", sub->id);
+        ok_subs ++;
+      }
+      else
+        ippAddInteger(client->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, "notify-status-code", IPP_STATUS_ERROR_INTERNAL);
+    }
+  }
+
+  if (ok_subs == 0)
+    ippSetStatusCode(client->response, IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS);
+  else if (ok_subs != num_subs)
+    ippSetStatusCode(client->response, IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS);
+}
+
+
+/*
+ * 'ipp_deregister_output_device()' - Unregister an output device.
+ */
+
+static void
+ipp_deregister_output_device(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_device_t        *device;                /* Device */
+
+
+ /*
+  * Find the device...
+  */
+
+  if ((device = find_device(client)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Output device not found.");
+    return;
+  }
+
+ /*
+  * Remove the device from the printer...
+  */
+
+  _cupsRWLockWrite(&client->printer->rwlock);
+
+  cupsArrayRemove(client->printer->devices, device);
+
+  update_device_attributes_no_lock(client->printer);
+  update_device_state_no_lock(client->printer);
+
+  _cupsRWUnlock(&client->printer->rwlock);
+
+ /*
+  * Delete the device...
+  */
+
+  delete_device(device);
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_fetch_document()' - Download a document.
+ */
+
+static void
+ipp_fetch_document(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_device_t                *device;        /* Device */
+  _ipp_job_t           *job;           /* Job */
+  ipp_attribute_t      *attr;          /* Attribute */
+  int                  compression;    /* compression */
+  char                 filename[1024]; /* Job filename */
+  const char           *format;        /* document-format */
+
+
+  if ((device = find_device(client)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+    return;
+  }
+
+  if ((job = find_job(client, 0)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job was not found.");
+    return;
+  }
+
+  if (!job->dev_uuid || strcmp(job->dev_uuid, device->uuid))
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job not assigned to device.");
+    return;
+  }
+
+  if ((attr = ippFindAttribute(client->request, "document-number", IPP_TAG_ZERO)) == NULL || ippGetGroupTag(attr) != IPP_TAG_OPERATION || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetCount(attr) != 1 || ippGetInteger(attr, 0) != 1)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, attr ? "Bad document-number attribute." : "Missing document-number attribute.");
+    return;
+  }
+
+  if ((attr = ippFindAttribute(client->request, "compression-accepted", IPP_TAG_KEYWORD)) != NULL)
+    compression = !strcmp(ippGetString(attr, 0, NULL), "gzip");
+  else
+    compression = 0;
+
+  if ((attr = ippFindAttribute(client->request, "document-format-accepted", IPP_TAG_MIMETYPE)) != NULL)
+  {
+    int        i,                              /* Looping var */
+       count = ippGetCount(attr);      /* Number of values */
+
+
+    for (i = 0; i < count; i ++)
+    {
+      format = ippGetString(attr, i, NULL);
+
+      create_job_filename(client->printer, job, NULL, filename, sizeof(filename));
+
+      if (!access(filename, R_OK))
+        break;
+    }
+
+    if (i >= count)
+    {
+      respond_ipp(client, _IPP_STATUS_ERROR_NOT_FETCHABLE, "Document not available in requested format.");
+      return;
+    }
+  }
+  else if ((attr = ippFindAttribute(job->attrs, "document-format", IPP_TAG_MIMETYPE)) != NULL)
+    format = ippGetString(attr, 0, NULL);
+  else
+  {
+    respond_ipp(client, _IPP_STATUS_ERROR_NOT_FETCHABLE, "Document format unknown.");
+    return;
+  }
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+  ippAddString(client->response, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, format);
+  ippAddString(client->response, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "compression", NULL, compression ? "gzip" : "none");
+
+  client->fetch_file = open(filename, O_RDONLY);
+}
+
+
+/*
+ * 'ipp_fetch_job()' - Download a job.
+ */
+
+static void
+ipp_fetch_job(_ipp_client_t *client)   /* I - Client */
+{
+  _ipp_device_t                *device;        /* Device */
+  _ipp_job_t           *job;           /* Job */
+
+
+  if ((device = find_device(client)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+    return;
+  }
+
+  if ((job = find_job(client, 0)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job was not found.");
+    return;
+  }
+
+  if (job->dev_uuid && strcmp(job->dev_uuid, device->uuid))
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job not assigned to device.");
+    return;
+  }
+
+  if (!(job->state_reasons & _IPP_JREASON_JOB_FETCHABLE))
+  {
+    respond_ipp(client, _IPP_STATUS_ERROR_NOT_FETCHABLE, "Job not fetchable.");
+    return;
+  }
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+  copy_attributes(client->response, job->attrs, NULL, IPP_TAG_JOB, 0);
+}
+
+
+/*
+ * 'ipp_get_document_attributes()' - Get the attributes for a document object.
+ *
+ * Note: This implementation only supports single document jobs so we
+ *       synthesize the information for a single document from the job.
+ */
+
+static void
+ipp_get_document_attributes(
+    _ipp_client_t *client)             /* I - Client */
+{
+  // TODO: Implement this!
+  respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Need to implement this.");
+}
+
+
+/*
+ * 'ipp_get_documents()' - Get the list of documents in a job.
+ *
+ * Note: This implementation only supports single document jobs so we
+ *       synthesize the information for a single document from the job.
+ */
+
+static void
+ipp_get_documents(_ipp_client_t *client)/* I - Client */
+{
+  // TODO: Implement this!
+  respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Need to implement this.");
+}
+
+
+/*
+ * 'ipp_get_job_attributes()' - Get the attributes for a job object.
+ */
+
+static void
+ipp_get_job_attributes(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_job_t   *job;                   /* Job */
+  cups_array_t *ra;                    /* requested-attributes */
+
+
+  if ((job = find_job(client, 0)) == 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(_ipp_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 */
+  _ipp_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 = (_ipp_job_t *)cupsArrayFirst(client->printer->jobs);
+       (limit <= 0 || count < limit) && job;
+       job = (_ipp_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_notifications()' - Get notification events for one or more subscriptions.
+ */
+
+static void
+ipp_get_notifications(
+    _ipp_client_t *client)             /* I - Client */
+{
+  ipp_attribute_t      *sub_ids,       /* notify-subscription-ids */
+                       *seq_nums,      /* notify-sequence-numbers */
+                       *notify_wait;   /* Wait for events? */
+  int                  i,              /* Looping vars */
+                       count,          /* Number of IDs */
+                       first = 1,      /* First event? */
+                       seq_num;        /* Sequence number */
+  _ipp_subscription_t  *sub;           /* Current subscription */
+  ipp_t                        *event;         /* Current event */
+
+
+  if ((sub_ids = ippFindAttribute(client->request, "notify-subscription-ids", IPP_TAG_INTEGER)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing notify-subscription-ids attribute.");
+    return;
+  }
+
+  count       = ippGetCount(sub_ids);
+  seq_nums    = ippFindAttribute(client->request, "notify-sequence-numbers", IPP_TAG_INTEGER);
+  notify_wait = ippFindAttribute(client->request, "notify-wait", IPP_TAG_BOOLEAN);
+
+  if (seq_nums && count != ippGetCount(seq_nums))
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "The notify-subscription-ids and notify-sequence-numbers attributes are different lengths.");
+    return;
+  }
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+  ippAddInteger(client->response, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "notify-get-interval", 30);
+
+  for (i = 0; i < count; i ++)
+  {
+    if ((sub = find_subscription(client, ippGetInteger(sub_ids, i))) == NULL)
+      continue;
+
+    seq_num = ippGetInteger(seq_nums, i);
+    if (seq_num < sub->first_sequence)
+      seq_num = sub->first_sequence;
+
+    if (seq_num > sub->last_sequence)
+      continue;
+
+    for (event = (ipp_t *)cupsArrayIndex(sub->events, seq_num - sub->first_sequence);
+         event;
+        event = (ipp_t *)cupsArrayNext(sub->events))
+    {
+      if (first)
+        first = 0;
+      else
+        ippAddSeparator(client->response);
+
+      ippCopyAttributes(client->response, event, 0, NULL, NULL);
+    }
+  }
+}
+
+
+/*
+ * 'ipp_get_output_device_attributes()' - Get attributes for an output device.
+ */
+
+static void
+ipp_get_output_device_attributes(
+    _ipp_client_t *client)             /* I - Client */
+{
+  // TODO: Implement this!
+  respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Need to implement this.");
+}
+
+
+/*
+ * 'ipp_get_printer_attributes()' - Get the attributes for a printer object.
+ */
+
+static void
+ipp_get_printer_attributes(
+    _ipp_client_t *client)             /* I - Client */
+{
+  cups_array_t         *ra;            /* Requested attributes array */
+  _ipp_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);
+  copy_attributes(client->response, printer->dev_attrs, ra, IPP_TAG_ZERO, IPP_TAG_ZERO);
+
+  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", printer->state > printer->dev_state ? printer->state : printer->dev_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." };
+
+    if (printer->state > printer->dev_state)
+      ippAddString(client->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-state-message", NULL, messages[printer->state - IPP_PSTATE_IDLE]);
+    else
+      ippAddString(client->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-state-message", NULL, messages[printer->dev_state - IPP_PSTATE_IDLE]);
+  }
+
+  if (!ra || cupsArrayFind(ra, "printer-state-reasons"))
+    copy_printer_state_reasons(client->response, IPP_TAG_PRINTER, printer);
+
+  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", cupsArrayCount(printer->active_jobs));
+
+  _cupsRWUnlock(&(printer->rwlock));
+
+  cupsArrayDelete(ra);
+}
+
+
+/*
+ * 'ipp_get_printer_supported_values()' - Return the supported values for
+ *                                        the infrastructure printer.
+ */
+
+static void
+ipp_get_printer_supported_values(
+    _ipp_client_t *client)             /* I - Client */
+{
+  cups_array_t *ra = ippCreateRequestedArray(client->request);
+                                       /* Requested attributes */
+
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+
+  copy_attributes(client->response, client->printer->attrs, ra, IPP_TAG_PRINTER, 1);
+
+  cupsArrayDelete(ra);
+}
+
+
+/*
+ * 'ipp_get_subscription_attributes()' - Get attributes for a subscription.
+ */
+
+static void
+ipp_get_subscription_attributes(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_subscription_t  *sub;           /* Subscription */
+  cups_array_t         *ra = ippCreateRequestedArray(client->request);
+                                       /* Requested attributes */
+
+
+  if ((sub = find_subscription(client, 0)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Subscription was not found.");
+  }
+  else
+  {
+    respond_ipp(client, IPP_STATUS_OK, NULL);
+    copy_subscription_attributes(client, sub, ra);
+  }
+
+  cupsArrayDelete(ra);
+}
+
+
+/*
+ * 'ipp_get_subscriptions()' - Get attributes for all subscriptions.
+ */
+
+static void
+ipp_get_subscriptions(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_subscription_t  *sub;           /* Current subscription */
+  cups_array_t         *ra = ippCreateRequestedArray(client->request);
+                                       /* Requested attributes */
+  int                  first = 1;      /* First time? */
+
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+  _cupsRWLockRead(&client->printer->rwlock);
+  for (sub = (_ipp_subscription_t *)cupsArrayFirst(client->printer->subscriptions);
+       sub;
+       sub = (_ipp_subscription_t *)cupsArrayNext(client->printer->subscriptions))
+  {
+    if (first)
+      first = 0;
+    else
+      ippAddSeparator(client->response);
+
+    copy_subscription_attributes(client, sub, ra);
+  }
+
+  cupsArrayDelete(ra);
+}
+
+
+/*
+ * 'ipp_identify_printer()' - Beep or display a message.
+ */
+
+static void
+ipp_identify_printer(
+    _ipp_client_t *client)             /* I - Client */
+{
+  /* TODO: Do something */
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_print_job()' - Create a job object with an attached document.
+ */
+
+static void
+ipp_print_job(_ipp_client_t *client)   /* I - Client */
+{
+  _ipp_job_t           *job;           /* New job */
+  char                 filename[1024], /* Filename buffer */
+                       buffer[4096];   /* Copy buffer */
+  ssize_t              bytes;          /* Bytes read */
+  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_SEND)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "No file in request.");
+    return;
+  }
+
+ /*
+  * Print the job...
+  */
+
+  if ((job = create_job(client)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BUSY,
+                "Currently printing another job.");
+    return;
+  }
+
+ /*
+  * Create a file for the request data...
+  */
+
+  create_job_filename(client->printer, job, NULL, filename, sizeof(filename));
+
+  if (Verbosity)
+    fprintf(stderr, "Creating job file \"%s\", format \"%s\".\n", filename, job->format);
+
+  if ((job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0)
+  {
+    job->state = IPP_JSTATE_ABORTED;
+
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to create print file: %s", strerror(errno));
+    return;
+  }
+
+  while ((bytes = httpRead2(client->http, buffer, sizeof(buffer))) > 0)
+  {
+    if (write(job->fd, buffer, (size_t)bytes) < bytes)
+    {
+      int error = errno;               /* Write error */
+
+      job->state = IPP_JSTATE_ABORTED;
+
+      close(job->fd);
+      job->fd = -1;
+
+      unlink(filename);
+
+      respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                  "Unable to write print file: %s", strerror(error));
+      return;
+    }
+  }
+
+  if (bytes < 0)
+  {
+   /*
+    * Got an error while reading the print data, so abort this job.
+    */
+
+    job->state = IPP_JSTATE_ABORTED;
+
+    close(job->fd);
+    job->fd = -1;
+
+    unlink(filename);
+
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to read print file.");
+    return;
+  }
+
+  if (close(job->fd))
+  {
+    int error = errno;         /* Write error */
+
+    job->state = IPP_JSTATE_ABORTED;
+    job->fd    = -1;
+
+    unlink(filename);
+
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to write print file: %s", strerror(error));
+    return;
+  }
+
+  job->fd       = -1;
+  job->filename = strdup(filename);
+  job->state    = IPP_JSTATE_PENDING;
+
+ /*
+  * Process the job, if possible...
+  */
+
+  check_jobs(client->printer);
+  
+ /*
+  * 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);
+
+ /*
+  * Process any pending subscriptions...
+  */
+
+  client->job = job;
+  ipp_create_xxx_subscriptions(client);
+}
+
+
+/*
+ * 'ipp_print_uri()' - Create a job object with a referenced document.
+ */
+
+static void
+ipp_print_uri(_ipp_client_t *client)   /* I - Client */
+{
+  _ipp_job_t           *job;           /* New 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 */
+  cups_array_t         *ra;            /* Attributes to send in response */
+  static const char * const uri_status_strings[] =
+  {                                    /* URI decode errors */
+    "URI too large.",
+    "Bad arguments to function.",
+    "Bad resource in URI.",
+    "Bad port number in URI.",
+    "Bad hostname in URI.",
+    "Bad username in URI.",
+    "Bad scheme in URI.",
+    "Bad/empty URI."
+  };
+
+
+ /*
+  * 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;
+  }
+
+ /*
+  * 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.");
+    return;
+  }
+
+  if (ippGetCount(uri) != 1)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+                "Too many document-uri values.");
+    return;
+  }
+
+  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",
+                uri_status_strings[uri_status - HTTP_URI_STATUS_OVERFLOW]);
+    return;
+  }
+
+  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);
+    return;
+  }
+
+  if (!strcmp(scheme, "file") && access(resource, R_OK))
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+                "Unable to access URI: %s", strerror(errno));
+    return;
+  }
+
+ /*
+  * Print the job...
+  */
+
+  if ((job = create_job(client)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BUSY,
+                "Currently printing another job.");
+    return;
+  }
+
+ /*
+  * Create a file for the request data...
+  */
+
+  if (!strcasecmp(job->format, "image/jpeg"))
+    snprintf(filename, sizeof(filename), "%s/%d.jpg",
+             client->printer->directory, job->id);
+  else if (!strcasecmp(job->format, "image/png"))
+    snprintf(filename, sizeof(filename), "%s/%d.png",
+             client->printer->directory, job->id);
+  else if (!strcasecmp(job->format, "application/pdf"))
+    snprintf(filename, sizeof(filename), "%s/%d.pdf",
+             client->printer->directory, job->id);
+  else if (!strcasecmp(job->format, "application/postscript"))
+    snprintf(filename, sizeof(filename), "%s/%d.ps",
+             client->printer->directory, job->id);
+  else
+    snprintf(filename, sizeof(filename), "%s/%d.prn",
+             client->printer->directory, job->id);
+
+  if ((job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0)
+  {
+    job->state = IPP_JSTATE_ABORTED;
+
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to create print file: %s", strerror(errno));
+    return;
+  }
+
+  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));
+      return;
+    }
+
+    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 */
+
+       job->state = IPP_JSTATE_ABORTED;
+
+       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));
+       return;
+      }
+    }
+    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());
+      job->state = IPP_JSTATE_ABORTED;
+
+      close(job->fd);
+      job->fd = -1;
+
+      unlink(filename);
+      return;
+    }
+
+    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));
+
+      job->state = IPP_JSTATE_ABORTED;
+
+      close(job->fd);
+      job->fd = -1;
+
+      unlink(filename);
+      httpClose(http);
+      return;
+    }
+
+    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));
+
+      job->state = IPP_JSTATE_ABORTED;
+
+      close(job->fd);
+      job->fd = -1;
+
+      unlink(filename);
+      httpClose(http);
+      return;
+    }
+
+    while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
+    {
+      if (write(job->fd, buffer, (size_t)bytes) < bytes)
+      {
+       int error = errno;              /* Write error */
+
+       job->state = IPP_JSTATE_ABORTED;
+
+       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));
+       return;
+      }
+    }
+
+    httpClose(http);
+  }
+
+  if (close(job->fd))
+  {
+    int error = errno;         /* Write error */
+
+    job->state = IPP_JSTATE_ABORTED;
+    job->fd    = -1;
+
+    unlink(filename);
+
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to write print file: %s", strerror(error));
+    return;
+  }
+
+  job->fd       = -1;
+  job->filename = strdup(filename);
+  job->state    = IPP_JSTATE_PENDING;
+
+  /* TODO: Do something different here - only process if the printer is idle */
+ /*
+  * Process the job...
+  */
+
+  check_jobs(client->printer);
+
+ /*
+  * 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);
+
+ /*
+  * Process any pending subscriptions...
+  */
+
+  client->job = job;
+  ipp_create_xxx_subscriptions(client);
+}
+
+
+/*
+ * 'ipp_renew_subscription()' - Renew a subscription.
+ */
+
+static void
+ipp_renew_subscription(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_subscription_t  *sub;           /* Subscription */
+  ipp_attribute_t      *attr;          /* notify-lease-duration */
+  int                  lease;          /* Lease duration in seconds */
+
+
+  if ((sub = find_subscription(client, 0)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Subscription was not found.");
+    return;
+  }
+
+  if (sub->job)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Per-job subscriptions cannot be renewed.");
+    return;
+  }
+
+  if ((attr = ippFindAttribute(client->request, "notify-lease-duration", IPP_TAG_ZERO)) != NULL)
+  {
+    if (ippGetGroupTag(attr) != IPP_TAG_SUBSCRIPTION || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetCount(attr) != 1 || ippGetInteger(attr, 0) < 0)
+    {
+      respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, "Bad notify-lease-duration.");
+      return;
+    }
+
+    lease = ippGetInteger(attr, 0);
+  }
+  else
+    lease = _IPP_NOTIFY_LEASE_DURATION_DEFAULT;
+
+  sub->lease = lease;
+
+  if (lease)
+    sub->expire = time(NULL) + sub->lease;
+  else
+    sub->expire = INT_MAX;
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_send_document()' - Add an attached document to a job object created with
+ *                         Create-Job.
+ */
+
+static void
+ipp_send_document(_ipp_client_t *client)/* I - Client */
+{
+  _ipp_job_t           *job;           /* Job information */
+  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 */
+
+
+ /*
+  * Get the job...
+  */
+
+  if ((job = find_job(client, 0)) == 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 (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;
+  }
+
+  copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0);
+
+ /*
+  * Get the document format for the job...
+  */
+
+  _cupsRWLockWrite(&(client->printer->rwlock));
+
+  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";
+
+ /*
+  * Create a file for the request data...
+  */
+
+  create_job_filename(client->printer, job, NULL, filename, sizeof(filename));
+
+  if (Verbosity)
+    fprintf(stderr, "Creating job file \"%s\", format \"%s\".\n", filename, job->format);
+
+  job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600);
+
+  _cupsRWUnlock(&(client->printer->rwlock));
+
+  if (job->fd < 0)
+  {
+    job->state = IPP_JSTATE_ABORTED;
+
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to create print file: %s", strerror(errno));
+    return;
+  }
+
+  while ((bytes = httpRead2(client->http, buffer, sizeof(buffer))) > 0)
+  {
+    if (write(job->fd, buffer, (size_t)bytes) < bytes)
+    {
+      int error = errno;               /* Write error */
+
+      job->state = IPP_JSTATE_ABORTED;
+
+      close(job->fd);
+      job->fd = -1;
+
+      unlink(filename);
+
+      respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                  "Unable to write print file: %s", strerror(error));
+      return;
+    }
+  }
+
+  if (bytes < 0)
+  {
+   /*
+    * Got an error while reading the print data, so abort this job.
+    */
+
+    job->state = IPP_JSTATE_ABORTED;
+
+    close(job->fd);
+    job->fd = -1;
+
+    unlink(filename);
+
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to read print file.");
+    return;
+  }
+
+  if (close(job->fd))
+  {
+    int error = errno;                 /* Write error */
+
+    job->state = IPP_JSTATE_ABORTED;
+    job->fd    = -1;
+
+    unlink(filename);
+
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to write print file: %s", strerror(error));
+    return;
+  }
+
+  _cupsRWLockWrite(&(client->printer->rwlock));
+
+  job->fd       = -1;
+  job->filename = strdup(filename);
+  job->state    = IPP_JSTATE_PENDING;
+
+  _cupsRWUnlock(&(client->printer->rwlock));
+
+ /*
+  * Process the job, if possible...
+  */
+
+  check_jobs(client->printer);
+  
+ /*
+  * 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);
+}
+
+
+/*
+ * 'ipp_send_uri()' - Add a referenced document to a job object created with
+ *                    Create-Job.
+ */
+
+static void
+ipp_send_uri(_ipp_client_t *client)    /* I - Client */
+{
+  _ipp_job_t           *job;           /* Job information */
+  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 */
+  static const char * const uri_status_strings[] =
+  {                                    /* URI decode errors */
+    "URI too large.",
+    "Bad arguments to function.",
+    "Bad resource in URI.",
+    "Bad port number in URI.",
+    "Bad hostname in URI.",
+    "Bad username in URI.",
+    "Bad scheme in URI.",
+    "Bad/empty URI."
+  };
+
+
+ /*
+  * Get the job...
+  */
+
+  if ((job = find_job(client, 0)) == 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 (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;
+  }
+
+ /*
+  * 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;
+  }
+
+ /*
+  * 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.");
+    return;
+  }
+
+  if (ippGetCount(uri) != 1)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+                "Too many document-uri values.");
+    return;
+  }
+
+  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",
+                uri_status_strings[uri_status - HTTP_URI_STATUS_OVERFLOW]);
+    return;
+  }
+
+  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);
+    return;
+  }
+
+  if (!strcmp(scheme, "file") && access(resource, R_OK))
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+                "Unable to access URI: %s", strerror(errno));
+    return;
+  }
+
+ /*
+  * 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 (!strcasecmp(job->format, "image/jpeg"))
+    snprintf(filename, sizeof(filename), "%s/%d.jpg",
+             client->printer->directory, job->id);
+  else if (!strcasecmp(job->format, "image/png"))
+    snprintf(filename, sizeof(filename), "%s/%d.png",
+             client->printer->directory, job->id);
+  else if (!strcasecmp(job->format, "application/pdf"))
+    snprintf(filename, sizeof(filename), "%s/%d.pdf",
+             client->printer->directory, job->id);
+  else if (!strcasecmp(job->format, "application/postscript"))
+    snprintf(filename, sizeof(filename), "%s/%d.ps",
+             client->printer->directory, job->id);
+  else
+    snprintf(filename, sizeof(filename), "%s/%d.prn",
+             client->printer->directory, job->id);
+
+  job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600);
+
+  _cupsRWUnlock(&(client->printer->rwlock));
+
+  if (job->fd < 0)
+  {
+    job->state = IPP_JSTATE_ABORTED;
+
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to create print file: %s", strerror(errno));
+    return;
+  }
+
+  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));
+      return;
+    }
+
+    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 */
+
+       job->state = IPP_JSTATE_ABORTED;
+
+       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));
+       return;
+      }
+    }
+    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());
+      job->state = IPP_JSTATE_ABORTED;
+
+      close(job->fd);
+      job->fd = -1;
+
+      unlink(filename);
+      return;
+    }
+
+    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));
+
+      job->state = IPP_JSTATE_ABORTED;
+
+      close(job->fd);
+      job->fd = -1;
+
+      unlink(filename);
+      httpClose(http);
+      return;
+    }
+
+    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));
+
+      job->state = IPP_JSTATE_ABORTED;
+
+      close(job->fd);
+      job->fd = -1;
+
+      unlink(filename);
+      httpClose(http);
+      return;
+    }
+
+    while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
+    {
+      if (write(job->fd, buffer, (size_t)bytes) < bytes)
+      {
+       int error = errno;              /* Write error */
+
+       job->state = IPP_JSTATE_ABORTED;
+
+       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));
+       return;
+      }
+    }
+
+    httpClose(http);
+  }
+
+  if (close(job->fd))
+  {
+    int error = errno;         /* Write error */
+
+    job->state = IPP_JSTATE_ABORTED;
+    job->fd    = -1;
+
+    unlink(filename);
+
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to write print file: %s", strerror(error));
+    return;
+  }
+
+  _cupsRWLockWrite(&(client->printer->rwlock));
+
+  job->fd       = -1;
+  job->filename = strdup(filename);
+  job->state    = IPP_JSTATE_PENDING;
+
+  _cupsRWUnlock(&(client->printer->rwlock));
+
+ /*
+  * Process the job, if possible...
+  */
+
+  check_jobs(client->printer);
+  
+ /*
+  * 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);
+}
+
+
+/*
+ * 'ipp_update_active_jobs()' - Update the list of active jobs.
+ */
+
+static void
+ipp_update_active_jobs(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_device_t                *device;        /* Output device */
+  _ipp_job_t           *job;           /* Job */
+  ipp_attribute_t      *job_ids,       /* job-ids */
+                       *job_states;    /* output-device-job-states */
+  int                  i,              /* Looping var */
+                       count,          /* Number of values */
+                       num_different = 0,
+                                       /* Number of jobs with different states */
+                       different[1000],/* Jobs with different states */
+                       num_unsupported = 0,
+                                       /* Number of unsupported job-ids */
+                       unsupported[1000];
+                                       /* Unsupported job-ids */
+  ipp_jstate_t         states[1000];   /* Different job state values */
+
+
+ /*
+  * Process the job-ids and output-device-job-states values...
+  */
+
+  if ((device = find_device(client)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+    return;
+  }
+
+  if ((job_ids = ippFindAttribute(client->request, "job-ids", IPP_TAG_ZERO)) == NULL || ippGetGroupTag(job_ids) != IPP_TAG_OPERATION || ippGetValueTag(job_ids) != IPP_TAG_INTEGER)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, job_ids ? "Bad job-ids attribute." : "Missing required job-ids attribute.");
+    return;
+  }
+
+  if ((job_states = ippFindAttribute(client->request, "output-device-job-states", IPP_TAG_ZERO)) == NULL || ippGetGroupTag(job_states) != IPP_TAG_OPERATION || ippGetValueTag(job_states) != IPP_TAG_ENUM)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, job_ids ? "Bad output-device-job-states attribute." : "Missing required output-device-job-states attribute.");
+    return;
+  }
+
+  count = ippGetCount(job_ids);
+  if (count != ippGetCount(job_states))
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "The job-ids and output-device-job-states attributes do not have the same number of values.");
+    return;
+  }
+
+  for (i = 0; i < count; i ++)
+  {
+    if ((job = find_job(client, ippGetInteger(job_ids, i))) == NULL || !job->dev_uuid || strcmp(job->dev_uuid, device->uuid))
+    {
+      if (num_unsupported < 1000)
+        unsupported[num_unsupported ++] = ippGetInteger(job_ids, i);
+    }
+    else
+    {
+      ipp_jstate_t     state = (ipp_jstate_t)ippGetInteger(job_states, i);
+
+      if (job->state >= IPP_JSTATE_STOPPED && state != job->state)
+      {
+        if (num_different < 1000)
+       {
+         different[num_different] = job->id;
+         states[num_different ++] = job->state;
+       }
+      }
+      else
+        job->dev_state = state;
+    }
+  }
+
+ /*
+  * Then look for jobs assigned to the device but not listed...
+  */
+
+  for (job = (_ipp_job_t *)cupsArrayFirst(client->printer->jobs);
+       job && num_different < 1000;
+       job = (_ipp_job_t *)cupsArrayNext(client->printer->jobs))
+  {
+    if (job->dev_uuid && !strcmp(job->dev_uuid, device->uuid) && !ippContainsInteger(job_ids, job->id))
+    {
+      different[num_different] = job->id;
+      states[num_different ++] = job->state;
+    }
+  }
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+
+  if (num_different > 0)
+  {
+    ippAddIntegers(client->response, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-ids", num_different, different);
+    ippAddIntegers(client->response, IPP_TAG_OPERATION, IPP_TAG_ENUM, "output-device-job-states", num_different, (int *)states);
+  }
+
+  if (num_unsupported > 0)
+  {
+    ippAddIntegers(client->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_INTEGER, "job-ids", num_unsupported, unsupported);
+  }
+}
+
+
+/*
+ * 'ipp_update_document_status()' - Update the state of a document.
+ */
+
+static void
+ipp_update_document_status(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_device_t                *device;        /* Device */
+  _ipp_job_t           *job;           /* Job */
+  ipp_attribute_t      *attr;          /* Attribute */
+
+
+  if ((device = find_device(client)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+    return;
+  }
+
+  if ((job = find_job(client, 0)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job was not found.");
+    return;
+  }
+
+  if (!job->dev_uuid || strcmp(job->dev_uuid, device->uuid))
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job not assigned to device.");
+    return;
+  }
+
+  if ((attr = ippFindAttribute(client->request, "document-number", IPP_TAG_ZERO)) == NULL || ippGetGroupTag(attr) != IPP_TAG_OPERATION || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetCount(attr) != 1 || ippGetInteger(attr, 0) != 1)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, attr ? "Bad document-number attribute." : "Missing document-number attribute.");
+    return;
+  }
+
+  if ((attr = ippFindAttribute(client->request, "impressions-completed", IPP_TAG_INTEGER)) != NULL)
+  {
+    job->impcompleted = ippGetInteger(attr, 0);
+    add_event(client->printer, job, _IPP_EVENT_JOB_PROGRESS, NULL);
+  }
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_update_job_status()' - Update the state of a job.
+ */
+
+static void
+ipp_update_job_status(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_device_t                *device;        /* Device */
+  _ipp_job_t           *job;           /* Job */
+  ipp_attribute_t      *attr;          /* Attribute */
+  _ipp_event_t         events = _IPP_EVENT_NONE;
+                                       /* Event(s) */
+
+
+  if ((device = find_device(client)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Device was not found.");
+    return;
+  }
+
+  if ((job = find_job(client, 0)) == NULL)
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job was not found.");
+    return;
+  }
+
+  if (!job->dev_uuid || strcmp(job->dev_uuid, device->uuid))
+  {
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Job not assigned to device.");
+    return;
+  }
+
+  if ((attr = ippFindAttribute(client->request, "job-impressions-completed", IPP_TAG_INTEGER)) != NULL)
+  {
+    job->impcompleted = ippGetInteger(attr, 0);
+    events |= _IPP_EVENT_JOB_PROGRESS;
+  }
+
+  if ((attr = ippFindAttribute(client->request, "output-device-job-state", IPP_TAG_ENUM)) != NULL)
+  {
+    job->dev_state = (ipp_jstate_t)ippGetInteger(attr, 0);
+    events |= _IPP_EVENT_JOB_STATE_CHANGED;
+  }
+
+  if ((attr = ippFindAttribute(client->request, "output-device-job-state-reasons", IPP_TAG_KEYWORD)) != NULL)
+  {
+    job->dev_state_reasons = get_job_state_reasons_bits(attr);
+    events |= _IPP_EVENT_JOB_STATE_CHANGED;
+  }
+
+  if (events)
+    add_event(client->printer, job, events, NULL);
+
+  respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_update_output_device_attributes()' - Update the values for an output device.
+ */
+
+static void
+ipp_update_output_device_attributes(
+    _ipp_client_t *client)             /* I - Client */
+{
+  _ipp_device_t                *device;        /* Device */
+  ipp_attribute_t      *attr,          /* Current attribute */
+                       *dev_attr;      /* Device attribute */
+  _ipp_event_t         events = _IPP_EVENT_NONE;
+                                       /* Config/state changed? */
+
+
+  if ((device = find_device(client)) == NULL)
+  {
+    if ((device = create_device(client)) == NULL)
+    {
+      respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE, "Unable to add output device.");
+      return;
+    }
+  }
+
+  _cupsRWLockWrite(&device->rwlock);
+
+  attr = ippFirstAttribute(client->request);
+  while (attr && ippGetGroupTag(attr) != IPP_TAG_PRINTER)
+    attr = ippNextAttribute(client->request);
+
+  for (; attr; attr = ippNextAttribute(client->request))
+  {
+    const char *attrname = ippGetName(attr),
+                                       /* Attribute name */
+               *dotptr;                /* Pointer to dot in name */
+
+   /*
+    * Skip attributes we don't care about...
+    */
+
+    if (!attrname)
+      continue;
+
+    if (strncmp(attrname, "copies", 6) && strncmp(attrname, "document-format", 15) && strncmp(attrname, "finishings", 10) && strncmp(attrname, "media", 5) && strncmp(attrname, "print-", 6) && strncmp(attrname, "sides", 5) && strncmp(attrname, "printer-alert", 13) && strncmp(attrname, "printer-input", 13) && strncmp(attrname, "printer-output", 14) && strncmp(attrname, "printer-resolution", 18) && strncmp(attrname, "pwg-raster", 10) && strncmp(attrname, "urf-", 4))
+      continue;
+
+    if (strncmp(attrname, "printer-alert", 13) || strncmp(attrname, "printer-state", 13))
+      events |= _IPP_EVENT_PRINTER_CONFIG_CHANGED;
+    else
+      events |= _IPP_EVENT_PRINTER_STATE_CHANGED;
+
+    if (!strcmp(attrname, "media-col-ready") || !strcmp(attrname, "media-ready"))
+      events |= _IPP_EVENT_PRINTER_MEDIA_CHANGED;
+
+    if (!strcmp(attrname, "finishings-col-ready") || !strcmp(attrname, "finishings-ready"))
+      events |= _IPP_EVENT_PRINTER_FINISHINGS_CHANGED;
+
+    if ((dotptr = strrchr(attrname, '.')) != NULL && isdigit(dotptr[1] & 255))
+    {
+#if 0
+     /*
+      * Sparse representation: name.NNN or name.NNN-NNN
+      */
+
+      char     temp[256],              /* Temporary name string */
+               *tempptr;               /* Pointer into temporary string */
+      int      low, high;              /* Low and high numbers in range */
+
+      low = (int)strtol(dotptr + 1, (char **)&dotptr, 10);
+      if (dotptr && *dotptr == '-')
+        high = (int)strtol(dotptr + 1, NULL, 10);
+      else
+        high = low;
+
+      strlcpy(temp, attrname, sizeof(temp));
+      if ((tempptr = strrchr(temp, '.')) != NULL)
+        *tempptr = '\0';
+
+      if ((dev_attr = ippFindAttribute(device->attrs, temp, IPP_TAG_ZERO)) != NULL)
+      {
+      }
+      else
+#endif /* 0 */
+        respond_unsupported(client, attr);
+    }
+    else
+    {
+     /*
+      * Regular representation - replace or delete current attribute,
+      * if any...
+      */
+
+      if ((dev_attr = ippFindAttribute(device->attrs, attrname, IPP_TAG_ZERO)) != NULL)
+        ippDeleteAttribute(device->attrs, dev_attr);
+
+      if (ippGetValueTag(attr) != IPP_TAG_DELETEATTR)
+        ippCopyAttribute(device->attrs, attr, 0);
+    }
+  }
+
+  _cupsRWUnlock(&device->rwlock);
+
+  if (events)
+  {
+    _cupsRWLockWrite(&client->printer->rwlock);
+    if (events & _IPP_EVENT_PRINTER_CONFIG_CHANGED)
+      update_device_attributes_no_lock(client->printer);
+    if (events & _IPP_EVENT_PRINTER_STATE_CHANGED)
+      update_device_state_no_lock(client->printer);
+    _cupsRWUnlock(&client->printer->rwlock);
+
+    add_event(client->printer, NULL, events, NULL);
+  }
+}
+
+
+/*
+ * 'ipp_validate_document()' - Validate document creation attributes.
+ */
+
+static void
+ipp_validate_document(
+    _ipp_client_t *client)             /* I - Client */
+{
+  if (valid_doc_attributes(client))
+    respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'ipp_validate_job()' - Validate job creation attributes.
+ */
+
+static void
+ipp_validate_job(_ipp_client_t *client)        /* I - Client */
+{
+  if (valid_job_attributes(client))
+    respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+#if 0
+/*
+ * '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(_ipp_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);
+}
+#endif /* 0 */
+
+
+/*
+ * 'process_client()' - Process client requests on a thread.
+ */
+
+static void *                          /* O - Exit status */
+process_client(_ipp_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(_ipp_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 */
+  const char           *encoding;      /* Content-Encoding value */
+  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...
+  */
+
+  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 HTTP Expect...
+  */
+
+  if (httpGetExpect(client->http) &&
+      (client->operation == HTTP_STATE_POST ||
+       client->operation == HTTP_STATE_PUT))
+  {
+    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);
+    }
+  }
+
+ /*
+  * Handle new transfers...
+  */
+
+  encoding = httpGetContentEncoding(client->http);
+
+  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 0 /* TODO: Work out icon support */
+        if (!strcmp(client->uri, "/icon.png"))
+         return (respond_http(client, HTTP_STATUS_OK, NULL, "image/png", 0));
+       else
+#endif /* 0 */
+       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 0 /* TODO: Work out icon support */
+        if (!strcmp(client->uri, "/icon.png"))
+       {
+        /*
+         * Send PNG icon file.
+         */
+
+          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
+#endif /* 0 */
+       if (!strcmp(client->uri, "/"))
+       {
+        /*
+         * Show web status page...
+         */
+
+          _ipp_job_t   *job;           /* Current job */
+         int           i;              /* Looping var */
+         _ipp_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"
+         };
+
+          if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0))
+           return (0);
+
+          html_header(client, client->printer->name);
+          html_printf(client,
+                     "<p><img align=\"right\" src=\"/icon.png\" width=\"64\" height=\"64\"><b>ippserver (" CUPS_SVERSION ")</b></p>\n"
+                     "<p>%s, %d job(s).", client->printer->state == IPP_PSTATE_IDLE ? "Idle" : client->printer->state == IPP_PSTATE_PROCESSING ? "Printing" : "Stopped", cupsArrayCount(client->printer->jobs));
+         for (i = 0, reason = 1; i < (int)(sizeof(reasons) / sizeof(reasons[0])); i ++, reason <<= 1)
+           if (client->printer->state_reasons & reason)
+             html_printf(client, "\n<br>&nbsp;&nbsp;&nbsp;&nbsp;%s", reasons[i]);
+         html_printf(client, "</p>\n");
+         
+          if (cupsArrayCount(client->printer->jobs) > 0)
+         {
+            _cupsRWLockRead(&(client->printer->rwlock));
+
+           html_printf(client, "<table class=\"striped\" summary=\"Jobs\"><thead><tr><th>Job #</th><th>Name</th><th>Owner</th><th>When</th></tr></thead><tbody>\n");
+           for (job = (_ipp_job_t *)cupsArrayFirst(client->printer->jobs); job; job = (_ipp_job_t *)cupsArrayNext(client->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, "<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td></tr>\n", job->id, job->name, job->username, when);
+           }
+           html_printf(client, "</tbody></table>\n");
+
+           _cupsRWUnlock(&(client->printer->rwlock));
+         }
+          html_footer(client);
+
+         return (1);
+       }
+#if 0 /* TODO: Pull media and supply info from device attrs */
+       else if (!strcmp(client->uri, "/media"))
+       {
+        /*
+         * Show web media page...
+         */
+
+         int           i,              /* Looping var */
+                       num_options;    /* Number of form options */
+         cups_option_t *options;       /* Form options */
+          static const char * const sizes[] =
+         {                             /* Size strings */
+           "ISO A4",
+           "ISO A5",
+           "ISO A6",
+           "DL Envelope",
+           "US Legal",
+           "US Letter",
+           "#10 Envelope",
+           "3x5 Photo",
+           "3.5x5 Photo",
+           "4x6 Photo",
+           "5x7 Photo"
+         };
+         static const char * const types[] =
+                                         /* Type strings */
+         {
+           "Auto",
+           "Cardstock",
+           "Envelope",
+           "Labels",
+           "Other",
+           "Glossy Photo",
+           "High-Gloss Photo",
+           "Matte Photo",
+           "Satin Photo",
+           "Semi-Gloss Photo",
+           "Plain",
+           "Letterhead",
+           "Transparency"
+         };
+         static const int sheets[] =   /* Number of sheets */
+         {
+           250,
+           100,
+           25,
+           5,
+           0
+         };
+
+          if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0))
+           return (0);
+
+          html_header(client, client->printer->name);
+
+         if ((num_options = parse_options(client, &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!
+           */
+
+           const char  *val;           /* Form value */
+
+           if ((val = cupsGetOption("main_size", num_options, options)) != NULL)
+             client->printer->main_size = atoi(val);
+           if ((val = cupsGetOption("main_type", num_options, options)) != NULL)
+             client->printer->main_type = atoi(val);
+           if ((val = cupsGetOption("main_level", num_options, options)) != NULL)
+             client->printer->main_level = atoi(val);
+
+           if ((val = cupsGetOption("envelope_size", num_options, options)) != NULL)
+             client->printer->envelope_size = atoi(val);
+           if ((val = cupsGetOption("envelope_level", num_options, options)) != NULL)
+             client->printer->envelope_level = atoi(val);
+
+           if ((val = cupsGetOption("photo_size", num_options, options)) != NULL)
+             client->printer->photo_size = atoi(val);
+           if ((val = cupsGetOption("photo_type", num_options, options)) != NULL)
+             client->printer->photo_type = atoi(val);
+           if ((val = cupsGetOption("photo_level", num_options, options)) != NULL)
+             client->printer->photo_level = atoi(val);
+
+            if ((client->printer->main_level < 100 && client->printer->main_level > 0) || (client->printer->envelope_level < 25 && client->printer->envelope_level > 0) || (client->printer->photo_level < 25 && client->printer->photo_level > 0))
+             client->printer->state_reasons |= _IPP_PREASON_MEDIA_LOW;
+           else
+             client->printer->state_reasons &= (_ipp_preason_t)~_IPP_PREASON_MEDIA_LOW;
+
+            if ((client->printer->main_level == 0 && client->printer->main_size > _IPP_MEDIA_SIZE_NONE) || (client->printer->envelope_level == 0 && client->printer->envelope_size > _IPP_MEDIA_SIZE_NONE) || (client->printer->photo_level == 0 && client->printer->photo_size > _IPP_MEDIA_SIZE_NONE))
+           {
+             client->printer->state_reasons |= _IPP_PREASON_MEDIA_EMPTY;
+             if (client->printer->active_job)
+               client->printer->state_reasons |= _IPP_PREASON_MEDIA_NEEDED;
+           }
+           else
+             client->printer->state_reasons &= (_ipp_preason_t)~(_IPP_PREASON_MEDIA_EMPTY | _IPP_PREASON_MEDIA_NEEDED);
+
+           html_printf(client, "<blockquote>Media updated.</blockquote>\n");
+          }
+
+          html_printf(client, "<form method=\"GET\" action=\"/media\">\n");
+
+          html_printf(client, "<table class=\"form\" summary=\"Media\">\n");
+          html_printf(client, "<tr><th>Main Tray:</th><td><select name=\"main_size\"><option value=\"-1\">None</option>");
+          for (i = 0; i < (int)(sizeof(sizes) / sizeof(sizes[0])); i ++)
+           if (!strstr(sizes[i], "Envelope") && !strstr(sizes[i], "Photo"))
+             html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->main_size ? " selected" : "", sizes[i]);
+         html_printf(client, "</select> <select name=\"main_type\"><option value=\"-1\">None</option>");
+          for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i ++)
+           if (!strstr(types[i], "Photo"))
+             html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->main_type ? " selected" : "", types[i]);
+         html_printf(client, "</select> <select name=\"main_level\">");
+          for (i = 0; i < (int)(sizeof(sheets) / sizeof(sheets[0])); i ++)
+           html_printf(client, "<option value=\"%d\"%s>%d sheets</option>", sheets[i], sheets[i] == client->printer->main_level ? " selected" : "", sheets[i]);
+         html_printf(client, "</select></td></tr>\n");
+
+          html_printf(client,
+                     "<tr><th>Envelope Feeder:</th><td><select name=\"envelope_size\"><option value=\"-1\">None</option>");
+          for (i = 0; i < (int)(sizeof(sizes) / sizeof(sizes[0])); i ++)
+           if (strstr(sizes[i], "Envelope"))
+             html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->envelope_size ? " selected" : "", sizes[i]);
+         html_printf(client, "</select> <select name=\"envelope_level\">");
+          for (i = 0; i < (int)(sizeof(sheets) / sizeof(sheets[0])); i ++)
+           html_printf(client, "<option value=\"%d\"%s>%d sheets</option>", sheets[i], sheets[i] == client->printer->envelope_level ? " selected" : "", sheets[i]);
+         html_printf(client, "</select></td></tr>\n");
+
+          html_printf(client,
+                     "<tr><th>Photo Tray:</th><td><select name=\"photo_size\"><option value=\"-1\">None</option>");
+          for (i = 0; i < (int)(sizeof(sizes) / sizeof(sizes[0])); i ++)
+           if (strstr(sizes[i], "Photo"))
+             html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->photo_size ? " selected" : "", sizes[i]);
+         html_printf(client, "</select> <select name=\"photo_type\"><option value=\"-1\">None</option>");
+          for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i ++)
+           if (strstr(types[i], "Photo"))
+             html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->photo_type ? " selected" : "", types[i]);
+         html_printf(client, "</select> <select name=\"photo_level\">");
+          for (i = 0; i < (int)(sizeof(sheets) / sizeof(sheets[0])); i ++)
+           html_printf(client, "<option value=\"%d\"%s>%d sheets</option>", sheets[i], sheets[i] == client->printer->photo_level ? " selected" : "", sheets[i]);
+         html_printf(client, "</select></td></tr>\n");
+
+         html_printf(client, "<tr><td></td><td><input type=\"submit\" value=\"Update Media\"></td></tr></table></form>\n");
+          html_footer(client);
+
+         return (1);
+       }
+       else if (!strcmp(client->uri, "/supplies"))
+       {
+        /*
+         * Show web supplies page...
+         */
+
+          int          i, j,           /* Looping vars */
+                       num_options;    /* Number of form options */
+         cups_option_t *options;       /* Form options */
+         static const int levels[] = { 0, 5, 10, 25, 50, 75, 90, 95, 100 };
+
+          if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0))
+           return (0);
+
+          html_header(client, client->printer->name);
+
+         if ((num_options = parse_options(client, &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 */
+
+            client->printer->state_reasons &= (_ipp_preason_t)~(_IPP_PREASON_MARKER_SUPPLY_EMPTY | _IPP_PREASON_MARKER_SUPPLY_LOW | _IPP_PREASON_MARKER_WASTE_ALMOST_FULL | _IPP_PREASON_MARKER_WASTE_FULL | _IPP_PREASON_TONER_EMPTY | _IPP_PREASON_TONER_LOW);
+
+           for (i = 0; i < (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])); i ++)
+           {
+             snprintf(name, sizeof(name), "supply_%d", i);
+             if ((val = cupsGetOption(name, num_options, options)) != NULL)
+             {
+               int level = client->printer->supplies[i] = atoi(val);
+                                       /* New level */
+
+               if (i < 4)
+               {
+                 if (level == 0)
+                   client->printer->state_reasons |= _IPP_PREASON_TONER_EMPTY;
+                 else if (level < 10)
+                   client->printer->state_reasons |= _IPP_PREASON_TONER_LOW;
+               }
+               else
+               {
+                 if (level == 100)
+                   client->printer->state_reasons |= _IPP_PREASON_MARKER_WASTE_FULL;
+                 else if (level > 90)
+                   client->printer->state_reasons |= _IPP_PREASON_MARKER_WASTE_ALMOST_FULL;
+               }
+             }
+            }
+
+           html_printf(client, "<blockquote>Supplies updated.</blockquote>\n");
+          }
+
+          html_printf(client, "<form method=\"GET\" action=\"/supplies\">\n");
+
+         html_printf(client, "<table class=\"form\" summary=\"Supplies\">\n");
+         for (i = 0; i < (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])); i ++)
+         {
+           html_printf(client, "<tr><th>%s:</th><td><select name=\"supply_%d\">", printer_supplies[i], i);
+           for (j = 0; j < (int)(sizeof(levels) / sizeof(levels[0])); j ++)
+             html_printf(client, "<option value=\"%d\"%s>%d%%</option>", levels[j], levels[j] == client->printer->supplies[i] ? " selected" : "", levels[j]);
+           html_printf(client, "</select></td></tr>\n");
+         }
+         html_printf(client, "<tr><td></td><td><input type=\"submit\" value=\"Update Supplies\"></td></tr>\n</table>\n</form>\n");
+          html_footer(client);
+
+         return (1);
+       }
+#endif /* 0 */
+       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(_ipp_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 */
+
+
+  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 (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
+       {
+        /*
+         * Try processing the operation...
+         */
+
+         switch ((int)ippGetOperation(client->request))
+         {
+           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_CANCEL_MY_JOBS :
+               ipp_cancel_my_jobs(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_GET_PRINTER_SUPPORTED_VALUES :
+               ipp_get_printer_supported_values(client);
+               break;
+
+           case IPP_OP_CLOSE_JOB :
+               ipp_close_job(client);
+               break;
+
+           case IPP_OP_IDENTIFY_PRINTER :
+               ipp_identify_printer(client);
+               break;
+
+           case IPP_OP_CANCEL_SUBSCRIPTION :
+               ipp_cancel_subscription(client);
+               break;
+
+            case IPP_OP_CREATE_JOB_SUBSCRIPTIONS :
+           case IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS :
+               ipp_create_xxx_subscriptions(client);
+               break;
+
+           case IPP_OP_GET_NOTIFICATIONS :
+               ipp_get_notifications(client);
+               break;
+
+           case IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES :
+               ipp_get_subscription_attributes(client);
+               break;
+
+           case IPP_OP_GET_SUBSCRIPTIONS :
+               ipp_get_subscriptions(client);
+               break;
+
+           case IPP_OP_RENEW_SUBSCRIPTION :
+               ipp_renew_subscription(client);
+               break;
+
+           case IPP_OP_GET_DOCUMENT_ATTRIBUTES :
+               ipp_get_document_attributes(client);
+               break;
+
+           case IPP_OP_GET_DOCUMENTS :
+               ipp_get_documents(client);
+               break;
+
+           case IPP_OP_VALIDATE_DOCUMENT :
+               ipp_validate_document(client);
+               break;
+
+            case _IPP_OP_ACKNOWLEDGE_DOCUMENT :
+               ipp_acknowledge_document(client);
+               break;
+
+            case _IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER :
+               ipp_acknowledge_identify_printer(client);
+               break;
+
+            case _IPP_OP_ACKNOWLEDGE_JOB :
+               ipp_acknowledge_job(client);
+               break;
+
+            case _IPP_OP_FETCH_DOCUMENT :
+               ipp_fetch_document(client);
+               break;
+
+            case _IPP_OP_FETCH_JOB :
+               ipp_fetch_job(client);
+               break;
+
+            case _IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES :
+               ipp_get_output_device_attributes(client);
+               break;
+
+            case _IPP_OP_UPDATE_ACTIVE_JOBS :
+               ipp_update_active_jobs(client);
+               break;
+
+            case _IPP_OP_UPDATE_DOCUMENT_STATUS :
+               ipp_update_document_status(client);
+               break;
+
+            case _IPP_OP_UPDATE_JOB_STATUS :
+               ipp_update_job_status(client);
+               break;
+
+            case _IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES :
+               ipp_update_output_device_attributes(client);
+               break;
+
+            case _IPP_OP_DEREGISTER_OUTPUT_DEVICE :
+               ipp_deregister_output_device(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",
+                       client->fetch_file >= 0 ? 0 : ippLength(client->response)));
+}
+
+
+/*
+ * 'process_job()' - Process a print job.
+ */
+
+static void *                          /* O - Thread exit status */
+process_job(_ipp_job_t *job)           /* I - Job */
+{
+  job->state                   = IPP_JSTATE_PROCESSING;
+  job->printer->state          = IPP_PSTATE_PROCESSING;
+  job->processing              = time(NULL);
+  job->printer->processing_job = job;
+
+  add_event(job->printer, job, _IPP_EVENT_JOB_STATE_CHANGED, "Job processing.");
+
+ /*
+  * TODO: Perform any preprocessing needed...
+  */
+
+  // job->state_reasons |= _IPP_JREASON_JOB_TRANSFORMING;
+  // job->state_reasons &= ~_IPP_JREASON_JOB_TRANSFORMING;
+
+ /*
+  * Set the state to processing-stopped, fetchable, then send a
+  * notification.
+  */
+
+  job->state         = IPP_JSTATE_STOPPED;
+  job->state_reasons |= _IPP_JREASON_JOB_FETCHABLE;
+
+  add_event(job->printer, job, _IPP_EVENT_JOB_STATE_CHANGED, "Job fetchable.");
+
+  return (NULL);
+}
+
+
+/*
+ * 'respond_http()' - Send a HTTP response.
+ */
+
+int                                    /* O - 1 on success, 0 on failure */
+respond_http(
+    _ipp_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 (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);
+
+    if (client->fetch_file >= 0)
+    {
+      ssize_t  bytes;                  /* Bytes read */
+      char     buffer[32768];          /* Buffer */
+
+      if (client->fetch_compression)
+        httpSetField(client->http, HTTP_FIELD_CONTENT_ENCODING, "gzip");
+
+      while ((bytes = read(client->fetch_file, buffer, sizeof(buffer))) > 0)
+        httpWrite2(client->http, buffer, (size_t)bytes);
+
+      httpWrite2(client->http, "", 0);
+      close(client->fetch_file);
+      client->fetch_file = -1;
+    }
+  }
+
+  return (1);
+}
+
+
+/*
+ * 'respond_ipp()' - Send an IPP response.
+ */
+
+static void
+respond_ipp(_ipp_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(
+    _ipp_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(_ipp_printer_t *printer)   /* I - Printer */
+{
+  int          num_fds;                /* Number of file descriptors */
+  struct pollfd        polldata[3];            /* poll() data */
+  int          timeout;                /* Timeout for poll() */
+  _ipp_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;
+
+ /*
+  * 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)
+      {
+       if (!_cupsThreadCreate((_cups_thread_func_t)process_client, client))
+       {
+         perror("Unable to create client thread");
+         delete_client(client);
+       }
+      }
+    }
+
+    if (polldata[1].revents & POLLIN)
+    {
+      if ((client = create_client(printer, printer->ipv6)) != NULL)
+      {
+       if (!_cupsThreadCreate((_cups_thread_func_t)process_client, client))
+       {
+         perror("Unable to create client thread");
+         delete_client(client);
+       }
+      }
+    }
+
+   /*
+    * Clean out old jobs...
+    */
+
+    clean_jobs(printer);
+  }
+}
+
+
+/*
+ * '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    *curtime = localtime(&tv);
+                                       /* Local time */
+
+  strftime(buffer, bufsize, "%X", curtime);
+  return (buffer);
+}
+
+
+/*
+ * 'update_device_attributes_no_lock()' - Update the composite device attributes.
+ *
+ * Note: Caller MUST lock the printer object for writing before using.
+ */
+
+static void
+update_device_attributes_no_lock(
+    _ipp_printer_t *printer)           /* I - Printer */
+{
+  _ipp_device_t                *device;        /* Current device */
+  ipp_t                        *dev_attrs;     /* Device attributes */
+
+
+ /* TODO: Support multiple output devices, icons, etc... */
+  device    = (_ipp_device_t *)cupsArrayFirst(printer->devices);
+  dev_attrs = ippNew();
+
+  if (device)
+    copy_attributes(dev_attrs, device->attrs, NULL, IPP_TAG_PRINTER, 0);
+
+  ippDelete(printer->dev_attrs);
+  printer->dev_attrs = dev_attrs;
+
+  printer->config_time = time(NULL);
+}
+
+
+/*
+ * 'update_device_status_no_lock()' - Update the composite device state.
+ *
+ * Note: Caller MUST lock the printer object for writing before using.
+ */
+
+static void
+update_device_state_no_lock(
+    _ipp_printer_t *printer)           /* I - Printer */
+{
+  _ipp_device_t                *device;        /* Current device */
+  ipp_attribute_t      *attr;          /* Current attribute */
+
+
+ /* TODO: Support multiple output devices, icons, etc... */
+  device = (_ipp_device_t *)cupsArrayFirst(printer->devices);
+
+  if ((attr = ippFindAttribute(device->attrs, "printer-state", IPP_TAG_ENUM)) != NULL)
+    printer->dev_state = (ipp_pstate_t)ippGetInteger(attr, 0);
+  else
+    printer->dev_state = IPP_PSTATE_STOPPED;
+
+  if ((attr = ippFindAttribute(device->attrs, "printer-state-reasons", IPP_TAG_KEYWORD)) != NULL)
+    printer->dev_reasons = get_printer_state_reasons_bits(attr);
+  else
+    printer->dev_reasons = _IPP_PREASON_PAUSED;
+
+  printer->state_time = time(NULL);
+}
+
+
+/*
+ * 'usage()' - Show program usage.
+ */
+
+static void
+usage(int status)                      /* O - Exit status */
+{
+  if (!status)
+  {
+    puts(CUPS_SVERSION " - Copyright 2010-2014 by Apple Inc. All rights reserved.");
+    puts("");
+  }
+
+  puts("Usage: ippinfra [options] \"name\"");
+  puts("");
+  puts("Options:");
+  printf("-d spool-directory      Spool directory "
+         "(default=/tmp/ippserver.%d)\n", (int)getpid());
+  puts("-h                      Show program help");
+  puts("-k                      Keep job spool files");
+  puts("-n hostname             Hostname for printer");
+  puts("-p port                 Port number (default=auto)");
+  puts("-u user:pass            Set proxy username and password");
+  puts("-v[vvv]                 Be (very) 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(
+    _ipp_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 (!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(
+    _ipp_client_t *client)             /* I - Client */
+{
+  int                  i,              /* Looping var */
+                       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
+    {
+#if 0 /* TODO: Validate media */
+      for (i = 0;
+           i < (int)(sizeof(media_supported) / sizeof(media_supported[0]));
+          i ++)
+        if (!strcmp(ippGetString(attr, 0, NULL), media_supported[i]))
+         break;
+
+      if (i >= (int)(sizeof(media_supported) / sizeof(media_supported[0])))
+      {
+       respond_unsupported(client, attr);
+       valid = 0;
+      }
+#endif /* 0 */
+    }
+  }
+
+  if ((attr = ippFindAttribute(client->request, "media-col", IPP_TAG_ZERO)) != NULL)
+  {
+    if (ippGetCount(attr) != 1 ||
+        ippGetValueTag(attr) != IPP_TAG_BEGIN_COLLECTION)
+    {
+      respond_unsupported(client, attr);
+      valid = 0;
+    }
+    /* TODO: check for valid media-col */
+  }
+
+  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->dev_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      count,                  /* Number of supported values */
+               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->dev_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);
+}
+
+
+/*
+ * End of "$Id: ippinfra.c 12237 2014-11-03 13:07:32Z msweet $".
+ */
diff --git a/test/ippinfra.man b/test/ippinfra.man
new file mode 100644 (file)
index 0000000..46ac84e
--- /dev/null
@@ -0,0 +1,103 @@
+.\"
+.\" "$Id$"
+.\"
+.\" ippinfra man page for CUPS.
+.\"
+.\" Copyright 2014 by Apple Inc.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH ippinfra 1 "CUPS" "16 September 2014" "Apple Inc."
+.SH NAME
+ippinfra \- a simple ipp infrastructure server
+.SH SYNOPSIS
+.B ippinfra
+[
+.B \-d
+.I spool-directory
+] [
+.B \-h
+] [
+.B \-k
+] [
+.B \-n
+.I hostname
+] [
+.B \-p
+.I port
+] [
+.B \-u
+.I username:password
+] [
+.B \-v[vvv]
+]
+.I service-name
+.SH DESCRIPTION
+.B ippinfra
+is a simple Internet Printing Protocol (IPP) infrastructure server conforming to the IPP Shared Infrastructure Extensions (INFRA) specification. It can be used as a very basic infrastructure server between standard IPP clients and IPP proxies conforming to the INFRA specification.
+.SH OPTIONS
+The following options are recognized by
+.B ippinfra:
+.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
+.B \-h
+Shows program help.
+.TP 5
+.B \-k
+Keeps the print documents in the spool directory rather than deleting them.
+.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
+\fB\-u \fIusername:password\fR
+Specifies the username and password for the IPP proxy.
+The default is "test:test123".
+.TP 5
+.B \-v[vvv]
+Be (very) verbose when logging activity to the standard output.
+.SH EXIT STATUS
+The
+.B ippinfra
+program returns 1 if it is unable to process the command-line arguments.
+Otherwise
+.B ippinfra
+will run continuously until terminated.
+.SH CONFORMING TO
+The
+.B ippinfra
+program is unique to CUPS and conforms to the IPP Shared Infrastructure Extensions (INFRA) specification as an Infrastructure Printer.
+.SH EXAMPLES
+Run
+.B ippinfra
+with a service name of My Cool Printer:
+.nf
+
+    ippinfra "My Cool Printer"
+.fi
+.LP
+Specify a proxy username of "foo" and password of "bar":
+.nf
+
+    ippinfra \-u foo:bar "My Cool Printer"
+.fi
+.SH SEE ALSO
+PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)
+.SH COPYRIGHT
+Copyright \[co] 2007-2014 by Apple Inc.
+.\"
+.\" End of "$Id$".
+.\"
diff --git a/test/ippproxy.c b/test/ippproxy.c
new file mode 100644 (file)
index 0000000..e8dd2c1
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * "$Id: ippproxy.c 12191 2014-10-01 19:00:21Z msweet $"
+ *
+ * CUPS Cloud Proxy for HP PCL and IPP Everywhere printers.
+ *
+ * Copyright 2014 by Apple Inc.
+ */
+
+#include <cups/cups.h>
+
+
+/*
+ * 'main()' - Main entry for cupsproxy.
+ */
+
+int                                    /* O - Exit status */
+main(int  argc,                                /* I - Number of command-line arguments */
+     char *argv[])                     /* I - Command-line arguments */
+{
+  (void)argc;
+  (void)argv;
+
+  return (0);
+}
+
+
+/*
+ * End of "$Id: ippproxy.c 12191 2014-10-01 19:00:21Z msweet $".
+ */
diff --git a/test/ippproxy.man b/test/ippproxy.man
new file mode 100644 (file)
index 0000000..1d46c9a
--- /dev/null
@@ -0,0 +1,59 @@
+.\"
+.\" "$Id$"
+.\"
+.\" ippproxy man page for CUPS.
+.\"
+.\" Copyright 2014 by Apple Inc.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH ippproxy 1 "CUPS" "16 September 2014" "Apple Inc."
+.SH NAME
+ippproxy \- a simple ipp proxy client
+.SH SYNOPSIS
+.B ippproxy
+[
+.B \-v[vvv]
+]
+.I infrastructure-printer-uri
+.I local-printer-uri
+.SH DESCRIPTION
+.B ippproxy
+is a simple IPP proxy client conforming to the IPP Shared Infrastructure Extensions (INFRA) specification. It can be used to proxy access to a local IPP printer through an Infrastructure Printer such as
+.BR ippinfra (1).
+.SH OPTIONS
+The following options are recognized by
+.B ippproxy:
+.TP 5
+.B \-v[vvv]
+Be (very) verbose when logging activity to the standard output.
+.SH EXIT STATUS
+The
+.B ippproxy
+program returns 1 if it is unable to process the command-line arguments or connect to either the infrastructure or local printers.
+Otherwise
+.B ippproxy
+will run continuously until terminated.
+.SH CONFORMING TO
+The
+.B ippproxy
+program is unique to CUPS and conforms to the IPP Shared Infrastructure Extensions (INFRA) specification.
+.SH EXAMPLE
+Run
+.B ippproxy
+with an infrastructure URI of "ipps://host.example.com/ipp/print" and a local URI of "ipp://10.0.1.2/ipp/print":
+.nf
+
+    ippproxy ipps://host.example.com/ipp/print ipp://10.0.1.2/ipp/print
+.fi
+.SH SEE ALSO
+PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)
+.SH COPYRIGHT
+Copyright \[co] 2007-2014 by Apple Inc.
+.\"
+.\" End of "$Id$".
+.\"
index 32bcf44..6fcae92 100644 (file)
@@ -1,88 +1,68 @@
 /*
- * "$Id: ippserver.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ippserver.c 12947 2015-10-28 15:23:33Z msweet $"
  *
- *   Sample IPP/2.0 server for CUPS.
+ * Sample IPP Everywhere server for CUPS.
  *
- *   Copyright 2010-2012 by Apple Inc.
+ * Copyright 2010-2015 by Apple Inc.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()                      - Main entry to the sample server.
- *   clean_jobs()                - Clean out old (completed) jobs.
- *   compare_jobs()              - Compare two jobs.
- *   copy_attributes()           - Copy attributes from one request to
- *                                 another.
- *   copy_job_attrs()            - Copy job attributes to the response.
- *   create_client()             - Accept a new network connection and create
- *                                 a client object.
- *   create_job()                - Create a new job object from a Print-Job or
- *                                 Create-Job request.
- *   create_listener()           - Create a listener socket.
- *   create_media_col()          - Create a media-col value.
- *   create_printer()            - Create, register, and listen for
- *                                 connections to a printer object.
- *   create_requested_array()    - Create an array for requested-attributes.
- *   debug_attributes()          - Print attributes in a request or response.
- *   delete_client()             - Close the socket and free all memory used
- *                                 by a client object.
- *   delete_job()                - Remove from the printer and free all memory
- *                                 used by a job object.
- *   delete_printer()            - Unregister, close listen sockets, and free
- *                                 all memory used by a printer object.
- *   dnssd_callback()            - Handle Bonjour registration events.
- *   find_job()                  - Find a job specified in a request.
- *   html_escape()               - Write a HTML-safe string.
- *   html_printf()               - Send formatted text to the client, quoting
- *                                 as needed.
- *   ipp_cancel_job()            - Cancel a job.
- *   ipp_create_job()            - Create a job object.
- *   ipp_get_job_attributes()    - Get the attributes for a job object.
- *   ipp_get_jobs()              - Get a list of job objects.
- *   ipp_get_printer_attributes() - Get the attributes for a printer object.
- *   ipp_print_job()             - Create a job object with an attached
- *                                 document.
- *   ipp_print_uri()             - Create a job object with a referenced
- *                                 document.
- *   ipp_send_document()         - Add an attached document to a job object
- *                                 created with Create-Job.
- *   ipp_send_uri()              - Add a referenced document to a job object
- *                                 created with Create-Job.
- *   ipp_validate_job()          - Validate job creation attributes.
- *   process_client()            - Process client requests on a thread.
- *   process_http()              - Process a HTTP request.
- *   process_ipp()               - Process an IPP request.
- *   process_job()               - Process a print job.
- *   register_printer()          - Register a printer object via Bonjour.
- *   respond_http()              - Send a HTTP response.
- *   respond_ipp()               - Send an IPP response.
- *   respond_unsupported()       - Respond with an unsupported attribute.
- *   run_printer()               - Run the printer service.
- *   usage()                     - Show program usage.
- *   valid_doc_attributes()      - Determine whether the document attributes
- *                                 are valid.
- *   valid_job_attributes()      - Determine whether the job attributes are
- *                                 valid.
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+/*
+ * Disable private and deprecated stuff so we can verify that the public API
+ * is sufficient to implement a server.
  */
 
+#define _IPP_PRIVATE_STRUCTURES 0      /* Disable private IPP stuff */
+#define _CUPS_NO_DEPRECATED 1          /* Disable deprecated stuff */
+
+
 /*
  * Include necessary headers...
  */
 
-#include <cups/cups-private.h>
+#include <config.h>                    /* CUPS configuration header */
+#include <cups/cups.h>                 /* Public API */
+#include <cups/string-private.h>       /* CUPS string functions */
+#include <cups/thread-private.h>       /* For multithreading functions */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <sys/stat.h>
+
+#ifdef WIN32
+#  include <fcntl.h>
+#  include <io.h>
+#  include <process.h>
+#  define WEXITSTATUS(s) (s)
+#  include <winsock2.h>
+typedef ULONG nfds_t;
+#  define poll WSAPoll
+#else
+extern char **environ;
+
+#  include <sys/fcntl.h>
+#  include <sys/wait.h>
+#  include <poll.h>
+#endif /* WIN32 */
+
 #ifdef HAVE_DNSSD
 #  include <dns_sd.h>
+#elif defined(HAVE_AVAHI)
+#  include <avahi-client/client.h>
+#  include <avahi-client/publish.h>
+#  include <avahi-common/error.h>
+#  include <avahi-common/thread-watch.h>
 #endif /* HAVE_DNSSD */
-#include <limits.h>
-#include <sys/stat.h>
-#include <poll.h>
 #ifdef HAVE_SYS_MOUNT_H
 #  include <sys/mount.h>
 #endif /* HAVE_SYS_MOUNT_H */
  * Constants...
  */
 
-enum _ipp_preasons_e                   /* printer-state-reasons bit values */
+enum _ipp_preason_e                    /* printer-state-reasons bit values */
 {
-  _IPP_PRINTER_NONE = 0x0000,          /* none */
-  _IPP_PRINTER_OTHER = 0x0001,         /* other */
-  _IPP_PRINTER_COVER_OPEN = 0x0002,    /* cover-open */
-  _IPP_PRINTER_INPUT_TRAY_MISSING = 0x0004,
+  _IPP_PREASON_NONE = 0x0000,          /* none */
+  _IPP_PREASON_OTHER = 0x0001,         /* other */
+  _IPP_PREASON_COVER_OPEN = 0x0002,    /* cover-open */
+  _IPP_PREASON_INPUT_TRAY_MISSING = 0x0004,
                                        /* input-tray-missing */
-  _IPP_PRINTER_MARKER_SUPPLY_EMPTY = 0x0008,
+  _IPP_PREASON_MARKER_SUPPLY_EMPTY = 0x0008,
                                        /* marker-supply-empty */
-  _IPP_PRINTER_MARKER_SUPPLY_LOW = 0x0010,
-                                       /* marker-suply-low */
-  _IPP_PRINTER_MARKER_WASTE_ALMOST_FULL = 0x0020,
+  _IPP_PREASON_MARKER_SUPPLY_LOW = 0x0010,
+                                       /* marker-supply-low */
+  _IPP_PREASON_MARKER_WASTE_ALMOST_FULL = 0x0020,
                                        /* marker-waste-almost-full */
-  _IPP_PRINTER_MARKER_WASTE_FULL = 0x0040,
+  _IPP_PREASON_MARKER_WASTE_FULL = 0x0040,
                                        /* marker-waste-full */
-  _IPP_PRINTER_MEDIA_EMPTY = 0x0080,   /* media-empty */
-  _IPP_PRINTER_MEDIA_JAM = 0x0100,     /* media-jam */
-  _IPP_PRINTER_MEDIA_LOW = 0x0200,     /* media-low */
-  _IPP_PRINTER_MEDIA_NEEDED = 0x0400,  /* media-needed */
-  _IPP_PRINTER_MOVING_TO_PAUSED = 0x0800,
+  _IPP_PREASON_MEDIA_EMPTY = 0x0080,   /* media-empty */
+  _IPP_PREASON_MEDIA_JAM = 0x0100,     /* media-jam */
+  _IPP_PREASON_MEDIA_LOW = 0x0200,     /* media-low */
+  _IPP_PREASON_MEDIA_NEEDED = 0x0400,  /* media-needed */
+  _IPP_PREASON_MOVING_TO_PAUSED = 0x0800,
                                        /* moving-to-paused */
-  _IPP_PRINTER_PAUSED = 0x1000,                /* paused */
-  _IPP_PRINTER_SPOOL_AREA_FULL = 0x2000,/* spool-area-full */
-  _IPP_PRINTER_TONER_EMPTY = 0x4000,   /* toner-empty */
-  _IPP_PRINTER_TONER_LOW = 0x8000      /* toner-low */
+  _IPP_PREASON_PAUSED = 0x1000,                /* paused */
+  _IPP_PREASON_SPOOL_AREA_FULL = 0x2000,/* spool-area-full */
+  _IPP_PREASON_TONER_EMPTY = 0x4000,   /* toner-empty */
+  _IPP_PREASON_TONER_LOW = 0x8000      /* toner-low */
+};
+typedef unsigned int _ipp_preason_t;   /* Bitfield for printer-state-reasons */
+static const char * const _ipp_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"
 };
-typedef unsigned int _ipp_preasons_t;  /* Bitfield for printer-state-reasons */
 
 typedef enum _ipp_media_class_e
 {
@@ -136,6 +136,21 @@ typedef enum _ipp_media_class_e
   _IPP_ENV_ONLY                                /* Envelope-only size */
 } _ipp_media_class_t;
 
+typedef enum _ipp_media_size_e
+{
+  _IPP_MEDIA_SIZE_NONE = -1,
+  _IPP_MEDIA_SIZE_A4,
+  _IPP_MEDIA_SIZE_A5,
+  _IPP_MEDIA_SIZE_A6,
+  _IPP_MEDIA_SIZE_DL,
+  _IPP_MEDIA_SIZE_LEGAL,
+  _IPP_MEDIA_SIZE_LETTER,
+  _IPP_MEDIA_SIZE_COM10,
+  _IPP_MEDIA_SIZE_3x5,
+  _IPP_MEDIA_SIZE_L,
+  _IPP_MEDIA_SIZE_4x6,
+  _IPP_MEDIA_SIZE_5x7
+} _ipp_media_size_t;
 static const char * const media_supported[] =
 {                                      /* media-supported values */
   "iso_a4_210x297mm",                  /* A4 */
@@ -164,6 +179,43 @@ static const int media_col_sizes[][3] =
   { 10160, 15240, _IPP_PHOTO_ONLY },   /* 4x6 */
   { 12700, 17780, _IPP_PHOTO_ONLY }    /* 5x7 aka 2L */
 };
+
+typedef enum _ipp_media_source_e
+{
+  _IPP_MEDIA_SOURCE_NONE = -1,
+  _IPP_MEDIA_SOURCE_AUTO,
+  _IPP_MEDIA_SOURCE_MAIN,
+  _IPP_MEDIA_SOURCE_MANUAL,
+  _IPP_MEDIA_SOURCE_ENVELOPE,
+  _IPP_MEDIA_SOURCE_PHOTO
+} _ipp_media_source_t;
+static const char * const media_source_supported[] =
+                                     /* media-source-supported values */
+{
+  "auto",
+  "main",
+  "manual",
+  "envelope",
+  "photo"
+};
+
+typedef enum _ipp_media_type_e
+{
+  _IPP_MEDIA_TYPE_NONE = -1,
+  _IPP_MEDIA_TYPE_AUTO,
+  _IPP_MEDIA_TYPE_CARDSTOCK,
+  _IPP_MEDIA_TYPE_ENVELOPE,
+  _IPP_MEDIA_TYPE_LABELS,
+  _IPP_MEDIA_TYPE_OTHER,
+  _IPP_MEDIA_TYPE_GLOSSY,
+  _IPP_MEDIA_TYPE_HIGH_GLOSS,
+  _IPP_MEDIA_TYPE_MATTE,
+  _IPP_MEDIA_TYPE_SATIN,
+  _IPP_MEDIA_TYPE_SEMI_GLOSS,
+  _IPP_MEDIA_TYPE_STATIONERY,
+  _IPP_MEDIA_TYPE_LETTERHEAD,
+  _IPP_MEDIA_TYPE_TRANSPARENCY
+} _ipp_media_type_t;
 static const char * const media_type_supported[] =
                                      /* media-type-supported values */
 {
@@ -182,50 +234,109 @@ static const char * const media_type_supported[] =
   "transparency"
 };
 
+typedef enum _ipp_supply_e
+{
+  _IPP_SUPPLY_CYAN,                    /* Cyan Toner */
+  _IPP_SUPPLY_MAGENTA,                 /* Magenta Toner */
+  _IPP_SUPPLY_YELLOW,                  /* Yellow Toner */
+  _IPP_SUPPLY_BLACK,                   /* Black Toner */
+  _IPP_SUPPLY_WASTE                    /* Waste Toner */
+} _ipp_supply_t;
+static const char * const printer_supplies[] =
+{                                      /* printer-supply-description values */
+  "Cyan Toner",
+  "Magenta Toner",
+  "Yellow Toner",
+  "Black Toner",
+  "Toner Waste"
+};
+
+/*
+ * 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 _ipp_srv_t;      /* Service reference */
+typedef TXTRecordRef _ipp_txt_t;       /* TXT record */
+
+#elif defined(HAVE_AVAHI)
+typedef AvahiEntryGroup *_ipp_srv_t;   /* Service reference */
+typedef AvahiStringList *_ipp_txt_t;   /* TXT record */
+
+#else
+typedef void *_ipp_srv_t;              /* Service reference */
+typedef void *_ipp_txt_t;              /* TXT record */
+#endif /* HAVE_DNSSD */
+
+typedef struct _ipp_filter_s           /**** Attribute filter ****/
+{
+  cups_array_t         *ra;            /* Requested attributes */
+  ipp_tag_t            group_tag;      /* Group to copy */
+} _ipp_filter_t;
+
 typedef struct _ipp_job_s _ipp_job_t;
 
 typedef struct _ipp_printer_s          /**** Printer data ****/
 {
   int                  ipv4,           /* IPv4 listener */
                        ipv6;           /* IPv6 listener */
-#ifdef HAVE_DNSSD
-  DNSServiceRef                common_ref,     /* Shared service connection */
-                       ipp_ref,        /* Bonjour IPP service */
+  _ipp_srv_t           ipp_ref,        /* Bonjour IPP service */
+                       ipps_ref,       /* Bonjour IPPS service */
                        http_ref,       /* Bonjour HTTP service */
                        printer_ref;    /* Bonjour LPD service */
-  TXTRecordRef         ipp_txt;        /* Bonjour IPP TXT record */
-  char                 *dnssd_name;    /* printer-dnssd-name */
-#endif /* HAVE_DNSSD */
-  char                 *name,          /* printer-name */
+  char                 *dnssd_name,    /* printer-dnssd-name */
+                       *name,          /* printer-name */
                        *icon,          /* Icon filename */
                        *directory,     /* Spool directory */
                        *hostname,      /* Hostname */
-                       *uri;           /* printer-uri-supported */
+                       *uri,           /* printer-uri-supported */
+                       *command;       /* Command to run with job file */
   int                  port;           /* Port */
   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 */
-  _ipp_preasons_t      state_reasons;  /* printer-state-reasons values */
+  _ipp_preason_t       state_reasons;  /* printer-state-reasons values */
+  time_t               state_time;     /* printer-state-change-time */
   cups_array_t         *jobs;          /* Jobs */
   _ipp_job_t           *active_job;    /* Current active/pending job */
   int                  next_job_id;    /* Next job-id value */
   _cups_rwlock_t       rwlock;         /* Printer lock */
+  _ipp_media_size_t    main_size;      /* Ready media */
+  _ipp_media_type_t    main_type;
+  int                  main_level;
+  _ipp_media_size_t    envelope_size;
+  int                  envelope_level;
+  _ipp_media_size_t    photo_size;
+  _ipp_media_type_t    photo_type;
+  int                  photo_level;
+  int                  supplies[5];    /* Supply levels (0-100) */
 } _ipp_printer_t;
 
 struct _ipp_job_s                      /**** Job data ****/
 {
   int                  id;             /* Job ID */
-  char                 *name,          /* job-name */
+  const char           *name,          /* job-name */
                        *username,      /* job-originating-user-name */
                        *format;        /* document-format */
   ipp_jstate_t         state;          /* job-state value */
-  time_t               processing,     /* time-at-processing value */
+  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 */
@@ -235,14 +346,16 @@ struct _ipp_job_s                 /**** Job data ****/
 
 typedef struct _ipp_client_s           /**** Client data ****/
 {
-  http_t               http;           /* HTTP connection */
+  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 */
+  char                 uri[1024],      /* Request URI */
+                       *options;       /* URI options */
   http_addr_t          addr;           /* Client address */
+  char                 hostname[256];  /* Client hostname */
   _ipp_printer_t       *printer;       /* Printer */
   _ipp_job_t           *job;           /* Current job, if any */
 } _ipp_client_t;
@@ -260,9 +373,8 @@ static void         copy_job_attributes(_ipp_client_t *client,
                                            _ipp_job_t *job, cups_array_t *ra);
 static _ipp_client_t   *create_client(_ipp_printer_t *printer, int sock);
 static _ipp_job_t      *create_job(_ipp_client_t *client);
-static int             create_listener(int family, int *port);
-static ipp_t           *create_media_col(const char *media, const char *type,
-                                         int width, int length, int margins);
+static int             create_listener(int family, int port);
+static ipp_t           *create_media_col(const char *media, const char *source, const char *type, int width, int length, int margins);
 static ipp_t           *create_media_size(int width, int length);
 static _ipp_printer_t  *create_printer(const char *servername,
                                        const char *name, const char *location,
@@ -270,53 +382,62 @@ static _ipp_printer_t     *create_printer(const char *servername,
                                        const char *icon,
                                        const char *docformats, int ppm,
                                        int ppm_color, int duplex, int port,
-#ifdef HAVE_DNSSD
-                                       const char *regtype,
-#endif /* HAVE_DNSSD */
-                                       const char *directory);
-static cups_array_t    *create_requested_array(_ipp_client_t *client);
+                                       int pin, const char *subtype,
+                                       const char *directory,
+                                       const char *command,
+                                       const char *attrfile);
 static void            debug_attributes(const char *title, ipp_t *ipp,
                                         int response);
 static void            delete_client(_ipp_client_t *client);
 static void            delete_job(_ipp_job_t *job);
 static void            delete_printer(_ipp_printer_t *printer);
 #ifdef HAVE_DNSSD
-static void            dnssd_callback(DNSServiceRef sdRef,
+static void DNSSD_API  dnssd_callback(DNSServiceRef sdRef,
                                       DNSServiceFlags flags,
                                       DNSServiceErrorType errorCode,
                                       const char *name,
                                       const char *regtype,
                                       const char *domain,
                                       _ipp_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(_ipp_filter_t *filter, ipp_t *dst, ipp_attribute_t *attr);
 static _ipp_job_t      *find_job(_ipp_client_t *client);
+static ipp_t           *get_collection(FILE *fp, const char *filename, int *linenum);
+static char            *get_token(FILE *fp, char *buf, int buflen, int *linenum);
 static void            html_escape(_ipp_client_t *client, const char *s,
                                    size_t slen);
+static void            html_footer(_ipp_client_t *client);
+static void            html_header(_ipp_client_t *client, const char *title);
 static void            html_printf(_ipp_client_t *client, const char *format,
                                    ...) __attribute__((__format__(__printf__,
                                                                   2, 3)));
 static void            ipp_cancel_job(_ipp_client_t *client);
+static void            ipp_close_job(_ipp_client_t *client);
 static void            ipp_create_job(_ipp_client_t *client);
 static void            ipp_get_job_attributes(_ipp_client_t *client);
 static void            ipp_get_jobs(_ipp_client_t *client);
 static void            ipp_get_printer_attributes(_ipp_client_t *client);
+static void            ipp_identify_printer(_ipp_client_t *client);
 static void            ipp_print_job(_ipp_client_t *client);
 static void            ipp_print_uri(_ipp_client_t *client);
 static void            ipp_send_document(_ipp_client_t *client);
 static void            ipp_send_uri(_ipp_client_t *client);
 static void            ipp_validate_job(_ipp_client_t *client);
+static void            load_attributes(const char *filename, ipp_t *attrs);
+static int             parse_options(_ipp_client_t *client, cups_option_t **options);
+static void            process_attr_message(_ipp_job_t *job, char *message);
 static void            *process_client(_ipp_client_t *client);
 static int             process_http(_ipp_client_t *client);
 static int             process_ipp(_ipp_client_t *client);
 static void            *process_job(_ipp_job_t *job);
-#ifdef HAVE_DNSSD
-static int             register_printer(_ipp_printer_t *printer,
-                                        const char *location, const char *make,
-                                        const char *model, const char *formats,
-                                        const char *adminurl, int color,
-                                        int duplex, const char *regtype);
-#endif /* HAVE_DNSSD */
+static void            process_state_message(_ipp_job_t *job, char *message);
+static int             register_printer(_ipp_printer_t *printer, const char *location, const char *make, const char *model, const char *formats, const char *adminurl, const char *uuid, int color, int duplex, const char *regtype);
 static int             respond_http(_ipp_client_t *client, http_status_t code,
+                                    const char *content_coding,
                                     const char *type, size_t length);
 static void            respond_ipp(_ipp_client_t *client, ipp_status_t status,
                                    const char *message, ...)
@@ -324,6 +445,7 @@ static void         respond_ipp(_ipp_client_t *client, ipp_status_t status,
 static void            respond_unsupported(_ipp_client_t *client,
                                            ipp_attribute_t *attr);
 static void            run_printer(_ipp_printer_t *printer);
+static char            *time_string(time_t tv, char *buffer, size_t bufsize);
 static void            usage(int status) __attribute__((noreturn));
 static int             valid_doc_attributes(_ipp_client_t *client);
 static int             valid_job_attributes(_ipp_client_t *client);
@@ -333,6 +455,13 @@ static int         valid_job_attributes(_ipp_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,
                        Verbosity = 0;
 
@@ -347,22 +476,27 @@ main(int  argc,                           /* I - Number of command-line args */
 {
   int          i;                      /* Looping var */
   const char   *opt,                   /* Current option character */
+               *attrfile = NULL,       /* Attributes file */
+               *command = NULL,        /* Command to run with job files */
                *servername = NULL,     /* Server host name */
                *name = NULL,           /* Printer name */
                *location = "",         /* Location of printer */
                *make = "Test",         /* Manufacturer */
                *model = "Printer",     /* Model */
                *icon = "printer.png",  /* Icon file */
-               *formats = "application/pdf,image/jpeg";
+               *formats = "application/pdf,image/jpeg,image/pwg-raster";
                                        /* Supported formats */
-#ifdef HAVE_DNSSD
-  const char   *regtype = "_ipp._tcp"; /* Bonjour service type */
-#endif /* HAVE_DNSSD */
-  int          port = 8631,            /* Port number (0 = auto) TODO: FIX */
+#ifdef HAVE_SSL
+  const char   *keypath = NULL;        /* Keychain path */
+#endif /* HAVE_SSL */
+  const char   *subtype = "_print";    /* Bonjour service subtype */
+  int          port = 0,               /* Port number (0 = auto) */
                duplex = 0,             /* Duplex mode */
                ppm = 10,               /* Pages per minute for mono */
-               ppm_color = 0;          /* Pages per minute for color */
-  char         directory[1024] = "";   /* Spool directory */
+               ppm_color = 0,          /* Pages per minute for color */
+               pin = 0;                /* PIN printing mode? */
+  char         directory[1024] = "",   /* Spool directory */
+               hostname[1024];         /* Auto-detected hostname */
   _ipp_printer_t *printer;             /* Printer object */
 
 
@@ -374,12 +508,22 @@ main(int  argc,                           /* I - Number of command-line args */
     if (argv[i][0] == '-')
     {
       for (opt = argv[i] + 1; *opt; opt ++)
+      {
         switch (*opt)
        {
          case '2' : /* -2 (enable 2-sided printing) */
              duplex = 1;
              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)
@@ -387,6 +531,26 @@ main(int  argc,                            /* I - Number of command-line args */
              make = argv[i];
              break;
 
+          case 'P' : /* -P (PIN printing mode) */
+              pin = 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)
@@ -403,7 +567,6 @@ main(int  argc,                             /* I - Number of command-line args */
 
           case 'h' : /* -h (show help) */
              usage(0);
-             break;
 
          case 'i' : /* -i icon.png */
              i ++;
@@ -444,14 +607,12 @@ main(int  argc,                           /* I - Number of command-line args */
              port = atoi(argv[i]);
              break;
 
-#ifdef HAVE_DNSSD
-         case 'r' : /* -r regtype */
+         case 'r' : /* -r subtype */
              i ++;
              if (i >= argc)
                usage(1);
-             regtype = argv[i];
+             subtype = argv[i];
              break;
-#endif /* HAVE_DNSSD */
 
          case 's' : /* -s speed[,color-speed] */
              i ++;
@@ -468,8 +629,8 @@ main(int  argc,                             /* I - Number of command-line args */
           default : /* Unknown */
              fprintf(stderr, "Unknown option \"-%c\".\n", *opt);
              usage(1);
-             break;
        }
+      }
     }
     else if (!name)
     {
@@ -488,11 +649,48 @@ main(int  argc,                           /* I - Number of command-line args */
   * Apply defaults as needed...
   */
 
+  if (!servername)
+    servername = httpGetHostname(NULL, hostname, sizeof(hostname));
+
+  if (!port)
+  {
+#ifdef WIN32
+   /*
+    * Windows is almost always used as a single user system, so use a default
+    * port number of 8631.
+    */
+
+    port = 8631;
+
+#else
+   /*
+    * Use 8000 + UID mod 1000 for the default port number...
+    */
+
+    port = 8000 + ((int)getuid() % 1000);
+#endif /* WIN32 */
+
+    fprintf(stderr, "Listening on port %d.\n", port);
+  }
+
   if (!directory[0])
   {
-    snprintf(directory, sizeof(directory), "/tmp/ippserver.%d", (int)getpid());
+    const char *tmpdir;                        /* Temporary directory */
 
-    if (mkdir(directory, 0777) && errno != EEXIST)
+#ifdef WIN32
+    if ((tmpdir = getenv("TEMP")) == NULL)
+      tmpdir = "C:/TEMP";
+#elif defined(__APPLE__)
+    if ((tmpdir = getenv("TMPDIR")) == NULL)
+      tmpdir = "/private/tmp";
+#else
+    if ((tmpdir = getenv("TMPDIR")) == NULL)
+      tmpdir = "/tmp";
+#endif /* WIN32 */
+
+    snprintf(directory, sizeof(directory), "%s/ippserver.%d", tmpdir, (int)getpid());
+
+    if (mkdir(directory, 0755) && errno != EEXIST)
     {
       fprintf(stderr, "Unable to create spool directory \"%s\": %s\n",
              directory, strerror(errno));
@@ -503,16 +701,23 @@ main(int  argc,                           /* I - Number of command-line args */
       fprintf(stderr, "Using spool directory \"%s\".\n", directory);
   }
 
+#ifdef HAVE_SSL
+  cupsSetServerCredentials(keypath, servername, 1);
+#endif /* HAVE_SSL */
+
+ /*
+  * Initialize Bonjour...
+  */
+
+  dnssd_init();
+
  /*
   * Create the printer...
   */
 
   if ((printer = create_printer(servername, name, location, make, model, icon,
-                                formats, ppm, ppm_color, duplex, port,
-#ifdef HAVE_DNSSD
-                               regtype,
-#endif /* HAVE_DNSSD */
-                               directory)) == NULL)
+                                formats, ppm, ppm_color, duplex, port, pin,
+                               subtype, directory, command, attrfile)) == NULL)
     return (1);
 
  /*
@@ -585,25 +790,13 @@ copy_attributes(ipp_t        *to, /* I - Destination request */
                ipp_tag_t    group_tag, /* I - Group to copy */
                int          quickcopy) /* I - Do a quick copy? */
 {
-  ipp_attribute_t      *fromattr;      /* Source attribute */
+  _ipp_filter_t        filter;                 /* Filter data */
 
 
-  if (!to || !from)
-    return;
-
-  for (fromattr = from->attrs; fromattr; fromattr = fromattr->next)
-  {
-   /*
-    * Filter attributes as needed...
-    */
-
-    if ((group_tag != IPP_TAG_ZERO && fromattr->group_tag != group_tag &&
-         fromattr->group_tag != IPP_TAG_ZERO) || !fromattr->name)
-      continue;
+  filter.ra        = ra;
+  filter.group_tag = group_tag;
 
-    if (!ra || cupsArrayFind(ra, fromattr->name))
-      ippCopyAttribute(to, fromattr, quickcopy);
-  }
+  ippCopyAttributes(to, from, quickcopy, (ipp_copycb_t)filter_cb, &filter);
 }
 
 
@@ -619,71 +812,134 @@ copy_job_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));
+    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", job->state);
 
+  if (!ra || cupsArrayFind(ra, "job-state-message"))
+  {
+    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_JOB_PENDING :
+      case IPP_JSTATE_PENDING :
          ippAddString(client->response, IPP_TAG_JOB,
-                      IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
+                      IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
                       NULL, "none");
          break;
 
-      case IPP_JOB_HELD :
+      case IPP_JSTATE_HELD :
           if (job->fd >= 0)
            ippAddString(client->response, IPP_TAG_JOB,
-                        IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
-                        NULL, "job-incoming");
+                        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_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
-                        NULL, "job-hold-until-specified");
+                        IPP_CONST_TAG(IPP_TAG_KEYWORD),
+                        "job-state-reasons", NULL, "job-hold-until-specified");
           else
            ippAddString(client->response, IPP_TAG_JOB,
-                        IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
-                        NULL, "job-data-insufficient");
+                        IPP_CONST_TAG(IPP_TAG_KEYWORD),
+                        "job-state-reasons", NULL, "job-data-insufficient");
          break;
 
-      case IPP_JOB_PROCESSING :
+      case IPP_JSTATE_PROCESSING :
          if (job->cancel)
            ippAddString(client->response, IPP_TAG_JOB,
-                        IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
-                        NULL, "processing-to-stop-point");
+                        IPP_CONST_TAG(IPP_TAG_KEYWORD),
+                        "job-state-reasons", NULL, "processing-to-stop-point");
          else
            ippAddString(client->response, IPP_TAG_JOB,
-                        IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
-                        NULL, "job-printing");
+                        IPP_CONST_TAG(IPP_TAG_KEYWORD),
+                        "job-state-reasons", NULL, "job-printing");
          break;
 
-      case IPP_JOB_STOPPED :
+      case IPP_JSTATE_STOPPED :
          ippAddString(client->response, IPP_TAG_JOB,
-                      IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
+                      IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
                       NULL, "job-stopped");
          break;
 
-      case IPP_JOB_CANCELED :
+      case IPP_JSTATE_CANCELED :
          ippAddString(client->response, IPP_TAG_JOB,
-                      IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
+                      IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
                       NULL, "job-canceled-by-user");
          break;
 
-      case IPP_JOB_ABORTED :
+      case IPP_JSTATE_ABORTED :
          ippAddString(client->response, IPP_TAG_JOB,
-                      IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
+                      IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
                       NULL, "aborted-by-system");
          break;
 
-      case IPP_JOB_COMPLETED :
+      case IPP_JSTATE_COMPLETED :
          ippAddString(client->response, IPP_TAG_JOB,
-                      IPP_TAG_KEYWORD | IPP_TAG_COPY, "job-state-reasons",
+                      IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-state-reasons",
                       NULL, "job-completed-successfully");
          break;
     }
@@ -692,12 +948,12 @@ copy_job_attributes(
   if (!ra || cupsArrayFind(ra, "time-at-completed"))
     ippAddInteger(client->response, IPP_TAG_JOB,
                   job->completed ? IPP_TAG_INTEGER : IPP_TAG_NOVALUE,
-                  "time-at-completed", job->completed);
+                  "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", job->processing);
+                  "time-at-processing", (int)(job->processing - client->printer->start_time));
 }
 
 
@@ -711,8 +967,6 @@ create_client(_ipp_printer_t *printer,      /* I - Printer */
               int            sock)     /* I - Listen socket */
 {
   _ipp_client_t        *client;                /* Client */
-  int          val;                    /* Parameter value */
-  socklen_t    addrlen;                /* Length of address */
 
 
   if ((client = calloc(1, sizeof(_ipp_client_t))) == NULL)
@@ -721,20 +975,13 @@ create_client(_ipp_printer_t *printer,    /* I - Printer */
     return (NULL);
   }
 
-  client->printer         = printer;
-  client->http.activity   = time(NULL);
-  client->http.hostaddr   = &(client->addr);
-  client->http.blocking   = 1;
-  client->http.wait_value = 60000;
+  client->printer = printer;
 
  /*
   * Accept the client and get the remote address...
   */
 
-  addrlen = sizeof(http_addr_t);
-
-  if ((client->http.fd = accept(sock, (struct sockaddr *)&(client->addr),
-                                &addrlen)) < 0)
+  if ((client->http = httpAcceptConnection(sock, 1)) == NULL)
   {
     perror("Unable to accept client connection");
 
@@ -743,23 +990,10 @@ create_client(_ipp_printer_t *printer,    /* I - Printer */
     return (NULL);
   }
 
-  httpAddrString(&(client->addr), client->http.hostname,
-                sizeof(client->http.hostname));
+  httpGetHostname(client->http, client->hostname, sizeof(client->hostname));
 
   if (Verbosity)
-    fprintf(stderr, "Accepted connection from %s (%s)\n", client->http.hostname,
-           client->http.hostaddr->addr.sa_family == AF_INET ? "IPv4" : "IPv6");
-
- /*
-  * 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(client->http.fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val,
-             sizeof(val));
+    fprintf(stderr, "Accepted connection from %s\n", client->hostname);
 
   return (client);
 }
@@ -775,12 +1009,13 @@ create_job(_ipp_client_t *client)        /* I - Client */
 {
   _ipp_job_t           *job;           /* Job */
   ipp_attribute_t      *attr;          /* Job attribute */
-  char                 uri[1024];      /* job-uri value */
+  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_JOB_CANCELED)
+      client->printer->active_job->state < IPP_JSTATE_CANCELED)
   {
    /*
     * Only accept a single job at a time...
@@ -801,42 +1036,42 @@ create_job(_ipp_client_t *client)        /* I - Client */
   }
 
   job->printer    = client->printer;
-  job->attrs      = client->request;
-  job->state      = IPP_JOB_HELD;
+  job->attrs      = ippNew();
+  job->state      = IPP_JSTATE_HELD;
   job->fd         = -1;
-  client->request = NULL;
 
  /*
-  * Set all but the first two attributes to the job attributes group...
+  * Copy all of the job attributes...
   */
 
-  for (attr = job->attrs->attrs->next->next; attr; attr = attr->next)
-    attr->group_tag = IPP_TAG_JOB;
+  copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0);
 
  /*
   * Get the requesting-user-name, document format, and priority...
   */
 
-  if ((attr = ippFindAttribute(job->attrs, "requesting-user-name",
-                               IPP_TAG_NAME)) != NULL)
+  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)
   {
-    _cupsStrFree(attr->name);
-    attr->name = _cupsStrAlloc("job-originating-user-name");
+    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";
   }
-  else
-    attr = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME | IPP_TAG_COPY,
-                        "job-originating-user-name", NULL, "anonymous");
 
-  if (attr)
-    job->username = attr->values[0].string.text;
-  else
-    job->username = "anonymous";
+  if ((attr = ippFindAttribute(client->request, "job-impressions", IPP_TAG_INTEGER)) != NULL)
+    job->impressions = ippGetInteger(attr, 0);
 
-  if ((attr = ippFindAttribute(job->attrs, "document-format",
-                               IPP_TAG_MIMETYPE)) != NULL)
-    job->format = attr->values[0].string.text;
-  else
-    job->format = "application/octet-stream";
+  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...
@@ -845,13 +1080,17 @@ create_job(_ipp_client_t *client)        /* I - Client */
   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-printer-uri", NULL,
-               client->printer->uri);
-  ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation",
-                (int)time(NULL));
+  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;
@@ -863,64 +1102,86 @@ create_job(_ipp_client_t *client)        /* I - Client */
 
 
 /*
- * 'create_listener()' - Create a listener socket.
+ * 'create_job_filename()' - Create the filename for a document in a job.
  */
 
-static int                             /* O  - Listener socket or -1 on error */
-create_listener(int family,            /* I  - Address family */
-                int *port)             /* IO - Port number */
+static void create_job_filename(
+    _ipp_printer_t *printer,           /* I - Printer */
+    _ipp_job_t     *job,               /* I - Job */
+    char           *fname,             /* I - Filename buffer */
+    size_t         fnamesize)          /* I - Size of filename buffer */
 {
-  int          sock,                   /* Listener socket */
-               val;                    /* Socket value */
-  http_addr_t  address;                /* Listen address */
-  socklen_t    addrlen;                /* Length of listen address */
+  char                 name[256],      /* "Safe" filename */
+                       *nameptr;       /* Pointer into filename */
+  const char           *ext,           /* Filename extension */
+                       *job_name;      /* job-name value */
+  ipp_attribute_t      *job_name_attr; /* job-name attribute */
 
 
-  if ((sock = socket(family, SOCK_STREAM, 0)) < 0)
-    return (-1);
+ /*
+  * Make a name from the job-name attribute...
+  */
 
-  val = 1;
-  setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
+  if ((job_name_attr = ippFindAttribute(job->attrs, "job-name", IPP_TAG_NAME)) != NULL)
+    job_name = ippGetString(job_name_attr, 0, NULL);
+  else
+    job_name = "untitled";
 
-#ifdef IPV6_V6ONLY
-  if (family == AF_INET6)
-    setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val));
-#endif /* IPV6_V6ONLY */
+  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++ = '_';
 
-  if (!*port)
-  {
-   /*
-    * Get the auto-assigned port number for the IPv4 socket...
-    */
+  *nameptr = '\0';
 
-    /* TODO: This code does not appear to work - port is always 0... */
-    addrlen = sizeof(address);
-    if (getsockname(sock, (struct sockaddr *)&address, &addrlen))
-    {
-      perror("getsockname() failed");
-      *port = 8631;
-    }
-    else
-      *port = _httpAddrPort(&address);
+ /*
+  * Figure out the extension...
+  */
 
-    fprintf(stderr, "Listening on port %d.\n", *port);
-  }
+  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 = "ras";
+  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
+    ext = "prn";
 
-  memset(&address, 0, sizeof(address));
-  address.addr.sa_family = family;
-  _httpAddrSetPort(&address, *port);
+ /*
+  * Create a filename with the job-id, job-name, and document-format (extension)...
+  */
 
-  if (bind(sock, (struct sockaddr *)&address, httpAddrLength(&address)))
-  {
-    close(sock);
-    return (-1);
-  }
+  snprintf(fname, fnamesize, "%s/%d-%s.%s", printer->directory, job->id, name, ext);
+}
 
-  if (listen(sock, 5))
-  {
-    close(sock);
+
+/*
+ * 'create_listener()' - Create a listener socket.
+ */
+
+static int                             /* O - Listener socket or -1 on error */
+create_listener(int family,            /* I - Address family */
+                int port)              /* I - Port number */
+{
+  int                  sock;           /* Listener socket */
+  http_addrlist_t      *addrlist;      /* Listen address */
+  char                 service[255];   /* Service port */
+
+
+  snprintf(service, sizeof(service), "%d", port);
+  if ((addrlist = httpAddrGetList(NULL, family, service)) == NULL)
     return (-1);
-  }
+
+  sock = httpAddrListen(&(addrlist->addr), port);
+
+  httpAddrFreeList(addrlist);
 
   return (sock);
 }
@@ -932,7 +1193,8 @@ create_listener(int family,                /* I  - Address family */
 
 static ipp_t *                         /* O - media-col collection */
 create_media_col(const char *media,    /* I - Media name */
-                const char *type,      /* I - Nedua type */
+                const char *source,    /* I - Media source */
+                const char *type,      /* I - Media type */
                 int        width,      /* I - x-dimension in 2540ths */
                 int        length,     /* I - y-dimension in 2540ths */
                 int        margins)    /* I - Value for margins */
@@ -943,12 +1205,19 @@ create_media_col(const char *media,      /* I - Media name */
   char media_key[256];                 /* media-key value */
 
 
-  snprintf(media_key, sizeof(media_key), "%s_%s%s", media, type,
-           margins == 0 ? "_borderless" : "");
+  if (type && source)
+    snprintf(media_key, sizeof(media_key), "%s_%s_%s%s", media, source, type, margins == 0 ? "_borderless" : "");
+  else if (type)
+    snprintf(media_key, sizeof(media_key), "%s__%s%s", media, type, margins == 0 ? "_borderless" : "");
+  else if (source)
+    snprintf(media_key, sizeof(media_key), "%s_%s%s", media, source, margins == 0 ? "_borderless" : "");
+  else
+    snprintf(media_key, sizeof(media_key), "%s%s", media, margins == 0 ? "_borderless" : "");
 
   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);
   ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
                 "media-bottom-margin", margins);
   ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
@@ -957,8 +1226,10 @@ create_media_col(const char *media,       /* I - Media name */
                 "media-right-margin", margins);
   ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
                 "media-top-margin", margins);
-  ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-type",
-               NULL, type);
+  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);
 
@@ -1003,19 +1274,28 @@ create_printer(const char *servername,  /* I - Server hostname (NULL for default)
               int        ppm_color,    /* I - Pages per minute in color (0 for gray) */
               int        duplex,       /* I - 1 = duplex, 0 = simplex */
               int        port,         /* I - Port for listeners or 0 for auto */
-#ifdef HAVE_DNSSD
-              const char *regtype,     /* I - Bonjour service type */
-#endif /* HAVE_DNSSD */
-              const char *directory)   /* I - Spool directory */
+              int        pin,          /* I - Require PIN printing */
+              const char *subtype,     /* I - Bonjour service subtype */
+              const char *directory,   /* I - Spool directory */
+              const char *command,     /* I - Command to run on job files */
+              const char *attrfile)    /* I - Attributes file */
 {
   int                  i, j;           /* Looping vars */
   _ipp_printer_t       *printer;       /* Printer */
-  char                 hostname[256],  /* Hostname */
-                       uri[1024],      /* Printer URI */
+#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 */
                        device_id[1024],/* printer-device-id */
-                       make_model[128];/* printer-make-and-model */
+                       make_model[128],/* printer-make-and-model */
+                       uuid[128];      /* printer-uuid */
   int                  num_formats;    /* Number of document-format-supported values */
   char                 *defformat,     /* document-format-default value */
                        *formats[100],  /* document-format-supported values */
@@ -1028,8 +1308,7 @@ create_printer(const char *servername,    /* I - Server hostname (NULL for default)
                                        /* media-size-supported value */
   ipp_t                        *media_col_default;
                                        /* media-col-default value */
-  _ipp_value_t         *media_col_value;
-                                       /* Current media-col-database value */
+  int                  media_col_index;/* Current media-col-database value */
   int                  k_supported;    /* Maximum file size supported */
 #ifdef HAVE_STATVFS
   struct statvfs       spoolinfo;      /* FS info for spool directory */
@@ -1040,10 +1319,10 @@ create_printer(const char *servername,  /* I - Server hostname (NULL for default)
 #endif /* HAVE_STATVFS */
   static const int     orients[4] =    /* orientation-requested-supported values */
   {
-    IPP_PORTRAIT,
-    IPP_LANDSCAPE,
-    IPP_REVERSE_LANDSCAPE,
-    IPP_REVERSE_PORTRAIT
+    IPP_ORIENT_PORTRAIT,
+    IPP_ORIENT_LANDSCAPE,
+    IPP_ORIENT_REVERSE_LANDSCAPE,
+    IPP_ORIENT_REVERSE_PORTRAIT
   };
   static const char * const versions[] =/* ipp-versions-supported values */
   {
@@ -1051,29 +1330,52 @@ create_printer(const char *servername,  /* I - Server hostname (NULL for default)
     "1.1",
     "2.0"
   };
+  static const char * const features[] =/* ipp-features-supported values */
+  {
+    "ipp-everywhere"
+  };
   static const int     ops[] =         /* operations-supported values */
   {
-    IPP_PRINT_JOB,
-    IPP_PRINT_URI,
-    IPP_VALIDATE_JOB,
-    IPP_CREATE_JOB,
-    IPP_SEND_DOCUMENT,
-    IPP_SEND_URI,
-    IPP_CANCEL_JOB,
-    IPP_GET_JOB_ATTRIBUTES,
-    IPP_GET_JOBS,
-    IPP_GET_PRINTER_ATTRIBUTES
+    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",
     "ipp-attribute-fidelity",
+    "job-account-id",
+    "job-accounting-user-id",
     "job-name",
+    "job-password",
     "job-priority",
     "media",
     "media-col",
@@ -1088,6 +1390,7 @@ create_printer(const char *servername,    /* I - Server hostname (NULL for default)
     "media-left-margin",
     "media-right-margin",
     "media-size",
+    "media-source",
     "media-top-margin",
     "media-type"
   };
@@ -1101,12 +1404,36 @@ create_printer(const char *servername,  /* I - Server hostname (NULL for default)
     "separate-documents-uncollated-copies",
     "separate-documents-collated-copies"
   };
+  static const char * const overrides[] =
+  {                                    /* overrides-supported */
+    "document-number",
+    "pages"
+  };
+  static const char * const print_color_mode_supported[] =
+  {                                    /* 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 int     pwg_raster_document_resolution_supported[] =
+  {
+    150,
+    300
+  };
+  static const char * const pwg_raster_document_type_supported[] =
+  {
+    "black_1",
+    "cmyk_8",
+    "sgray_8",
+    "srgb_8",
+    "srgb_16"
+  };
   static const char * const reference_uri_schemes_supported[] =
   {                                    /* reference-uri-schemes-supported */
     "file",
@@ -1122,6 +1449,29 @@ create_printer(const char *servername,   /* I - Server hostname (NULL for default)
     "two-sided-long-edge",
     "two-sided-short-edge"
   };
+  static const char * const urf_supported[] =
+  {                                    /* urf-supported values */
+    "CP1",
+    "IS1-5-7",
+    "MT1-2-3-4-5-6-8-9-10-11-12-13",
+    "RS300",
+    "SRGB24",
+    "V1.4",
+    "W8",
+    "DM1"
+  };
+#ifdef HAVE_SSL
+  static const char * const uri_authentication_supported[] =
+  {                                    /* uri-authentication-supported values */
+    "none",
+    "none"
+  };
+  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",
@@ -1136,50 +1486,101 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
   };
 
 
+#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))
+      {
+        fprintf(stderr, "ippserver: Unable to execute command \"%s\": %s\n", command, strerror(errno));
+       return (NULL);
+      }
+    }
+    else
+    {
+      if (!cupsFileFind(command, getenv("PATH"), 1, path, sizeof(path)))
+      {
+       fprintf(stderr, "ippserver: Unable to find command \"%s\".\n", command);
+       return (NULL);
+      }
+
+      command = path;
+    }
+  }
+#endif /* !WIN32 */
+
  /*
   * Allocate memory for the printer...
   */
 
   if ((printer = calloc(1, sizeof(_ipp_printer_t))) == NULL)
   {
-    perror("Unable to allocate memory for printer");
+    perror("ippserver: Unable to allocate memory for printer");
     return (NULL);
   }
 
   printer->ipv4          = -1;
   printer->ipv6          = -1;
-  printer->name          = _cupsStrAlloc(name);
-#ifdef HAVE_DNSSD
-  printer->dnssd_name    = _cupsStrRetain(printer->name);
-#endif /* HAVE_DNSSD */
-  printer->directory     = _cupsStrAlloc(directory);
-  printer->hostname      = _cupsStrAlloc(servername ? servername :
-                                             httpGetHostname(NULL, hostname,
-                                                             sizeof(hostname)));
+  printer->name          = strdup(name);
+  printer->dnssd_name    = strdup(printer->name);
+  printer->command       = command ? strdup(command) : NULL;
+  printer->directory     = strdup(directory);
+  printer->hostname      = strdup(servername);
   printer->port          = port;
-  printer->state         = IPP_PRINTER_IDLE;
-  printer->state_reasons = _IPP_PRINTER_NONE;
+  printer->start_time    = time(NULL);
+  printer->config_time   = printer->start_time;
+  printer->state         = IPP_PSTATE_IDLE;
+  printer->state_reasons = _IPP_PREASON_NONE;
+  printer->state_time    = printer->start_time;
   printer->jobs          = cupsArrayNew((cups_array_func_t)compare_jobs, NULL);
   printer->next_job_id   = 1;
 
-  httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
-                 printer->hostname, printer->port, "/ipp");
-  printer->uri    = _cupsStrAlloc(uri);
+  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 */
+
+  if (icon)
+    printer->icon = strdup(icon);
+
+  printer->main_size      = _IPP_MEDIA_SIZE_A4;
+  printer->main_type      = _IPP_MEDIA_TYPE_STATIONERY;
+  printer->main_level     = 500;
+
+  printer->envelope_size  = _IPP_MEDIA_SIZE_NONE;
+  printer->envelope_level = 0;
+
+  printer->photo_size     = _IPP_MEDIA_SIZE_NONE;
+  printer->photo_type     = _IPP_MEDIA_TYPE_NONE;
+  printer->photo_level    = 0;
+
+  printer->supplies[_IPP_SUPPLY_CYAN]    = 100;
+  printer->supplies[_IPP_SUPPLY_MAGENTA] = 100;
+  printer->supplies[_IPP_SUPPLY_YELLOW]  = 100;
+  printer->supplies[_IPP_SUPPLY_BLACK]   = 100;
+  printer->supplies[_IPP_SUPPLY_WASTE]   = 0;
+
   _cupsRWInit(&(printer->rwlock));
 
  /*
   * Create the listener sockets...
   */
 
-  if ((printer->ipv4 = create_listener(AF_INET, &(printer->port))) < 0)
+  if ((printer->ipv4 = create_listener(AF_INET, printer->port)) < 0)
   {
     perror("Unable to create IPv4 listener");
     goto bad_printer;
   }
 
-  if ((printer->ipv6 = create_listener(AF_INET6, &(printer->port))) < 0)
+  if ((printer->ipv6 = create_listener(AF_INET6, printer->port)) < 0)
   {
     perror("Unable to create IPv6 listener");
     goto bad_printer;
@@ -1189,14 +1590,14 @@ create_printer(const char *servername,  /* I - Server hostname (NULL for default)
   * Prepare values for the printer attributes...
   */
 
-  httpAssembleURI(HTTP_URI_CODING_ALL, icons, sizeof(icons), "http", NULL,
-                  printer->hostname, printer->port, "/icon.png");
-  httpAssembleURI(HTTP_URI_CODING_ALL, adminurl, sizeof(adminurl), "http", NULL,
-                  printer->hostname, printer->port, "/");
+  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");
 
   if (Verbosity)
   {
     fprintf(stderr, "printer-more-info=\"%s\"\n", adminurl);
+    fprintf(stderr, "printer-supply-info-uri=\"%s\"\n", supplyurl);
     fprintf(stderr, "printer-uri=\"%s\"\n", uri);
   }
 
@@ -1210,7 +1611,7 @@ create_printer(const char *servername,    /* I - Server hostname (NULL for default)
     *ptr++ = '\0';
     formats[num_formats++] = ptr;
 
-    if (!_cups_strcasecmp(ptr, "application/octet-stream"))
+    if (!strcasecmp(ptr, "application/octet-stream"))
       defformat = ptr;
   }
 
@@ -1219,24 +1620,27 @@ create_printer(const char *servername,  /* I - Server hostname (NULL for default)
   prefix = "CMD:";
   for (i = 0; i < num_formats; i ++)
   {
-    if (!_cups_strcasecmp(formats[i], "application/pdf"))
-      snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%sPDF", prefix);
-    else if (!_cups_strcasecmp(formats[i], "application/postscript"))
-      snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%sPS", prefix);
-    else if (!_cups_strcasecmp(formats[i], "application/vnd.hp-PCL"))
-      snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%sPCL", prefix);
-    else if (!_cups_strcasecmp(formats[i], "image/jpeg"))
-      snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%sJPEG", prefix);
-    else if (!_cups_strcasecmp(formats[i], "image/png"))
-      snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%sPNG", prefix);
-    else if (_cups_strcasecmp(formats[i], "application/octet-stream"))
-      snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%s%s", prefix,
-               formats[i]);
+    if (!strcasecmp(formats[i], "application/pdf"))
+      snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPDF", prefix);
+    else if (!strcasecmp(formats[i], "application/postscript"))
+      snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPS", prefix);
+    else if (!strcasecmp(formats[i], "application/vnd.hp-PCL"))
+      snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPCL", prefix);
+    else if (!strcasecmp(formats[i], "image/jpeg"))
+      snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sJPEG", prefix);
+    else if (!strcasecmp(formats[i], "image/png"))
+      snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPNG", prefix);
+    else if (strcasecmp(formats[i], "application/octet-stream"))
+      snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%s%s", prefix, formats[i]);
 
     ptr += strlen(ptr);
     prefix = ",";
   }
-  strlcat(device_id, ";", sizeof(device_id));
+  if (ptr < (device_id + sizeof(device_id) - 1))
+  {
+    *ptr++ = ';';
+    *ptr = '\0';
+  }
 
  /*
   * Get the maximum spool size based on the size of the filesystem used for
@@ -1273,29 +1677,30 @@ create_printer(const char *servername,  /* I - Server hostname (NULL for default)
 
   printer->attrs = ippNew();
 
+  if (attrfile)
+    load_attributes(attrfile, printer->attrs);
+
   /* charset-configured */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_CHARSET | IPP_TAG_COPY,
-               "charset-configured", NULL, "utf-8");
+  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_TAG_CHARSET | IPP_TAG_COPY,
-                "charset-supported", sizeof(charsets) / sizeof(charsets[0]),
-               NULL, charsets);
+  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_CHARSET), "charset-supported", sizeof(charsets) / sizeof(charsets[0]), NULL, charsets);
 
   /* color-supported */
-  ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "color-supported",
-                ppm_color > 0);
+  if (!ippFindAttribute(printer->attrs, "color-supported", IPP_TAG_ZERO))
+    ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "color-supported", ppm_color > 0);
 
   /* compression-supported */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-              "compression-supported", NULL, "none");
+  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);
 
   /* copies-default */
-  ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
-                "copies-default", 1);
+  if (!ippFindAttribute(printer->attrs, "copies-default", IPP_TAG_ZERO))
+    ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "copies-default", 1);
 
   /* copies-supported */
-  ippAddRange(printer->attrs, IPP_TAG_PRINTER, "copies-supported", 1, 999);
+  if (!ippFindAttribute(printer->attrs, "copies-supported", IPP_TAG_ZERO))
+    ippAddRange(printer->attrs, IPP_TAG_PRINTER, "copies-supported", 1, 999);
 
   /* document-format-default */
   ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_MIMETYPE,
@@ -1306,225 +1711,261 @@ create_printer(const char *servername,        /* I - Server hostname (NULL for default)
                 "document-format-supported", num_formats, NULL,
                (const char * const *)formats);
 
+  /* document-password-supported */
+  if (!ippFindAttribute(printer->attrs, "document-password-supported", IPP_TAG_ZERO))
+    ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "document-password-supported", 127);
+
   /* finishings-default */
-  ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
-                "finishings-default", IPP_FINISHINGS_NONE);
+  if (!ippFindAttribute(printer->attrs, "finishings-default", IPP_TAG_ZERO))
+    ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE);
 
   /* finishings-supported */
-  ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
-                "finishings-supported", IPP_FINISHINGS_NONE);
+  if (!ippFindAttribute(printer->attrs, "finishings-supported", IPP_TAG_ZERO))
+    ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-supported", IPP_FINISHINGS_NONE);
 
   /* generated-natural-language-supported */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE | IPP_TAG_COPY,
-               "generated-natural-language-supported", NULL, "en");
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_LANGUAGE), "generated-natural-language-supported", NULL, "en");
+
+  /* identify-actions-default */
+  if (!ippFindAttribute(printer->attrs, "identify-actions-default", IPP_TAG_ZERO))
+    ippAddString (printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "identify-actions-default", NULL, "sound");
+
+  /* identify-actions-supported */
+  if (!ippFindAttribute(printer->attrs, "identify-actions-supported", IPP_TAG_ZERO))
+    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 */
+  if (!ippFindAttribute(printer->attrs, "ipp-features-supported", IPP_TAG_ZERO))
+    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 */
-  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-                "ipp-versions-supported",
-               sizeof(versions) / sizeof(versions[0]), NULL, versions);
+  if (!ippFindAttribute(printer->attrs, "ipp-versions-supported", IPP_TAG_ZERO))
+    ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-versions-supported", sizeof(versions) / sizeof(versions[0]), NULL, versions);
+
+  /* job-account-id-default */
+  if (!ippFindAttribute(printer->attrs, "job-account-id-default", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-account-id-default", NULL, "");
+
+  /* job-account-id-supported */
+  if (!ippFindAttribute(printer->attrs, "job-account-id-supported", IPP_TAG_ZERO))
+    ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "job-account-id-supported", 1);
+
+  /* job-accounting-user-id-default */
+  if (!ippFindAttribute(printer->attrs, "job-accounting-user-id-default", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-accounting-user-id-default", NULL, "");
+
+  /* job-accounting-user-id-supported */
+  if (!ippFindAttribute(printer->attrs, "job-accounting-user-id-supported", IPP_TAG_ZERO))
+    ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "job-accounting-user-id-supported", 1);
 
   /* job-creation-attributes-supported */
-  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-                "job-creation-attributes-supported",
-               sizeof(job_creation) / sizeof(job_creation[0]),
-               NULL, job_creation);
+  if (!ippFindAttribute(printer->attrs, "job-creation-attributes-supported", IPP_TAG_ZERO))
+    ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-creation-attributes-supported", sizeof(job_creation) / sizeof(job_creation[0]), NULL, job_creation);
+
+  /* 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-password-supported */
+  if (!ippFindAttribute(printer->attrs, "job-password-supported", IPP_TAG_ZERO))
+    ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "job-password-supported", 4);
+
   /* job-priority-default */
-  ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
-                "job-priority-default", 50);
+  if (!ippFindAttribute(printer->attrs, "job-priority-default", IPP_TAG_ZERO))
+    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", 100);
+  if (!ippFindAttribute(printer->attrs, "job-priority-supported", IPP_TAG_ZERO))
+    ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "job-priority-supported", 100);
 
   /* job-sheets-default */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME | IPP_TAG_COPY,
-               "job-sheets-default", NULL, "none");
+  if (!ippFindAttribute(printer->attrs, "job-sheets-default", IPP_TAG_ZERO))
+    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_TAG_NAME | IPP_TAG_COPY,
-               "job-sheets-supported", NULL, "none");
+  if (!ippFindAttribute(printer->attrs, "job-sheets-supported", IPP_TAG_ZERO))
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-sheets-supported", NULL, "none");
 
   /* media-bottom-margin-supported */
-  ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
-                 "media-bottom-margin-supported",
-                (int)(sizeof(media_xxx_margin_supported) /
-                      sizeof(media_xxx_margin_supported[0])),
-                media_xxx_margin_supported);
+  if (!ippFindAttribute(printer->attrs, "media-bottom-margin-supported", IPP_TAG_ZERO))
+    ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-bottom-margin-supported", (int)(sizeof(media_xxx_margin_supported) / sizeof(media_xxx_margin_supported[0])), media_xxx_margin_supported);
 
   /* media-col-database */
-  for (num_database = 0, i = 0;
-       i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
-       i ++)
-  {
-    if (media_col_sizes[i][2] == _IPP_ENV_ONLY)
-      num_database += 2;               /* auto + envelope */
-    else if (media_col_sizes[i][2] == _IPP_PHOTO_ONLY)
-      num_database += 12;              /* auto + photographic-* + borderless */
-    else
-      num_database += (int)(sizeof(media_type_supported) /
-                            sizeof(media_type_supported[0])) + 6;
-                                       /* All types + borderless */
-  }
-
-  media_col_database = ippAddCollections(printer->attrs, IPP_TAG_PRINTER,
-                                         "media-col-database", num_database,
-                                        NULL);
-  for (media_col_value = media_col_database->values, i = 0;
-       i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
-       i ++)
-  {
-    for (j = 0;
-         j < (int)(sizeof(media_type_supported) /
-                  sizeof(media_type_supported[0]));
-         j ++)
+  if (!ippFindAttribute(printer->attrs, "media-col-database", IPP_TAG_ZERO))
+  {
+    for (num_database = 0, i = 0;
+        i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
+        i ++)
     {
-      if (media_col_sizes[i][2] == _IPP_ENV_ONLY &&
-          strcmp(media_type_supported[j], "auto") &&
-         strcmp(media_type_supported[j], "envelope"))
-       continue;
-      else if (media_col_sizes[i][2] == _IPP_PHOTO_ONLY &&
-               strcmp(media_type_supported[j], "auto") &&
-              strncmp(media_type_supported[j], "photographic-", 13))
-       continue;
-
-      media_col_value->collection =
-          create_media_col(media_supported[i], media_type_supported[j],
-                          media_col_sizes[i][0], media_col_sizes[i][1],
-                          media_xxx_margin_supported[1]);
-      media_col_value ++;
+      if (media_col_sizes[i][2] == _IPP_ENV_ONLY)
+       num_database += 3;              /* auto + manual + envelope */
+      else if (media_col_sizes[i][2] == _IPP_PHOTO_ONLY)
+       num_database += 6 * 3;          /* auto + photographic-* from auto, manual, and photo */
+      else
+       num_database += 2;              /* Regular + borderless */
+    }
 
-      if (media_col_sizes[i][2] != _IPP_ENV_ONLY &&
-         (!strcmp(media_type_supported[j], "auto") ||
-          !strncmp(media_type_supported[j], "photographic-", 13)))
+    media_col_database = ippAddCollections(printer->attrs, IPP_TAG_PRINTER, "media-col-database", num_database, NULL);
+    for (media_col_index = 0, i = 0;
+        i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
+        i ++)
+    {
+      switch (media_col_sizes[i][2])
       {
-       /*
-        * Add borderless version for this combination...
-       */
+       case _IPP_GENERAL :
+          /*
+           * Regular + borderless for the general class; no source/type
+           * selectors...
+           */
+
+           ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], NULL, NULL, media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[1]));
+           ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], NULL, NULL, media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[0]));
+           break;
+
+       case _IPP_ENV_ONLY :
+          /*
+           * Regular margins for "auto", "manual", and "envelope" sources.
+           */
 
-       media_col_value->collection =
-           create_media_col(media_supported[i], media_type_supported[j],
-                            media_col_sizes[i][0], media_col_sizes[i][1],
-                            media_xxx_margin_supported[0]);
-       media_col_value ++;
+           ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "auto", "envelope", media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[1]));
+           ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "manual", "envelope", media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[1]));
+           ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "envelope", "envelope", media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[1]));
+           break;
+       case _IPP_PHOTO_ONLY :
+          /*
+           * Photos have specific media types and can only be printed via
+           * the auto, manual, and photo sources...
+           */
+
+           for (j = 0;
+                j < (int)(sizeof(media_type_supported) /
+                          sizeof(media_type_supported[0]));
+                j ++)
+           {
+             if (strcmp(media_type_supported[j], "auto") && strncmp(media_type_supported[j], "photographic-", 13))
+               continue;
+
+             ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "auto", media_type_supported[j], media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[0]));
+             ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "manual", media_type_supported[j], media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[0]));
+             ippSetCollection(printer->attrs, &media_col_database, media_col_index ++, create_media_col(media_supported[i], "photo", media_type_supported[j], media_col_sizes[i][0], media_col_sizes[i][1], media_xxx_margin_supported[0]));
+           }
+           break;
       }
     }
   }
 
   /* media-col-default */
-  media_col_default = create_media_col(media_supported[0],
-                                       media_type_supported[0],
-                                      media_col_sizes[0][0],
-                                      media_col_sizes[0][1],
-                                      media_xxx_margin_supported[1]);
+  if (!ippFindAttribute(printer->attrs, "media-col-default", IPP_TAG_ZERO))
+  {
+    media_col_default = create_media_col(media_supported[0], media_source_supported[0], media_type_supported[0], media_col_sizes[0][0], media_col_sizes[0][1],media_xxx_margin_supported[1]);
 
-  ippAddCollection(printer->attrs, IPP_TAG_PRINTER, "media-col-default",
-                   media_col_default);
-  ippDelete(media_col_default);
+    ippAddCollection(printer->attrs, IPP_TAG_PRINTER, "media-col-default",
+                    media_col_default);
+    ippDelete(media_col_default);
+  }
 
   /* media-col-supported */
-  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-                "media-col-supported",
-               (int)(sizeof(media_col_supported) /
-                     sizeof(media_col_supported[0])), NULL,
-               media_col_supported);
+  if (!ippFindAttribute(printer->attrs, "media-col-supported", IPP_TAG_ZERO))
+    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);
 
   /* media-default */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-               "media-default", NULL, media_supported[0]);
+  if (!ippFindAttribute(printer->attrs, "media-default", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-default", NULL, media_supported[0]);
 
   /* media-left-margin-supported */
-  ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
-                 "media-left-margin-supported",
-                (int)(sizeof(media_xxx_margin_supported) /
-                      sizeof(media_xxx_margin_supported[0])),
-                media_xxx_margin_supported);
+  if (!ippFindAttribute(printer->attrs, "media-left-margin-supported", IPP_TAG_ZERO))
+    ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-left-margin-supported", (int)(sizeof(media_xxx_margin_supported) / sizeof(media_xxx_margin_supported[0])), media_xxx_margin_supported);
 
   /* media-right-margin-supported */
-  ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
-                 "media-right-margin-supported",
-                (int)(sizeof(media_xxx_margin_supported) /
-                      sizeof(media_xxx_margin_supported[0])),
-                media_xxx_margin_supported);
+  if (!ippFindAttribute(printer->attrs, "media-right-margin-supported", IPP_TAG_ZERO))
+    ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-right-margin-supported", (int)(sizeof(media_xxx_margin_supported) / sizeof(media_xxx_margin_supported[0])), media_xxx_margin_supported);
 
   /* media-supported */
-  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-                "media-supported",
-               (int)(sizeof(media_supported) / sizeof(media_supported[0])),
-               NULL, media_supported);
+  if (!ippFindAttribute(printer->attrs, "media-supported", IPP_TAG_ZERO))
+    ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-supported", (int)(sizeof(media_supported) / sizeof(media_supported[0])), NULL, media_supported);
 
   /* media-size-supported */
-  media_size_supported = ippAddCollections(printer->attrs, IPP_TAG_PRINTER,
-                                           "media-size-supported",
-                                           (int)(sizeof(media_col_sizes) /
-                                                 sizeof(media_col_sizes[0])),
-                                           NULL);
-  for (i = 0;
-       i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
-       i ++)
-    media_size_supported->values[i].collection =
-        create_media_size(media_col_sizes[i][0], media_col_sizes[i][1]);
+  if (!ippFindAttribute(printer->attrs, "media-size-supported", IPP_TAG_ZERO))
+  {
+    media_size_supported = ippAddCollections(printer->attrs, IPP_TAG_PRINTER, "media-size-supported", (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0])), NULL);
+
+    for (i = 0;
+        i < (int)(sizeof(media_col_sizes) / sizeof(media_col_sizes[0]));
+        i ++)
+    {
+      ipp_t *size = create_media_size(media_col_sizes[i][0], media_col_sizes[i][1]);
+
+      ippSetCollection(printer->attrs, &media_size_supported, i, size);
+      ippDelete(size);
+    }
+  }
+
+  /* media-source-supported */
+  if (!ippFindAttribute(printer->attrs, "media-source-supported", IPP_TAG_ZERO))
+    ippAddStrings(printer->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 */
-  ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
-                 "media-top-margin-supported",
-                (int)(sizeof(media_xxx_margin_supported) /
-                      sizeof(media_xxx_margin_supported[0])),
-                media_xxx_margin_supported);
+  if (!ippFindAttribute(printer->attrs, "media-top-margin-supported", IPP_TAG_ZERO))
+    ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-top-margin-supported", (int)(sizeof(media_xxx_margin_supported) / sizeof(media_xxx_margin_supported[0])), media_xxx_margin_supported);
 
   /* media-type-supported */
-  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-                "media-type-supported",
-               (int)(sizeof(media_type_supported) /
-                     sizeof(media_type_supported[0])),
-               NULL, media_type_supported);
+  if (!ippFindAttribute(printer->attrs, "media-type-supported", IPP_TAG_ZERO))
+    ippAddStrings(printer->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);
 
   /* multiple-document-handling-supported */
-  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-                "multiple-document-handling-supported",
-                sizeof(multiple_document_handling) /
-                   sizeof(multiple_document_handling[0]), NULL,
-               multiple_document_handling);
+  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);
+  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_TAG_LANGUAGE | IPP_TAG_COPY,
+  ippAddString(printer->attrs, IPP_TAG_PRINTER,
+               IPP_CONST_TAG(IPP_TAG_LANGUAGE),
                "natural-language-configured", NULL, "en");
 
   /* number-up-default */
-  ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
-                "number-up-default", 1);
+  if (!ippFindAttribute(printer->attrs, "number-up-default", IPP_TAG_ZERO))
+    ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "number-up-default", 1);
 
   /* number-up-supported */
-  ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
-                "number-up-supported", 1);
+  if (!ippFindAttribute(printer->attrs, "number-up-supported", IPP_TAG_ZERO))
+    ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "number-up-supported", 1);
 
   /* operations-supported */
-  ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
-                "operations-supported", sizeof(ops) / sizeof(ops[0]), ops);
+  ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "operations-supported", sizeof(ops) / sizeof(ops[0]), ops);
 
   /* orientation-requested-default */
-  ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NOVALUE,
-                "orientation-requested-default", 0);
+  if (!ippFindAttribute(printer->attrs, "orientation-requested-default", IPP_TAG_ZERO))
+    ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "orientation-requested-default", 0);
 
   /* orientation-requested-supported */
-  ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
-                 "orientation-requested-supported", 4, orients);
+  if (!ippFindAttribute(printer->attrs, "orientation-requested-supported", IPP_TAG_ZERO))
+    ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "orientation-requested-supported", 4, orients);
 
   /* output-bin-default */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-               "output-bin-default", NULL, "face-down");
+  if (!ippFindAttribute(printer->attrs, "output-bin-default", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-default", NULL, "face-down");
 
   /* output-bin-supported */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-               "output-bin-supported", NULL, "face-down");
+  if (!ippFindAttribute(printer->attrs, "output-bin-supported", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-supported", NULL, "face-down");
+
+  /* overrides-supported */
+  if (!ippFindAttribute(printer->attrs, "overrides-supported", IPP_TAG_ZERO))
+    ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "overrides-supported", (int)(sizeof(overrides) / sizeof(overrides[0])), NULL, overrides);
+
+  /* page-ranges-supported */
+  if (!ippFindAttribute(printer->attrs, "page-ranges-supported", IPP_TAG_ZERO))
+    ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "page-ranges-supported", 1);
 
   /* pages-per-minute */
   ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
@@ -1536,35 +1977,64 @@ create_printer(const char *servername,  /* I - Server hostname (NULL for default)
                   "pages-per-minute-color", ppm_color);
 
   /* pdl-override-supported */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-               "pdl-override-supported", NULL, "attempted");
+  if (!ippFindAttribute(printer->attrs, "pdl-override-supported", IPP_TAG_ZERO))
+    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);
+
+  /* print-color-mode-default */
+  if (!ippFindAttribute(printer->attrs, "print-color-mode-default", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-default", NULL, "auto");
+
+  /* print-color-mode-supported */
+  if (!ippFindAttribute(printer->attrs, "print-color-mode-supported", IPP_TAG_ZERO))
+    ippAddStrings(printer->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 */
+  if (!ippFindAttribute(printer->attrs, "print-content-optimize-default", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-default", NULL, "auto");
+
+  /* print-content-optimize-supported */
+  if (!ippFindAttribute(printer->attrs, "print-content-optimize-supported", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-supported", NULL, "auto");
+
+  /* print-rendering-intent-default */
+  if (!ippFindAttribute(printer->attrs, "print-rendering-intent-default", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-default", NULL, "auto");
+
+  /* print-rendering-intent-supported */
+  if (!ippFindAttribute(printer->attrs, "print-rendering-intent-supported", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-supported", NULL, "auto");
 
   /* print-quality-default */
-  ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
-                "print-quality-default", IPP_QUALITY_NORMAL);
+  if (!ippFindAttribute(printer->attrs, "print-quality-default", IPP_TAG_ZERO))
+    ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-default", IPP_QUALITY_NORMAL);
 
   /* print-quality-supported */
-  ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM,
-                 "print-quality-supported",
-                (int)(sizeof(print_quality_supported) /
-                      sizeof(print_quality_supported[0])),
-                print_quality_supported);
+  if (!ippFindAttribute(printer->attrs, "print-quality-supported", IPP_TAG_ZERO))
+    ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-supported", (int)(sizeof(print_quality_supported) / sizeof(print_quality_supported[0])), print_quality_supported);
 
   /* printer-device-id */
   ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT,
               "printer-device-id", NULL, device_id);
 
+  /* 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 */
+  if (!ippFindAttribute(printer->attrs, "printer-geo-location", IPP_TAG_ZERO))
+    ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_UNKNOWN, "printer-geo-location", 0);
+
   /* 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);
+  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);
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info", NULL, name);
 
   /* printer-location */
   ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT,
@@ -1574,68 +2044,125 @@ create_printer(const char *servername, /* I - Server hostname (NULL for default)
   ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT,
                "printer-make-and-model", NULL, make_model);
 
+  /* printer-mandatory-job-attributes */
+  if (pin && !ippFindAttribute(printer->attrs, "", IPP_TAG_ZERO))
+  {
+    static const char * const names[] =
+    {
+      "job-account-id",
+      "job-accounting-user-id",
+      "job-password"
+    };
+
+    ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
+                  "printer-mandatory-job-attributes",
+                  (int)(sizeof(names) / sizeof(names[0])), NULL, names);
+  }
+
   /* printer-more-info */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI,
-               "printer-more-info", NULL, adminurl);
+  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);
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL, name);
+
+  /* printer-organization */
+  if (!ippFindAttribute(printer->attrs, "printer-organization", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organization", NULL, "Apple Inc.");
+
+  /* printer-organizational-unit */
+  if (!ippFindAttribute(printer->attrs, "printer-organizational-unit", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organizational-unit", NULL, "Printing Engineering");
 
   /* printer-resolution-default */
-  ippAddResolution(printer->attrs, IPP_TAG_PRINTER,
-                   "printer-resolution-default", IPP_RES_PER_INCH, 600, 600);
+  if (!ippFindAttribute(printer->attrs, "printer-resolution-default", IPP_TAG_ZERO))
+    ippAddResolution(printer->attrs, IPP_TAG_PRINTER, "printer-resolution-default", IPP_RES_PER_INCH, 600, 600);
 
   /* printer-resolution-supported */
-  ippAddResolution(printer->attrs, IPP_TAG_PRINTER,
-                   "printer-resolution-supported", IPP_RES_PER_INCH, 600, 600);
+  if (!ippFindAttribute(printer->attrs, "printer-resolutions-supported", IPP_TAG_ZERO))
+    ippAddResolution(printer->attrs, IPP_TAG_PRINTER, "printer-resolution-supported", IPP_RES_PER_INCH, 600, 600);
+
+  /* printer-supply-description */
+  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-supply-description", (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])), NULL, printer_supplies);
+
+  /* printer-supply-info-uri */
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, supplyurl);
 
   /* printer-uri-supported */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI,
-               "printer-uri-supported", NULL, uri);
+#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 */
+  httpAssembleUUID(printer->hostname, port, name, 0, uuid, sizeof(uuid));
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL, uuid);
+
+  /* pwg-raster-document-xxx-supported */
+  for (i = 0; i < num_formats; i ++)
+    if (!strcasecmp(formats[i], "image/pwg-raster"))
+      break;
+
+  if (i < num_formats)
+  {
+    if (!ippFindAttribute(printer->attrs, "pwg-raster-document-resolution-supported", IPP_TAG_ZERO))
+      ippAddResolutions(printer->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 (!ippFindAttribute(printer->attrs, "pwg-raster-document-sheet-back", IPP_TAG_ZERO))
+      ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "pwg-raster-document-sheet-back", NULL, "normal");
+    if (!ippFindAttribute(printer->attrs, "pwg-raster-document-type-supported", IPP_TAG_ZERO))
+      ippAddStrings(printer->attrs, IPP_TAG_PRINTER, 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);
+  }
 
   /* reference-uri-scheme-supported */
-  ippAddStrings(printer->attrs, IPP_TAG_PRINTER,
-                IPP_TAG_URISCHEME | IPP_TAG_COPY,
-                "reference-uri-schemes-supported",
-                (int)(sizeof(reference_uri_schemes_supported) /
-                      sizeof(reference_uri_schemes_supported[0])),
-                NULL, reference_uri_schemes_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);
 
   /* sides-default */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-               "sides-default", NULL, "one-sided");
+  if (!ippFindAttribute(printer->attrs, "sides-default", IPP_TAG_ZERO))
+    ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-default", NULL, "one-sided");
 
   /* sides-supported */
-  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-                "sides-supported", duplex ? 3 : 1, NULL, sides_supported);
+  if (!ippFindAttribute(printer->attrs, "sides-supported", IPP_TAG_ZERO))
+  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-supported", duplex ? 3 : 1, NULL, sides_supported);
+
+  /* urf-supported */
+  for (i = 0; i < num_formats; i ++)
+    if (!strcasecmp(formats[i], "image/urf"))
+      break;
+
+  if (i < num_formats && !ippFindAttribute(printer->attrs, "urf-supported", IPP_TAG_ZERO))
+    ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported) / sizeof(urf_supported[0])) - !duplex, NULL, urf_supported);
 
   /* uri-authentication-supported */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-               "uri-authentication-supported", NULL, "none");
+#ifdef HAVE_SSL
+  ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", 2, NULL, uri_authentication_supported);
+#else
+  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", NULL, "none");
+#endif /* HAVE_SSL */
 
   /* uri-security-supported */
-  ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY,
-               "uri-security-supported", NULL, "none");
+#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_TAG_KEYWORD | IPP_TAG_COPY,
-                "which-jobs-supported",
-                sizeof(which_jobs) / sizeof(which_jobs[0]), NULL, which_jobs);
+  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);
 
   free(formats[0]);
 
   debug_attributes("Printer", printer->attrs, 0);
 
-#ifdef HAVE_DNSSD
  /*
   * Register the printer with Bonjour...
   */
 
-  if (!register_printer(printer, location, make, model, docformats, adminurl,
-                        ppm_color > 0, duplex, regtype))
+  if (!register_printer(printer, location, make, model, docformats, adminurl, uuid + 9, ppm_color > 0, duplex, subtype))
     goto bad_printer;
-#endif /* HAVE_DNSSD */
 
  /*
   * Return it!
@@ -1656,208 +2183,6 @@ create_printer(const char *servername,  /* I - Server hostname (NULL for default)
 
 
 /*
- * 'create_requested_array()' - Create an array for requested-attributes.
- */
-
-static cups_array_t *                  /* O - requested-attributes array */
-create_requested_array(
-    _ipp_client_t *client)             /* I - Client */
-{
-  int                  i;              /* Looping var */
-  ipp_attribute_t      *requested;     /* requested-attributes attribute */
-  cups_array_t         *ra;            /* Requested attributes array */
-  char                 *value;         /* Current value */
-
-
- /*
-  * Get the requested-attributes attribute, and return NULL if we don't
-  * have one...
-  */
-
-  if ((requested = ippFindAttribute(client->request, "requested-attributes",
-                                    IPP_TAG_KEYWORD)) == NULL)
-    return (NULL);
-
- /*
-  * If the attribute contains a single "all" keyword, return NULL...
-  */
-
-  if (requested->num_values == 1 &&
-      !strcmp(requested->values[0].string.text, "all"))
-    return (NULL);
-
- /*
-  * Create an array using "strcmp" as the comparison function...
-  */
-
-  ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
-
-  for (i = 0; i < requested->num_values; i ++)
-  {
-    value = requested->values[i].string.text;
-
-    if (!strcmp(value, "job-template"))
-    {
-      cupsArrayAdd(ra, "copies");
-      cupsArrayAdd(ra, "copies-default");
-      cupsArrayAdd(ra, "copies-supported");
-      cupsArrayAdd(ra, "finishings");
-      cupsArrayAdd(ra, "finishings-default");
-      cupsArrayAdd(ra, "finishings-supported");
-      cupsArrayAdd(ra, "job-hold-until");
-      cupsArrayAdd(ra, "job-hold-until-default");
-      cupsArrayAdd(ra, "job-hold-until-supported");
-      cupsArrayAdd(ra, "job-priority");
-      cupsArrayAdd(ra, "job-priority-default");
-      cupsArrayAdd(ra, "job-priority-supported");
-      cupsArrayAdd(ra, "job-sheets");
-      cupsArrayAdd(ra, "job-sheets-default");
-      cupsArrayAdd(ra, "job-sheets-supported");
-      cupsArrayAdd(ra, "media");
-      cupsArrayAdd(ra, "media-col");
-      cupsArrayAdd(ra, "media-col-default");
-      cupsArrayAdd(ra, "media-col-supported");
-      cupsArrayAdd(ra, "media-default");
-      cupsArrayAdd(ra, "media-source-supported");
-      cupsArrayAdd(ra, "media-supported");
-      cupsArrayAdd(ra, "media-type-supported");
-      cupsArrayAdd(ra, "multiple-document-handling");
-      cupsArrayAdd(ra, "multiple-document-handling-default");
-      cupsArrayAdd(ra, "multiple-document-handling-supported");
-      cupsArrayAdd(ra, "number-up");
-      cupsArrayAdd(ra, "number-up-default");
-      cupsArrayAdd(ra, "number-up-supported");
-      cupsArrayAdd(ra, "orientation-requested");
-      cupsArrayAdd(ra, "orientation-requested-default");
-      cupsArrayAdd(ra, "orientation-requested-supported");
-      cupsArrayAdd(ra, "page-ranges");
-      cupsArrayAdd(ra, "page-ranges-supported");
-      cupsArrayAdd(ra, "printer-resolution");
-      cupsArrayAdd(ra, "printer-resolution-default");
-      cupsArrayAdd(ra, "printer-resolution-supported");
-      cupsArrayAdd(ra, "print-quality");
-      cupsArrayAdd(ra, "print-quality-default");
-      cupsArrayAdd(ra, "print-quality-supported");
-      cupsArrayAdd(ra, "sides");
-      cupsArrayAdd(ra, "sides-default");
-      cupsArrayAdd(ra, "sides-supported");
-    }
-    else if (!strcmp(value, "job-description"))
-    {
-      cupsArrayAdd(ra, "date-time-at-completed");
-      cupsArrayAdd(ra, "date-time-at-creation");
-      cupsArrayAdd(ra, "date-time-at-processing");
-      cupsArrayAdd(ra, "job-detailed-status-message");
-      cupsArrayAdd(ra, "job-document-access-errors");
-      cupsArrayAdd(ra, "job-id");
-      cupsArrayAdd(ra, "job-impressions");
-      cupsArrayAdd(ra, "job-impressions-completed");
-      cupsArrayAdd(ra, "job-k-octets");
-      cupsArrayAdd(ra, "job-k-octets-processed");
-      cupsArrayAdd(ra, "job-media-sheets");
-      cupsArrayAdd(ra, "job-media-sheets-completed");
-      cupsArrayAdd(ra, "job-message-from-operator");
-      cupsArrayAdd(ra, "job-more-info");
-      cupsArrayAdd(ra, "job-name");
-      cupsArrayAdd(ra, "job-originating-user-name");
-      cupsArrayAdd(ra, "job-printer-up-time");
-      cupsArrayAdd(ra, "job-printer-uri");
-      cupsArrayAdd(ra, "job-state");
-      cupsArrayAdd(ra, "job-state-message");
-      cupsArrayAdd(ra, "job-state-reasons");
-      cupsArrayAdd(ra, "job-uri");
-      cupsArrayAdd(ra, "number-of-documents");
-      cupsArrayAdd(ra, "number-of-intervening-jobs");
-      cupsArrayAdd(ra, "output-device-assigned");
-      cupsArrayAdd(ra, "time-at-completed");
-      cupsArrayAdd(ra, "time-at-creation");
-      cupsArrayAdd(ra, "time-at-processing");
-    }
-    else if (!strcmp(value, "printer-description"))
-    {
-      cupsArrayAdd(ra, "charset-configured");
-      cupsArrayAdd(ra, "charset-supported");
-      cupsArrayAdd(ra, "color-supported");
-      cupsArrayAdd(ra, "compression-supported");
-      cupsArrayAdd(ra, "document-format-default");
-      cupsArrayAdd(ra, "document-format-supported");
-      cupsArrayAdd(ra, "generated-natural-language-supported");
-      cupsArrayAdd(ra, "ipp-versions-supported");
-      cupsArrayAdd(ra, "job-impressions-supported");
-      cupsArrayAdd(ra, "job-k-octets-supported");
-      cupsArrayAdd(ra, "job-media-sheets-supported");
-      cupsArrayAdd(ra, "multiple-document-jobs-supported");
-      cupsArrayAdd(ra, "multiple-operation-time-out");
-      cupsArrayAdd(ra, "natural-language-configured");
-      cupsArrayAdd(ra, "notify-attributes-supported");
-      cupsArrayAdd(ra, "notify-lease-duration-default");
-      cupsArrayAdd(ra, "notify-lease-duration-supported");
-      cupsArrayAdd(ra, "notify-max-events-supported");
-      cupsArrayAdd(ra, "notify-events-default");
-      cupsArrayAdd(ra, "notify-events-supported");
-      cupsArrayAdd(ra, "notify-pull-method-supported");
-      cupsArrayAdd(ra, "notify-schemes-supported");
-      cupsArrayAdd(ra, "operations-supported");
-      cupsArrayAdd(ra, "pages-per-minute");
-      cupsArrayAdd(ra, "pages-per-minute-color");
-      cupsArrayAdd(ra, "pdl-override-supported");
-      cupsArrayAdd(ra, "printer-alert");
-      cupsArrayAdd(ra, "printer-alert-description");
-      cupsArrayAdd(ra, "printer-current-time");
-      cupsArrayAdd(ra, "printer-driver-installer");
-      cupsArrayAdd(ra, "printer-info");
-      cupsArrayAdd(ra, "printer-is-accepting-jobs");
-      cupsArrayAdd(ra, "printer-location");
-      cupsArrayAdd(ra, "printer-make-and-model");
-      cupsArrayAdd(ra, "printer-message-from-operator");
-      cupsArrayAdd(ra, "printer-more-info");
-      cupsArrayAdd(ra, "printer-more-info-manufacturer");
-      cupsArrayAdd(ra, "printer-name");
-      cupsArrayAdd(ra, "printer-state");
-      cupsArrayAdd(ra, "printer-state-message");
-      cupsArrayAdd(ra, "printer-state-reasons");
-      cupsArrayAdd(ra, "printer-up-time");
-      cupsArrayAdd(ra, "printer-uri-supported");
-      cupsArrayAdd(ra, "queued-job-count");
-      cupsArrayAdd(ra, "reference-uri-schemes-supported");
-      cupsArrayAdd(ra, "uri-authentication-supported");
-      cupsArrayAdd(ra, "uri-security-supported");
-    }
-    else if (!strcmp(value, "printer-defaults"))
-    {
-      cupsArrayAdd(ra, "copies-default");
-      cupsArrayAdd(ra, "document-format-default");
-      cupsArrayAdd(ra, "finishings-default");
-      cupsArrayAdd(ra, "job-hold-until-default");
-      cupsArrayAdd(ra, "job-priority-default");
-      cupsArrayAdd(ra, "job-sheets-default");
-      cupsArrayAdd(ra, "media-default");
-      cupsArrayAdd(ra, "media-col-default");
-      cupsArrayAdd(ra, "number-up-default");
-      cupsArrayAdd(ra, "orientation-requested-default");
-      cupsArrayAdd(ra, "sides-default");
-    }
-    else if (!strcmp(value, "subscription-template"))
-    {
-      cupsArrayAdd(ra, "notify-attributes");
-      cupsArrayAdd(ra, "notify-charset");
-      cupsArrayAdd(ra, "notify-events");
-      cupsArrayAdd(ra, "notify-lease-duration");
-      cupsArrayAdd(ra, "notify-natural-language");
-      cupsArrayAdd(ra, "notify-pull-method");
-      cupsArrayAdd(ra, "notify-recipient-uri");
-      cupsArrayAdd(ra, "notify-time-interval");
-      cupsArrayAdd(ra, "notify-user-data");
-    }
-    else
-      cupsArrayAdd(ra, value);
-  }
-
-  return (ra);
-}
-
-
-/*
  * 'debug_attributes()' - Print attributes in a request or response.
  */
 
@@ -1869,38 +2194,39 @@ debug_attributes(const char *title,     /* I - Title */
   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);
-  fprintf(stderr, "  version=%d.%d\n", ipp->request.any.version[0],
-          ipp->request.any.version[1]);
+  major = ippGetVersion(ipp, &minor);
+  fprintf(stderr, "  version=%d.%d\n", major, minor);
   if (type == 1)
     fprintf(stderr, "  operation-id=%s(%04x)\n",
-            ippOpString(ipp->request.op.operation_id),
-            ipp->request.op.operation_id);
+            ippOpString(ippGetOperation(ipp)), ippGetOperation(ipp));
   else if (type == 2)
     fprintf(stderr, "  status-code=%s(%04x)\n",
-            ippErrorString(ipp->request.status.status_code),
-            ipp->request.status.status_code);
-  fprintf(stderr, "  request-id=%d\n\n", ipp->request.any.request_id);
+            ippErrorString(ippGetStatusCode(ipp)), ippGetStatusCode(ipp));
+  fprintf(stderr, "  request-id=%d\n\n", ippGetRequestId(ipp));
 
-  for (attr = ipp->attrs, group_tag = IPP_TAG_ZERO; attr; attr = attr->next)
+  for (attr = ippFirstAttribute(ipp), group_tag = IPP_TAG_ZERO;
+       attr;
+       attr = ippNextAttribute(ipp))
   {
-    if (attr->group_tag != group_tag)
+    if (ippGetGroupTag(attr) != group_tag)
     {
-      group_tag = attr->group_tag;
+      group_tag = ippGetGroupTag(attr);
       fprintf(stderr, "  %s\n", ippTagString(group_tag));
     }
 
-    if (attr->name)
+    if (ippGetName(attr))
     {
       ippAttributeString(attr, buffer, sizeof(buffer));
-      fprintf(stderr, "    %s (%s%s) %s\n", attr->name,
-             attr->num_values > 1 ? "1setOf " : "",
-             ippTagString(attr->value_tag), buffer);
+      fprintf(stderr, "    %s (%s%s) %s\n", ippGetName(attr),
+             ippGetCount(attr) > 1 ? "1setOf " : "",
+             ippTagString(ippGetValueTag(attr)), buffer);
     }
   }
 }
@@ -1915,27 +2241,21 @@ static void
 delete_client(_ipp_client_t *client)   /* I - Client */
 {
   if (Verbosity)
-    fprintf(stderr, "Closing connection from %s (%s)\n", client->http.hostname,
-           client->http.hostaddr->addr.sa_family == AF_INET ? "IPv4" : "IPv6");
+    fprintf(stderr, "Closing connection from %s\n", client->hostname);
 
  /*
   * Flush pending writes before closing...
   */
 
-  httpFlushWrite(&(client->http));
-
-  if (client->http.fd >= 0)
-    close(client->http.fd);
+  httpFlushWrite(client->http);
 
  /*
   * Free memory...
   */
 
-  httpClearCookie(&(client->http));
-  httpClearFields(&(client->http));
+  httpClose(client->http);
 
   ippDelete(client->request);
-
   ippDelete(client->response);
 
   free(client);
@@ -1984,32 +2304,41 @@ delete_printer(_ipp_printer_t *printer) /* I - Printer */
 #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->common_ref)
-    DNSServiceRefDeallocate(printer->common_ref);
-
-  TXTRecordDeallocate(&(printer->ipp_txt));
+  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);
 
-  if (printer->dnssd_name)
-    _cupsStrFree(printer->dnssd_name);
+  avahi_threaded_poll_unlock(DNSSDMaster);
 #endif /* HAVE_DNSSD */
 
+  if (printer->dnssd_name)
+    free(printer->dnssd_name);
   if (printer->name)
-    _cupsStrFree(printer->name);
+    free(printer->name);
   if (printer->icon)
-    _cupsStrFree(printer->icon);
+    free(printer->icon);
+  if (printer->command)
+    free(printer->command);
   if (printer->directory)
-    _cupsStrFree(printer->directory);
+    free(printer->directory);
   if (printer->hostname)
-    _cupsStrFree(printer->hostname);
+    free(printer->hostname);
   if (printer->uri)
-    _cupsStrFree(printer->uri);
+    free(printer->uri);
 
   ippDelete(printer->attrs);
   cupsArrayDelete(printer->jobs);
@@ -2023,7 +2352,7 @@ delete_printer(_ipp_printer_t *printer)   /* I - Printer */
  * 'dnssd_callback()' - Handle Bonjour registration events.
  */
 
-static void
+static void DNSSD_API
 dnssd_callback(
     DNSServiceRef       sdRef,         /* I - Service reference */
     DNSServiceFlags     flags,         /* I - Status flags */
@@ -2033,26 +2362,142 @@ dnssd_callback(
     const char          *domain,       /* I - Domain for service */
     _ipp_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 (_cups_strcasecmp(name, printer->dnssd_name))
+  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 */
-    _cupsStrFree(printer->dnssd_name);
-    printer->dnssd_name = _cupsStrAlloc(name);
+    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, "Ignore 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(_ipp_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.
  */
 
@@ -2064,19 +2509,18 @@ find_job(_ipp_client_t *client)         /* I - Client */
                        *job;           /* Matching job, if any */
 
 
-  key.id = 0;
-
-  if ((attr = ippFindAttribute(client->request, "job-uri",
-                               IPP_TAG_URI)) != NULL)
+  if ((attr = ippFindAttribute(client->request, "job-uri", IPP_TAG_URI)) != NULL)
   {
-    if (!strncmp(attr->values[0].string.text, client->printer->uri,
-                 client->printer->urilen) &&
-        attr->values[0].string.text[client->printer->urilen] == '/')
-      key.id = atoi(attr->values[0].string.text + client->printer->urilen + 1);
+    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 = attr->values[0].integer;
+  else if ((attr = ippFindAttribute(client->request, "job-id", IPP_TAG_INTEGER)) != NULL)
+    key.id = ippGetInteger(attr, 0);
 
   _cupsRWLockRead(&(client->printer->rwlock));
   job = (_ipp_job_t *)cupsArrayFind(client->printer->jobs, &key);
@@ -2087,60 +2531,444 @@ find_job(_ipp_client_t *client)                /* I - Client */
 
 
 /*
- * 'html_escape()' - Write a HTML-safe string.
+ * 'get_collection()' - Get a collection value from a file.
  */
 
-static void
-html_escape(_ipp_client_t *client,     /* I - Client */
-           const char    *s,           /* I - String to write */
-           size_t        slen)         /* I - Number of characters to write */
+static ipp_t *                         /* O  - Collection value */
+get_collection(FILE       *fp,         /* I  - File to read from */
+               const char *filename,   /* I  - Attributes filename */
+              int        *linenum)     /* IO - Line number */
 {
-  const char   *start,                 /* Start of segment */
-               *end;                   /* End of string */
-
+  char         token[1024],            /* Token from file */
+               attr[128];              /* Attribute name */
+  ipp_tag_t    value;                  /* Current value type */
+  ipp_t                *col = ippNew();        /* Collection value */
+  ipp_attribute_t *lastcol = NULL;     /* Last collection attribute */
 
-  start = s;
-  end   = s + (slen > 0 ? slen : strlen(s));
 
-  while (*s && s < end)
+  while (get_token(fp, token, sizeof(token), linenum) != NULL)
   {
-    if (*s == '&' || *s == '<')
+    if (!strcmp(token, "}"))
+      break;
+    else if (!strcmp(token, "{") && lastcol)
     {
-      if (s > start)
-        httpWrite2(&(client->http), start, s - start);
+     /*
+      * Another collection value
+      */
 
-      if (*s == '&')
-        httpWrite2(&(client->http), "&amp;", 5);
-      else
-        httpWrite2(&(client->http), "&lt;", 4);
+      ipp_t    *subcol = get_collection(fp, filename, linenum);
+                                       /* Collection value */
 
-      start = s + 1;
+      if (subcol)
+        ippSetCollection(col, &lastcol, ippGetCount(lastcol), subcol);
+      else
+       goto col_error;
     }
+    else if (!_cups_strcasecmp(token, "MEMBER"))
+    {
+     /*
+      * Attribute...
+      */
 
-    s ++;
-  }
+      lastcol = NULL;
 
-  if (s > start)
-    httpWrite2(&(client->http), start, s - start);
-}
+      if (!get_token(fp, token, sizeof(token), linenum))
+      {
+       fprintf(stderr, "ippserver: Missing MEMBER value tag on line %d of \"%s\".\n", *linenum, filename);
+       goto col_error;
+      }
 
+      if ((value = ippTagValue(token)) == IPP_TAG_ZERO)
+      {
+       fprintf(stderr, "ippserver: Bad MEMBER value tag \"%s\" on line %d of \"%s\".\n", token, *linenum, filename);
+       goto col_error;
+      }
 
-/*
- * 'html_printf()' - Send formatted text to the client, quoting as needed.
- */
+      if (!get_token(fp, attr, sizeof(attr), linenum))
+      {
+       fprintf(stderr, "ippserver: Missing MEMBER name on line %d of \"%s\".\n", *linenum, filename);
+       goto col_error;
+      }
 
-static void
-html_printf(_ipp_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() */
+      if (!get_token(fp, token, sizeof(token), linenum))
+      {
+       fprintf(stderr, "ippserver: Missing MEMBER value on line %d of \"%s\".\n", *linenum, filename);
+       goto col_error;
+      }
+
+      switch (value)
+      {
+       case IPP_TAG_BOOLEAN :
+           if (!_cups_strcasecmp(token, "true"))
+             ippAddBoolean(col, IPP_TAG_ZERO, attr, 1);
+           else
+             ippAddBoolean(col, IPP_TAG_ZERO, attr, (char)atoi(token));
+           break;
+
+       case IPP_TAG_INTEGER :
+       case IPP_TAG_ENUM :
+           ippAddInteger(col, IPP_TAG_ZERO, value, attr, atoi(token));
+           break;
+
+       case IPP_TAG_RESOLUTION :
+           {
+             int       xres,           /* X resolution */
+                       yres;           /* Y resolution */
+             char      units[6];       /* Units */
+
+             if (sscanf(token, "%dx%d%5s", &xres, &yres, units) != 3 ||
+                 (_cups_strcasecmp(units, "dpi") &&
+                  _cups_strcasecmp(units, "dpc") &&
+                  _cups_strcasecmp(units, "dpcm") &&
+                  _cups_strcasecmp(units, "other")))
+             {
+               fprintf(stderr, "ippserver: Bad resolution value \"%s\" on line %d of \"%s\".\n", token, *linenum, filename);
+               goto col_error;
+             }
+
+             if (!_cups_strcasecmp(units, "dpi"))
+               ippAddResolution(col, IPP_TAG_ZERO, attr, IPP_RES_PER_INCH, xres, yres);
+             else if (!_cups_strcasecmp(units, "dpc") ||
+                      !_cups_strcasecmp(units, "dpcm"))
+               ippAddResolution(col, IPP_TAG_ZERO, attr, IPP_RES_PER_CM, xres, yres);
+             else
+               ippAddResolution(col, IPP_TAG_ZERO, attr, (ipp_res_t)0, xres, yres);
+           }
+           break;
+
+       case IPP_TAG_RANGE :
+           {
+             int       lowers[4],      /* Lower value */
+                       uppers[4],      /* Upper values */
+                       num_vals;       /* Number of values */
+
+
+             num_vals = sscanf(token, "%d-%d,%d-%d,%d-%d,%d-%d",
+                               lowers + 0, uppers + 0,
+                               lowers + 1, uppers + 1,
+                               lowers + 2, uppers + 2,
+                               lowers + 3, uppers + 3);
+
+             if ((num_vals & 1) || num_vals == 0)
+             {
+               fprintf(stderr, "ippserver: Bad rangeOfInteger value \"%s\" on line %d of \"%s\".\n", token, *linenum, filename);
+               goto col_error;
+             }
+
+             ippAddRanges(col, IPP_TAG_ZERO, attr, num_vals / 2, lowers,
+                          uppers);
+           }
+           break;
+
+       case IPP_TAG_BEGIN_COLLECTION :
+           if (!strcmp(token, "{"))
+           {
+             ipp_t     *subcol = get_collection(fp, filename, linenum);
+                                     /* Collection value */
+
+             if (subcol)
+             {
+               lastcol = ippAddCollection(col, IPP_TAG_ZERO, attr, subcol);
+               ippDelete(subcol);
+             }
+             else
+               goto col_error;
+           }
+           else
+           {
+             fprintf(stderr, "ippserver: Bad collection value on line %d of \"%s\".\n", *linenum, filename);
+             goto col_error;
+           }
+           break;
+       case IPP_TAG_STRING :
+           ippAddOctetString(col, IPP_TAG_ZERO, attr, token, (int)strlen(token));
+           break;
+
+       default :
+           if (!strchr(token, ','))
+             ippAddString(col, IPP_TAG_ZERO, value, attr, NULL, token);
+           else
+           {
+            /*
+             * Multiple string values...
+             */
+
+             int       num_values;     /* Number of values */
+             char      *values[100],   /* Values */
+                       *ptr;           /* Pointer to next value */
+
+
+             values[0]  = token;
+             num_values = 1;
+
+             for (ptr = strchr(token, ','); ptr; ptr = strchr(ptr, ','))
+             {
+               *ptr++ = '\0';
+               values[num_values] = ptr;
+               num_values ++;
+               if (num_values >= (int)(sizeof(values) / sizeof(values[0])))
+                 break;
+             }
+
+             ippAddStrings(col, IPP_TAG_ZERO, value, attr, num_values,
+                           NULL, (const char **)values);
+           }
+           break;
+      }
+    }
+  }
+
+  return (col);
+
+ /*
+  * If we get here there was a parse error; free memory and return.
+  */
+
+  col_error:
+
+  ippDelete(col);
+
+  return (NULL);
+}
+
+
+/*
+ * 'get_token()' - Get a token from a file.
+ */
+
+static char *                          /* O  - Token from file or NULL on EOF */
+get_token(FILE *fp,                    /* I  - File to read from */
+          char *buf,                   /* I  - Buffer to read into */
+         int  buflen,                  /* I  - Length of buffer */
+         int  *linenum)                /* IO - Current line number */
+{
+  int  ch,                             /* Character from file */
+       quote;                          /* Quoting character */
+  char *bufptr,                        /* Pointer into buffer */
+       *bufend;                        /* End of buffer */
+
+
+  for (;;)
+  {
+   /*
+    * Skip whitespace...
+    */
+
+    while (isspace(ch = getc(fp)))
+    {
+      if (ch == '\n')
+        (*linenum) ++;
+    }
+
+   /*
+    * Read a token...
+    */
+
+    if (ch == EOF)
+      return (NULL);
+    else if (ch == '\'' || ch == '\"')
+    {
+     /*
+      * Quoted text or regular expression...
+      */
+
+      quote  = ch;
+      bufptr = buf;
+      bufend = buf + buflen - 1;
+
+      while ((ch = getc(fp)) != EOF)
+      {
+        if (ch == '\\')
+       {
+        /*
+         * Escape next character...
+         */
+
+         if (bufptr < bufend)
+           *bufptr++ = (char)ch;
+
+         if ((ch = getc(fp)) != EOF && bufptr < bufend)
+           *bufptr++ = (char)ch;
+       }
+       else if (ch == quote)
+          break;
+       else if (bufptr < bufend)
+          *bufptr++ = (char)ch;
+      }
+
+      *bufptr = '\0';
+
+      return (buf);
+    }
+    else if (ch == '#')
+    {
+     /*
+      * Comment...
+      */
+
+      while ((ch = getc(fp)) != EOF)
+       if (ch == '\n')
+          break;
+
+      (*linenum) ++;
+    }
+    else if (ch == '{' || ch == '}' || ch == ',')
+    {
+      buf[0] = (char)ch;
+      buf[1] = '\0';
+
+      return (buf);
+    }
+    else
+    {
+     /*
+      * Whitespace delimited text...
+      */
+
+      ungetc(ch, fp);
+
+      bufptr = buf;
+      bufend = buf + buflen - 1;
+
+      while ((ch = getc(fp)) != EOF)
+       if (isspace(ch) || ch == '#')
+          break;
+       else if (bufptr < bufend)
+          *bufptr++ = (char)ch;
+
+      if (ch == '#')
+        ungetc(ch, fp);
+      else if (ch == '\n')
+        (*linenum) ++;
+
+      *bufptr = '\0';
+
+      return (buf);
+    }
+  }
+}
+
+
+/*
+ * 'html_escape()' - Write a HTML-safe string.
+ */
+
+static void
+html_escape(_ipp_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, "&amp;", 5);
+      else
+        httpWrite2(client->http, "&lt;", 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(_ipp_client_t *client)     /* I - Client */
+{
+  html_printf(client,
+             "</div>\n"
+             "</body>\n"
+             "</html>\n");
+  httpWrite2(client->http, "", 0);
+}
+
+
+/*
+ * 'html_header()' - Show the web interface header and title.
+ */
+
+static void
+html_header(_ipp_client_t *client,     /* I - Client */
+            const char    *title)      /* I - Title */
+{
+  html_printf(client,
+             "<!doctype html>\n"
+             "<html>\n"
+             "<head>\n"
+             "<title>%s</title>\n"
+             "<link rel=\"shortcut icon\" href=\"/icon.png\" type=\"image/png\">\n"
+             "<link rel=\"apple-touch-icon\" href=\"/icon.png\" type=\"image/png\">\n"
+             "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\">\n"
+             "<meta name=\"viewport\" content=\"width=device-width\">\n"
+             "<style>\n"
+             "body { font-family: sans-serif; margin: 0; }\n"
+             "div.body { padding: 0px 10px 10px; }\n"
+             "blockquote { background: #dfd; border-radius: 5px; color: #006; padding: 10px; }\n"
+             "table.form { border-collapse: collapse; margin-top: 10px; width: 100%%; }\n"
+             "table.form td, table.form th { padding: 5px 2px; width: 50%%; }\n"
+             "table.form th { text-align: right; }\n"
+             "table.striped { border-bottom: solid thin black; border-collapse: collapse; width: 100%%; }\n"
+             "table.striped tr:nth-child(even) { background: #fcfcfc; }\n"
+             "table.striped tr:nth-child(odd) { background: #f0f0f0; }\n"
+             "table.striped th { background: white; border-bottom: solid thin black; text-align: left; vertical-align: bottom; }\n"
+             "table.striped td { margin: 0; padding: 5px; vertical-align: top; }\n"
+             "table.nav { border-collapse: collapse; width: 100%%; }\n"
+             "table.nav td { margin: 0; text-align: center; }\n"
+             "td.nav a, td.nav a:active, td.nav a:hover, td.nav a:hover:link, td.nav a:hover:link:visited, td.nav a:link, td.nav a:link:visited, td.nav a:visited { background: inherit; color: inherit; font-size: 80%%; text-decoration: none; }\n"
+             "td.nav { background: #333; color: #fff; padding: 4px 8px; width: 33%%; }\n"
+             "td.nav.sel { background: #fff; color: #000; font-weight: bold; }\n"
+             "td.nav:hover { background: #666; color: #fff; }\n"
+             "td.nav:active { background: #000; color: #ff0; }\n"
+             "</style>\n"
+             "</head>\n"
+             "<body>\n"
+             "<table class=\"nav\"><tr>"
+             "<td class=\"nav%s\"><a href=\"/\">Status</a></td>"
+             "<td class=\"nav%s\"><a href=\"/supplies\">Supplies</a></td>"
+             "<td class=\"nav%s\"><a href=\"/media\">Media</a></td>"
+             "</tr></table>\n"
+             "<div class=\"body\">\n", title, !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(_ipp_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 */
@@ -2158,15 +2986,16 @@ html_printf(_ipp_client_t *client,      /* I - Client */
     if (*format == '%')
     {
       if (format > start)
-        httpWrite2(&(client->http), start, format - start);
+        httpWrite2(client->http, start, (size_t)(format - start));
 
       tptr    = tformat;
       *tptr++ = *format++;
 
       if (*format == '%')
       {
-        httpWrite2(&(client->http), "%", 1);
+        httpWrite2(client->http, "%", 1);
         format ++;
+       start = format;
        continue;
       }
       else if (strchr(" -+#\'", *format))
@@ -2181,7 +3010,7 @@ html_printf(_ipp_client_t *client,        /* I - Client */
        format ++;
        width = va_arg(ap, int);
 
-       snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width);
+       snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", width);
        tptr += strlen(tptr);
       }
       else
@@ -2213,7 +3042,7 @@ html_printf(_ipp_client_t *client,        /* I - Client */
          format ++;
          prec = va_arg(ap, int);
 
-         snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec);
+         snprintf(tptr, sizeof(tformat) - (size_t)(tptr - tformat), "%d", prec);
          tptr += strlen(tptr);
        }
        else
@@ -2273,12 +3102,12 @@ html_printf(_ipp_client_t *client,      /* I - Client */
        case 'e' :
        case 'f' :
        case 'g' :
-           if ((width + 2) > sizeof(temp))
+           if ((size_t)(width + 2) > sizeof(temp))
              break;
 
            sprintf(temp, tformat, va_arg(ap, double));
 
-            httpWrite2(&(client->http), temp, strlen(temp));
+            httpWrite2(client->http, temp, strlen(temp));
            break;
 
         case 'B' : /* Integer formats */
@@ -2289,7 +3118,7 @@ html_printf(_ipp_client_t *client,        /* I - Client */
        case 'o' :
        case 'u' :
        case 'x' :
-           if ((width + 2) > sizeof(temp))
+           if ((size_t)(width + 2) > sizeof(temp))
              break;
 
 #  ifdef HAVE_LONG_LONG
@@ -2302,22 +3131,22 @@ html_printf(_ipp_client_t *client,      /* I - Client */
            else
              sprintf(temp, tformat, va_arg(ap, int));
 
-            httpWrite2(&(client->http), temp, strlen(temp));
+            httpWrite2(client->http, temp, strlen(temp));
            break;
 
        case 'p' : /* Pointer value */
-           if ((width + 2) > sizeof(temp))
+           if ((size_t)(width + 2) > sizeof(temp))
              break;
 
            sprintf(temp, tformat, va_arg(ap, void *));
 
-            httpWrite2(&(client->http), temp, strlen(temp));
+            httpWrite2(client->http, temp, strlen(temp));
            break;
 
         case 'c' : /* Character or character array */
             if (width <= 1)
             {
-              temp[0] = va_arg(ap, int);
+              temp[0] = (char)va_arg(ap, int);
               temp[1] = '\0';
               html_escape(client, temp, 1);
             }
@@ -2338,7 +3167,7 @@ html_printf(_ipp_client_t *client,        /* I - Client */
   }
 
   if (format > start)
-    httpWrite2(&(client->http), start, format - start);
+    httpWrite2(client->http, start, (size_t)(format - start));
 
   va_end(ap);
 }
@@ -2360,7 +3189,7 @@ ipp_cancel_job(_ipp_client_t *client)     /* I - Client */
 
   if ((job = find_job(client)) == NULL)
   {
-    respond_ipp(client, IPP_NOT_FOUND, "Job does not exist.");
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
     return;
   }
 
@@ -2371,18 +3200,18 @@ ipp_cancel_job(_ipp_client_t *client)   /* I - Client */
 
   switch (job->state)
   {
-    case IPP_JOB_CANCELED :
-       respond_ipp(client, IPP_NOT_POSSIBLE,
+    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_JOB_ABORTED :
-       respond_ipp(client, IPP_NOT_POSSIBLE,
+    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_JOB_COMPLETED :
-       respond_ipp(client, IPP_NOT_POSSIBLE,
+    case IPP_JSTATE_COMPLETED :
+       respond_ipp(client, IPP_STATUS_ERROR_NOT_POSSIBLE,
                    "Job #%d is already completed - can\'t cancel.", job->id);
         break;
 
@@ -2393,18 +3222,73 @@ ipp_cancel_job(_ipp_client_t *client)   /* I - Client */
 
        _cupsRWLockWrite(&(client->printer->rwlock));
 
-       if (job->state == IPP_JOB_PROCESSING ||
-           (job->state == IPP_JOB_HELD && job->fd >= 0))
+       if (job->state == IPP_JSTATE_PROCESSING ||
+           (job->state == IPP_JSTATE_HELD && job->fd >= 0))
           job->cancel = 1;
        else
        {
-         job->state     = IPP_JOB_CANCELED;
+         job->state     = IPP_JSTATE_CANCELED;
          job->completed = time(NULL);
        }
 
        _cupsRWUnlock(&(client->printer->rwlock));
 
-       respond_ipp(client, IPP_OK, NULL);
+       respond_ipp(client, IPP_STATUS_OK, NULL);
+        break;
+  }
+}
+
+
+/*
+ * 'ipp_close_job()' - Close an open job.
+ */
+
+static void
+ipp_close_job(_ipp_client_t *client)   /* I - Client */
+{
+  _ipp_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;
   }
 }
@@ -2427,7 +3311,7 @@ ipp_create_job(_ipp_client_t *client)     /* I - Client */
 
   if (!valid_job_attributes(client))
   {
-    httpFlush(&(client->http));
+    httpFlush(client->http);
     return;
   }
 
@@ -2435,9 +3319,9 @@ ipp_create_job(_ipp_client_t *client)     /* I - Client */
   * Do we have a file to print?
   */
 
-  if (client->http.state == HTTP_POST_RECV)
+  if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
   {
-    respond_ipp(client, IPP_BAD_REQUEST,
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
                 "Unexpected document data following request.");
     return;
   }
@@ -2448,7 +3332,8 @@ ipp_create_job(_ipp_client_t *client)     /* I - Client */
 
   if ((job = create_job(client)) == NULL)
   {
-    respond_ipp(client, IPP_PRINTER_BUSY, "Currently printing another job.");
+    respond_ipp(client, IPP_STATUS_ERROR_BUSY,
+                "Currently printing another job.");
     return;
   }
 
@@ -2456,11 +3341,12 @@ ipp_create_job(_ipp_client_t *client)   /* I - Client */
   * Return the job info...
   */
 
-  respond_ipp(client, IPP_OK, NULL);
+  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");
 
@@ -2483,13 +3369,13 @@ ipp_get_job_attributes(
 
   if ((job = find_job(client)) == NULL)
   {
-    respond_ipp(client, IPP_NOT_FOUND, "Job not found.");
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job not found.");
     return;
   }
 
-  respond_ipp(client, IPP_OK, NULL);
+  respond_ipp(client, IPP_STATUS_OK, NULL);
 
-  ra = create_requested_array(client);
+  ra = ippCreateRequestedArray(client->request);
   copy_job_attributes(client, job, ra);
   cupsArrayDelete(ra);
 }
@@ -2503,6 +3389,8 @@ static void
 ipp_get_jobs(_ipp_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 */
@@ -2519,61 +3407,62 @@ ipp_get_jobs(_ipp_client_t *client)     /* I - Client */
 
   if ((attr = ippFindAttribute(client->request, "which-jobs",
                                IPP_TAG_KEYWORD)) != NULL)
-    fprintf(stderr, "%s Get-Jobs which-jobs=%s", client->http.hostname,
-            attr->values[0].string.text);
+  {
+    which_jobs = ippGetString(attr, 0, NULL);
+    fprintf(stderr, "%s Get-Jobs which-jobs=%s", client->hostname, which_jobs);
+  }
 
-  if (!attr || !strcmp(attr->values[0].string.text, "not-completed"))
+  if (!which_jobs || !strcmp(which_jobs, "not-completed"))
   {
     job_comparison = -1;
-    job_state      = IPP_JOB_STOPPED;
+    job_state      = IPP_JSTATE_STOPPED;
   }
-  else if (!strcmp(attr->values[0].string.text, "completed"))
+  else if (!strcmp(which_jobs, "completed"))
   {
     job_comparison = 1;
-    job_state      = IPP_JOB_CANCELED;
+    job_state      = IPP_JSTATE_CANCELED;
   }
-  else if (!strcmp(attr->values[0].string.text, "aborted"))
+  else if (!strcmp(which_jobs, "aborted"))
   {
     job_comparison = 0;
-    job_state      = IPP_JOB_ABORTED;
+    job_state      = IPP_JSTATE_ABORTED;
   }
-  else if (!strcmp(attr->values[0].string.text, "all"))
+  else if (!strcmp(which_jobs, "all"))
   {
     job_comparison = 1;
-    job_state      = IPP_JOB_PENDING;
+    job_state      = IPP_JSTATE_PENDING;
   }
-  else if (!strcmp(attr->values[0].string.text, "canceled"))
+  else if (!strcmp(which_jobs, "canceled"))
   {
     job_comparison = 0;
-    job_state      = IPP_JOB_CANCELED;
+    job_state      = IPP_JSTATE_CANCELED;
   }
-  else if (!strcmp(attr->values[0].string.text, "pending"))
+  else if (!strcmp(which_jobs, "pending"))
   {
     job_comparison = 0;
-    job_state      = IPP_JOB_PENDING;
+    job_state      = IPP_JSTATE_PENDING;
   }
-  else if (!strcmp(attr->values[0].string.text, "pending-held"))
+  else if (!strcmp(which_jobs, "pending-held"))
   {
     job_comparison = 0;
-    job_state      = IPP_JOB_HELD;
+    job_state      = IPP_JSTATE_HELD;
   }
-  else if (!strcmp(attr->values[0].string.text, "processing"))
+  else if (!strcmp(which_jobs, "processing"))
   {
     job_comparison = 0;
-    job_state      = IPP_JOB_PROCESSING;
+    job_state      = IPP_JSTATE_PROCESSING;
   }
-  else if (!strcmp(attr->values[0].string.text, "processing-stopped"))
+  else if (!strcmp(which_jobs, "processing-stopped"))
   {
     job_comparison = 0;
-    job_state      = IPP_JOB_STOPPED;
+    job_state      = IPP_JSTATE_STOPPED;
   }
   else
   {
-    respond_ipp(client, IPP_ATTRIBUTES,
-                "The which-jobs value \"%s\" is not supported.",
-                attr->values[0].string.text);
+    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, attr->values[0].string.text);
+                 "which-jobs", NULL, which_jobs);
     return;
   }
 
@@ -2584,9 +3473,9 @@ ipp_get_jobs(_ipp_client_t *client)       /* I - Client */
   if ((attr = ippFindAttribute(client->request, "limit",
                                IPP_TAG_INTEGER)) != NULL)
   {
-    limit = attr->values[0].integer;
+    limit = ippGetInteger(attr, 0);
 
-    fprintf(stderr, "%s Get-Jobs limit=%d", client->http.hostname, limit);
+    fprintf(stderr, "%s Get-Jobs limit=%d", client->hostname, limit);
   }
   else
     limit = 0;
@@ -2594,9 +3483,9 @@ ipp_get_jobs(_ipp_client_t *client)       /* I - Client */
   if ((attr = ippFindAttribute(client->request, "first-job-id",
                                IPP_TAG_INTEGER)) != NULL)
   {
-    first_job_id = attr->values[0].integer;
+    first_job_id = ippGetInteger(attr, 0);
 
-    fprintf(stderr, "%s Get-Jobs first-job-id=%d", client->http.hostname,
+    fprintf(stderr, "%s Get-Jobs first-job-id=%d", client->hostname,
             first_job_id);
   }
   else
@@ -2611,23 +3500,25 @@ ipp_get_jobs(_ipp_client_t *client)     /* I - Client */
   if ((attr = ippFindAttribute(client->request, "my-jobs",
                                IPP_TAG_BOOLEAN)) != NULL)
   {
-    fprintf(stderr, "%s Get-Jobs my-jobs=%s\n", client->http.hostname,
-            attr->values[0].boolean ? "true" : "false");
+    int my_jobs = ippGetBoolean(attr, 0);
+
+    fprintf(stderr, "%s Get-Jobs my-jobs=%s\n", client->hostname,
+            my_jobs ? "true" : "false");
 
-    if (attr->values[0].boolean)
+    if (my_jobs)
     {
       if ((attr = ippFindAttribute(client->request, "requesting-user-name",
                                        IPP_TAG_NAME)) == NULL)
       {
-       respond_ipp(client, IPP_BAD_REQUEST,
+       respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
                    "Need requesting-user-name with my-jobs.");
        return;
       }
 
-      username = attr->values[0].string.text;
+      username = ippGetString(attr, 0, NULL);
 
       fprintf(stderr, "%s Get-Jobs requesting-user-name=\"%s\"\n",
-              client->http.hostname, username);
+              client->hostname, username);
     }
   }
 
@@ -2635,21 +3526,9 @@ ipp_get_jobs(_ipp_client_t *client)      /* I - Client */
   * OK, build a list of jobs for this printer...
   */
 
-  if ((ra = create_requested_array(client)) == NULL &&
-      !ippFindAttribute(client->request, "requested-attributes",
-                        IPP_TAG_KEYWORD))
-  {
-   /*
-    * IPP conformance - Get-Jobs has a default requested-attributes value of
-    * "job-id" and "job-uri".
-    */
-
-    ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
-    cupsArrayAdd(ra, "job-id");
-    cupsArrayAdd(ra, "job-uri");
-  }
+  ra = ippCreateRequestedArray(client->request);
 
-  respond_ipp(client, IPP_OK, NULL);
+  respond_ipp(client, IPP_STATUS_OK, NULL);
 
   _cupsRWLockRead(&(client->printer->rwlock));
 
@@ -2665,7 +3544,8 @@ ipp_get_jobs(_ipp_client_t *client)       /* I - Client */
        (job_comparison == 0 && job->state != job_state) ||
        (job_comparison > 0 && job->state < job_state) ||
        job->id < first_job_id ||
-       (username && job->username && _cups_strcasecmp(username, job->username)))
+       (username && job->username &&
+        strcasecmp(username, job->username)))
       continue;
 
     if (count > 0)
@@ -2697,94 +3577,190 @@ ipp_get_printer_attributes(
   * Send the attributes...
   */
 
-  ra      = create_requested_array(client);
+  ra      = ippCreateRequestedArray(client->request);
   printer = client->printer;
 
-  respond_ipp(client, IPP_OK, NULL);
+  respond_ipp(client, IPP_STATUS_OK, NULL);
 
   _cupsRWLockRead(&(printer->rwlock));
 
   copy_attributes(client->response, printer->attrs, ra, IPP_TAG_ZERO,
-                 IPP_TAG_COPY);
-
-  if (!ra || cupsArrayFind(ra, "printer-state"))
-    ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_ENUM,
-                  "printer-state", printer->state);
+                 IPP_TAG_CUPS_CONST);
 
-  if (!ra || cupsArrayFind(ra, "printer-state-reasons"))
+  if (!ra || cupsArrayFind(ra, "media-col-ready"))
   {
-    if (printer->state_reasons == _IPP_PRINTER_NONE)
-      ippAddString(client->response, IPP_TAG_PRINTER,
-                   IPP_TAG_KEYWORD | IPP_TAG_COPY, "printer-state-reasons",
-                  NULL, "none");
-    else
+    int                i,                      /* Looping var */
+               num_ready = 0;          /* Number of ready media */
+    ipp_t      *ready[3];              /* Ready media */
+
+    if (printer->main_size != _IPP_MEDIA_SIZE_NONE)
+    {
+      if (printer->main_type != _IPP_MEDIA_TYPE_NONE)
+        ready[num_ready ++] = create_media_col(media_supported[printer->main_size], "main", media_type_supported[printer->main_type], media_col_sizes[printer->main_size][0], media_col_sizes[printer->main_size][1], 635);
+      else
+        ready[num_ready ++] = create_media_col(media_supported[printer->main_size], "main", NULL, media_col_sizes[printer->main_size][0], media_col_sizes[printer->main_size][1], 635);
+    }
+    if (printer->envelope_size != _IPP_MEDIA_SIZE_NONE)
+      ready[num_ready ++] = create_media_col(media_supported[printer->envelope_size], "envelope", NULL, media_col_sizes[printer->envelope_size][0], media_col_sizes[printer->envelope_size][1], 635);
+    if (printer->photo_size != _IPP_MEDIA_SIZE_NONE)
+    {
+      if (printer->photo_type != _IPP_MEDIA_TYPE_NONE)
+        ready[num_ready ++] = create_media_col(media_supported[printer->photo_size], "photo", media_type_supported[printer->photo_type], media_col_sizes[printer->photo_size][0], media_col_sizes[printer->photo_size][1], 0);
+      else
+        ready[num_ready ++] = create_media_col(media_supported[printer->photo_size], "photo", NULL, media_col_sizes[printer->photo_size][0], media_col_sizes[printer->photo_size][1], 0);
+    }
+
+    if (num_ready)
     {
-      int                      num_reasons = 0;/* Number of reasons */
-      const char               *reasons[32];   /* Reason strings */
-
-      if (printer->state_reasons & _IPP_PRINTER_OTHER)
-       reasons[num_reasons ++] = "other";
-      if (printer->state_reasons & _IPP_PRINTER_COVER_OPEN)
-       reasons[num_reasons ++] = "cover-open";
-      if (printer->state_reasons & _IPP_PRINTER_INPUT_TRAY_MISSING)
-       reasons[num_reasons ++] = "input-tray-missing";
-      if (printer->state_reasons & _IPP_PRINTER_MARKER_SUPPLY_EMPTY)
-       reasons[num_reasons ++] = "marker-supply-empty-warning";
-      if (printer->state_reasons & _IPP_PRINTER_MARKER_SUPPLY_LOW)
-       reasons[num_reasons ++] = "marker-supply-low-report";
-      if (printer->state_reasons & _IPP_PRINTER_MARKER_WASTE_ALMOST_FULL)
-       reasons[num_reasons ++] = "marker-waste-almost-full-report";
-      if (printer->state_reasons & _IPP_PRINTER_MARKER_WASTE_FULL)
-       reasons[num_reasons ++] = "marker-waste-full-warning";
-      if (printer->state_reasons & _IPP_PRINTER_MEDIA_EMPTY)
-       reasons[num_reasons ++] = "media-empty-warning";
-      if (printer->state_reasons & _IPP_PRINTER_MEDIA_JAM)
-       reasons[num_reasons ++] = "media-jam-warning";
-      if (printer->state_reasons & _IPP_PRINTER_MEDIA_LOW)
-       reasons[num_reasons ++] = "media-low-report";
-      if (printer->state_reasons & _IPP_PRINTER_MEDIA_NEEDED)
-       reasons[num_reasons ++] = "media-needed-report";
-      if (printer->state_reasons & _IPP_PRINTER_MOVING_TO_PAUSED)
-       reasons[num_reasons ++] = "moving-to-paused";
-      if (printer->state_reasons & _IPP_PRINTER_PAUSED)
-       reasons[num_reasons ++] = "paused";
-      if (printer->state_reasons & _IPP_PRINTER_SPOOL_AREA_FULL)
-       reasons[num_reasons ++] = "spool-area-full";
-      if (printer->state_reasons & _IPP_PRINTER_TONER_EMPTY)
-       reasons[num_reasons ++] = "toner-empty-warning";
-      if (printer->state_reasons & _IPP_PRINTER_TONER_LOW)
-       reasons[num_reasons ++] = "toner-low-report";
-
-      ippAddStrings(client->response, IPP_TAG_PRINTER,
-                    IPP_TAG_KEYWORD | IPP_TAG_COPY,  "printer-state-reasons",
-                   num_reasons, NULL, reasons);
+      ippAddCollections(client->response, IPP_TAG_PRINTER, "media-col-ready", num_ready, (const ipp_t **)ready);
+      for (i = 0; i < num_ready; i ++)
+        ippDelete(ready[i]);
     }
+    else
+      ippAddOutOfBand(client->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "media-col-ready");
   }
 
-  if (!ra || cupsArrayFind(ra, "printer-up-time"))
-    ippAddInteger(client->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
-                  "printer-up-time", (int)time(NULL));
+  if (!ra || cupsArrayFind(ra, "media-ready"))
+  {
+    int                num_ready = 0;          /* Number of ready media */
+    const char *ready[3];              /* Ready media */
 
-  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_JOB_CANCELED);
+    if (printer->main_size != _IPP_MEDIA_SIZE_NONE)
+      ready[num_ready ++] = media_supported[printer->main_size];
 
-  _cupsRWUnlock(&(printer->rwlock));
+    if (printer->envelope_size != _IPP_MEDIA_SIZE_NONE)
+      ready[num_ready ++] = media_supported[printer->envelope_size];
 
-  cupsArrayDelete(ra);
-}
+    if (printer->photo_size != _IPP_MEDIA_SIZE_NONE)
+      ready[num_ready ++] = media_supported[printer->photo_size];
 
+    if (num_ready)
+      ippAddStrings(client->response, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-ready", num_ready, NULL, ready);
+    else
+      ippAddOutOfBand(client->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "media-ready");
+  }
 
-/*
- * 'ipp_print_job()' - Create a job object with an attached document.
- */
+  if (!ra || cupsArrayFind(ra, "printer-config-change-date-time"))
+    ippAddDate(client->response, IPP_TAG_PRINTER, "printer-config-change-date-time", ippTimeToDate(printer->config_time));
 
-static void
-ipp_print_job(_ipp_client_t *client)   /* I - Client */
-{
-  _ipp_job_t           *job;           /* New job */
+  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", 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 == _IPP_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 */
+      _ipp_preason_t   bit;                    /* Reason bit */
+      int              i;                      /* Looping var */
+      char             reason[32];             /* Reason string */
+
+      for (i = 0, bit = 1; i < (int)(sizeof(_ipp_preason_strings) / sizeof(_ipp_preason_strings[0])); i ++, bit *= 2)
+      {
+        if (printer->state_reasons & bit)
+       {
+         snprintf(reason, sizeof(reason), "%s-%s", _ipp_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-supply"))
+  {
+    int                        i;              /* Looping var */
+    char               buffer[256];    /* Supply value buffer */
+    ipp_attribute_t    *attr = NULL;   /* Attribute */
+    static const char * const colorants[] = { "cyan", "magenta", "yellow", "black", "unknown" };
+
+    for (i = 0; i < 5; i ++)
+    {
+      snprintf(buffer, sizeof(buffer), "index=%d;class=%s;type=%s;unit=percent;maxcapacity=100;level=%d;colorantname=%s;", i + 1, i < 4 ? "supplyThatIsConsumed" : "receptacleThatIsFilled", i < 4 ? "toner" : "wasteToner", printer->supplies[i], colorants[i]);
+
+      if (!attr)
+       attr = ippAddOctetString(client->response, IPP_TAG_PRINTER, "printer-supply", buffer, (int)strlen(buffer));
+      else
+        ippSetOctetString(client->response, &attr, i, buffer, (int)strlen(buffer));
+    }
+  }
+
+  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(
+    _ipp_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(_ipp_client_t *client)   /* I - Client */
+{
+  _ipp_job_t           *job;           /* New job */
   char                 filename[1024], /* Filename buffer */
                        buffer[4096];   /* Copy buffer */
   ssize_t              bytes;          /* Bytes read */
@@ -2797,7 +3773,7 @@ ipp_print_job(_ipp_client_t *client)      /* I - Client */
 
   if (!valid_job_attributes(client))
   {
-    httpFlush(&(client->http));
+    httpFlush(client->http);
     return;
   }
 
@@ -2805,9 +3781,9 @@ ipp_print_job(_ipp_client_t *client)      /* I - Client */
   * Do we have a file to print?
   */
 
-  if (client->http.state == HTTP_POST_SEND)
+  if (httpGetState(client->http) == HTTP_STATE_POST_SEND)
   {
-    respond_ipp(client, IPP_BAD_REQUEST, "No file in request.");
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "No file in request.");
     return;
   }
 
@@ -2817,7 +3793,8 @@ ipp_print_job(_ipp_client_t *client)      /* I - Client */
 
   if ((job = create_job(client)) == NULL)
   {
-    respond_ipp(client, IPP_PRINTER_BUSY, "Currently printing another job.");
+    respond_ipp(client, IPP_STATUS_ERROR_BUSY,
+                "Currently printing another job.");
     return;
   }
 
@@ -2825,45 +3802,34 @@ ipp_print_job(_ipp_client_t *client)    /* I - Client */
   * Create a file for the request data...
   */
 
-  if (!_cups_strcasecmp(job->format, "image/jpeg"))
-    snprintf(filename, sizeof(filename), "%s/%d.jpg",
-             client->printer->directory, job->id);
-  else if (!_cups_strcasecmp(job->format, "image/png"))
-    snprintf(filename, sizeof(filename), "%s/%d.png",
-             client->printer->directory, job->id);
-  else if (!_cups_strcasecmp(job->format, "application/pdf"))
-    snprintf(filename, sizeof(filename), "%s/%d.pdf",
-             client->printer->directory, job->id);
-  else if (!_cups_strcasecmp(job->format, "application/postscript"))
-    snprintf(filename, sizeof(filename), "%s/%d.ps",
-             client->printer->directory, job->id);
-  else
-    snprintf(filename, sizeof(filename), "%s/%d.prn",
-             client->printer->directory, job->id);
+  create_job_filename(client->printer, job, filename, sizeof(filename));
+
+  if (Verbosity)
+    fprintf(stderr, "Creating job file \"%s\", format \"%s\".\n", filename, job->format);
 
   if ((job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0)
   {
-    job->state = IPP_JOB_ABORTED;
+    job->state = IPP_JSTATE_ABORTED;
 
-    respond_ipp(client, IPP_INTERNAL_ERROR,
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
                 "Unable to create print file: %s", strerror(errno));
     return;
   }
 
-  while ((bytes = httpRead2(&(client->http), buffer, sizeof(buffer))) > 0)
+  while ((bytes = httpRead2(client->http, buffer, sizeof(buffer))) > 0)
   {
-    if (write(job->fd, buffer, bytes) < bytes)
+    if (write(job->fd, buffer, (size_t)bytes) < bytes)
     {
       int error = errno;               /* Write error */
 
-      job->state = IPP_JOB_ABORTED;
+      job->state = IPP_JSTATE_ABORTED;
 
       close(job->fd);
       job->fd = -1;
 
       unlink(filename);
 
-      respond_ipp(client, IPP_INTERNAL_ERROR,
+      respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
                   "Unable to write print file: %s", strerror(error));
       return;
     }
@@ -2875,14 +3841,15 @@ ipp_print_job(_ipp_client_t *client)    /* I - Client */
     * Got an error while reading the print data, so abort this job.
     */
 
-    job->state = IPP_JOB_ABORTED;
+    job->state = IPP_JSTATE_ABORTED;
 
     close(job->fd);
     job->fd = -1;
 
     unlink(filename);
 
-    respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to read print file.");
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to read print file.");
     return;
   }
 
@@ -2890,45 +3857,41 @@ ipp_print_job(_ipp_client_t *client)    /* I - Client */
   {
     int error = errno;         /* Write error */
 
-    job->state = IPP_JOB_ABORTED;
+    job->state = IPP_JSTATE_ABORTED;
     job->fd    = -1;
 
     unlink(filename);
 
-    respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to write print file: %s",
-                strerror(error));
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to write print file: %s", strerror(error));
     return;
   }
 
   job->fd       = -1;
   job->filename = strdup(filename);
-  job->state    = IPP_JOB_PENDING;
+  job->state    = IPP_JSTATE_PENDING;
 
  /*
   * Process the job...
   */
 
-#if 0
   if (!_cupsThreadCreate((_cups_thread_func_t)process_job, job))
   {
-    job->state = IPP_JOB_ABORTED;
-    respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to process job.");
+    job->state = IPP_JSTATE_ABORTED;
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to process job.");
     return;
   }
 
-#else
-  process_job(job);
-#endif /* 0 */
-
  /*
   * Return the job info...
   */
 
-  respond_ipp(client, IPP_OK, NULL);
+  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");
 
@@ -2979,7 +3942,7 @@ ipp_print_uri(_ipp_client_t *client)      /* I - Client */
 
   if (!valid_job_attributes(client))
   {
-    httpFlush(&(client->http));
+    httpFlush(client->http);
     return;
   }
 
@@ -2987,9 +3950,9 @@ ipp_print_uri(_ipp_client_t *client)      /* I - Client */
   * Do we have a file to print?
   */
 
-  if (client->http.state == HTTP_POST_RECV)
+  if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
   {
-    respond_ipp(client, IPP_BAD_REQUEST,
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
                 "Unexpected document data following request.");
     return;
   }
@@ -3001,24 +3964,25 @@ ipp_print_uri(_ipp_client_t *client)    /* I - Client */
   if ((uri = ippFindAttribute(client->request, "document-uri",
                               IPP_TAG_URI)) == NULL)
   {
-    respond_ipp(client, IPP_BAD_REQUEST, "Missing document-uri.");
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing document-uri.");
     return;
   }
 
-  if (uri->num_values != 1)
+  if (ippGetCount(uri) != 1)
   {
-    respond_ipp(client, IPP_BAD_REQUEST, "Too many document-uri values.");
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+                "Too many document-uri values.");
     return;
   }
 
-  uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text,
+  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_OK)
+  if (uri_status < HTTP_URI_STATUS_OK)
   {
-    respond_ipp(client, IPP_BAD_REQUEST, "Bad document-uri: %s",
-                uri_status_strings[uri_status - HTTP_URI_OVERFLOW]);
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Bad document-uri: %s",
+                uri_status_strings[uri_status - HTTP_URI_STATUS_OVERFLOW]);
     return;
   }
 
@@ -3028,15 +3992,15 @@ ipp_print_uri(_ipp_client_t *client)    /* I - Client */
 #endif /* HAVE_SSL */
       strcmp(scheme, "http"))
   {
-    respond_ipp(client, IPP_URI_SCHEME, "URI scheme \"%s\" not supported.",
-                scheme);
+    respond_ipp(client, IPP_STATUS_ERROR_URI_SCHEME,
+                "URI scheme \"%s\" not supported.", scheme);
     return;
   }
 
   if (!strcmp(scheme, "file") && access(resource, R_OK))
   {
-    respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to access URI: %s",
-                strerror(errno));
+    respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+                "Unable to access URI: %s", strerror(errno));
     return;
   }
 
@@ -3046,7 +4010,8 @@ ipp_print_uri(_ipp_client_t *client)      /* I - Client */
 
   if ((job = create_job(client)) == NULL)
   {
-    respond_ipp(client, IPP_PRINTER_BUSY, "Currently printing another job.");
+    respond_ipp(client, IPP_STATUS_ERROR_BUSY,
+                "Currently printing another job.");
     return;
   }
 
@@ -3054,16 +4019,16 @@ ipp_print_uri(_ipp_client_t *client)    /* I - Client */
   * Create a file for the request data...
   */
 
-  if (!_cups_strcasecmp(job->format, "image/jpeg"))
+  if (!strcasecmp(job->format, "image/jpeg"))
     snprintf(filename, sizeof(filename), "%s/%d.jpg",
              client->printer->directory, job->id);
-  else if (!_cups_strcasecmp(job->format, "image/png"))
+  else if (!strcasecmp(job->format, "image/png"))
     snprintf(filename, sizeof(filename), "%s/%d.png",
              client->printer->directory, job->id);
-  else if (!_cups_strcasecmp(job->format, "application/pdf"))
+  else if (!strcasecmp(job->format, "application/pdf"))
     snprintf(filename, sizeof(filename), "%s/%d.pdf",
              client->printer->directory, job->id);
-  else if (!_cups_strcasecmp(job->format, "application/postscript"))
+  else if (!strcasecmp(job->format, "application/postscript"))
     snprintf(filename, sizeof(filename), "%s/%d.ps",
              client->printer->directory, job->id);
   else
@@ -3072,9 +4037,9 @@ ipp_print_uri(_ipp_client_t *client)      /* I - Client */
 
   if ((job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0)
   {
-    job->state = IPP_JOB_ABORTED;
+    job->state = IPP_JSTATE_ABORTED;
 
-    respond_ipp(client, IPP_INTERNAL_ERROR,
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
                 "Unable to create print file: %s", strerror(errno));
     return;
   }
@@ -3083,8 +4048,8 @@ ipp_print_uri(_ipp_client_t *client)      /* I - Client */
   {
     if ((infile = open(resource, O_RDONLY)) < 0)
     {
-      respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to access URI: %s",
-                 strerror(errno));
+      respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+                  "Unable to access URI: %s", strerror(errno));
       return;
     }
 
@@ -3093,11 +4058,11 @@ ipp_print_uri(_ipp_client_t *client)    /* I - Client */
       if ((bytes = read(infile, buffer, sizeof(buffer))) < 0 &&
           (errno == EAGAIN || errno == EINTR))
         bytes = 1;
-      else if (bytes > 0 && write(job->fd, buffer, bytes) < bytes)
+      else if (bytes > 0 && write(job->fd, buffer, (size_t)bytes) < bytes)
       {
        int error = errno;              /* Write error */
 
-       job->state = IPP_JOB_ABORTED;
+       job->state = IPP_JSTATE_ABORTED;
 
        close(job->fd);
        job->fd = -1;
@@ -3105,7 +4070,7 @@ ipp_print_uri(_ipp_client_t *client)      /* I - Client */
        unlink(filename);
        close(infile);
 
-       respond_ipp(client, IPP_INTERNAL_ERROR,
+       respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
                    "Unable to write print file: %s", strerror(error));
        return;
       }
@@ -3118,17 +4083,18 @@ ipp_print_uri(_ipp_client_t *client)    /* I - Client */
   {
 #ifdef HAVE_SSL
     if (port == 443 || !strcmp(scheme, "https"))
-      encryption = HTTP_ENCRYPT_ALWAYS;
+      encryption = HTTP_ENCRYPTION_ALWAYS;
     else
 #endif /* HAVE_SSL */
-    encryption = HTTP_ENCRYPT_IF_REQUESTED;
+    encryption = HTTP_ENCRYPTION_IF_REQUESTED;
 
-    if ((http = httpConnectEncrypt(hostname, port, encryption)) == NULL)
+    if ((http = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption,
+                             1, 30000, NULL)) == NULL)
     {
-      respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR,
+      respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
                   "Unable to connect to %s: %s", hostname,
                  cupsLastErrorString());
-      job->state = IPP_JOB_ABORTED;
+      job->state = IPP_JSTATE_ABORTED;
 
       close(job->fd);
       job->fd = -1;
@@ -3141,10 +4107,10 @@ ipp_print_uri(_ipp_client_t *client)    /* I - Client */
     httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en");
     if (httpGet(http, resource))
     {
-      respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to GET URI: %s",
-                 strerror(errno));
+      respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+                  "Unable to GET URI: %s", strerror(errno));
 
-      job->state = IPP_JOB_ABORTED;
+      job->state = IPP_JSTATE_ABORTED;
 
       close(job->fd);
       job->fd = -1;
@@ -3154,14 +4120,14 @@ ipp_print_uri(_ipp_client_t *client)    /* I - Client */
       return;
     }
 
-    while ((status = httpUpdate(http)) == HTTP_CONTINUE);
+    while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE);
 
-    if (status != HTTP_OK)
+    if (status != HTTP_STATUS_OK)
     {
-      respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to GET URI: %s",
-                 httpStatus(status));
+      respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+                  "Unable to GET URI: %s", httpStatus(status));
 
-      job->state = IPP_JOB_ABORTED;
+      job->state = IPP_JSTATE_ABORTED;
 
       close(job->fd);
       job->fd = -1;
@@ -3173,11 +4139,11 @@ ipp_print_uri(_ipp_client_t *client)    /* I - Client */
 
     while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
     {
-      if (write(job->fd, buffer, bytes) < bytes)
+      if (write(job->fd, buffer, (size_t)bytes) < bytes)
       {
        int error = errno;              /* Write error */
 
-       job->state = IPP_JOB_ABORTED;
+       job->state = IPP_JSTATE_ABORTED;
 
        close(job->fd);
        job->fd = -1;
@@ -3185,7 +4151,7 @@ ipp_print_uri(_ipp_client_t *client)      /* I - Client */
        unlink(filename);
        httpClose(http);
 
-       respond_ipp(client, IPP_INTERNAL_ERROR,
+       respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
                    "Unable to write print file: %s", strerror(error));
        return;
       }
@@ -3198,19 +4164,19 @@ ipp_print_uri(_ipp_client_t *client)    /* I - Client */
   {
     int error = errno;         /* Write error */
 
-    job->state = IPP_JOB_ABORTED;
+    job->state = IPP_JSTATE_ABORTED;
     job->fd    = -1;
 
     unlink(filename);
 
-    respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to write print file: %s",
-               strerror(error));
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to write print file: %s", strerror(error));
     return;
   }
 
   job->fd       = -1;
   job->filename = strdup(filename);
-  job->state    = IPP_JOB_PENDING;
+  job->state    = IPP_JSTATE_PENDING;
 
  /*
   * Process the job...
@@ -3219,8 +4185,8 @@ ipp_print_uri(_ipp_client_t *client)      /* I - Client */
 #if 0
   if (!_cupsThreadCreate((_cups_thread_func_t)process_job, job))
   {
-    job->state = IPP_JOB_ABORTED;
-    respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to process job.");
+    job->state = IPP_JSTATE_ABORTED;
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to process job.");
     return;
   }
 
@@ -3232,7 +4198,7 @@ ipp_print_uri(_ipp_client_t *client)      /* I - Client */
   * Return the job info...
   */
 
-  respond_ipp(client, IPP_OK, NULL);
+  respond_ipp(client, IPP_STATUS_OK, NULL);
 
   ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
   cupsArrayAdd(ra, "job-id");
@@ -3267,8 +4233,8 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
 
   if ((job = find_job(client)) == NULL)
   {
-    respond_ipp(client, IPP_NOT_FOUND, "Job does not exist.");
-    httpFlush(&(client->http));
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
+    httpFlush(client->http);
     return;
   }
 
@@ -3277,33 +4243,34 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
   * in a non-pending state...
   */
 
-  if (job->state > IPP_JOB_HELD)
+  if (job->state > IPP_JSTATE_HELD)
   {
-    respond_ipp(client, IPP_NOT_POSSIBLE, "Job is not in a pending state.");
-    httpFlush(&(client->http));
+    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_MULTIPLE_JOBS_NOT_SUPPORTED,
+    respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED,
                 "Multiple document jobs are not supported.");
-    httpFlush(&(client->http));
+    httpFlush(client->http);
     return;
   }
 
   if ((attr = ippFindAttribute(client->request, "last-document",
                                IPP_TAG_ZERO)) == NULL)
   {
-    respond_ipp(client, IPP_BAD_REQUEST,
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
                 "Missing required last-document attribute.");
-    httpFlush(&(client->http));
+    httpFlush(client->http);
     return;
   }
-  else if (attr->value_tag != IPP_TAG_BOOLEAN || attr->num_values != 1 ||
-           !attr->values[0].boolean)
+  else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 ||
+           !ippGetBoolean(attr, 0))
   {
     respond_unsupported(client, attr);
-    httpFlush(&(client->http));
+    httpFlush(client->http);
     return;
   }
 
@@ -3313,19 +4280,22 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
 
   if (!valid_doc_attributes(client))
   {
-    httpFlush(&(client->http));
+    httpFlush(client->http);
     return;
   }
 
+  copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0);
+
  /*
   * Get the document format for the job...
   */
 
   _cupsRWLockWrite(&(client->printer->rwlock));
 
-  if ((attr = ippFindAttribute(job->attrs, "document-format",
-                               IPP_TAG_MIMETYPE)) != NULL)
-    job->format = attr->values[0].string.text;
+  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";
 
@@ -3333,21 +4303,10 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
   * Create a file for the request data...
   */
 
-  if (!_cups_strcasecmp(job->format, "image/jpeg"))
-    snprintf(filename, sizeof(filename), "%s/%d.jpg",
-             client->printer->directory, job->id);
-  else if (!_cups_strcasecmp(job->format, "image/png"))
-    snprintf(filename, sizeof(filename), "%s/%d.png",
-             client->printer->directory, job->id);
-  else if (!_cups_strcasecmp(job->format, "application/pdf"))
-    snprintf(filename, sizeof(filename), "%s/%d.pdf",
-             client->printer->directory, job->id);
-  else if (!_cups_strcasecmp(job->format, "application/postscript"))
-    snprintf(filename, sizeof(filename), "%s/%d.ps",
-             client->printer->directory, job->id);
-  else
-    snprintf(filename, sizeof(filename), "%s/%d.prn",
-             client->printer->directory, job->id);
+  create_job_filename(client->printer, job, filename, sizeof(filename));
+
+  if (Verbosity)
+    fprintf(stderr, "Creating job file \"%s\", format \"%s\".\n", filename, job->format);
 
   job->fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600);
 
@@ -3355,27 +4314,27 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
 
   if (job->fd < 0)
   {
-    job->state = IPP_JOB_ABORTED;
+    job->state = IPP_JSTATE_ABORTED;
 
-    respond_ipp(client, IPP_INTERNAL_ERROR,
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
                 "Unable to create print file: %s", strerror(errno));
     return;
   }
 
-  while ((bytes = httpRead2(&(client->http), buffer, sizeof(buffer))) > 0)
+  while ((bytes = httpRead2(client->http, buffer, sizeof(buffer))) > 0)
   {
-    if (write(job->fd, buffer, bytes) < bytes)
+    if (write(job->fd, buffer, (size_t)bytes) < bytes)
     {
       int error = errno;               /* Write error */
 
-      job->state = IPP_JOB_ABORTED;
+      job->state = IPP_JSTATE_ABORTED;
 
       close(job->fd);
       job->fd = -1;
 
       unlink(filename);
 
-      respond_ipp(client, IPP_INTERNAL_ERROR,
+      respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
                   "Unable to write print file: %s", strerror(error));
       return;
     }
@@ -3387,14 +4346,15 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
     * Got an error while reading the print data, so abort this job.
     */
 
-    job->state = IPP_JOB_ABORTED;
+    job->state = IPP_JSTATE_ABORTED;
 
     close(job->fd);
     job->fd = -1;
 
     unlink(filename);
 
-    respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to read print file.");
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to read print file.");
     return;
   }
 
@@ -3402,13 +4362,13 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
   {
     int error = errno;                 /* Write error */
 
-    job->state = IPP_JOB_ABORTED;
+    job->state = IPP_JSTATE_ABORTED;
     job->fd    = -1;
 
     unlink(filename);
 
-    respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to write print file: %s",
-                strerror(error));
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to write print file: %s", strerror(error));
     return;
   }
 
@@ -3416,7 +4376,7 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
 
   job->fd       = -1;
   job->filename = strdup(filename);
-  job->state    = IPP_JOB_PENDING;
+  job->state    = IPP_JSTATE_PENDING;
 
   _cupsRWUnlock(&(client->printer->rwlock));
 
@@ -3427,8 +4387,8 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
 #if 0
   if (!_cupsThreadCreate((_cups_thread_func_t)process_job, job))
   {
-    job->state = IPP_JOB_ABORTED;
-    respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to process job.");
+    job->state = IPP_JSTATE_ABORTED;
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to process job.");
     return;
   }
 
@@ -3440,7 +4400,7 @@ ipp_send_document(_ipp_client_t *client)/* I - Client */
   * Return the job info...
   */
 
-  respond_ipp(client, IPP_OK, NULL);
+  respond_ipp(client, IPP_STATUS_OK, NULL);
 
   ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
   cupsArrayAdd(ra, "job-id");
@@ -3497,8 +4457,8 @@ ipp_send_uri(_ipp_client_t *client)       /* I - Client */
 
   if ((job = find_job(client)) == NULL)
   {
-    respond_ipp(client, IPP_NOT_FOUND, "Job does not exist.");
-    httpFlush(&(client->http));
+    respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist.");
+    httpFlush(client->http);
     return;
   }
 
@@ -3507,33 +4467,34 @@ ipp_send_uri(_ipp_client_t *client)     /* I - Client */
   * in a non-pending state...
   */
 
-  if (job->state > IPP_JOB_HELD)
+  if (job->state > IPP_JSTATE_HELD)
   {
-    respond_ipp(client, IPP_NOT_POSSIBLE, "Job is not in a pending state.");
-    httpFlush(&(client->http));
+    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_MULTIPLE_JOBS_NOT_SUPPORTED,
+    respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED,
                 "Multiple document jobs are not supported.");
-    httpFlush(&(client->http));
+    httpFlush(client->http);
     return;
   }
 
   if ((attr = ippFindAttribute(client->request, "last-document",
                                IPP_TAG_ZERO)) == NULL)
   {
-    respond_ipp(client, IPP_BAD_REQUEST,
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
                 "Missing required last-document attribute.");
-    httpFlush(&(client->http));
+    httpFlush(client->http);
     return;
   }
-  else if (attr->value_tag != IPP_TAG_BOOLEAN || attr->num_values != 1 ||
-           !attr->values[0].boolean)
+  else if (ippGetValueTag(attr) != IPP_TAG_BOOLEAN || ippGetCount(attr) != 1 ||
+           !ippGetBoolean(attr, 0))
   {
     respond_unsupported(client, attr);
-    httpFlush(&(client->http));
+    httpFlush(client->http);
     return;
   }
 
@@ -3543,7 +4504,7 @@ ipp_send_uri(_ipp_client_t *client)       /* I - Client */
 
   if (!valid_doc_attributes(client))
   {
-    httpFlush(&(client->http));
+    httpFlush(client->http);
     return;
   }
 
@@ -3551,9 +4512,9 @@ ipp_send_uri(_ipp_client_t *client)       /* I - Client */
   * Do we have a file to print?
   */
 
-  if (client->http.state == HTTP_POST_RECV)
+  if (httpGetState(client->http) == HTTP_STATE_POST_RECV)
   {
-    respond_ipp(client, IPP_BAD_REQUEST,
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
                 "Unexpected document data following request.");
     return;
   }
@@ -3565,24 +4526,25 @@ ipp_send_uri(_ipp_client_t *client)     /* I - Client */
   if ((uri = ippFindAttribute(client->request, "document-uri",
                               IPP_TAG_URI)) == NULL)
   {
-    respond_ipp(client, IPP_BAD_REQUEST, "Missing document-uri.");
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing document-uri.");
     return;
   }
 
-  if (uri->num_values != 1)
+  if (ippGetCount(uri) != 1)
   {
-    respond_ipp(client, IPP_BAD_REQUEST, "Too many document-uri values.");
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+                "Too many document-uri values.");
     return;
   }
 
-  uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text,
+  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_OK)
+  if (uri_status < HTTP_URI_STATUS_OK)
   {
-    respond_ipp(client, IPP_BAD_REQUEST, "Bad document-uri: %s",
-                uri_status_strings[uri_status - HTTP_URI_OVERFLOW]);
+    respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Bad document-uri: %s",
+                uri_status_strings[uri_status - HTTP_URI_STATUS_OVERFLOW]);
     return;
   }
 
@@ -3592,15 +4554,15 @@ ipp_send_uri(_ipp_client_t *client)     /* I - Client */
 #endif /* HAVE_SSL */
       strcmp(scheme, "http"))
   {
-    respond_ipp(client, IPP_URI_SCHEME, "URI scheme \"%s\" not supported.",
-                scheme);
+    respond_ipp(client, IPP_STATUS_ERROR_URI_SCHEME,
+                "URI scheme \"%s\" not supported.", scheme);
     return;
   }
 
   if (!strcmp(scheme, "file") && access(resource, R_OK))
   {
-    respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to access URI: %s",
-                strerror(errno));
+    respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+                "Unable to access URI: %s", strerror(errno));
     return;
   }
 
@@ -3612,7 +4574,7 @@ ipp_send_uri(_ipp_client_t *client)       /* I - Client */
 
   if ((attr = ippFindAttribute(job->attrs, "document-format",
                                IPP_TAG_MIMETYPE)) != NULL)
-    job->format = attr->values[0].string.text;
+    job->format = ippGetString(attr, 0, NULL);
   else
     job->format = "application/octet-stream";
 
@@ -3620,16 +4582,16 @@ ipp_send_uri(_ipp_client_t *client)     /* I - Client */
   * Create a file for the request data...
   */
 
-  if (!_cups_strcasecmp(job->format, "image/jpeg"))
+  if (!strcasecmp(job->format, "image/jpeg"))
     snprintf(filename, sizeof(filename), "%s/%d.jpg",
              client->printer->directory, job->id);
-  else if (!_cups_strcasecmp(job->format, "image/png"))
+  else if (!strcasecmp(job->format, "image/png"))
     snprintf(filename, sizeof(filename), "%s/%d.png",
              client->printer->directory, job->id);
-  else if (!_cups_strcasecmp(job->format, "application/pdf"))
+  else if (!strcasecmp(job->format, "application/pdf"))
     snprintf(filename, sizeof(filename), "%s/%d.pdf",
              client->printer->directory, job->id);
-  else if (!_cups_strcasecmp(job->format, "application/postscript"))
+  else if (!strcasecmp(job->format, "application/postscript"))
     snprintf(filename, sizeof(filename), "%s/%d.ps",
              client->printer->directory, job->id);
   else
@@ -3642,9 +4604,9 @@ ipp_send_uri(_ipp_client_t *client)       /* I - Client */
 
   if (job->fd < 0)
   {
-    job->state = IPP_JOB_ABORTED;
+    job->state = IPP_JSTATE_ABORTED;
 
-    respond_ipp(client, IPP_INTERNAL_ERROR,
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
                 "Unable to create print file: %s", strerror(errno));
     return;
   }
@@ -3653,8 +4615,8 @@ ipp_send_uri(_ipp_client_t *client)       /* I - Client */
   {
     if ((infile = open(resource, O_RDONLY)) < 0)
     {
-      respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to access URI: %s",
-                 strerror(errno));
+      respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+                  "Unable to access URI: %s", strerror(errno));
       return;
     }
 
@@ -3663,11 +4625,11 @@ ipp_send_uri(_ipp_client_t *client)     /* I - Client */
       if ((bytes = read(infile, buffer, sizeof(buffer))) < 0 &&
           (errno == EAGAIN || errno == EINTR))
         bytes = 1;
-      else if (bytes > 0 && write(job->fd, buffer, bytes) < bytes)
+      else if (bytes > 0 && write(job->fd, buffer, (size_t)bytes) < bytes)
       {
        int error = errno;              /* Write error */
 
-       job->state = IPP_JOB_ABORTED;
+       job->state = IPP_JSTATE_ABORTED;
 
        close(job->fd);
        job->fd = -1;
@@ -3675,7 +4637,7 @@ ipp_send_uri(_ipp_client_t *client)       /* I - Client */
        unlink(filename);
        close(infile);
 
-       respond_ipp(client, IPP_INTERNAL_ERROR,
+       respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
                    "Unable to write print file: %s", strerror(error));
        return;
       }
@@ -3688,17 +4650,18 @@ ipp_send_uri(_ipp_client_t *client)     /* I - Client */
   {
 #ifdef HAVE_SSL
     if (port == 443 || !strcmp(scheme, "https"))
-      encryption = HTTP_ENCRYPT_ALWAYS;
+      encryption = HTTP_ENCRYPTION_ALWAYS;
     else
 #endif /* HAVE_SSL */
-    encryption = HTTP_ENCRYPT_IF_REQUESTED;
+    encryption = HTTP_ENCRYPTION_IF_REQUESTED;
 
-    if ((http = httpConnectEncrypt(hostname, port, encryption)) == NULL)
+    if ((http = httpConnect2(hostname, port, NULL, AF_UNSPEC, encryption,
+                             1, 30000, NULL)) == NULL)
     {
-      respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR,
+      respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
                   "Unable to connect to %s: %s", hostname,
                  cupsLastErrorString());
-      job->state = IPP_JOB_ABORTED;
+      job->state = IPP_JSTATE_ABORTED;
 
       close(job->fd);
       job->fd = -1;
@@ -3711,10 +4674,10 @@ ipp_send_uri(_ipp_client_t *client)     /* I - Client */
     httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en");
     if (httpGet(http, resource))
     {
-      respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to GET URI: %s",
-                 strerror(errno));
+      respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+                  "Unable to GET URI: %s", strerror(errno));
 
-      job->state = IPP_JOB_ABORTED;
+      job->state = IPP_JSTATE_ABORTED;
 
       close(job->fd);
       job->fd = -1;
@@ -3724,14 +4687,14 @@ ipp_send_uri(_ipp_client_t *client)     /* I - Client */
       return;
     }
 
-    while ((status = httpUpdate(http)) == HTTP_CONTINUE);
+    while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE);
 
-    if (status != HTTP_OK)
+    if (status != HTTP_STATUS_OK)
     {
-      respond_ipp(client, IPP_DOCUMENT_ACCESS_ERROR, "Unable to GET URI: %s",
-                 httpStatus(status));
+      respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS,
+                  "Unable to GET URI: %s", httpStatus(status));
 
-      job->state = IPP_JOB_ABORTED;
+      job->state = IPP_JSTATE_ABORTED;
 
       close(job->fd);
       job->fd = -1;
@@ -3743,11 +4706,11 @@ ipp_send_uri(_ipp_client_t *client)     /* I - Client */
 
     while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0)
     {
-      if (write(job->fd, buffer, bytes) < bytes)
+      if (write(job->fd, buffer, (size_t)bytes) < bytes)
       {
        int error = errno;              /* Write error */
 
-       job->state = IPP_JOB_ABORTED;
+       job->state = IPP_JSTATE_ABORTED;
 
        close(job->fd);
        job->fd = -1;
@@ -3755,7 +4718,7 @@ ipp_send_uri(_ipp_client_t *client)       /* I - Client */
        unlink(filename);
        httpClose(http);
 
-       respond_ipp(client, IPP_INTERNAL_ERROR,
+       respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
                    "Unable to write print file: %s", strerror(error));
        return;
       }
@@ -3768,13 +4731,13 @@ ipp_send_uri(_ipp_client_t *client)     /* I - Client */
   {
     int error = errno;         /* Write error */
 
-    job->state = IPP_JOB_ABORTED;
+    job->state = IPP_JSTATE_ABORTED;
     job->fd    = -1;
 
     unlink(filename);
 
-    respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to write print file: %s",
-               strerror(error));
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL,
+                "Unable to write print file: %s", strerror(error));
     return;
   }
 
@@ -3782,7 +4745,7 @@ ipp_send_uri(_ipp_client_t *client)       /* I - Client */
 
   job->fd       = -1;
   job->filename = strdup(filename);
-  job->state    = IPP_JOB_PENDING;
+  job->state    = IPP_JSTATE_PENDING;
 
   _cupsRWUnlock(&(client->printer->rwlock));
 
@@ -3793,8 +4756,8 @@ ipp_send_uri(_ipp_client_t *client)       /* I - Client */
 #if 0
   if (!_cupsThreadCreate((_cups_thread_func_t)process_job, job))
   {
-    job->state = IPP_JOB_ABORTED;
-    respond_ipp(client, IPP_INTERNAL_ERROR, "Unable to process job.");
+    job->state = IPP_JSTATE_ABORTED;
+    respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to process job.");
     return;
   }
 
@@ -3806,7 +4769,7 @@ ipp_send_uri(_ipp_client_t *client)       /* I - Client */
   * Return the job info...
   */
 
-  respond_ipp(client, IPP_OK, NULL);
+  respond_ipp(client, IPP_STATUS_OK, NULL);
 
   ra = cupsArrayNew((cups_array_func_t)strcmp, NULL);
   cupsArrayAdd(ra, "job-id");
@@ -3827,7 +4790,345 @@ static void
 ipp_validate_job(_ipp_client_t *client)        /* I - Client */
 {
   if (valid_job_attributes(client))
-    respond_ipp(client, IPP_OK, NULL);
+    respond_ipp(client, IPP_STATUS_OK, NULL);
+}
+
+
+/*
+ * 'load_attributes()' - Load printer attributes from a file.
+ *
+ * Syntax is based on ipptool format:
+ *
+ *    ATTR value-tag name value
+ */
+
+static void
+load_attributes(const char *filename,  /* I - File to load */
+                ipp_t      *attrs)     /* I - Printer attributes */
+{
+  int          linenum = 0;            /* Current line number */
+  FILE         *fp = NULL;             /* Test file */
+  char         attr[128],              /* Attribute name */
+               token[1024],            /* Token from file */
+               *tokenptr;              /* Pointer into token */
+  ipp_tag_t    value;                  /* Current value type */
+  ipp_attribute_t *attrptr,            /* Attribute pointer */
+               *lastcol = NULL;        /* Last collection attribute */
+
+
+  if ((fp = fopen(filename, "r")) == NULL)
+  {
+    fprintf(stderr, "ippserver: Unable to open \"%s\": %s\n", filename, strerror(errno));
+    exit(1);
+  }
+
+  while (get_token(fp, token, sizeof(token), &linenum) != NULL)
+  {
+    if (!_cups_strcasecmp(token, "ATTR"))
+    {
+     /*
+      * Attribute...
+      */
+
+      if (!get_token(fp, token, sizeof(token), &linenum))
+      {
+       fprintf(stderr, "ippserver: Missing ATTR value tag on line %d of \"%s\".\n", linenum, filename);
+        exit(1);
+      }
+
+      if ((value = ippTagValue(token)) == IPP_TAG_ZERO)
+      {
+       fprintf(stderr, "ippserver: Bad ATTR value tag \"%s\" on line %d of \"%s\".\n", token, linenum, filename);
+       exit(1);
+      }
+
+      if (!get_token(fp, attr, sizeof(attr), &linenum))
+      {
+       fprintf(stderr, "ippserver: Missing ATTR name on line %d of \"%s\".\n", linenum, filename);
+       exit(1);
+      }
+
+      if (!get_token(fp, token, sizeof(token), &linenum))
+      {
+       fprintf(stderr, "ippserver: Missing ATTR value on line %d of \"%s\".\n", linenum, filename);
+       exit(1);
+      }
+
+      attrptr = NULL;
+
+      switch (value)
+      {
+       case IPP_TAG_BOOLEAN :
+           if (!_cups_strcasecmp(token, "true"))
+             attrptr = ippAddBoolean(attrs, IPP_TAG_PRINTER, attr, 1);
+           else
+             attrptr = ippAddBoolean(attrs, IPP_TAG_PRINTER, attr, (char)atoi(token));
+           break;
+
+       case IPP_TAG_INTEGER :
+       case IPP_TAG_ENUM :
+           if (!strchr(token, ','))
+             attrptr = ippAddInteger(attrs, IPP_TAG_PRINTER, value, attr, (int)strtol(token, &tokenptr, 0));
+           else
+           {
+             int       values[100],    /* Values */
+                       num_values = 1; /* Number of values */
+
+             values[0] = (int)strtol(token, &tokenptr, 10);
+             while (tokenptr && *tokenptr &&
+                    num_values < (int)(sizeof(values) / sizeof(values[0])))
+             {
+               if (*tokenptr == ',')
+                 tokenptr ++;
+               else if (!isdigit(*tokenptr & 255) && *tokenptr != '-')
+                 break;
+
+               values[num_values] = (int)strtol(tokenptr, &tokenptr, 0);
+               num_values ++;
+             }
+
+             attrptr = ippAddIntegers(attrs, IPP_TAG_PRINTER, value, attr, num_values, values);
+           }
+
+           if (!tokenptr || *tokenptr)
+           {
+             fprintf(stderr, "ippserver: Bad %s value \"%s\" on line %d of \"%s\".\n", ippTagString(value), token, linenum, filename);
+             exit(1);
+           }
+           break;
+
+       case IPP_TAG_RESOLUTION :
+           {
+             int       xres,           /* X resolution */
+                       yres;           /* Y resolution */
+             ipp_res_t units;          /* Units */
+             char      *start,         /* Start of value */
+                       *ptr,           /* Pointer into value */
+                       *next = NULL;   /* Next value */
+
+             for (start = token; start; start = next)
+             {
+               xres = yres = (int)strtol(start, (char **)&ptr, 10);
+               if (ptr > start && xres > 0)
+               {
+                 if (*ptr == 'x')
+                   yres = (int)strtol(ptr + 1, (char **)&ptr, 10);
+               }
+
+               if (ptr && (next = strchr(ptr, ',')) != NULL)
+                 *next++ = '\0';
+
+               if (ptr <= start || xres <= 0 || yres <= 0 || !ptr ||
+                   (_cups_strcasecmp(ptr, "dpi") &&
+                    _cups_strcasecmp(ptr, "dpc") &&
+                    _cups_strcasecmp(ptr, "dpcm") &&
+                    _cups_strcasecmp(ptr, "other")))
+               {
+                 fprintf(stderr, "ippserver: Bad resolution value \"%s\" on line %d of \"%s\".\n", token, linenum, filename);
+                 exit(1);
+               }
+
+               if (!_cups_strcasecmp(ptr, "dpc") || !_cups_strcasecmp(ptr, "dpcm"))
+                 units = IPP_RES_PER_CM;
+               else
+                 units = IPP_RES_PER_INCH;
+
+                if (attrptr)
+                 ippSetResolution(attrs, &attrptr, ippGetCount(attrptr), units, xres, yres);
+               else
+                 attrptr = ippAddResolution(attrs, IPP_TAG_PRINTER, attr, units, xres, yres);
+             }
+           }
+           break;
+
+       case IPP_TAG_RANGE :
+           {
+             int       lowers[4],      /* Lower value */
+                       uppers[4],      /* Upper values */
+                       num_vals;       /* Number of values */
+
+
+             num_vals = sscanf(token, "%d-%d,%d-%d,%d-%d,%d-%d",
+                               lowers + 0, uppers + 0,
+                               lowers + 1, uppers + 1,
+                               lowers + 2, uppers + 2,
+                               lowers + 3, uppers + 3);
+
+             if ((num_vals & 1) || num_vals == 0)
+             {
+               fprintf(stderr, "ippserver: Bad rangeOfInteger value \"%s\" on line %d of \"%s\".", token, linenum, filename);
+               exit(1);
+             }
+
+             attrptr = ippAddRanges(attrs, IPP_TAG_PRINTER, attr, num_vals / 2, lowers,
+                                    uppers);
+           }
+           break;
+
+       case IPP_TAG_BEGIN_COLLECTION :
+           if (!strcmp(token, "{"))
+           {
+             ipp_t     *col = get_collection(fp, filename, &linenum);
+                                   /* Collection value */
+
+             if (col)
+             {
+               attrptr = lastcol = ippAddCollection(attrs, IPP_TAG_PRINTER, attr, col);
+               ippDelete(col);
+             }
+             else
+               exit(1);
+           }
+           else
+           {
+             fprintf(stderr, "ippserver: Bad ATTR collection value on line %d of \"%s\".\n", linenum, filename);
+             exit(1);
+           }
+
+           do
+           {
+             ipp_t     *col;                   /* Collection value */
+             long      pos = ftell(fp);        /* Save position of file */
+
+             if (!get_token(fp, token, sizeof(token), &linenum))
+               break;
+
+             if (strcmp(token, ","))
+             {
+               fseek(fp, pos, SEEK_SET);
+               break;
+             }
+
+             if (!get_token(fp, token, sizeof(token), &linenum) || strcmp(token, "{"))
+             {
+               fprintf(stderr, "ippserver: Unexpected \"%s\" on line %d of \"%s\".\n", token, linenum, filename);
+               exit(1);
+             }
+
+             if ((col = get_collection(fp, filename, &linenum)) == NULL)
+               break;
+
+             ippSetCollection(attrs, &attrptr, ippGetCount(attrptr), col);
+             lastcol = attrptr;
+           }
+           while (!strcmp(token, "{"));
+           break;
+
+       case IPP_TAG_STRING :
+           attrptr = ippAddOctetString(attrs, IPP_TAG_PRINTER, attr, token, (int)strlen(token));
+           break;
+
+       default :
+           fprintf(stderr, "ippserver: Unsupported ATTR value tag %s on line %d of \"%s\".\n", ippTagString(value), linenum, filename);
+           exit(1);
+
+       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 (!strchr(token, ','))
+             attrptr = ippAddString(attrs, IPP_TAG_PRINTER, value, attr, NULL, token);
+           else
+           {
+            /*
+             * Multiple string values...
+             */
+
+             int       num_values;     /* Number of values */
+             char      *values[100],   /* Values */
+                       *ptr;           /* Pointer to next value */
+
+
+             values[0]  = token;
+             num_values = 1;
+
+             for (ptr = strchr(token, ','); ptr; ptr = strchr(ptr, ','))
+             {
+               if (ptr > token && ptr[-1] == '\\')
+                 _cups_strcpy(ptr - 1, ptr);
+               else
+               {
+                 *ptr++ = '\0';
+                 values[num_values] = ptr;
+                 num_values ++;
+                 if (num_values >= (int)(sizeof(values) / sizeof(values[0])))
+                   break;
+               }
+             }
+
+             attrptr = ippAddStrings(attrs, IPP_TAG_PRINTER, value, attr, num_values, NULL, (const char **)values);
+           }
+           break;
+      }
+
+      if (!attrptr)
+      {
+        fprintf(stderr, "ippserver: Unable to add attribute on line %d of \"%s\": %s\n", linenum, filename, cupsLastErrorString());
+        exit(1);
+      }
+    }
+    else
+    {
+      fprintf(stderr, "ippserver: Unknown directive \"%s\" on line %d of \"%s\".\n", token, linenum, filename);
+      exit(1);
+    }
+  }
+
+  fclose(fp);
+}
+
+
+/*
+ * '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(_ipp_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(
+    _ipp_job_t *job,                   /* I - Job */
+    char       *message)               /* I - Message */
+{
+  (void)job;
+  (void)message;
 }
 
 
@@ -3842,9 +5143,41 @@ process_client(_ipp_client_t *client)    /* I - Client */
   * Loop until we are out of requests or timeout (30 seconds)...
   */
 
-  while (httpWait(&(client->http), 30000))
+#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...
@@ -3863,175 +5196,131 @@ process_client(_ipp_client_t *client) /* I - Client */
 int                                    /* O - 1 on success, 0 on failure */
 process_http(_ipp_client_t *client)    /* I - Client connection */
 {
-  char                 line[4096],     /* Line from client... */
-                       operation[64],  /* Operation code from socket */
-                       uri[1024],      /* URI */
-                       version[64],    /* HTTP version number string */
-                       *ptr;           /* Pointer into strings */
-  int                  major, minor;   /* HTTP version numbers */
-  http_status_t                status;         /* Transfer status */
-  ipp_state_t          state;          /* State of IPP transfer */
-
-
- /*
-  * Abort if we have an error on the 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 */
+  const char           *encoding;      /* Content-Encoding value */
+  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"
+  };
 
-  if (client->http.error)
-    return (0);
 
  /*
   * Clear state variables...
   */
 
-  httpClearFields(&(client->http));
   ippDelete(client->request);
   ippDelete(client->response);
 
-  client->http.activity       = time(NULL);
-  client->http.version        = HTTP_1_1;
-  client->http.keep_alive     = HTTP_KEEPALIVE_OFF;
-  client->http.data_encoding  = HTTP_ENCODE_LENGTH;
-  client->http.data_remaining = 0;
-  client->request             = NULL;
-  client->response            = NULL;
-  client->operation           = HTTP_WAITING;
+  client->request   = NULL;
+  client->response  = NULL;
+  client->operation = HTTP_STATE_WAITING;
 
  /*
   * Read a request from the connection...
   */
 
-  while ((ptr = httpGets(line, sizeof(line) - 1, &(client->http))) != NULL)
-    if (*ptr)
-      break;
-
-  if (!ptr)
-    return (0);
+  while ((http_state = httpReadRequest(client->http, uri,
+                                       sizeof(uri))) == HTTP_STATE_WAITING)
+    usleep(1);
 
  /*
   * Parse the request line...
   */
 
-  fprintf(stderr, "%s %s\n", client->http.hostname, line);
-
-  switch (sscanf(line, "%63s%1023s%63s", operation, uri, version))
+  if (http_state == HTTP_STATE_ERROR)
   {
-    case 1 :
-       fprintf(stderr, "%s Bad request line.\n", client->http.hostname);
-       respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
-       return (0);
-
-    case 2 :
-       client->http.version = HTTP_0_9;
-       break;
-
-    case 3 :
-       if (sscanf(version, "HTTP/%d.%d", &major, &minor) != 2)
-       {
-         fprintf(stderr, "%s Bad HTTP version.\n", client->http.hostname);
-         respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
-         return (0);
-       }
+    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)));
 
-       if (major < 2)
-       {
-         client->http.version = (http_version_t)(major * 100 + minor);
-         if (client->http.version == HTTP_1_1)
-           client->http.keep_alive = HTTP_KEEPALIVE_ON;
-         else
-           client->http.keep_alive = HTTP_KEEPALIVE_OFF;
-       }
-       else
-       {
-         respond_http(client, HTTP_NOT_SUPPORTED, NULL, 0);
-         return (0);
-       }
-       break;
+    return (0);
   }
-
- /*
-  * Handle full URLs in the request line...
-  */
-
-  if (!strncmp(client->uri, "http:", 5) || !strncmp(client->uri, "ipp:", 4))
+  else if (http_state == HTTP_STATE_UNKNOWN_METHOD)
   {
-    char       scheme[32],             /* Method/scheme */
-               userpass[128],          /* Username:password */
-               hostname[HTTP_MAX_HOST];/* Hostname */
-    int                port;                   /* Port number */
-
-   /*
-    * 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_OK)
-    {
-      fprintf(stderr, "%s Bad URI \"%s\".\n", client->http.hostname, uri);
-      respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
-      return (0);
-    }
+    fprintf(stderr, "%s Bad/unknown operation.\n", client->hostname);
+    respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
+    return (0);
   }
-  else
+  else if (http_state == HTTP_STATE_UNKNOWN_VERSION)
   {
-   /*
-    * Decode URI
-    */
-
-    if (!_httpDecodeURI(client->uri, uri, sizeof(client->uri)))
-    {
-      fprintf(stderr, "%s Bad URI \"%s\".\n", client->http.hostname, uri);
-      respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
-      return (0);
-    }
+    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);
+
  /*
-  * Process the request...
+  * Separate the URI into its components...
   */
 
-  if (!strcmp(operation, "GET"))
-    client->http.state = HTTP_GET;
-  else if (!strcmp(operation, "POST"))
-    client->http.state = HTTP_POST;
-  else if (!strcmp(operation, "OPTIONS"))
-    client->http.state = HTTP_OPTIONS;
-  else if (!strcmp(operation, "HEAD"))
-    client->http.state = HTTP_HEAD;
-  else
+  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 operation \"%s\".\n", client->http.hostname,
-            operation);
-    respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
+    fprintf(stderr, "%s Bad URI \"%s\".\n", client->hostname, uri);
+    respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
     return (0);
   }
 
-  client->start       = time(NULL);
-  client->operation   = client->http.state;
-  client->http.status = HTTP_OK;
+  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 ((status = httpUpdate(&(client->http))) == HTTP_CONTINUE);
+  while ((http_status = httpUpdate(client->http)) == HTTP_STATUS_CONTINUE);
 
-  if (status != HTTP_OK)
+  if (http_status != HTTP_STATUS_OK)
   {
-    respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
+    respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
     return (0);
   }
 
-  if (!client->http.fields[HTTP_FIELD_HOST][0] &&
-      client->http.version >= HTTP_1_1)
+  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_BAD_REQUEST, NULL, 0);
+    respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
     return (0);
   }
 
@@ -4039,9 +5328,29 @@ process_http(_ipp_client_t *client)      /* I - Client connection */
   * Handle HTTP Upgrade...
   */
 
-  if (!_cups_strcasecmp(client->http.fields[HTTP_FIELD_CONNECTION], "Upgrade"))
+  if (!strcasecmp(httpGetField(client->http, HTTP_FIELD_CONNECTION),
+                        "Upgrade"))
   {
-    if (!respond_http(client, HTTP_NOT_IMPLEMENTED, NULL, 0))
+#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);
   }
 
@@ -4049,16 +5358,17 @@ process_http(_ipp_client_t *client)     /* I - Client connection */
   * Handle HTTP Expect...
   */
 
-  if (client->http.expect &&
-      (client->operation == HTTP_POST || client->operation == HTTP_PUT))
+  if (httpGetExpect(client->http) &&
+      (client->operation == HTTP_STATE_POST ||
+       client->operation == HTTP_STATE_PUT))
   {
-    if (client->http.expect == HTTP_CONTINUE)
+    if (httpGetExpect(client->http) == HTTP_STATUS_CONTINUE)
     {
      /*
       * Send 100-continue header...
       */
 
-      if (!respond_http(client, HTTP_CONTINUE, NULL, 0))
+      if (!respond_http(client, HTTP_STATUS_CONTINUE, NULL, NULL, 0))
        return (0);
     }
     else
@@ -4067,13 +5377,8 @@ process_http(_ipp_client_t *client)      /* I - Client connection */
       * Send 417-expectation-failed header...
       */
 
-      if (!respond_http(client, HTTP_EXPECTATION_FAILED, NULL, 0))
+      if (!respond_http(client, HTTP_STATUS_EXPECTATION_FAILED, NULL, NULL, 0))
        return (0);
-
-      httpPrintf(&(client->http), "Content-Length: 0\r\n");
-      httpPrintf(&(client->http), "\r\n");
-      httpFlushWrite(&(client->http));
-      client->http.data_encoding = HTTP_ENCODE_LENGTH;
     }
   }
 
@@ -4081,25 +5386,26 @@ process_http(_ipp_client_t *client)     /* I - Client connection */
   * Handle new transfers...
   */
 
+  encoding = httpGetContentEncoding(client->http);
+
   switch (client->operation)
   {
-    case HTTP_OPTIONS :
+    case HTTP_STATE_OPTIONS :
        /*
-       * Do HEAD/OPTIONS command...
+       * Do OPTIONS command...
        */
 
-       return (respond_http(client, HTTP_OK, NULL, 0));
+       return (respond_http(client, HTTP_STATUS_OK, NULL, NULL, 0));
 
-    case HTTP_HEAD :
+    case HTTP_STATE_HEAD :
         if (!strcmp(client->uri, "/icon.png"))
-         return (respond_http(client, HTTP_OK, "image/png", 0));
-       else if (!strcmp(client->uri, "/"))
-         return (respond_http(client, HTTP_OK, "text/html", 0));
+         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_NOT_FOUND, NULL, 0));
-       break;
+         return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
 
-    case HTTP_GET :
+    case HTTP_STATE_GET :
         if (!strcmp(client->uri, "/icon.png"))
        {
         /*
@@ -4111,24 +5417,27 @@ process_http(_ipp_client_t *client)     /* I - Client connection */
          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_OK, "image/png", fileinfo.st_size))
+           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, bytes);
+             httpWrite2(client->http, buffer, (size_t)bytes);
 
-           httpFlushWrite(&(client->http));
+           httpFlushWrite(client->http);
 
            close(fd);
          }
          else
-           return (respond_http(client, HTTP_NOT_FOUND, NULL, 0));
+           return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
        }
        else if (!strcmp(client->uri, "/"))
        {
@@ -4136,57 +5445,316 @@ process_http(_ipp_client_t *client)    /* I - Client connection */
          * Show web status page...
          */
 
-          if (!respond_http(client, HTTP_OK, "text/html", 0))
+          _ipp_job_t   *job;           /* Current job */
+         int           i;              /* Looping var */
+         _ipp_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"
+         };
+
+          if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0))
            return (0);
 
+          html_header(client, client->printer->name);
           html_printf(client,
-                     "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" "
-                     "\"http://www.w3.org/TR/html4/strict.dtd\">\n"
-                     "<html>\n"
-                     "<head>\n"
-                     "<title>%s</title>\n"
-                     "<link rel=\"SHORTCUT ICON\" href=\"/icon.png\" "
-                     "type=\"image/png\">\n"
-                     "</head>\n"
-                     "<body>\n"
-                     "</body>\n"
-                     "<h1>%s</h1>\n"
-                     "<p>%s, %d job(s).</p>\n"
-                     "</body>\n"
-                     "</html>\n",
-                     client->printer->name, client->printer->name,
-                     client->printer->state == IPP_PRINTER_IDLE ? "Idle" :
-                         client->printer->state == IPP_PRINTER_PROCESSING ?
-                         "Printing" : "Stopped",
-                     cupsArrayCount(client->printer->jobs));
-          httpWrite2(&(client->http), "", 0);
+                     "<p><img align=\"right\" src=\"/icon.png\" width=\"64\" height=\"64\"><b>ippserver (" CUPS_SVERSION ")</b></p>\n"
+                     "<p>%s, %d job(s).", client->printer->state == IPP_PSTATE_IDLE ? "Idle" : client->printer->state == IPP_PSTATE_PROCESSING ? "Printing" : "Stopped", cupsArrayCount(client->printer->jobs));
+         for (i = 0, reason = 1; i < (int)(sizeof(reasons) / sizeof(reasons[0])); i ++, reason <<= 1)
+           if (client->printer->state_reasons & reason)
+             html_printf(client, "\n<br>&nbsp;&nbsp;&nbsp;&nbsp;%s", reasons[i]);
+         html_printf(client, "</p>\n");
+
+          if (cupsArrayCount(client->printer->jobs) > 0)
+         {
+            _cupsRWLockRead(&(client->printer->rwlock));
+
+           html_printf(client, "<table class=\"striped\" summary=\"Jobs\"><thead><tr><th>Job #</th><th>Name</th><th>Owner</th><th>When</th></tr></thead><tbody>\n");
+           for (job = (_ipp_job_t *)cupsArrayFirst(client->printer->jobs); job; job = (_ipp_job_t *)cupsArrayNext(client->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, "<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td></tr>\n", job->id, job->name, job->username, when);
+           }
+           html_printf(client, "</tbody></table>\n");
+
+           _cupsRWUnlock(&(client->printer->rwlock));
+         }
+          html_footer(client);
 
          return (1);
        }
-       else
-         return (respond_http(client, HTTP_NOT_FOUND, NULL, 0));
-       break;
+       else if (!strcmp(client->uri, "/media"))
+       {
+        /*
+         * Show web media page...
+         */
+
+         int           i,              /* Looping var */
+                       num_options;    /* Number of form options */
+         cups_option_t *options;       /* Form options */
+          static const char * const sizes[] =
+         {                             /* Size strings */
+           "ISO A4",
+           "ISO A5",
+           "ISO A6",
+           "DL Envelope",
+           "US Legal",
+           "US Letter",
+           "#10 Envelope",
+           "3x5 Photo",
+           "3.5x5 Photo",
+           "4x6 Photo",
+           "5x7 Photo"
+         };
+         static const char * const types[] =
+                                         /* Type strings */
+         {
+           "Auto",
+           "Cardstock",
+           "Envelope",
+           "Labels",
+           "Other",
+           "Glossy Photo",
+           "High-Gloss Photo",
+           "Matte Photo",
+           "Satin Photo",
+           "Semi-Gloss Photo",
+           "Plain",
+           "Letterhead",
+           "Transparency"
+         };
+         static const int sheets[] =   /* Number of sheets */
+         {
+           250,
+           100,
+           25,
+           5,
+           0
+         };
+
+          if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0))
+           return (0);
 
-    case HTTP_POST :
-       if (client->http.data_remaining < 0 ||
-           (!client->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] &&
-            client->http.data_encoding == HTTP_ENCODE_LENGTH))
+          html_header(client, client->printer->name);
+
+         if ((num_options = parse_options(client, &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!
+           */
+
+           const char  *val;           /* Form value */
+
+           if ((val = cupsGetOption("main_size", num_options, options)) != NULL)
+             client->printer->main_size = atoi(val);
+           if ((val = cupsGetOption("main_type", num_options, options)) != NULL)
+             client->printer->main_type = atoi(val);
+           if ((val = cupsGetOption("main_level", num_options, options)) != NULL)
+             client->printer->main_level = atoi(val);
+
+           if ((val = cupsGetOption("envelope_size", num_options, options)) != NULL)
+             client->printer->envelope_size = atoi(val);
+           if ((val = cupsGetOption("envelope_level", num_options, options)) != NULL)
+             client->printer->envelope_level = atoi(val);
+
+           if ((val = cupsGetOption("photo_size", num_options, options)) != NULL)
+             client->printer->photo_size = atoi(val);
+           if ((val = cupsGetOption("photo_type", num_options, options)) != NULL)
+             client->printer->photo_type = atoi(val);
+           if ((val = cupsGetOption("photo_level", num_options, options)) != NULL)
+             client->printer->photo_level = atoi(val);
+
+            if ((client->printer->main_level < 100 && client->printer->main_level > 0) || (client->printer->envelope_level < 25 && client->printer->envelope_level > 0) || (client->printer->photo_level < 25 && client->printer->photo_level > 0))
+             client->printer->state_reasons |= _IPP_PREASON_MEDIA_LOW;
+           else
+             client->printer->state_reasons &= (_ipp_preason_t)~_IPP_PREASON_MEDIA_LOW;
+
+            if ((client->printer->main_level == 0 && client->printer->main_size > _IPP_MEDIA_SIZE_NONE) || (client->printer->envelope_level == 0 && client->printer->envelope_size > _IPP_MEDIA_SIZE_NONE) || (client->printer->photo_level == 0 && client->printer->photo_size > _IPP_MEDIA_SIZE_NONE))
+           {
+             client->printer->state_reasons |= _IPP_PREASON_MEDIA_EMPTY;
+             if (client->printer->active_job)
+               client->printer->state_reasons |= _IPP_PREASON_MEDIA_NEEDED;
+           }
+           else
+             client->printer->state_reasons &= (_ipp_preason_t)~(_IPP_PREASON_MEDIA_EMPTY | _IPP_PREASON_MEDIA_NEEDED);
+
+           html_printf(client, "<blockquote>Media updated.</blockquote>\n");
+          }
+
+          html_printf(client, "<form method=\"GET\" action=\"/media\">\n");
+
+          html_printf(client, "<table class=\"form\" summary=\"Media\">\n");
+          html_printf(client, "<tr><th>Main Tray:</th><td><select name=\"main_size\"><option value=\"-1\">None</option>");
+          for (i = 0; i < (int)(sizeof(sizes) / sizeof(sizes[0])); i ++)
+           if (!strstr(sizes[i], "Envelope") && !strstr(sizes[i], "Photo"))
+             html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->main_size ? " selected" : "", sizes[i]);
+         html_printf(client, "</select> <select name=\"main_type\"><option value=\"-1\">None</option>");
+          for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i ++)
+           if (!strstr(types[i], "Photo"))
+             html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->main_type ? " selected" : "", types[i]);
+         html_printf(client, "</select> <select name=\"main_level\">");
+          for (i = 0; i < (int)(sizeof(sheets) / sizeof(sheets[0])); i ++)
+           html_printf(client, "<option value=\"%d\"%s>%d sheets</option>", sheets[i], sheets[i] == client->printer->main_level ? " selected" : "", sheets[i]);
+         html_printf(client, "</select></td></tr>\n");
+
+          html_printf(client,
+                     "<tr><th>Envelope Feeder:</th><td><select name=\"envelope_size\"><option value=\"-1\">None</option>");
+          for (i = 0; i < (int)(sizeof(sizes) / sizeof(sizes[0])); i ++)
+           if (strstr(sizes[i], "Envelope"))
+             html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->envelope_size ? " selected" : "", sizes[i]);
+         html_printf(client, "</select> <select name=\"envelope_level\">");
+          for (i = 0; i < (int)(sizeof(sheets) / sizeof(sheets[0])); i ++)
+           html_printf(client, "<option value=\"%d\"%s>%d sheets</option>", sheets[i], sheets[i] == client->printer->envelope_level ? " selected" : "", sheets[i]);
+         html_printf(client, "</select></td></tr>\n");
+
+          html_printf(client,
+                     "<tr><th>Photo Tray:</th><td><select name=\"photo_size\"><option value=\"-1\">None</option>");
+          for (i = 0; i < (int)(sizeof(sizes) / sizeof(sizes[0])); i ++)
+           if (strstr(sizes[i], "Photo"))
+             html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->photo_size ? " selected" : "", sizes[i]);
+         html_printf(client, "</select> <select name=\"photo_type\"><option value=\"-1\">None</option>");
+          for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i ++)
+           if (strstr(types[i], "Photo"))
+             html_printf(client, "<option value=\"%d\"%s>%s</option>", i, i == client->printer->photo_type ? " selected" : "", types[i]);
+         html_printf(client, "</select> <select name=\"photo_level\">");
+          for (i = 0; i < (int)(sizeof(sheets) / sizeof(sheets[0])); i ++)
+           html_printf(client, "<option value=\"%d\"%s>%d sheets</option>", sheets[i], sheets[i] == client->printer->photo_level ? " selected" : "", sheets[i]);
+         html_printf(client, "</select></td></tr>\n");
+
+         html_printf(client, "<tr><td></td><td><input type=\"submit\" value=\"Update Media\"></td></tr></table></form>\n");
+          html_footer(client);
+
+         return (1);
+       }
+       else if (!strcmp(client->uri, "/supplies"))
        {
         /*
-         * Negative content lengths are invalid...
+         * Show web supplies page...
          */
 
-         return (respond_http(client, HTTP_BAD_REQUEST, NULL, 0));
+          int          i, j,           /* Looping vars */
+                       num_options;    /* Number of form options */
+         cups_option_t *options;       /* Form options */
+         static const int levels[] = { 0, 5, 10, 25, 50, 75, 90, 95, 100 };
+
+          if (!respond_http(client, HTTP_STATUS_OK, encoding, "text/html", 0))
+           return (0);
+
+          html_header(client, client->printer->name);
+
+         if ((num_options = parse_options(client, &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 */
+
+            client->printer->state_reasons &= (_ipp_preason_t)~(_IPP_PREASON_MARKER_SUPPLY_EMPTY | _IPP_PREASON_MARKER_SUPPLY_LOW | _IPP_PREASON_MARKER_WASTE_ALMOST_FULL | _IPP_PREASON_MARKER_WASTE_FULL | _IPP_PREASON_TONER_EMPTY | _IPP_PREASON_TONER_LOW);
+
+           for (i = 0; i < (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])); i ++)
+           {
+             snprintf(name, sizeof(name), "supply_%d", i);
+             if ((val = cupsGetOption(name, num_options, options)) != NULL)
+             {
+               int level = client->printer->supplies[i] = atoi(val);
+                                       /* New level */
+
+               if (i < 4)
+               {
+                 if (level == 0)
+                   client->printer->state_reasons |= _IPP_PREASON_TONER_EMPTY;
+                 else if (level < 10)
+                   client->printer->state_reasons |= _IPP_PREASON_TONER_LOW;
+               }
+               else
+               {
+                 if (level == 100)
+                   client->printer->state_reasons |= _IPP_PREASON_MARKER_WASTE_FULL;
+                 else if (level > 90)
+                   client->printer->state_reasons |= _IPP_PREASON_MARKER_WASTE_ALMOST_FULL;
+               }
+             }
+            }
+
+           html_printf(client, "<blockquote>Supplies updated.</blockquote>\n");
+          }
+
+          html_printf(client, "<form method=\"GET\" action=\"/supplies\">\n");
+
+         html_printf(client, "<table class=\"form\" summary=\"Supplies\">\n");
+         for (i = 0; i < (int)(sizeof(printer_supplies) / sizeof(printer_supplies[0])); i ++)
+         {
+           html_printf(client, "<tr><th>%s:</th><td><select name=\"supply_%d\">", printer_supplies[i], i);
+           for (j = 0; j < (int)(sizeof(levels) / sizeof(levels[0])); j ++)
+             html_printf(client, "<option value=\"%d\"%s>%d%%</option>", levels[j], levels[j] == client->printer->supplies[i] ? " selected" : "", levels[j]);
+           html_printf(client, "</select></td></tr>\n");
+         }
+         html_printf(client, "<tr><td></td><td><input type=\"submit\" value=\"Update Supplies\"></td></tr>\n</table>\n</form>\n");
+          html_footer(client);
+
+         return (1);
        }
+       else
+         return (respond_http(client, HTTP_STATUS_NOT_FOUND, NULL, NULL, 0));
+       break;
 
-       if (strcmp(client->http.fields[HTTP_FIELD_CONTENT_TYPE],
+    case HTTP_STATE_POST :
+       if (strcmp(httpGetField(client->http, HTTP_FIELD_CONTENT_TYPE),
                   "application/ipp"))
         {
         /*
          * Not an IPP request...
          */
 
-         return (respond_http(client, HTTP_BAD_REQUEST, NULL, 0));
+         return (respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0));
        }
 
        /*
@@ -4195,14 +5763,17 @@ process_http(_ipp_client_t *client)     /* I - Client connection */
 
        client->request = ippNew();
 
-        while ((state = ippRead(&(client->http), client->request)) != IPP_DATA)
-         if (state == IPP_ERROR)
+        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->http.hostname,
+            fprintf(stderr, "%s IPP read error (%s).\n", client->hostname,
                    cupsLastErrorString());
-           respond_http(client, HTTP_BAD_REQUEST, NULL, 0);
+           respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0);
            return (0);
          }
+       }
 
        /*
         * Now that we have the IPP request, process the request...
@@ -4230,6 +5801,8 @@ process_ipp(_ipp_client_t *client)        /* I - Client */
   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 */
 
 
   debug_attributes("Request", client->request, 1);
@@ -4238,37 +5811,30 @@ process_ipp(_ipp_client_t *client)      /* I - Client */
   * First build an empty response message for this request...
   */
 
-  client->operation_id = client->request->request.op.operation_id;
-  client->response     = ippNew();
-
-  client->response->request.status.version[0] =
-      client->request->request.op.version[0];
-  client->response->request.status.version[1] =
-      client->request->request.op.version[1];
-  client->response->request.status.request_id =
-      client->request->request.op.request_id;
+  client->operation_id = ippGetOperation(client->request);
+  client->response     = ippNewResponse(client->request);
 
  /*
   * Then validate the request header and required attributes...
   */
 
-  if (client->request->request.any.version[0] < 1 ||
-      client->request->request.any.version[0] > 2)
+  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_VERSION_NOT_SUPPORTED,
-                "Bad request version number %d.%d.",
-               client->request->request.any.version[0],
-               client->request->request.any.version[1]);
+    respond_ipp(client, IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED,
+                "Bad request version number %d.%d.", major, minor);
   }
-  else if (client->request->request.any.request_id <= 0)
-    respond_ipp(client, IPP_BAD_REQUEST, "Bad request-id %d.",
-                client->request->request.any.request_id);
-  else if (!client->request->attrs)
-    respond_ipp(client, IPP_BAD_REQUEST, "No attributes in request.");
+  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
   {
    /*
@@ -4276,22 +5842,25 @@ process_ipp(_ipp_client_t *client)      /* I - Client */
     * don't repeat groups...
     */
 
-    for (attr = client->request->attrs, group = attr->group_tag;
+    for (attr = ippFirstAttribute(client->request),
+             group = ippGetGroupTag(attr);
         attr;
-        attr = attr->next)
-      if (attr->group_tag < group && attr->group_tag != IPP_TAG_ZERO)
+        attr = ippNextAttribute(client->request))
+    {
+      if (ippGetGroupTag(attr) < group && ippGetGroupTag(attr) != IPP_TAG_ZERO)
       {
        /*
        * Out of order; return an error...
        */
 
-       respond_ipp(client, IPP_BAD_REQUEST,
-                      "Attribute groups are out of order (%x < %x).",
-                      attr->group_tag, group);
+       respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+                   "Attribute groups are out of order (%x < %x).",
+                   ippGetGroupTag(attr), group);
        break;
       }
       else
-       group = attr->group_tag;
+       group = ippGetGroupTag(attr);
+    }
 
     if (!attr)
     {
@@ -4303,20 +5872,19 @@ process_ipp(_ipp_client_t *client)      /* I - Client */
       *     printer-uri/job-uri
       */
 
-      attr = client->request->attrs;
-      if (attr && attr->name &&
-          !strcmp(attr->name, "attributes-charset") &&
-         (attr->value_tag & IPP_TAG_MASK) == IPP_TAG_CHARSET)
+      attr = ippFirstAttribute(client->request);
+      name = ippGetName(attr);
+      if (attr && name && !strcmp(name, "attributes-charset") &&
+         ippGetValueTag(attr) == IPP_TAG_CHARSET)
        charset = attr;
       else
        charset = NULL;
 
-      if (attr)
-        attr = attr->next;
+      attr = ippNextAttribute(client->request);
+      name = ippGetName(attr);
 
-      if (attr && attr->name &&
-          !strcmp(attr->name, "attributes-natural-language") &&
-         (attr->value_tag & IPP_TAG_MASK) == IPP_TAG_LANGUAGE)
+      if (attr && name && !strcmp(name, "attributes-natural-language") &&
+         ippGetValueTag(attr) == IPP_TAG_LANGUAGE)
        language = attr;
       else
        language = NULL;
@@ -4330,25 +5898,17 @@ process_ipp(_ipp_client_t *client)      /* I - Client */
       else
        uri = NULL;
 
-      ippAddString(client->response, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
-                  "attributes-charset", NULL,
-                  charset ? charset->values[0].string.text : "utf-8");
-
-      ippAddString(client->response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
-                  "attributes-natural-language", NULL,
-                  language ? language->values[0].string.text : "en");
-
       if (charset &&
-          _cups_strcasecmp(charset->values[0].string.text, "us-ascii") &&
-          _cups_strcasecmp(charset->values[0].string.text, "utf-8"))
+          strcasecmp(ippGetString(charset, 0, NULL), "us-ascii") &&
+          strcasecmp(ippGetString(charset, 0, NULL), "utf-8"))
       {
        /*
         * Bad character set...
        */
 
-       respond_ipp(client, IPP_BAD_REQUEST,
+       respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
                    "Unsupported character set \"%s\".",
-                   charset->values[0].string.text);
+                   ippGetString(charset, 0, NULL));
       }
       else if (!charset || !language || !uri)
       {
@@ -4358,120 +5918,461 @@ process_ipp(_ipp_client_t *client)    /* I - Client */
        * for all operations.
        */
 
-       respond_ipp(client, IPP_BAD_REQUEST, "Missing required attributes.");
-      }
-      else if (strcmp(uri->values[0].string.text, client->printer->uri) &&
-               strncmp(uri->values[0].string.text, client->printer->uri,
-                      client->printer->urilen))
-      {
-        respond_ipp(client, IPP_NOT_FOUND, "%s %s not found.", uri->name,
-                   uri->values[0].string.text);
+       respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST,
+                   "Missing required attributes.");
       }
       else
       {
-       /*
-        * Try processing the operation...
-       */
-
-        if (client->http.expect == HTTP_CONTINUE)
+        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
        {
         /*
-         * Send 100-continue header...
+         * Try processing the operation...
          */
 
-         if (!respond_http(client, HTTP_CONTINUE, NULL, 0))
-           return (0);
+         switch (ippGetOperation(client->request))
+         {
+           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;
+         }
        }
+      }
+    }
+  }
 
-       switch (client->request->request.op.operation_id)
-       {
-         case IPP_PRINT_JOB :
-              ipp_print_job(client);
-              break;
+ /*
+  * Send the HTTP header and return...
+  */
 
-         case IPP_PRINT_URI :
-              ipp_print_uri(client);
-              break;
+  if (httpGetState(client->http) != HTTP_STATE_POST_SEND)
+    httpFlush(client->http);           /* Flush trailing (junk) data */
 
-         case IPP_VALIDATE_JOB :
-              ipp_validate_job(client);
-              break;
+  return (respond_http(client, HTTP_STATUS_OK, NULL, "application/ipp",
+                       ippLength(client->response)));
+}
 
-          case IPP_CREATE_JOB :
-              ipp_create_job(client);
-              break;
 
-          case IPP_SEND_DOCUMENT :
-              ipp_send_document(client);
-              break;
+/*
+ * 'process_job()' - Process a print job.
+ */
 
-          case IPP_SEND_URI :
-              ipp_send_uri(client);
-              break;
+static void *                          /* O - Thread exit status */
+process_job(_ipp_job_t *job)           /* I - Job */
+{
+  job->state          = IPP_JSTATE_PROCESSING;
+  job->printer->state = IPP_PSTATE_PROCESSING;
+  job->processing     = time(NULL);
 
-         case IPP_CANCEL_JOB :
-              ipp_cancel_job(client);
-              break;
+  while (job->printer->state_reasons & _IPP_PREASON_MEDIA_EMPTY)
+  {
+    job->printer->state_reasons |= _IPP_PREASON_MEDIA_NEEDED;
 
-         case IPP_GET_JOB_ATTRIBUTES :
-              ipp_get_job_attributes(client);
-              break;
+    sleep(1);
+  }
 
-         case IPP_GET_JOBS :
-              ipp_get_jobs(client);
-              break;
+  job->printer->state_reasons &= (_ipp_preason_t)~_IPP_PREASON_MEDIA_NEEDED;
 
-         case IPP_GET_PRINTER_ATTRIBUTES :
-              ipp_get_printer_attributes(client);
-              break;
+  if (job->printer->command)
+  {
+   /*
+    * Execute a command with the job spool file and wait for it to complete...
+    */
 
-         default :
-             respond_ipp(client, IPP_OPERATION_NOT_SUPPORTED,
-                         "Operation not supported.");
-             break;
+    int        pid,                    /* Process ID */
+               status;                 /* Exit status */
+    time_t     start,                  /* Start time */
+               end;                    /* End time */
+    char       *myargv[3],             /* Command-line arguments */
+               *myenvp[200];           /* 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                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, "Running command \"%s %s\".\n", job->printer->command,
+            job->filename);
+    time(&start);
+
+   /*
+    * Setup the command-line arguments...
+    */
+
+    myargv[0] = job->printer->command;
+    myargv[1] = job->filename;
+    myargv[2] = NULL;
+
+   /*
+    * Copy the current environment, then add ENV variables for every Job
+    * attribute...
+    */
+
+    for (myenvc = 0; environ[myenvc] && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); myenvc ++)
+      myenvp[myenvc] = strdup(environ[myenvc]);
+
+    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);
+      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);
+    }
+    myenvp[myenvc] = NULL;
+
+   /*
+    * Now run the program...
+    */
+
+#ifdef WIN32
+    status = _spawnvpe(_P_WAIT, job->printer->command, myargv, myenvp);
+
+#else
+    if (pipe(mypipe))
+    {
+      perror("Unable to create pipe for stderr");
+      mypipe[0] = mypipe[1] = -1;
+    }
+
+    if ((pid = fork()) == 0)
+    {
+     /*
+      * Child comes here...
+      */
+
+      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...
+      */
+
+      perror("Unable to start job processing command");
+      status = -1;
+
+      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]);
+
+     /*
+      * 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)
+         {
+           *ptr++ = '\0';
+
+           if (!strncmp(line, "STATE:", 6))
+           {
+            /*
+             * Process printer-state-reasons keywords.
+             */
+
+             process_state_message(job, line);
+           }
+           else if (!strncmp(line, "ATTR:", 5))
+           {
+            /*
+             * Process printer attribute update.
+             */
+
+             process_attr_message(job, line);
+           }
+           else if (Verbosity > 1)
+             fprintf(stderr, "%s: %s\n", job->printer->command, 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, "Command \"%s\" exited with status %d.\n",
+               job->printer->command, WEXITSTATUS(status));
+#ifndef WIN32
+      else
+       fprintf(stderr, "Command \"%s\" terminated with signal %d.\n",
+               job->printer->command, WTERMSIG(status));
+#endif /* !WIN32 */
+      job->state = IPP_JSTATE_ABORTED;
+    }
+    else if (status < 0)
+      job->state = IPP_JSTATE_ABORTED;
+    else
+      fprintf(stderr, "Command \"%s\" completed successfully.\n",
+             job->printer->command);
+
+   /*
+    * Make sure processing takes at least 5 seconds...
+    */
+
+    time(&end);
+    if ((end - start) < 5)
+      sleep(5);
+  }
+  else
+  {
+   /*
+    * Sleep for a random amount of time to simulate job processing.
+    */
+
+    sleep((unsigned)(5 + (rand() % 11)));
   }
 
- /*
-  * Send the HTTP header and return...
-  */
+  if (job->cancel)
+    job->state = IPP_JSTATE_CANCELED;
+  else if (job->state == IPP_JSTATE_PROCESSING)
+    job->state = IPP_JSTATE_COMPLETED;
 
-  if (client->http.state != HTTP_POST_SEND)
-    httpFlush(&(client->http));                /* Flush trailing (junk) data */
+  job->completed           = time(NULL);
+  job->printer->state      = IPP_PSTATE_IDLE;
+  job->printer->active_job = NULL;
 
-  return (respond_http(client, HTTP_OK, "application/ipp",
-                       ippLength(client->response)));
+  return (NULL);
 }
 
 
 /*
- * 'process_job()' - Process a print job.
+ * 'process_state_message()' - Process a STATE: message from a command.
  */
 
-static void *                          /* O - Thread exit status */
-process_job(_ipp_job_t *job)           /* I - Job */
+static void
+process_state_message(
+    _ipp_job_t *job,                   /* I - Job */
+    char       *message)               /* I - Message */
 {
-  job->state          = IPP_JOB_PROCESSING;
-  job->printer->state = IPP_PRINTER_PROCESSING;
+  int          i;                      /* Looping var */
+  _ipp_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 */
 
-  sleep(5);
 
-  if (job->cancel)
-    job->state = IPP_JOB_CANCELED;
+ /*
+  * 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 2911.
+  */
+
+  if (*message == '-')
+  {
+    remove        = 1;
+    state_reasons = job->printer->state_reasons;
+    message ++;
+  }
+  else if (*message == '+')
+  {
+    remove        = 0;
+    state_reasons = job->printer->state_reasons;
+    message ++;
+  }
   else
-    job->state = IPP_JOB_COMPLETED;
+  {
+    remove        = 0;
+    state_reasons = _IPP_PREASON_NONE;
+  }
 
-  job->completed           = time(NULL);
-  job->printer->state      = IPP_PRINTER_IDLE;
-  job->printer->active_job = NULL;
+  while (*message)
+  {
+    if ((next = strchr(message, ',')) != NULL)
+      *next++ = '\0';
 
-  return (NULL);
+    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(_ipp_preason_strings) / sizeof(_ipp_preason_strings[0])); i ++, bit *= 2)
+    {
+      if (!strcmp(message, _ipp_preason_strings[i]))
+      {
+        if (remove)
+         state_reasons &= ~bit;
+       else
+         state_reasons |= bit;
+      }
+    }
+
+    if (next)
+      message = next;
+    else
+      break;
+  }
+
+  job->printer->state_reasons = state_reasons;
 }
 
 
-#ifdef HAVE_DNSSD
 /*
  * 'register_printer()' - Register a printer object via Bonjour.
  */
@@ -4484,13 +6385,19 @@ register_printer(
     const char     *model,             /* I - Model name */
     const char     *formats,           /* I - Supported formats */
     const char     *adminurl,          /* I - Web interface URL */
+    const char     *uuid,              /* I - Printer UUID */
     int            color,              /* I - 1 = color, 0 = monochrome */
     int            duplex,             /* I - 1 = duplex, 0 = simplex */
-    const char     *regtype)           /* I - Service type */
+    const char     *subtype)           /* I - Service subtype */
 {
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
+  _ipp_txt_t           ipp_txt;        /* Bonjour IPP TXT record */
+#endif /* HAVE_DNSSD || HAVE_AVAHI */
+#ifdef HAVE_DNSSD
   DNSServiceErrorType  error;          /* Error from Bonjour */
   char                 make_model[256],/* Make and model together */
-                       product[256];   /* Product string */
+                       product[256],   /* Product string */
+                       regtype[256];   /* Bonjour service type */
 
 
  /*
@@ -4500,46 +6407,41 @@ register_printer(
   snprintf(make_model, sizeof(make_model), "%s %s", make, model);
   snprintf(product, sizeof(product), "(%s)", model);
 
-  TXTRecordCreate(&(printer->ipp_txt), 1024, NULL);
-  TXTRecordSetValue(&(printer->ipp_txt), "txtvers", 1, "1");
-  TXTRecordSetValue(&(printer->ipp_txt), "qtotal", 1, "1");
-  TXTRecordSetValue(&(printer->ipp_txt), "rp", 3, "ipp");
-  TXTRecordSetValue(&(printer->ipp_txt), "ty", (uint8_t)strlen(make_model),
+  TXTRecordCreate(&ipp_txt, 1024, NULL);
+  TXTRecordSetValue(&ipp_txt, "rp", 9, "ipp/print");
+  TXTRecordSetValue(&ipp_txt, "ty", (uint8_t)strlen(make_model),
                     make_model);
-  TXTRecordSetValue(&(printer->ipp_txt), "adminurl", (uint8_t)strlen(adminurl),
+  TXTRecordSetValue(&ipp_txt, "adminurl", (uint8_t)strlen(adminurl),
                     adminurl);
-  TXTRecordSetValue(&(printer->ipp_txt), "note", (uint8_t)strlen(location),
-                    location);
-  TXTRecordSetValue(&(printer->ipp_txt), "priority", 1, "0");
-  TXTRecordSetValue(&(printer->ipp_txt), "product", (uint8_t)strlen(product),
+  if (*location)
+    TXTRecordSetValue(&ipp_txt, "note", (uint8_t)strlen(location),
+                     location);
+  TXTRecordSetValue(&ipp_txt, "product", (uint8_t)strlen(product),
                     product);
-  TXTRecordSetValue(&(printer->ipp_txt), "pdl", (uint8_t)strlen(formats),
+  TXTRecordSetValue(&ipp_txt, "pdl", (uint8_t)strlen(formats),
                     formats);
-  TXTRecordSetValue(&(printer->ipp_txt), "Color", 1, color ? "T" : "F");
-  TXTRecordSetValue(&(printer->ipp_txt), "Duplex", 1, duplex ? "T" : "F");
-  TXTRecordSetValue(&(printer->ipp_txt), "usb_MFG", (uint8_t)strlen(make),
+  TXTRecordSetValue(&ipp_txt, "Color", 1, color ? "T" : "F");
+  TXTRecordSetValue(&ipp_txt, "Duplex", 1, duplex ? "T" : "F");
+  TXTRecordSetValue(&ipp_txt, "usb_MFG", (uint8_t)strlen(make),
                     make);
-  TXTRecordSetValue(&(printer->ipp_txt), "usb_MDL", (uint8_t)strlen(model),
+  TXTRecordSetValue(&ipp_txt, "usb_MDL", (uint8_t)strlen(model),
                     model);
-  TXTRecordSetValue(&(printer->ipp_txt), "air", 4, "none");
-
- /*
-  * Create a shared service reference for Bonjour...
-  */
+  TXTRecordSetValue(&ipp_txt, "UUID", (uint8_t)strlen(uuid), uuid);
+#  ifdef HAVE_SSL
+  TXTRecordSetValue(&ipp_txt, "TLS", 3, "1.2");
+#  endif /* HAVE_SSL */
+  if (strstr(formats, "image/urf"))
+    TXTRecordSetValue(&ipp_txt, "URF", 66, "CP1,IS1-5-7,MT1-2-3-4-5-6-8-9-10-11-12-13,RS300,SRGB24,V1.4,W8,DM1");
 
-  if ((error = DNSServiceCreateConnection(&(printer->common_ref)))
-          != kDNSServiceErr_NoError)
-  {
-    fprintf(stderr, "Unable to create mDNSResponder connection: %d\n", error);
-    return (0);
-  }
+  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...
   */
 
-  printer->printer_ref = printer->common_ref;
+  printer->printer_ref = DNSSDMaster;
 
   if ((error = DNSServiceRegister(&(printer->printer_ref),
                                   kDNSServiceFlagsShareConnection,
@@ -4560,15 +6462,48 @@ register_printer(
   * advertise our IPP printer...
   */
 
-  printer->ipp_ref = printer->common_ref;
+  printer->ipp_ref = DNSSDMaster;
+
+  if (subtype && *subtype)
+    snprintf(regtype, sizeof(regtype), "_ipp._tcp,%s", subtype);
+  else
+    strlcpy(regtype, "_ipp._tcp", sizeof(regtype));
 
   if ((error = DNSServiceRegister(&(printer->ipp_ref),
                                   kDNSServiceFlagsShareConnection,
                                   0 /* interfaceIndex */, printer->dnssd_name,
                                  regtype, NULL /* domain */,
                                  NULL /* host */, htons(printer->port),
-                                 TXTRecordGetLength(&(printer->ipp_txt)),
-                                 TXTRecordGetBytesPtr(&(printer->ipp_txt)),
+                                 TXTRecordGetLength(&ipp_txt),
+                                 TXTRecordGetBytesPtr(&ipp_txt),
+                                 (DNSServiceRegisterReply)dnssd_callback,
+                                 printer)) != kDNSServiceErr_NoError)
+  {
+    fprintf(stderr, "Unable to register \"%s.%s\": %d\n",
+            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 (subtype && *subtype)
+    snprintf(regtype, sizeof(regtype), "_ipps._tcp,%s", subtype);
+  else
+    strlcpy(regtype, "_ipps._tcp", sizeof(regtype));
+
+  if ((error = DNSServiceRegister(&(printer->ipps_ref),
+                                  kDNSServiceFlagsShareConnection,
+                                  0 /* interfaceIndex */, printer->dnssd_name,
+                                 regtype, NULL /* domain */,
+                                 NULL /* host */, htons(printer->port),
+                                 TXTRecordGetLength(&ipp_txt),
+                                 TXTRecordGetBytesPtr(&ipp_txt),
                                  (DNSServiceRegisterReply)dnssd_callback,
                                  printer)) != kDNSServiceErr_NoError)
   {
@@ -4576,13 +6511,14 @@ register_printer(
             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 = printer->common_ref;
+  printer->http_ref = DNSSDMaster;
 
   if ((error = DNSServiceRegister(&(printer->http_ref),
                                   kDNSServiceFlagsShareConnection,
@@ -4598,9 +6534,85 @@ register_printer(
     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");
+  ipp_txt = avahi_string_list_add_printf(ipp_txt, "ty=%s %s", make, model);
+  ipp_txt = avahi_string_list_add_printf(ipp_txt, "adminurl=%s", adminurl);
+  if (*location)
+    ipp_txt = avahi_string_list_add_printf(ipp_txt, "note=%s", location);
+  ipp_txt = avahi_string_list_add_printf(ipp_txt, "product=(%s)", model);
+  ipp_txt = avahi_string_list_add_printf(ipp_txt, "pdl=%s", formats);
+  ipp_txt = avahi_string_list_add_printf(ipp_txt, "Color=%s", color ? "T" : "F");
+  ipp_txt = avahi_string_list_add_printf(ipp_txt, "Duplex=%s", duplex ? "T" : "F");
+  ipp_txt = avahi_string_list_add_printf(ipp_txt, "usb_MFG=%s", make);
+  ipp_txt = avahi_string_list_add_printf(ipp_txt, "usb_MDL=%s", model);
+  ipp_txt = avahi_string_list_add_printf(ipp_txt, "UUID=%s", uuid);
+#  ifdef HAVE_SSL
+  ipp_txt = avahi_string_list_add_printf(ipp_txt, "TLS=1.2");
+#  endif /* HAVE_SSL */
+
+ /*
+  * 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 (subtype && *subtype)
+  {
+    snprintf(temp, sizeof(temp), "%s._sub._ipp._tcp", subtype);
+    avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, temp);
+  }
+
+#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 (subtype && *subtype)
+  {
+    snprintf(temp, sizeof(temp), "%s._sub._ipps._tcp", subtype);
+    avahi_entry_group_add_service_subtype(printer->ipp_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, temp);
+  }
+#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);
 }
-#endif /* HAVE_DNSSD */
 
 
 /*
@@ -4608,32 +6620,32 @@ register_printer(
  */
 
 int                                    /* O - 1 on success, 0 on failure */
-respond_http(_ipp_client_t *client,    /* I - Client */
-            http_status_t code,        /* I - HTTP status of response */
-            const char    *type,       /* I - MIME type of response */
-            size_t        length)      /* I - Length of response */
+respond_http(
+    _ipp_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->http.hostname, httpStatus(code));
+  fprintf(stderr, "%s %s\n", client->hostname, httpStatus(code));
 
-  if (code == HTTP_CONTINUE)
+  if (code == HTTP_STATUS_CONTINUE)
   {
    /*
     * 100-continue doesn't send any headers...
     */
 
-    return (httpPrintf(&(client->http), "HTTP/%d.%d 100 Continue\r\n\r\n",
-                      client->http.version / 100,
-                      client->http.version % 100) > 0);
+    return (httpWriteResponse(client->http, HTTP_STATUS_CONTINUE) == 0);
   }
 
  /*
   * Format an error message...
   */
 
-  if (!type && !length && code != HTTP_OK)
+  if (!type && !length && code != HTTP_STATUS_OK && code != HTTP_STATUS_SWITCHING_PROTOCOLS)
   {
     snprintf(message, sizeof(message), "%d - %s\n", code, httpStatus(code));
 
@@ -4644,60 +6656,30 @@ respond_http(_ipp_client_t *client,     /* I - Client */
     message[0] = '\0';
 
  /*
-  * Send the HTTP status header...
-  */
-
-  httpFlushWrite(&(client->http));
-
-  client->http.data_encoding = HTTP_ENCODE_FIELDS;
-
-  if (httpPrintf(&(client->http), "HTTP/%d.%d %d %s\r\n", client->http.version / 100,
-                 client->http.version % 100, code, httpStatus(code)) < 0)
-    return (0);
-
- /*
-  * Follow the header with the response fields...
+  * Send the HTTP response header...
   */
 
-  if (httpPrintf(&(client->http), "Date: %s\r\n", httpGetDateString(time(NULL))) < 0)
-    return (0);
-
-  if (client->http.keep_alive && client->http.version >= HTTP_1_0)
-  {
-    if (httpPrintf(&(client->http),
-                   "Connection: Keep-Alive\r\n"
-                   "Keep-Alive: timeout=10\r\n") < 0)
-      return (0);
-  }
+  httpClearFields(client->http);
 
-  if (code == HTTP_METHOD_NOT_ALLOWED || client->operation == HTTP_OPTIONS)
-  {
-    if (httpPrintf(&(client->http), "Allow: GET, HEAD, OPTIONS, POST\r\n") < 0)
-      return (0);
-  }
+  if (code == HTTP_STATUS_METHOD_NOT_ALLOWED ||
+      client->operation == HTTP_STATE_OPTIONS)
+    httpSetField(client->http, HTTP_FIELD_ALLOW, "GET, HEAD, OPTIONS, POST");
 
   if (type)
   {
     if (!strcmp(type, "text/html"))
-    {
-      if (httpPrintf(&(client->http),
-                     "Content-Type: text/html; charset=utf-8\r\n") < 0)
-       return (0);
-    }
-    else if (httpPrintf(&(client->http), "Content-Type: %s\r\n", type) < 0)
-      return (0);
-  }
+      httpSetField(client->http, HTTP_FIELD_CONTENT_TYPE,
+                   "text/html; charset=utf-8");
+    else
+      httpSetField(client->http, HTTP_FIELD_CONTENT_TYPE, type);
 
-  if (length == 0 && !message[0])
-  {
-    if (httpPrintf(&(client->http), "Transfer-Encoding: chunked\r\n\r\n") < 0)
-      return (0);
+    if (content_encoding)
+      httpSetField(client->http, HTTP_FIELD_CONTENT_ENCODING, content_encoding);
   }
-  else if (httpPrintf(&(client->http), "Content-Length: " CUPS_LLFMT "\r\n\r\n",
-                      CUPS_LLCAST length) < 0)
-    return (0);
 
-  if (httpFlushWrite(&(client->http)) < 0)
+  httpSetLength(client->http, length);
+
+  if (httpWriteResponse(client->http, code) < 0)
     return (0);
 
  /*
@@ -4710,7 +6692,10 @@ respond_http(_ipp_client_t *client,      /* I - Client */
     * Send a plain text message.
     */
 
-    if (httpPrintf(&(client->http), "%s", message) < 0)
+    if (httpPrintf(client->http, "%s", message) < 0)
+      return (0);
+
+    if (httpWrite2(client->http, "", 0) < 0)
       return (0);
   }
   else if (client->response)
@@ -4721,21 +6706,13 @@ respond_http(_ipp_client_t *client,     /* I - Client */
 
     debug_attributes("Response", client->response, 2);
 
-    client->http.data_encoding  = HTTP_ENCODE_LENGTH;
-    client->http.data_remaining = (off_t)ippLength(client->response);
-    client->response->state     = IPP_IDLE;
+    ippSetState(client->response, IPP_STATE_IDLE);
 
-    if (ippWrite(&(client->http), client->response) != IPP_DATA)
+    if (ippWrite(client->http, client->response) != IPP_STATE_DATA)
       return (0);
   }
-  else
-    client->http.data_encoding = HTTP_ENCODE_CHUNKED;
-
- /*
-  * Flush the data and return...
-  */
 
-  return (httpFlushWrite(&(client->http)) >= 0);
+  return (1);
 }
 
 
@@ -4749,36 +6726,35 @@ respond_ipp(_ipp_client_t *client,      /* I - Client */
            const char    *message,     /* I - printf-style status-message */
            ...)                        /* I - Additional args as needed */
 {
-  va_list      ap;                     /* Pointer to additional args */
-  char         formatted[1024];        /* Formatted errror message */
-
+  const char   *formatted = NULL;      /* Formatted message */
 
-  client->response->request.status.status_code = status;
 
-  if (!client->response->attrs)
-  {
-    ippAddString(client->response, IPP_TAG_OPERATION,
-                 IPP_TAG_CHARSET | IPP_TAG_COPY, "attributes-charset", NULL,
-                "utf-8");
-    ippAddString(client->response, IPP_TAG_OPERATION,
-                 IPP_TAG_LANGUAGE | IPP_TAG_COPY, "attributes-natural-language",
-                NULL, "en-us");
-  }
+  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);
-    vsnprintf(formatted, sizeof(formatted), message, ap);
+    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);
 
-    ippAddString(client->response, IPP_TAG_OPERATION, IPP_TAG_TEXT,
-                "status-message", NULL, formatted);
+    formatted = ippGetString(attr, 0, NULL);
   }
-  else
-    formatted[0] = '\0';
 
-  fprintf(stderr, "%s %s %s (%s)\n", client->http.hostname,
-          ippOpString(client->operation_id), ippErrorString(status), formatted);
+  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));
 }
 
 
@@ -4794,12 +6770,10 @@ respond_unsupported(
   ipp_attribute_t      *temp;          /* Copy of attribute */
 
 
-  if (!client->response->attrs)
-    respond_ipp(client, IPP_ATTRIBUTES, "Unsupported %s %s%s value.",
-               attr->name, attr->num_values > 1 ? "1setOf " : "",
-               ippTagString(attr->value_tag));
-  else
-    ippSetStatusCode(client->response, IPP_ATTRIBUTES);
+  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);
@@ -4832,7 +6806,7 @@ run_printer(_ipp_printer_t *printer)      /* I - Printer */
   num_fds = 2;
 
 #ifdef HAVE_DNSSD
-  polldata[num_fds   ].fd     = DNSServiceRefSockFD(printer->common_ref);
+  polldata[num_fds   ].fd     = DNSServiceRefSockFD(DNSSDMaster);
   polldata[num_fds ++].events = POLLIN;
 #endif /* HAVE_DNSSD */
 
@@ -4847,7 +6821,7 @@ run_printer(_ipp_printer_t *printer)      /* I - Printer */
     else
       timeout = -1;
 
-    if (poll(polldata, num_fds, timeout) < 0 && errno != EINTR)
+    if (poll(polldata, (nfds_t)num_fds, timeout) < 0 && errno != EINTR)
     {
       perror("poll() failed");
       break;
@@ -4879,7 +6853,7 @@ run_printer(_ipp_printer_t *printer)      /* I - Printer */
 
 #ifdef HAVE_DNSSD
     if (polldata[2].revents & POLLIN)
-      DNSServiceProcessResult(printer->common_ref);
+      DNSServiceProcessResult(DNSSDMaster);
 #endif /* HAVE_DNSSD */
 
    /*
@@ -4892,6 +6866,23 @@ run_printer(_ipp_printer_t *printer)     /* I - Printer */
 
 
 /*
+ * '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    *curtime = localtime(&tv);
+                                       /* Local time */
+
+  strftime(buffer, bufsize, "%X", curtime);
+  return (buffer);
+}
+
+
+/*
  * 'usage()' - Show program usage.
  */
 
@@ -4900,7 +6891,8 @@ usage(int status)                 /* O - Exit status */
 {
   if (!status)
   {
-    puts(CUPS_SVERSION " - Copyright 2010 by Apple Inc. All rights reserved.");
+    puts(CUPS_SVERSION " - Copyright 2010-2015 by Apple Inc. All rights "
+         "reserved.");
     puts("");
   }
 
@@ -4909,17 +6901,21 @@ usage(int status)                       /* O - Exit status */
   puts("Options:");
   puts("-2                      Supports 2-sided printing (default=1-sided)");
   puts("-M manufacturer         Manufacturer name (default=Test)");
+  puts("-P                      PIN printing mode");
+  puts("-a attributes-file      Load printer attributes from file");
+  puts("-c command              Run command for every print job");
   printf("-d spool-directory      Spool directory "
          "(default=/tmp/ippserver.%d)\n", (int)getpid());
   puts("-f type/subtype[,...]   List of supported types "
        "(default=application/pdf,image/jpeg)");
   puts("-h                      Show program help");
   puts("-i iconfile.png         PNG icon file (default=printer.png)");
+  puts("-k                      Keep job spool files");
   puts("-l location             Location of printer (default=empty string)");
   puts("-m model                Model name (default=Printer)");
   puts("-n hostname             Hostname for printer");
   puts("-p port                 Port number (default=auto)");
-  puts("-r regtype              Bonjour service type (default=_ipp._tcp)");
+  puts("-r subtype              Bonjour service subtype (default=_print)");
   puts("-s speed[,color-speed]  Speed in pages per minute (default=10,0)");
   puts("-v[vvv]                 Be (very) verbose");
 
@@ -4939,108 +6935,137 @@ static int                            /* O - 1 if valid, 0 if not */
 valid_doc_attributes(
     _ipp_client_t *client)             /* I - Client */
 {
-  int                  i;              /* Looping var */
+  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;     /* document-format-supported */
-  const char           *format = NULL; /* document-format value */
+                       *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 ((attr = ippFindAttribute(client->request, "compression", IPP_TAG_ZERO)) != NULL)
   {
    /*
-    * If compression is specified, only accept "none"...
+    * If compression is specified, only accept a supported value in a Print-Job
+    * or Send-Document request...
     */
 
-    if (attr->num_values != 1 || attr->value_tag != IPP_TAG_KEYWORD ||
-        strcmp(attr->values[0].string.text, "none"))
+    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->http.hostname,
-              ippOpString(client->request->request.op.operation_id),
-              attr->values[0].string.text);
+    {
+      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 ((attr = ippFindAttribute(client->request, "document-format", IPP_TAG_ZERO)) != NULL)
   {
-    if (attr->num_values != 1 || attr->value_tag != IPP_TAG_MIMETYPE)
+    if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_MIMETYPE ||
+        ippGetGroupTag(attr) != IPP_TAG_OPERATION)
+    {
       respond_unsupported(client, attr);
+      valid = 0;
+    }
     else
     {
-      format = attr->values[0].string.text;
+      format = ippGetString(attr, 0, NULL);
 
       fprintf(stderr, "%s %s document-format=\"%s\"\n",
-             client->http.hostname,
-             ippOpString(client->request->request.op.operation_id), format);
+             client->hostname, op_name, format);
+
+      ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-supplied", NULL, format);
     }
   }
   else
-    format = "application/octet-stream";
+  {
+    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 (!strcmp(format, "application/octet-stream") &&
-      (client->request->request.op.operation_id == IPP_PRINT_JOB ||
-       client->request->request.op.operation_id == IPP_SEND_DOCUMENT))
+  if (!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 4 bytes of the file...
+    * Auto-type the file using the first 8 bytes of the file...
     */
 
-    unsigned char      header[4];      /* First 4 bytes of file */
+    unsigned char      header[8];      /* First 8 bytes of file */
 
     memset(header, 0, sizeof(header));
-    _httpPeek(&(client->http), (char *)header, 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)
+    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->http.hostname,
-             ippOpString(client->request->request.op.operation_id), format);
+             client->hostname, op_name, format);
 
-    if (!attr)
-      attr = ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE,
-                          "document-format", NULL, format);
-    else
-    {
-      _cupsStrFree(attr->values[0].string.text);
-      attr->values[0].string.text = _cupsStrAlloc(format);
+      ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format-detected", NULL, format);
     }
   }
 
-  if (client->request->request.op.operation_id != IPP_CREATE_JOB &&
-      (supported = ippFindAttribute(client->printer->attrs,
-                                    "document-format-supported",
-                                   IPP_TAG_MIMETYPE)) != NULL)
+  if (op != IPP_OP_CREATE_JOB && (supported = ippFindAttribute(client->printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE)) != NULL && !ippContainsString(supported, format))
   {
-    for (i = 0; i < supported->num_values; i ++)
-      if (!_cups_strcasecmp(format, supported->values[i].string.text))
-       break;
-
-    if (i >= supported->num_values && attr)
-      respond_unsupported(client, attr);
+    respond_unsupported(client, attr);
+    valid = 0;
   }
 
-  return (!client->response->attrs ||
-          !client->response->attrs->next ||
-          !client->response->attrs->next->next);
+ /*
+  * 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);
 }
 
 
@@ -5055,7 +7080,9 @@ static int                                /* O - 1 if valid, 0 if not */
 valid_job_attributes(
     _ipp_client_t *client)             /* I - Client */
 {
-  int                  i;              /* Looping var */
+  int                  i,              /* Looping var */
+                       count,          /* Number of values */
+                       valid = 1;      /* Valid attributes? */
   ipp_attribute_t      *attr,          /* Current attribute */
                        *supported;     /* xxx-supported attribute */
 
@@ -5064,193 +7091,305 @@ valid_job_attributes(
   * Check operation attributes...
   */
 
-  valid_doc_attributes(client);
+  valid = valid_doc_attributes(client);
 
  /*
   * Check the various job template attributes...
   */
 
-  if ((attr = ippFindAttribute(client->request, "copies",
-                               IPP_TAG_ZERO)) != NULL)
+  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 (attr->num_values != 1 || attr->value_tag != IPP_TAG_INTEGER ||
-        attr->values[0].integer < 1 || attr->values[0].integer > 999)
+    if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_BOOLEAN)
     {
       respond_unsupported(client, attr);
+      valid = 0;
     }
   }
 
-  if ((attr = ippFindAttribute(client->request, "ipp-attribute-fidelity",
-                               IPP_TAG_ZERO)) != NULL)
+  if ((attr = ippFindAttribute(client->request, "job-hold-until", IPP_TAG_ZERO)) != NULL)
   {
-    if (attr->num_values != 1 || attr->value_tag != IPP_TAG_BOOLEAN)
+    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-hold-until",
-                               IPP_TAG_ZERO)) != NULL)
+  if ((attr = ippFindAttribute(client->request, "job-impressions", IPP_TAG_ZERO)) != NULL)
   {
-    if (attr->num_values != 1 ||
-        (attr->value_tag != IPP_TAG_NAME &&
-        attr->value_tag != IPP_TAG_NAMELANG &&
-        attr->value_tag != IPP_TAG_KEYWORD) ||
-       strcmp(attr->values[0].string.text, "no-hold"))
+    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 ((attr = ippFindAttribute(client->request, "job-name", IPP_TAG_ZERO)) != NULL)
   {
-    if (attr->num_values != 1 ||
-        (attr->value_tag != IPP_TAG_NAME &&
-        attr->value_tag != IPP_TAG_NAMELANG))
+    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 ((attr = ippFindAttribute(client->request, "job-priority", IPP_TAG_ZERO)) != NULL)
   {
-    if (attr->num_values != 1 || attr->value_tag != IPP_TAG_INTEGER ||
-        attr->values[0].integer < 1 || attr->values[0].integer > 100)
+    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 ((attr = ippFindAttribute(client->request, "job-sheets", IPP_TAG_ZERO)) != NULL)
   {
-    if (attr->num_values != 1 ||
-        (attr->value_tag != IPP_TAG_NAME &&
-        attr->value_tag != IPP_TAG_NAMELANG &&
-        attr->value_tag != IPP_TAG_KEYWORD) ||
-       strcmp(attr->values[0].string.text, "none"))
+    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 ((attr = ippFindAttribute(client->request, "media", IPP_TAG_ZERO)) != NULL)
   {
-    if (attr->num_values != 1 ||
-        (attr->value_tag != IPP_TAG_NAME &&
-        attr->value_tag != IPP_TAG_NAMELANG &&
-        attr->value_tag != IPP_TAG_KEYWORD))
+    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
     {
-      for (i = 0;
-           i < (int)(sizeof(media_supported) / sizeof(media_supported[0]));
-          i ++)
-        if (!strcmp(attr->values[0].string.text, media_supported[i]))
-         break;
+      supported = ippFindAttribute(client->printer->attrs, "media-supported", IPP_TAG_KEYWORD);
 
-      if (i >= (int)(sizeof(media_supported) / sizeof(media_supported[0])))
+      if (!ippContainsString(supported, ippGetString(attr, 0, NULL)))
       {
        respond_unsupported(client, attr);
+       valid = 0;
       }
     }
   }
 
-  if ((attr = ippFindAttribute(client->request, "media-col",
-                               IPP_TAG_ZERO)) != NULL)
+  if ((attr = ippFindAttribute(client->request, "media-col", IPP_TAG_ZERO)) != NULL)
   {
-    if (attr->num_values != 1 || attr->value_tag != IPP_TAG_BEGIN_COLLECTION)
+    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;
+         }
+       }
+      }
     }
-    /* TODO: check for valid media-col */
   }
 
-  if ((attr = ippFindAttribute(client->request, "multiple-document-handling",
-                               IPP_TAG_ZERO)) != NULL)
+  if ((attr = ippFindAttribute(client->request, "multiple-document-handling", IPP_TAG_ZERO)) != NULL)
   {
-    if (attr->num_values != 1 || attr->value_tag != IPP_TAG_KEYWORD ||
-        (strcmp(attr->values[0].string.text,
+    if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD ||
+        (strcmp(ippGetString(attr, 0, NULL),
                "separate-documents-uncollated-copies") &&
-        strcmp(attr->values[0].string.text,
+        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 ((attr = ippFindAttribute(client->request, "orientation-requested", IPP_TAG_ZERO)) != NULL)
   {
-    if (attr->num_values != 1 || attr->value_tag != IPP_TAG_ENUM ||
-        attr->values[0].integer < IPP_PORTRAIT ||
-        attr->values[0].integer > IPP_REVERSE_PORTRAIT)
+    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 ((attr = ippFindAttribute(client->request, "page-ranges", IPP_TAG_ZERO)) != NULL)
   {
-    respond_unsupported(client, attr);
+    if (ippGetValueTag(attr) != IPP_TAG_RANGE)
+    {
+      respond_unsupported(client, attr);
+      valid = 0;
+    }
   }
 
-  if ((attr = ippFindAttribute(client->request, "print-quality",
-                               IPP_TAG_ZERO)) != NULL)
+  if ((attr = ippFindAttribute(client->request, "print-quality", IPP_TAG_ZERO)) != NULL)
   {
-    if (attr->num_values != 1 || attr->value_tag != IPP_TAG_ENUM ||
-        attr->values[0].integer < IPP_QUALITY_DRAFT ||
-        attr->values[0].integer > IPP_QUALITY_HIGH)
+    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)
+  if ((attr = ippFindAttribute(client->request, "printer-resolution", IPP_TAG_ZERO)) != NULL)
   {
-    respond_unsupported(client, attr);
+    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)
+  if ((attr = ippFindAttribute(client->request, "sides", IPP_TAG_ZERO)) != NULL)
   {
-    if (attr->num_values != 1 || attr->value_tag != IPP_TAG_KEYWORD)
+    const char *sides = ippGetString(attr, 0, NULL);
+                                       /* "sides" value... */
+
+    if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD)
     {
       respond_unsupported(client, attr);
+      valid = 0;
     }
-
-    if ((supported = ippFindAttribute(client->printer->attrs, "sides",
-                                      IPP_TAG_KEYWORD)) != NULL)
+    else if ((supported = ippFindAttribute(client->printer->attrs, "sides-supported", IPP_TAG_KEYWORD)) != NULL)
     {
-      for (i = 0; i < supported->num_values; i ++)
-        if (!strcmp(attr->values[0].string.text,
-                   supported->values[i].string.text))
-         break;
-
-      if (i >= supported->num_values)
+      if (!ippContainsString(supported, sides))
       {
        respond_unsupported(client, attr);
+       valid = 0;
       }
     }
-    else
+    else if (strcmp(sides, "one-sided"))
     {
       respond_unsupported(client, attr);
+      valid = 0;
     }
   }
 
-  return (!client->response->attrs ||
-          !client->response->attrs->next ||
-          !client->response->attrs->next->next);
+  return (valid);
 }
 
 
 /*
- * End of "$Id: ippserver.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: ippserver.c 12947 2015-10-28 15:23:33Z msweet $".
  */
diff --git a/test/ippserver.man b/test/ippserver.man
new file mode 100644 (file)
index 0000000..a5c1c1c
--- /dev/null
@@ -0,0 +1,172 @@
+.\"
+.\" "$Id$"
+.\"
+.\" ippserver man page for CUPS.
+.\"
+.\" Copyright 2014 by Apple Inc.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Apple Inc. and are protected by Federal copyright
+.\" law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+.\" which should have been included with this file.  If this file is
+.\" file is missing or damaged, see the license at "http://www.cups.org/".
+.\"
+.TH ippserver 1 "CUPS" "28 August 2014" "Apple Inc."
+.SH NAME
+ippserver \- a simple internet printing protocol server
+.SH SYNOPSIS
+.B ippserver
+[
+.B \-2
+] [
+.B \-M
+.I manufacturer
+] [
+.B \-P
+] [
+.B \-c
+.I command
+] [
+.B \-d
+.I spool-directory
+] [
+.B \-f
+.I type/subtype[,...]
+] [
+.B \-h
+] [
+.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
+] [
+.B \-s
+.I speed[,color-speed]
+] [
+.B \-v[vvv]
+]
+.I service-name
+.SH DESCRIPTION
+.B ippserver
+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 ippserver:
+.TP 5
+.B \-2
+Report support for two-sided (duplex) printing.
+.TP 5
+\fB\-M \fImanufacturer\fR
+Set the manufacturer of the printer.
+The default is "Test".
+.TP 5
+.B \-P
+Report support for PIN printing.
+.TP 5
+\fB\-c \fIcommand\fR
+Run the specified command for each document that is printed.
+.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 is "application/pdf,image/jpeg,image/pwg-raster".
+.TP 5
+.B \-h
+Shows program help.
+.TP 5
+\fB\-i \fIiconfile.png\fR
+Specifies the printer icon file for the server.
+The default is "printer.png".
+.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
+\fB\-r \fIsubtype\fR
+Specifies the Bonjour 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 the standard output.
+.SH EXIT STATUS
+The
+.B ippserver
+program returns 1 if it is unable to process the command-line arguments or register the IPP service.
+Otherwise
+.B ippserver
+will run continuously until terminated.
+.SH CONFORMING TO
+The
+.B ippserver
+program is unique to CUPS and conforms to the IPP Everywhere (PWG 5100.14) specification.
+.SH ENVIRONMENT
+.B ippserver
+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
+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".
+.SH EXAMPLES
+Run
+.B ippserver
+with a service name of My Cool Printer:
+.nf
+
+    ippserver "My Cool Printer"
+.fi
+.LP
+Run the
+.BR file (1)
+command whenever a job is sent to the server:
+.nf
+
+    ippserver \-c file "My Cool Printer"
+.fi
+.SH SEE ALSO
+PWG Internet Printing Protocol Workgroup (http://www.pwg.org/ipp)
+.SH COPYRIGHT
+Copyright \[co] 2007-2014 by Apple Inc.
+.\"
+.\" End of "$Id$".
+.\"
index afa60ef..64d827b 100644 (file)
@@ -1,48 +1,18 @@
 /*
- * "$Id: ipptool.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: ipptool.c 12952 2015-10-28 17:22:39Z msweet $"
  *
- *   ipptool command for CUPS.
+ * ipptool command for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- *   main()              - Parse options and do tests.
- *   add_stringf()       - Add a formatted string to an array.
- *   compare_vars()      - Compare two variables.
- *   do_tests()          - Do tests as specified in the test file.
- *   expand_variables()  - Expand variables in a string.
- *   expect_matches()    - Return true if the tag matches the specification.
- *   get_collection()    - Get a collection value from the current test file.
- *   get_filename()      - Get a filename based on the current test file.
- *   get_token()         - Get a token from a file.
- *   get_variable()      - Get the value of a variable.
- *   iso_date()          - Return an ISO 8601 date/time string for the given IPP
- *                         dateTime value.
- *   password_cb()       - Password callback for authenticated tests.
- *   print_attr()        - Print an attribute on the screen.
- *   print_col()         - Print a collection attribute on the screen.
- *   print_csv()         - Print a line of CSV text.
- *   print_fatal_error() - Print a fatal error message.
- *   print_line()        - Print a line of formatted or CSV text.
- *   print_xml_header()  - Print a standard XML plist header.
- *   print_xml_string()  - Print an XML string with escaping.
- *   print_xml_trailer() - Print the XML trailer with success/fail value.
- *   set_variable()      - Set a variable value.
- *   sigterm_handler()   - Handle SIGINT and SIGTERM.
- *   timeout_cb()        - Handle HTTP timeouts.
- *   usage()             - Show program usage.
- *   validate_attr()     - Determine whether an attribute is valid.
- *   with_value()        - Test a WITH-VALUE predicate.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 /*
 #include <cups/file-private.h>
 #include <regex.h>
 #include <sys/stat.h>
-#ifndef WIN32
+#ifdef WIN32
+#  include <windows.h>
+#  ifndef R_OK
+#    define R_OK 0
+#  endif /* !R_OK */
+#else
 #  include <signal.h>
+#  include <termios.h>
 #endif /* WIN32 */
 #ifndef O_BINARY
 #  define O_BINARY 0
@@ -85,19 +61,24 @@ 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_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? */
+               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 */
@@ -148,12 +129,14 @@ typedef struct _cups_vars_s               /**** Set of variables ****/
  * Globals...
  */
 
-_cups_transfer_t Transfer = _CUPS_TRANSFER_AUTO;
+static _cups_transfer_t Transfer = _CUPS_TRANSFER_AUTO;
                                        /* How to transfer requests */
-_cups_output_t Output = _CUPS_OUTPUT_LIST;
+static _cups_output_t  Output = _CUPS_OUTPUT_LIST;
                                        /* Output mode */
-int            Cancel = 0,             /* Cancel test? */
+static int     Cancel = 0,             /* Cancel test? */
                IgnoreErrors = 0,       /* Ignore errors? */
+               StopAfterIncludeError = 0,
+                                       /* Stop after include errors? */
                Verbosity = 0,          /* Show all attributes? */
                Version = 11,           /* Default IPP version */
                XMLHeader = 0,          /* 1 if header is written */
@@ -161,65 +144,44 @@ int               Cancel = 0,             /* Cancel test? */
                PassCount = 0,          /* Number of passing tests */
                FailCount = 0,          /* Number of failing tests */
                SkipCount = 0;          /* Number of skipped tests */
-char           *Password = NULL;       /* Password from URI */
-const char * const URIStatusStrings[] =        /* URI status strings */
-{
-  "URI too large",
-  "Bad arguments to function",
-  "Bad resource in URI",
-  "Bad port number in URI",
-  "Bad hostname/address in URI",
-  "Bad username in URI",
-  "Bad scheme in URI",
-  "Bad/empty URI",
-  "OK",
-  "Missing scheme in URI",
-  "Unknown scheme in URI",
-  "Missing resource in URI"
-};
+static char    *Username = NULL,       /* Username from URI */
+               *Password = NULL;       /* Password from URI */
+static int     PasswordTries = 0;      /* Number of tries with password */
 
 
 /*
  * Local functions...
  */
 
-static void    add_stringf(cups_array_t *a, const char *s, ...)
-               __attribute__ ((__format__ (__printf__, 2, 3)));
+static void    add_stringf(cups_array_t *a, const char *s, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
 static int     compare_vars(_cups_var_t *a, _cups_var_t *b);
-static int     do_tests(_cups_vars_t *vars, const char *testfile);
-static void    expand_variables(_cups_vars_t *vars, char *dst, const char *src,
-                                size_t dstsize) __attribute__((nonnull(1,2,3)));
+static int     do_tests(FILE *outfile, _cups_vars_t *vars, const char *testfile);
+static void    expand_variables(_cups_vars_t *vars, char *dst, const char *src, size_t dstsize) __attribute__((nonnull(1,2,3)));
 static int      expect_matches(_cups_expect_t *expect, ipp_tag_t value_tag);
-static ipp_t   *get_collection(_cups_vars_t *vars, FILE *fp, int *linenum);
-static char    *get_filename(const char *testfile, char *dst, const char *src,
-                             size_t dstsize);
-static char    *get_token(FILE *fp, char *buf, int buflen,
-                          int *linenum);
+static ipp_t   *get_collection(FILE *outfile, _cups_vars_t *vars, FILE *fp, int *linenum);
+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 char    *get_token(FILE *fp, char *buf, int buflen, int *linenum);
 static char    *get_variable(_cups_vars_t *vars, const char *name);
 static char    *iso_date(ipp_uchar_t *date);
 static const char *password_cb(const char *prompt);
-static void    print_attr(ipp_attribute_t *attr, ipp_tag_t *group);
-static void    print_col(ipp_t *col);
-static void    print_csv(ipp_attribute_t *attr, int num_displayed,
-                         char **displayed, size_t *widths);
-static void    print_fatal_error(const char *s, ...)
-               __attribute__ ((__format__ (__printf__, 1, 2)));
-static void    print_line(ipp_attribute_t *attr, int num_displayed,
-                          char **displayed, size_t *widths);
-static void    print_xml_header(void);
-static void    print_xml_string(const char *element, const char *s);
-static void    print_xml_trailer(int success, const char *message);
-static void    set_variable(_cups_vars_t *vars, const char *name,
-                            const char *value);
+static void    pause_message(const char *message);
+static void    print_attr(FILE *outfile, int format, ipp_attribute_t *attr, ipp_tag_t *group);
+static void    print_csv(FILE *outfile, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths);
+static void    print_fatal_error(FILE *outfile, const char *s, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
+static void    print_line(FILE *outfile, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths);
+static void    print_xml_header(FILE *outfile);
+static void    print_xml_string(FILE *outfile, const char *element, const char *s);
+static void    print_xml_trailer(FILE *outfile, int success, const char *message);
+static void    set_variable(FILE *outfile, _cups_vars_t *vars, const char *name, const char *value);
 #ifndef WIN32
 static void    sigterm_handler(int sig);
 #endif /* WIN32 */
 static int     timeout_cb(http_t *http, void *user_data);
 static void    usage(void) __attribute__((noreturn));
-static int     validate_attr(cups_array_t *errors, ipp_attribute_t *attr);
-static int      with_value(cups_array_t *errors, char *value, int flags,
-                          ipp_attribute_t *attr, char *matchbuf,
-                          size_t matchlen);
+static int     validate_attr(FILE *outfile, cups_array_t *errors, ipp_attribute_t *attr);
+static int      with_value(FILE *outfile, 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);
 
 
 /*
@@ -232,6 +194,8 @@ main(int  argc,                             /* I - Number of command-line args */
 {
   int                  i;              /* Looping var */
   int                  status;         /* Status of tests... */
+  FILE                 *outfile = stdout;
+                                       /* Output file */
   char                 *opt,           /* Current option */
                        name[1024],     /* Name/value buffer */
                        *value,         /* Pointer to value */
@@ -280,7 +244,20 @@ main(int  argc,                            /* I - Number of command-line args */
 
   for (i = 1; i < argc; i ++)
   {
-    if (argv[i][0] == '-')
+    if (!strcmp(argv[i], "--help"))
+    {
+      usage();
+    }
+    else if (!strcmp(argv[i], "--stop-after-include-error"))
+    {
+      StopAfterIncludeError = 1;
+    }
+    else if (!strcmp(argv[i], "--version"))
+    {
+      puts(CUPS_SVERSION);
+      return (0);
+    }
+    else if (argv[i][0] == '-')
     {
       for (opt = argv[i] + 1; *opt; opt ++)
       {
@@ -317,6 +294,33 @@ main(int  argc,                            /* I - Number of command-line args */
               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 (outfile != stdout)
+                usage();
+
+              if ((outfile = fopen(argv[i], "w")) == NULL)
+              {
+                _cupsLangPrintf(stderr, _("%s: Unable to open \"%s\": %s"), "ipptool", argv[i], strerror(errno));
+                exit(1);
+              }
+
+             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
              vars.encryption = HTTP_ENCRYPT_ALWAYS;
@@ -331,8 +335,9 @@ main(int  argc,                             /* I - Number of command-line args */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr,
-                             _("ipptool: Missing timeout for \"-T\"."));
+               _cupsLangPrintf(stderr,
+                               _("%s: Missing timeout for \"-T\"."),
+                               "ipptool");
                usage();
               }
 
@@ -344,8 +349,9 @@ main(int  argc,                             /* I - Number of command-line args */
 
              if (i >= argc)
              {
-               _cupsLangPuts(stderr,
-                             _("ipptool: Missing version for \"-V\"."));
+               _cupsLangPrintf(stderr,
+                               _("%s: Missing version for \"-V\"."),
+                               "ipptool");
                usage();
               }
 
@@ -362,8 +368,8 @@ main(int  argc,                             /* I - Number of command-line args */
              else
              {
                _cupsLangPrintf(stderr,
-                               _("ipptool: Bad version %s for \"-V\"."),
-                               argv[i]);
+                               _("%s: Bad version %s for \"-V\"."),
+                               "ipptool", argv[i]);
                usage();
              }
              break;
@@ -373,8 +379,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
               if (interval || repeat)
              {
-               _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are "
-                                       "incompatible with -X\"."));
+               _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."));
                usage();
              }
              break;
@@ -399,7 +404,7 @@ main(int  argc,                             /* I - Number of command-line args */
              else
                value = name + strlen(name);
 
-             set_variable(&vars, name, value);
+             set_variable(outfile, &vars, name, value);
              break;
 
           case 'f' : /* Set the default test filename */
@@ -413,7 +418,10 @@ main(int  argc,                            /* I - Number of command-line args */
               }
 
               if (vars.filename)
+              {
                free(vars.filename);
+               vars.filename = NULL;
+             }
 
               if (access(argv[i], 0))
               {
@@ -436,6 +444,8 @@ main(int  argc,                             /* I - Number of command-line args */
                             cg->cups_datadir, argv[i]);
                    if (access(filename, 0))
                      vars.filename = strdup(argv[i]);
+                   else
+                     vars.filename = strdup(filename);
                  }
                  else
                    vars.filename = strdup(filename);
@@ -453,34 +463,43 @@ main(int  argc,                           /* I - Number of command-line args */
                 */
 
                 if (!_cups_strcasecmp(ext, ".gif"))
-                  set_variable(&vars, "filetype", "image/gif");
+                  set_variable(outfile, &vars, "filetype", "image/gif");
                 else if (!_cups_strcasecmp(ext, ".htm") ||
                          !_cups_strcasecmp(ext, ".htm.gz") ||
                          !_cups_strcasecmp(ext, ".html") ||
                          !_cups_strcasecmp(ext, ".html.gz"))
-                  set_variable(&vars, "filetype", "text/html");
-                else if (!_cups_strcasecmp(ext, ".jpg"))
-                  set_variable(&vars, "filetype", "image/jpeg");
+                  set_variable(outfile, &vars, "filetype", "text/html");
+                else if (!_cups_strcasecmp(ext, ".jpg") ||
+                         !_cups_strcasecmp(ext, ".jpeg"))
+                  set_variable(outfile, &vars, "filetype", "image/jpeg");
                 else if (!_cups_strcasecmp(ext, ".pcl") ||
                          !_cups_strcasecmp(ext, ".pcl.gz"))
-                  set_variable(&vars, "filetype", "application/vnd.hp-PCL");
+                  set_variable(outfile, &vars, "filetype", "application/vnd.hp-PCL");
                 else if (!_cups_strcasecmp(ext, ".pdf"))
-                  set_variable(&vars, "filetype", "application/pdf");
+                  set_variable(outfile, &vars, "filetype", "application/pdf");
                 else if (!_cups_strcasecmp(ext, ".png"))
-                  set_variable(&vars, "filetype", "image/png");
+                  set_variable(outfile, &vars, "filetype", "image/png");
                 else if (!_cups_strcasecmp(ext, ".ps") ||
                          !_cups_strcasecmp(ext, ".ps.gz"))
-                  set_variable(&vars, "filetype", "application/postscript");
-                else if (!_cups_strcasecmp(ext, ".ras") ||
+                  set_variable(outfile, &vars, "filetype", "application/postscript");
+                else if (!_cups_strcasecmp(ext, ".pwg") ||
+                         !_cups_strcasecmp(ext, ".pwg.gz") ||
+                         !_cups_strcasecmp(ext, ".ras") ||
                          !_cups_strcasecmp(ext, ".ras.gz"))
-                  set_variable(&vars, "filetype", "image/pwg-raster");
+                  set_variable(outfile, &vars, "filetype", "image/pwg-raster");
+                else if (!_cups_strcasecmp(ext, ".tif") ||
+                         !_cups_strcasecmp(ext, ".tiff"))
+                  set_variable(outfile, &vars, "filetype", "image/tiff");
                 else if (!_cups_strcasecmp(ext, ".txt") ||
                          !_cups_strcasecmp(ext, ".txt.gz"))
-                  set_variable(&vars, "filetype", "text/plain");
+                  set_variable(outfile, &vars, "filetype", "text/plain");
+                else if (!_cups_strcasecmp(ext, ".urf") ||
+                         !_cups_strcasecmp(ext, ".urf.gz"))
+                  set_variable(outfile, &vars, "filetype", "image/urf");
                 else if (!_cups_strcasecmp(ext, ".xps"))
-                  set_variable(&vars, "filetype", "application/openxps");
+                  set_variable(outfile, &vars, "filetype", "application/openxps");
                 else
-                 set_variable(&vars, "filetype", "application/octet-stream");
+                 set_variable(outfile, &vars, "filetype", "application/octet-stream");
               }
               else
               {
@@ -488,7 +507,7 @@ main(int  argc,                             /* I - Number of command-line args */
                 * Use the "auto-type" MIME media type...
                 */
 
-               set_variable(&vars, "filetype", "application/octet-stream");
+               set_variable(outfile, &vars, "filetype", "application/octet-stream");
               }
              break;
 
@@ -515,8 +534,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
               if (Output == _CUPS_OUTPUT_PLIST && interval)
              {
-               _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are "
-                                       "incompatible with -X\"."));
+               _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."));
                usage();
              }
              break;
@@ -539,8 +557,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
               if (Output == _CUPS_OUTPUT_PLIST && repeat)
              {
-               _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are "
-                                       "incompatible with -X\"."));
+               _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"-P\" and \"-X\"."));
                usage();
              }
              break;
@@ -561,7 +578,6 @@ main(int  argc,                             /* I - Number of command-line args */
              _cupsLangPrintf(stderr, _("ipptool: Unknown option \"-%c\"."),
                              *opt);
              usage();
-             break;
        }
       }
     }
@@ -597,8 +613,7 @@ main(int  argc,                             /* I - Number of command-line args */
 
       if (uri_status != HTTP_URI_OK)
       {
-        _cupsLangPrintf(stderr, _("ipptool: Bad URI - %s."),
-                       URIStatusStrings[uri_status - HTTP_URI_OVERFLOW]);
+        _cupsLangPrintf(stderr, _("ipptool: Bad URI - %s."), httpURIStatusString(uri_status));
         return (1);
       }
 
@@ -607,9 +622,9 @@ main(int  argc,                             /* I - Number of command-line args */
         if ((Password = strchr(vars.userpass, ':')) != NULL)
          *Password++ = '\0';
 
-        cupsSetUser(vars.userpass);
+        Username = vars.userpass;
        cupsSetPasswordCB(password_cb);
-       set_variable(&vars, "uriuser", vars.userpass);
+       set_variable(outfile, &vars, "uriuser", vars.userpass);
       }
 
       httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), vars.scheme, NULL,
@@ -625,6 +640,7 @@ main(int  argc,                             /* I - Number of command-line args */
       if (!vars.uri)
       {
         _cupsLangPuts(stderr, _("ipptool: URI required before test file."));
+        _cupsLangPuts(stderr, argv[i]);
        usage();
       }
 
@@ -644,7 +660,7 @@ main(int  argc,                             /* I - Number of command-line args */
       else
         testfile = argv[i];
 
-      if (!do_tests(&vars, testfile))
+      if (!do_tests(outfile, &vars, testfile))
         status = 1;
     }
   }
@@ -657,13 +673,13 @@ main(int  argc,                           /* I - Number of command-line args */
   */
 
   if (Output == _CUPS_OUTPUT_PLIST)
-    print_xml_trailer(!status, NULL);
+    print_xml_trailer(outfile, !status, NULL);
   else if (interval > 0 && repeat > 0)
   {
     while (repeat > 1)
     {
-      usleep(interval);
-      do_tests(&vars, testfile);
+      usleep((useconds_t)interval);
+      do_tests(outfile, &vars, testfile);
       repeat --;
     }
   }
@@ -671,11 +687,12 @@ main(int  argc,                           /* I - Number of command-line args */
   {
     for (;;)
     {
-      usleep(interval);
-      do_tests(&vars, testfile);
+      usleep((useconds_t)interval);
+      do_tests(outfile, &vars, testfile);
     }
   }
-  else if (Output == _CUPS_OUTPUT_TEST && TestCount > 1)
+
+  if ((Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile)) && TestCount > 1)
   {
    /*
     * Show a summary report if there were multiple tests...
@@ -747,7 +764,8 @@ compare_vars(_cups_var_t *a,                /* I - First variable */
  */
 
 static int                             /* 1 = success, 0 = failure */
-do_tests(_cups_vars_t *vars,           /* I - Variables */
+do_tests(FILE         *outfile,                /* I - Output file */
+         _cups_vars_t *vars,           /* I - Variables */
          const char   *testfile)       /* I - Test file to use */
 {
   int          i,                      /* Looping var */
@@ -768,7 +786,8 @@ do_tests(_cups_vars_t *vars,                /* I - Variables */
                token[1024],            /* Token from file */
                *tokenptr,              /* Pointer into token */
                temp[1024],             /* Temporary string */
-               buffer[8192];           /* Copy buffer */
+               buffer[8192],           /* Copy buffer */
+               compression[16];        /* COMPRESSION value */
   ipp_t                *request = NULL,        /* IPP request */
                *response = NULL;       /* IPP response */
   size_t       length;                 /* Length of IPP request */
@@ -782,7 +801,9 @@ do_tests(_cups_vars_t *vars,                /* I - Variables */
   ipp_attribute_t *attrptr,            /* Attribute pointer */
                *found,                 /* Found attribute */
                *lastcol = NULL;        /* Last collection attribute */
-  char         name[1024];             /* Name of test */
+  char         name[1024],             /* Name of test */
+               file_id[1024],          /* File identifier */
+               test_id[1024];          /* Test identifier */
   char         filename[1024];         /* Filename */
   _cups_transfer_t transfer;           /* To chunk or not to chunk */
   int          version,                /* IPP version number to use */
@@ -808,7 +829,7 @@ do_tests(_cups_vars_t *vars,                /* I - Variables */
 
   if ((fp = fopen(testfile, "r")) == NULL)
   {
-    print_fatal_error("Unable to open test file %s - %s", testfile,
+    print_fatal_error(outfile, "Unable to open test file %s - %s", testfile,
                       strerror(errno));
     pass = 0;
     goto test_exit;
@@ -818,22 +839,21 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
   * Connect to the server...
   */
 
-  if ((http = _httpCreate(vars->hostname, vars->port, NULL, vars->encryption,
-                         vars->family)) == NULL)
+  if ((http = httpConnect2(vars->hostname, vars->port, NULL, vars->family,
+                           vars->encryption, 1, 30000, NULL)) == NULL)
   {
-    print_fatal_error("Unable to connect to %s on port %d - %s", vars->hostname,
+    print_fatal_error(outfile, "Unable to connect to %s on port %d - %s", vars->hostname,
                       vars->port, cupsLastErrorString());
     pass = 0;
     goto test_exit;
   }
 
-  if (httpReconnect(http))
-  {
-    print_fatal_error("Unable to connect to %s on port %d - %s", vars->hostname,
-                      vars->port, cupsLastErrorString());
-    pass = 0;
-    goto test_exit;
-  }
+#ifdef HAVE_LIBZ
+  httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING,
+                      "deflate, gzip, identity");
+#else
+  httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING, "identity");
+#endif /* HAVE_LIBZ */
 
   if (vars->timeout > 0.0)
     httpSetTimeout(http, vars->timeout, timeout_cb, NULL);
@@ -846,6 +866,7 @@ do_tests(_cups_vars_t *vars,                /* I - Variables */
 
   errors     = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup,
                              (cups_afree_func_t)free);
+  file_id[0] = '\0';
   pass       = 1;
   linenum    = 1;
   request_id = (CUPS_RAND() % 1000) * 137 + 1;
@@ -866,11 +887,11 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
           get_token(fp, temp, sizeof(temp), &linenum))
       {
         expand_variables(vars, token, temp, sizeof(token));
-       set_variable(vars, attr, token);
+       set_variable(outfile, vars, attr, token);
       }
       else
       {
-        print_fatal_error("Missing DEFINE name and/or value on line %d.",
+        print_fatal_error(outfile, "Missing DEFINE name and/or value on line %d.",
                          linenum);
        pass = 0;
        goto test_exit;
@@ -889,11 +910,11 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       {
         expand_variables(vars, token, temp, sizeof(token));
        if (!get_variable(vars, attr))
-         set_variable(vars, attr, token);
+         set_variable(outfile, vars, attr, token);
       }
       else
       {
-        print_fatal_error("Missing DEFINE-DEFAULT name and/or value on line "
+        print_fatal_error(outfile, "Missing DEFINE-DEFAULT name and/or value on line "
                          "%d.", linenum);
        pass = 0;
        goto test_exit;
@@ -901,6 +922,25 @@ do_tests(_cups_vars_t *vars,               /* I - Variables */
 
       continue;
     }
+    else if (!strcmp(token, "FILE-ID"))
+    {
+     /*
+      * FILE-ID "string"
+      */
+
+      if (get_token(fp, temp, sizeof(temp), &linenum))
+      {
+        expand_variables(vars, file_id, temp, sizeof(file_id));
+      }
+      else
+      {
+        print_fatal_error(outfile, "Missing FILE-ID value on line %d.", linenum);
+       pass = 0;
+       goto test_exit;
+      }
+
+      continue;
+    }
     else if (!strcmp(token, "IGNORE-ERRORS"))
     {
      /*
@@ -915,7 +955,7 @@ do_tests(_cups_vars_t *vars,                /* I - Variables */
       }
       else
       {
-        print_fatal_error("Missing IGNORE-ERRORS value on line %d.", linenum);
+        print_fatal_error(outfile, "Missing IGNORE-ERRORS value on line %d.", linenum);
        pass = 0;
        goto test_exit;
       }
@@ -935,18 +975,17 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
         * Map the filename to and then run the tests...
        */
 
-        if (!do_tests(vars, get_filename(testfile, filename, temp,
-                                        sizeof(filename))))
+        if (!do_tests(outfile, vars, get_filename(testfile, filename, temp, sizeof(filename))))
        {
          pass = 0;
 
-         if (!IgnoreErrors)
+         if (StopAfterIncludeError)
            goto test_exit;
        }
       }
       else
       {
-        print_fatal_error("Missing INCLUDE filename on line %d.", linenum);
+        print_fatal_error(outfile, "Missing INCLUDE filename on line %d.", linenum);
        pass = 0;
        goto test_exit;
       }
@@ -969,18 +1008,17 @@ do_tests(_cups_vars_t *vars,             /* I - Variables */
        */
 
         if (get_variable(vars, attr) &&
-           !do_tests(vars, get_filename(testfile, filename, temp,
-                                        sizeof(filename))))
+           !do_tests(outfile, vars, get_filename(testfile, filename, temp, sizeof(filename))))
        {
          pass = 0;
 
-         if (!IgnoreErrors)
+         if (StopAfterIncludeError)
            goto test_exit;
        }
       }
       else
       {
-        print_fatal_error("Missing INCLUDE-IF-DEFINED name or filename on line "
+        print_fatal_error(outfile, "Missing INCLUDE-IF-DEFINED name or filename on line "
                          "%d.", linenum);
        pass = 0;
        goto test_exit;
@@ -1004,18 +1042,17 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
        */
 
         if (!get_variable(vars, attr) &&
-           !do_tests(vars, get_filename(testfile, filename, temp,
-                                        sizeof(filename))))
+           !do_tests(outfile, vars, get_filename(testfile, filename, temp, sizeof(filename))))
        {
          pass = 0;
 
-         if (!IgnoreErrors)
+         if (StopAfterIncludeError)
            goto test_exit;
        }
       }
       else
       {
-        print_fatal_error("Missing INCLUDE-IF-NOT-DEFINED name or filename on "
+        print_fatal_error(outfile, "Missing INCLUDE-IF-NOT-DEFINED name or filename on "
                          "line %d.", linenum);
        pass = 0;
        goto test_exit;
@@ -1037,7 +1074,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       }
       else
       {
-        print_fatal_error("Missing SKIP-IF-DEFINED variable on line %d.",
+        print_fatal_error(outfile, "Missing SKIP-IF-DEFINED variable on line %d.",
                          linenum);
        pass = 0;
        goto test_exit;
@@ -1056,12 +1093,34 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
       }
       else
       {
-        print_fatal_error("Missing SKIP-IF-NOT-DEFINED variable on line %d.",
+        print_fatal_error(outfile, "Missing SKIP-IF-NOT-DEFINED variable on line %d.",
                          linenum);
        pass = 0;
        goto test_exit;
       }
     }
+    else if (!strcmp(token, "STOP-AFTER-INCLUDE-ERROR"))
+    {
+     /*
+      * STOP-AFTER-INCLUDE-ERROR yes
+      * STOP-AFTER-INCLUDE-ERROR no
+      */
+
+      if (get_token(fp, temp, sizeof(temp), &linenum) &&
+          (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no")))
+      {
+        StopAfterIncludeError = !_cups_strcasecmp(temp, "yes");
+      }
+      else
+      {
+        print_fatal_error(outfile, "Missing STOP-AFTER-INCLUDE-ERROR value on line %d.",
+                          linenum);
+       pass = 0;
+       goto test_exit;
+      }
+
+      continue;
+    }
     else if (!strcmp(token, "TRANSFER"))
     {
      /*
@@ -1080,7 +1139,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          Transfer = _CUPS_TRANSFER_LENGTH;
        else
        {
-         print_fatal_error("Bad TRANSFER value \"%s\" on line %d.", temp,
+         print_fatal_error(outfile, "Bad TRANSFER value \"%s\" on line %d.", temp,
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1088,7 +1147,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       }
       else
       {
-        print_fatal_error("Missing TRANSFER value on line %d.", linenum);
+        print_fatal_error(outfile, "Missing TRANSFER value on line %d.", linenum);
        pass = 0;
        goto test_exit;
       }
@@ -1111,14 +1170,14 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
          Version = 22;
        else
        {
-         print_fatal_error("Bad VERSION \"%s\" on line %d.", temp, linenum);
+         print_fatal_error(outfile, "Bad VERSION \"%s\" on line %d.", temp, linenum);
          pass = 0;
          goto test_exit;
        }
       }
       else
       {
-        print_fatal_error("Missing VERSION number on line %d.", linenum);
+        print_fatal_error(outfile, "Missing VERSION number on line %d.", linenum);
        pass = 0;
        goto test_exit;
       }
@@ -1127,7 +1186,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
     }
     else if (strcmp(token, "{"))
     {
-      print_fatal_error("Unexpected token %s seen on line %d.", token, linenum);
+      print_fatal_error(outfile, "Unexpected token %s seen on line %d.", token, linenum);
       pass = 0;
       goto test_exit;
     }
@@ -1139,8 +1198,8 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
     if (show_header)
     {
       if (Output == _CUPS_OUTPUT_PLIST)
-       print_xml_header();
-      else if (Output == _CUPS_OUTPUT_TEST)
+       print_xml_header(outfile);
+      if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
        printf("\"%s\":\n", testfile);
 
       show_header = 0;
@@ -1149,17 +1208,19 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
     strlcpy(resource, vars->resource, sizeof(resource));
 
     request_id ++;
-    request       = ippNew();
-    op            = (ipp_op_t)0;
-    group         = IPP_TAG_ZERO;
-    ignore_errors = IgnoreErrors;
-    last_expect   = NULL;
-    last_status   = NULL;
-    filename[0]   = '\0';
-    skip_previous = 0;
-    skip_test     = 0;
-    version       = Version;
-    transfer      = Transfer;
+    request        = ippNew();
+    op             = (ipp_op_t)0;
+    group          = IPP_TAG_ZERO;
+    ignore_errors  = IgnoreErrors;
+    last_expect    = NULL;
+    last_status    = NULL;
+    filename[0]    = '\0';
+    skip_previous  = 0;
+    skip_test      = 0;
+    test_id[0]     = '\0';
+    version        = Version;
+    transfer       = Transfer;
+    compression[0] = '\0';
 
     strlcpy(name, testfile, sizeof(name));
     if (strrchr(name, '.') != NULL)
@@ -1184,7 +1245,14 @@ do_tests(_cups_vars_t *vars,             /* I - Variables */
           _cups_strcasecmp(token, "REPEAT-NO-MATCH") &&
           _cups_strcasecmp(token, "SAME-COUNT-AS") &&
           _cups_strcasecmp(token, "WITH-ALL-VALUES") &&
-          _cups_strcasecmp(token, "WITH-VALUE"))
+          _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"))
         last_expect = NULL;
 
       if (_cups_strcasecmp(token, "DEFINE-MATCH") &&
@@ -1204,46 +1272,49 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
        * Another collection value
        */
 
-       ipp_t   *col = get_collection(vars, fp, &linenum);
+       ipp_t   *col = get_collection(outfile, vars, fp, &linenum);
                                        /* Collection value */
 
        if (col)
        {
-         ipp_attribute_t *tempcol;     /* Pointer to new buffer */
-
-
-        /*
-         * Reallocate memory...
-         */
+          ippSetCollection(request, &lastcol, ippGetCount(lastcol), col);
+        }
+       else
+       {
+         pass = 0;
+         goto test_exit;
+       }
+      }
+      else if (!strcmp(token, "COMPRESSION"))
+      {
+       /*
+       * COMPRESSION none
+       * COMPRESSION deflate
+       * COMPRESSION gzip
+       */
 
-         if ((tempcol = realloc(lastcol, sizeof(ipp_attribute_t) +
-                                         (lastcol->num_values + 1) *
-                                         sizeof(_ipp_value_t))) == NULL)
-         {
-           print_fatal_error("Unable to allocate memory on line %d.", linenum);
+       if (get_token(fp, temp, sizeof(temp), &linenum))
+       {
+         expand_variables(vars, compression, temp, sizeof(compression));
+#ifdef HAVE_LIBZ
+         if (strcmp(compression, "none") && strcmp(compression, "deflate") &&
+             strcmp(compression, "gzip"))
+#else
+         if (strcmp(compression, "none"))
+#endif /* HAVE_LIBZ */
+          {
+           print_fatal_error(outfile, "Unsupported COMPRESSION value '%s' on line %d.",
+                             compression, linenum);
            pass = 0;
            goto test_exit;
-         }
-
-         if (tempcol != lastcol)
-         {
-          /*
-           * Reset pointers in the list...
-           */
-
-           if (request->prev)
-             request->prev->next = tempcol;
-           else
-             request->attrs = tempcol;
-
-           lastcol = request->current = request->last = tempcol;
-         }
+          }
 
-         lastcol->values[lastcol->num_values].collection = col;
-         lastcol->num_values ++;
+          if (!strcmp(compression, "none"))
+            compression[0] = '\0';
        }
        else
        {
+         print_fatal_error(outfile, "Missing COMPRESSION value on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1258,11 +1329,11 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
            get_token(fp, temp, sizeof(temp), &linenum))
        {
          expand_variables(vars, token, temp, sizeof(token));
-         set_variable(vars, attr, token);
+         set_variable(outfile, vars, attr, token);
        }
        else
        {
-         print_fatal_error("Missing DEFINE name and/or value on line %d.",
+         print_fatal_error(outfile, "Missing DEFINE name and/or value on line %d.",
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1282,7 +1353,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
        }
        else
        {
-         print_fatal_error("Missing IGNORE-ERRORS value on line %d.", linenum);
+         print_fatal_error(outfile, "Missing IGNORE-ERRORS value on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1295,7 +1366,17 @@ do_tests(_cups_vars_t *vars,             /* I - Variables */
         * Name of test...
        */
 
-       get_token(fp, name, sizeof(name), &linenum);
+       get_token(fp, temp, sizeof(temp), &linenum);
+       expand_variables(vars, name, temp, sizeof(name));
+      }
+      else if (!_cups_strcasecmp(token, "PAUSE"))
+      {
+       /*
+        * Pause with a message...
+       */
+
+       get_token(fp, token, sizeof(token), &linenum);
+       pause_message(token);
       }
       else if (!strcmp(token, "REQUEST-ID"))
       {
@@ -1312,7 +1393,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
            request_id = (CUPS_RAND() % 1000) * 137 + 1;
          else
          {
-           print_fatal_error("Bad REQUEST-ID value \"%s\" on line %d.", temp,
+           print_fatal_error(outfile, "Bad REQUEST-ID value \"%s\" on line %d.", temp,
                              linenum);
            pass = 0;
            goto test_exit;
@@ -1320,7 +1401,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
        }
        else
        {
-         print_fatal_error("Missing REQUEST-ID value on line %d.", linenum);
+         print_fatal_error(outfile, "Missing REQUEST-ID value on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1338,12 +1419,34 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
        }
        else
        {
-         print_fatal_error("Missing SKIP-IF-DEFINED value on line %d.",
+         print_fatal_error(outfile, "Missing SKIP-IF-DEFINED value on line %d.",
                            linenum);
          pass = 0;
          goto test_exit;
        }
       }
+      else if (!strcmp(token, "SKIP-IF-MISSING"))
+      {
+       /*
+       * SKIP-IF-MISSING filename
+       */
+
+       if (get_token(fp, temp, sizeof(temp), &linenum))
+       {
+         expand_variables(vars, token, temp, sizeof(token));
+         get_filename(testfile, filename, token, sizeof(filename));
+
+         if (access(filename, R_OK))
+           skip_test = 1;
+       }
+       else
+       {
+         print_fatal_error(outfile, "Missing SKIP-IF-MISSING filename on line %d.",
+                           linenum);
+         pass = 0;
+         goto test_exit;
+       }
+      }
       else if (!strcmp(token, "SKIP-IF-NOT-DEFINED"))
       {
        /*
@@ -1357,7 +1460,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
        }
        else
        {
-         print_fatal_error("Missing SKIP-IF-NOT-DEFINED value on line %d.",
+         print_fatal_error(outfile, "Missing SKIP-IF-NOT-DEFINED value on line %d.",
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1377,7 +1480,26 @@ do_tests(_cups_vars_t *vars,             /* I - Variables */
        }
        else
        {
-         print_fatal_error("Missing SKIP-PREVIOUS-ERROR value on line %d.", linenum);
+         print_fatal_error(outfile, "Missing SKIP-PREVIOUS-ERROR value on line %d.", linenum);
+         pass = 0;
+         goto test_exit;
+       }
+
+       continue;
+      }
+      else if (!strcmp(token, "TEST-ID"))
+      {
+       /*
+       * TEST-ID "string"
+       */
+
+       if (get_token(fp, temp, sizeof(temp), &linenum))
+       {
+         expand_variables(vars, test_id, temp, sizeof(test_id));
+       }
+       else
+       {
+         print_fatal_error(outfile, "Missing TEST-ID value on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1402,7 +1524,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
            transfer = _CUPS_TRANSFER_LENGTH;
          else
          {
-           print_fatal_error("Bad TRANSFER value \"%s\" on line %d.", temp,
+           print_fatal_error(outfile, "Bad TRANSFER value \"%s\" on line %d.", temp,
                              linenum);
            pass = 0;
            goto test_exit;
@@ -1410,7 +1532,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
        }
        else
        {
-         print_fatal_error("Missing TRANSFER value on line %d.", linenum);
+         print_fatal_error(outfile, "Missing TRANSFER value on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1433,14 +1555,14 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
            version = 22;
          else
          {
-           print_fatal_error("Bad VERSION \"%s\" on line %d.", temp, linenum);
+           print_fatal_error(outfile, "Bad VERSION \"%s\" on line %d.", temp, linenum);
            pass = 0;
            goto test_exit;
          }
        }
        else
        {
-         print_fatal_error("Missing VERSION number on line %d.", linenum);
+         print_fatal_error(outfile, "Missing VERSION number on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1453,7 +1575,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
 
        if (!get_token(fp, resource, sizeof(resource), &linenum))
        {
-         print_fatal_error("Missing RESOURCE path on line %d.", linenum);
+         print_fatal_error(outfile, "Missing RESOURCE path on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1466,7 +1588,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
 
        if (!get_token(fp, temp, sizeof(temp), &linenum))
        {
-         print_fatal_error("Missing OPERATION code on line %d.", linenum);
+         print_fatal_error(outfile, "Missing OPERATION code on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1474,9 +1596,9 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
        expand_variables(vars, token, temp, sizeof(token));
 
        if ((op = ippOpValue(token)) == (ipp_op_t)-1 &&
-           (op = strtol(token, NULL, 0)) == 0)
+           (op = (ipp_op_t)strtol(token, NULL, 0)) == 0)
        {
-         print_fatal_error("Bad OPERATION code \"%s\" on line %d.", token,
+         print_fatal_error(outfile, "Bad OPERATION code \"%s\" on line %d.", token,
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1490,14 +1612,14 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
 
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing GROUP tag on line %d.", linenum);
+         print_fatal_error(outfile, "Missing GROUP tag on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
 
        if ((value = ippTagValue(token)) < 0)
        {
-         print_fatal_error("Bad GROUP tag \"%s\" on line %d.", token, linenum);
+         print_fatal_error(outfile, "Bad GROUP tag \"%s\" on line %d.", token, linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1517,7 +1639,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
 
        if (!get_token(fp, temp, sizeof(temp), &linenum))
        {
-         print_fatal_error("Missing DELAY value on line %d.", linenum);
+         print_fatal_error(outfile, "Missing DELAY value on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1526,7 +1648,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
 
        if ((delay = _cupsStrScand(token, NULL, localeconv())) <= 0.0)
        {
-         print_fatal_error("Bad DELAY value \"%s\" on line %d.", token,
+         print_fatal_error(outfile, "Bad DELAY value \"%s\" on line %d.", token,
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1536,7 +1658,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          if (Output == _CUPS_OUTPUT_TEST)
            printf("    [%g second delay]\n", delay);
 
-         usleep((int)(1000000.0 * delay));
+         usleep((useconds_t)(1000000.0 * delay));
        }
       }
       else if (!_cups_strcasecmp(token, "ATTR"))
@@ -1547,14 +1669,14 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
 
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing ATTR value tag on line %d.", linenum);
+         print_fatal_error(outfile, "Missing ATTR value tag on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
 
        if ((value = ippTagValue(token)) == IPP_TAG_ZERO)
        {
-         print_fatal_error("Bad ATTR value tag \"%s\" on line %d.", token,
+         print_fatal_error(outfile, "Bad ATTR value tag \"%s\" on line %d.", token,
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1562,14 +1684,14 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
 
        if (!get_token(fp, attr, sizeof(attr), &linenum))
        {
-         print_fatal_error("Missing ATTR name on line %d.", linenum);
+         print_fatal_error(outfile, "Missing ATTR name on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
 
        if (!get_token(fp, temp, sizeof(temp), &linenum))
        {
-         print_fatal_error("Missing ATTR value on line %d.", linenum);
+         print_fatal_error(outfile, "Missing ATTR value on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1583,30 +1705,76 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
              if (!_cups_strcasecmp(token, "true"))
                attrptr = ippAddBoolean(request, group, attr, 1);
               else
-               attrptr = ippAddBoolean(request, group, attr, atoi(token));
+               attrptr = ippAddBoolean(request, group, attr, (char)atoi(token));
              break;
 
          case IPP_TAG_INTEGER :
          case IPP_TAG_ENUM :
              if (!strchr(token, ','))
-               attrptr = ippAddInteger(request, group, value, attr,
-                                       strtol(token, &tokenptr, 0));
+             {
+               if (isdigit(token[0] & 255) || token[0] == '-')
+                 attrptr = ippAddInteger(request, group, value, attr, (int)strtol(token, &tokenptr, 0));
+               else
+               {
+                  tokenptr = token;
+                  if ((i = ippEnumValue(attr, tokenptr)) >= 0)
+                  {
+                    attrptr  = ippAddInteger(request, group, value, attr, i);
+                    tokenptr += strlen(tokenptr);
+                  }
+               }
+             }
              else
              {
                int     values[100],    /* Values */
                        num_values = 1; /* Number of values */
 
-               values[0] = strtol(token, &tokenptr, 10);
+               if (!isdigit(token[0] & 255) && token[0] != '-' && value == IPP_TAG_ENUM)
+               {
+                 char *ptr;            /* Pointer to next terminator */
+
+                 if ((ptr = strchr(token, ',')) != NULL)
+                   *ptr++ = '\0';
+                 else
+                   ptr = token + strlen(token);
+
+                 if ((i = ippEnumValue(attr, token)) < 0)
+                   tokenptr = NULL;
+                 else
+                   tokenptr = ptr;
+               }
+               else
+                 i = (int)strtol(tokenptr, &tokenptr, 0);
+
+               values[0] = i;
+
                while (tokenptr && *tokenptr &&
                       num_values < (int)(sizeof(values) / sizeof(values[0])))
                {
                  if (*tokenptr == ',')
                    tokenptr ++;
-                 else if (!isdigit(*tokenptr & 255) && *tokenptr != '-')
-                   break;
 
-                 values[num_values] = strtol(tokenptr, &tokenptr, 0);
-                 num_values ++;
+                 if (!isdigit(*tokenptr & 255) && *tokenptr != '-')
+                 {
+                   char *ptr;          /* Pointer to next terminator */
+
+                   if (value != IPP_TAG_ENUM)
+                     break;
+
+                    if ((ptr = strchr(tokenptr, ',')) != NULL)
+                      *ptr++ = '\0';
+                    else
+                      ptr = tokenptr + strlen(tokenptr);
+
+                    if ((i = ippEnumValue(attr, tokenptr)) < 0)
+                      break;
+
+                    tokenptr = ptr;
+                 }
+                 else
+                   i = (int)strtol(tokenptr, &tokenptr, 0);
+
+                 values[num_values ++] = i;
                }
 
                attrptr = ippAddIntegers(request, group, value, attr, num_values, values);
@@ -1614,7 +1782,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
 
              if (!tokenptr || *tokenptr)
              {
-               print_fatal_error("Bad %s value \"%s\" on line %d.",
+               print_fatal_error(outfile, "Bad %s value \"%s\" on line %d.",
                                  ippTagString(value), token, linenum);
                pass = 0;
                goto test_exit;
@@ -1627,11 +1795,11 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
                        yres;           /* Y resolution */
                char    *ptr;           /* Pointer into value */
 
-               xres = yres = strtol(token, (char **)&ptr, 10);
+               xres = yres = (int)strtol(token, (char **)&ptr, 10);
                if (ptr > token && xres > 0)
                {
                  if (*ptr == 'x')
-                 yres = strtol(ptr + 1, (char **)&ptr, 10);
+                   yres = (int)strtol(ptr + 1, (char **)&ptr, 10);
                }
 
                if (ptr <= token || xres <= 0 || yres <= 0 || !ptr ||
@@ -1640,22 +1808,19 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
                     _cups_strcasecmp(ptr, "dpcm") &&
                     _cups_strcasecmp(ptr, "other")))
                {
-                 print_fatal_error("Bad resolution value \"%s\" on line %d.",
+                 print_fatal_error(outfile, "Bad resolution value \"%s\" on line %d.",
                                    token, linenum);
                  pass = 0;
                  goto test_exit;
                }
 
                if (!_cups_strcasecmp(ptr, "dpi"))
-                 attrptr = ippAddResolution(request, group, attr, IPP_RES_PER_INCH,
-                                            xres, yres);
+                 attrptr = ippAddResolution(request, group, attr, IPP_RES_PER_INCH, xres, yres);
                else if (!_cups_strcasecmp(ptr, "dpc") ||
                         !_cups_strcasecmp(ptr, "dpcm"))
-                 attrptr = ippAddResolution(request, group, attr, IPP_RES_PER_CM,
-                                            xres, yres);
+                 attrptr = ippAddResolution(request, group, attr, IPP_RES_PER_CM, xres, yres);
                else
-                 attrptr = ippAddResolution(request, group, attr, (ipp_res_t)0,
-                                            xres, yres);
+                 attrptr = ippAddResolution(request, group, attr, (ipp_res_t)0, xres, yres);
              }
              break;
 
@@ -1674,7 +1839,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
 
                 if ((num_vals & 1) || num_vals == 0)
                {
-                 print_fatal_error("Bad rangeOfInteger value \"%s\" on line "
+                 print_fatal_error(outfile, "Bad rangeOfInteger value \"%s\" on line "
                                    "%d.", token, linenum);
                  pass = 0;
                  goto test_exit;
@@ -1688,7 +1853,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
           case IPP_TAG_BEGIN_COLLECTION :
              if (!strcmp(token, "{"))
              {
-               ipp_t   *col = get_collection(vars, fp, &linenum);
+               ipp_t   *col = get_collection(outfile, vars, fp, &linenum);
                                        /* Collection value */
 
                 if (col)
@@ -1704,20 +1869,49 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
               }
              else
              {
-               print_fatal_error("Bad ATTR collection value on line %d.",
+               print_fatal_error(outfile, "Bad ATTR collection value on line %d.",
                                  linenum);
                pass = 0;
                goto test_exit;
              }
+
+             do
+             {
+               ipp_t   *col;                   /* Collection value */
+               long    pos = ftell(fp);        /* Save position of file */
+
+               if (!get_token(fp, token, sizeof(token), &linenum))
+                 break;
+
+               if (strcmp(token, ","))
+               {
+                 fseek(fp, pos, SEEK_SET);
+                 break;
+               }
+
+               if (!get_token(fp, token, sizeof(token), &linenum) || strcmp(token, "{"))
+               {
+                 print_fatal_error(outfile, "Unexpected \"%s\" on line %d.", token, linenum);
+                 pass = 0;
+                 goto test_exit;
+                 break;
+               }
+
+               if ((col = get_collection(outfile, vars, fp, &linenum)) == NULL)
+                 break;
+
+               ippSetCollection(request, &attrptr, ippGetCount(attrptr), col);
+               lastcol = attrptr;
+             }
+             while (!strcmp(token, "{"));
              break;
 
           case IPP_TAG_STRING :
-              attrptr = ippAddOctetString(request, group, attr, token,
-                                          strlen(token));
+              attrptr = ippAddOctetString(request, group, attr, token, (int)strlen(token));
              break;
 
          default :
-             print_fatal_error("Unsupported ATTR value tag %s on line %d.",
+             print_fatal_error(outfile, "Unsupported ATTR value tag %s on line %d.",
                                ippTagString(value), linenum);
              pass = 0;
              goto test_exit;
@@ -1750,9 +1944,14 @@ do_tests(_cups_vars_t *vars,             /* I - Variables */
 
                 for (ptr = strchr(token, ','); ptr; ptr = strchr(ptr, ','))
                {
-                 *ptr++ = '\0';
-                 values[num_values] = ptr;
-                 num_values ++;
+                 if (ptr > token && ptr[-1] == '\\')
+                   _cups_strcpy(ptr - 1, ptr);
+                 else
+                 {
+                   *ptr++ = '\0';
+                   values[num_values] = ptr;
+                   num_values ++;
+                 }
                }
 
                attrptr = ippAddStrings(request, group, value, attr, num_values,
@@ -1763,7 +1962,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
 
        if (!attrptr)
        {
-         print_fatal_error("Unable to add attribute on line %d: %s", linenum,
+         print_fatal_error(outfile, "Unable to add attribute on line %d: %s", linenum,
                            cupsLastErrorString());
          pass = 0;
          goto test_exit;
@@ -1777,13 +1976,22 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
 
        if (!get_token(fp, temp, sizeof(temp), &linenum))
        {
-         print_fatal_error("Missing FILE filename on line %d.", linenum);
+         print_fatal_error(outfile, "Missing FILE filename on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
 
         expand_variables(vars, token, temp, sizeof(token));
        get_filename(testfile, filename, token, sizeof(filename));
+
+        if (access(filename, R_OK))
+        {
+         print_fatal_error(outfile, "Filename \"%s\" on line %d cannot be read.",
+                           temp, linenum);
+         print_fatal_error(outfile, "Filename mapped to \"%s\".", filename);
+         pass = 0;
+         goto test_exit;
+        }
       }
       else if (!_cups_strcasecmp(token, "STATUS"))
       {
@@ -1793,23 +2001,23 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
 
         if (num_statuses >= (int)(sizeof(statuses) / sizeof(statuses[0])))
        {
-         print_fatal_error("Too many STATUS's on line %d.", linenum);
+         print_fatal_error(outfile, "Too many STATUS's on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
 
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing STATUS code on line %d.", linenum);
+         print_fatal_error(outfile, "Missing STATUS code on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
 
        if ((statuses[num_statuses].status = ippErrorValue(token))
                == (ipp_status_t)-1 &&
-           (statuses[num_statuses].status = strtol(token, NULL, 0)) == 0)
+           (statuses[num_statuses].status = (ipp_status_t)strtol(token, NULL, 0)) == 0)
        {
-         print_fatal_error("Bad STATUS code \"%s\" on line %d.", token,
+         print_fatal_error(outfile, "Bad STATUS code \"%s\" on line %d.", token,
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1826,22 +2034,24 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
        last_status->repeat_match    = 0;
        last_status->repeat_no_match = 0;
       }
-      else if (!_cups_strcasecmp(token, "EXPECT"))
+      else if (!_cups_strcasecmp(token, "EXPECT") || !_cups_strcasecmp(token, "EXPECT-ALL"))
       {
        /*
         * Expected attributes...
        */
 
+       int expect_all = !_cups_strcasecmp(token, "EXPECT-ALL");
+
         if (num_expects >= (int)(sizeof(expects) / sizeof(expects[0])))
         {
-         print_fatal_error("Too many EXPECT's on line %d.", linenum);
+         print_fatal_error(outfile, "Too many EXPECT's on line %d.", linenum);
          pass = 0;
          goto test_exit;
         }
 
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing EXPECT name on line %d.", linenum);
+         print_fatal_error(outfile, "Missing EXPECT name on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1851,6 +2061,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
 
        memset(last_expect, 0, sizeof(_cups_expect_t));
        last_expect->repeat_limit = 1000;
+       last_expect->expect_all   = expect_all;
 
         if (token[0] == '!')
         {
@@ -1869,14 +2080,14 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
       {
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing COUNT number on line %d.", linenum);
+         print_fatal_error(outfile, "Missing COUNT number on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
 
         if ((i = atoi(token)) <= 0)
        {
-         print_fatal_error("Bad COUNT \"%s\" on line %d.", token, linenum);
+         print_fatal_error(outfile, "Bad COUNT \"%s\" on line %d.", token, linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1885,7 +2096,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          last_expect->count = i;
        else
        {
-         print_fatal_error("COUNT without a preceding EXPECT on line %d.",
+         print_fatal_error(outfile, "COUNT without a preceding EXPECT on line %d.",
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1895,7 +2106,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       {
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing DEFINE-MATCH variable on line %d.",
+         print_fatal_error(outfile, "Missing DEFINE-MATCH variable on line %d.",
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1907,7 +2118,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          last_status->define_match = strdup(token);
        else
        {
-         print_fatal_error("DEFINE-MATCH without a preceding EXPECT or STATUS "
+         print_fatal_error(outfile, "DEFINE-MATCH without a preceding EXPECT or STATUS "
                            "on line %d.", linenum);
          pass = 0;
          goto test_exit;
@@ -1917,7 +2128,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       {
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing DEFINE-NO-MATCH variable on line %d.",
+         print_fatal_error(outfile, "Missing DEFINE-NO-MATCH variable on line %d.",
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1929,7 +2140,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          last_status->define_no_match = strdup(token);
        else
        {
-         print_fatal_error("DEFINE-NO-MATCH without a preceding EXPECT or "
+         print_fatal_error(outfile, "DEFINE-NO-MATCH without a preceding EXPECT or "
                            "STATUS on line %d.", linenum);
          pass = 0;
          goto test_exit;
@@ -1939,7 +2150,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       {
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing DEFINE-VALUE variable on line %d.",
+         print_fatal_error(outfile, "Missing DEFINE-VALUE variable on line %d.",
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1949,7 +2160,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          last_expect->define_value = strdup(token);
        else
        {
-         print_fatal_error("DEFINE-VALUE without a preceding EXPECT on "
+         print_fatal_error(outfile, "DEFINE-VALUE without a preceding EXPECT on "
                            "line %d.", linenum);
          pass = 0;
          goto test_exit;
@@ -1959,7 +2170,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       {
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing OF-TYPE value tag(s) on line %d.",
+         print_fatal_error(outfile, "Missing OF-TYPE value tag(s) on line %d.",
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1969,7 +2180,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          last_expect->of_type = strdup(token);
        else
        {
-         print_fatal_error("OF-TYPE without a preceding EXPECT on line %d.",
+         print_fatal_error(outfile, "OF-TYPE without a preceding EXPECT on line %d.",
                            linenum);
          pass = 0;
          goto test_exit;
@@ -1982,7 +2193,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
 
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing IN-GROUP group tag on line %d.", linenum);
+         print_fatal_error(outfile, "Missing IN-GROUP group tag on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -1994,7 +2205,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          last_expect->in_group = in_group;
        else
        {
-         print_fatal_error("IN-GROUP without a preceding EXPECT on line %d.",
+         print_fatal_error(outfile, "IN-GROUP without a preceding EXPECT on line %d.",
                            linenum);
          pass = 0;
          goto test_exit;
@@ -2004,13 +2215,13 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
       {
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing REPEAT-LIMIT value on line %d.", linenum);
+         print_fatal_error(outfile, "Missing REPEAT-LIMIT value on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
        else if (atoi(token) <= 0)
        {
-         print_fatal_error("Bad REPEAT-LIMIT value on line %d.", linenum);
+         print_fatal_error(outfile, "Bad REPEAT-LIMIT value on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -2021,7 +2232,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          last_expect->repeat_limit = atoi(token);
        else
        {
-         print_fatal_error("REPEAT-LIMIT without a preceding EXPECT or STATUS "
+         print_fatal_error(outfile, "REPEAT-LIMIT without a preceding EXPECT or STATUS "
                            "on line %d.", linenum);
          pass = 0;
          goto test_exit;
@@ -2035,7 +2246,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          last_expect->repeat_match = 1;
        else
        {
-         print_fatal_error("REPEAT-MATCH without a preceding EXPECT or STATUS "
+         print_fatal_error(outfile, "REPEAT-MATCH without a preceding EXPECT or STATUS "
                            "on line %d.", linenum);
          pass = 0;
          goto test_exit;
@@ -2049,7 +2260,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          last_expect->repeat_no_match = 1;
        else
        {
-         print_fatal_error("REPEAT-NO-MATCH without a preceding EXPECT or "
+         print_fatal_error(outfile, "REPEAT-NO-MATCH without a preceding EXPECT or "
                            "STATUS on ine %d.", linenum);
          pass = 0;
          goto test_exit;
@@ -2059,7 +2270,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       {
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing SAME-COUNT-AS name on line %d.", linenum);
+         print_fatal_error(outfile, "Missing SAME-COUNT-AS name on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -2068,7 +2279,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          last_expect->same_count_as = strdup(token);
        else
        {
-         print_fatal_error("SAME-COUNT-AS without a preceding EXPECT on line "
+         print_fatal_error(outfile, "SAME-COUNT-AS without a preceding EXPECT on line "
                            "%d.", linenum);
          pass = 0;
          goto test_exit;
@@ -2078,7 +2289,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       {
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing IF-DEFINED name on line %d.", linenum);
+         print_fatal_error(outfile, "Missing IF-DEFINED name on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -2089,7 +2300,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          last_status->if_defined = strdup(token);
        else
        {
-         print_fatal_error("IF-DEFINED without a preceding EXPECT or STATUS "
+         print_fatal_error(outfile, "IF-DEFINED without a preceding EXPECT or STATUS "
                            "on line %d.", linenum);
          pass = 0;
          goto test_exit;
@@ -2099,7 +2310,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       {
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing IF-NOT-DEFINED name on line %d.", linenum);
+         print_fatal_error(outfile, "Missing IF-NOT-DEFINED name on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -2110,21 +2321,40 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
          last_status->if_not_defined = strdup(token);
        else
        {
-         print_fatal_error("IF-NOT-DEFINED without a preceding EXPECT or STATUS "
+         print_fatal_error(outfile, "IF-NOT-DEFINED without a preceding EXPECT or STATUS "
                            "on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
       }
       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"))
       {
-       if (!_cups_strcasecmp(token, "WITH-ALL-VALUES") && last_expect)
-         last_expect->with_flags = _CUPS_WITH_ALL;
+       if (last_expect)
+       {
+         if (!_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") ||
+             !_cups_strcasecmp(token, "WITH-HOSTNAME"))
+           last_expect->with_flags = _CUPS_WITH_HOSTNAME;
+         else if (!_cups_strcasecmp(token, "WITH-ALL-RESOURCES") ||
+             !_cups_strcasecmp(token, "WITH-RESOURCE"))
+           last_expect->with_flags = _CUPS_WITH_RESOURCE;
+         else if (!_cups_strcasecmp(token, "WITH-ALL-SCHEMES") ||
+             !_cups_strcasecmp(token, "WITH-SCHEME"))
+           last_expect->with_flags = _CUPS_WITH_SCHEME;
+
+         if (!_cups_strncasecmp(token, "WITH-ALL-", 9))
+           last_expect->with_flags |= _CUPS_WITH_ALL;
+        }
 
        if (!get_token(fp, temp, sizeof(temp), &linenum))
        {
-         print_fatal_error("Missing %s value on line %d.", token, linenum);
+         print_fatal_error(outfile, "Missing %s value on line %d.", token, linenum);
          pass = 0;
          goto test_exit;
        }
@@ -2145,11 +2375,11 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
            * WITH-VALUE is a POSIX extended regular expression.
            */
 
-           last_expect->with_value = calloc(1, tokenptr - token);
+           last_expect->with_value = calloc(1, (size_t)(tokenptr - token));
            last_expect->with_flags |= _CUPS_WITH_REGEX;
 
            if (last_expect->with_value)
-             memcpy(last_expect->with_value, token + 1, tokenptr - token - 1);
+             memcpy(last_expect->with_value, token + 1, (size_t)(tokenptr - token - 1));
          }
          else
          {
@@ -2157,13 +2387,55 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
            * WITH-VALUE is a literal value...
            */
 
+           char *ptr;                  /* Pointer into value */
+
+            for (ptr = token; *ptr; ptr ++)
+            {
+             if (*ptr == '\\' && ptr[1])
+             {
+              /*
+               * Remove \ from \foo...
+               */
+
+               _cups_strcpy(ptr, ptr + 1);
+             }
+           }
+
            last_expect->with_value = strdup(token);
            last_expect->with_flags |= _CUPS_WITH_LITERAL;
          }
        }
        else
        {
-         print_fatal_error("%s without a preceding EXPECT on line %d.", token,
+         print_fatal_error(outfile, "%s without a preceding EXPECT on line %d.", token,
+                           linenum);
+         pass = 0;
+         goto test_exit;
+       }
+      }
+      else if (!_cups_strcasecmp(token, "WITH-VALUE-FROM"))
+      {
+       if (!get_token(fp, temp, sizeof(temp), &linenum))
+       {
+         print_fatal_error(outfile, "Missing %s value on line %d.", token, linenum);
+         pass = 0;
+         goto test_exit;
+       }
+
+        if (last_expect)
+       {
+        /*
+         * Expand any variables in the value and then save it.
+         */
+
+         expand_variables(vars, token, temp, sizeof(token));
+
+         last_expect->with_value_from = strdup(token);
+         last_expect->with_flags      = _CUPS_WITH_LITERAL;
+       }
+       else
+       {
+         print_fatal_error(outfile, "%s without a preceding EXPECT on line %d.", token,
                            linenum);
          pass = 0;
          goto test_exit;
@@ -2177,14 +2449,14 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
 
         if (num_displayed >= (int)(sizeof(displayed) / sizeof(displayed[0])))
        {
-         print_fatal_error("Too many DISPLAY's on line %d", linenum);
+         print_fatal_error(outfile, "Too many DISPLAY's on line %d", linenum);
          pass = 0;
          goto test_exit;
        }
 
        if (!get_token(fp, token, sizeof(token), &linenum))
        {
-         print_fatal_error("Missing DISPLAY name on line %d.", linenum);
+         print_fatal_error(outfile, "Missing DISPLAY name on line %d.", linenum);
          pass = 0;
          goto test_exit;
        }
@@ -2194,7 +2466,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       }
       else
       {
-       print_fatal_error("Unexpected token %s seen on line %d.", token,
+       print_fatal_error(outfile, "Unexpected token %s seen on line %d.", token,
                          linenum);
        pass = 0;
        goto test_exit;
@@ -2207,40 +2479,54 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
 
     TestCount ++;
 
-    request->request.op.version[0]   = version / 10;
-    request->request.op.version[1]   = version % 10;
-    request->request.op.operation_id = op;
-    request->request.op.request_id   = request_id;
+    ippSetVersion(request, version / 10, version % 10);
+    ippSetOperation(request, op);
+    ippSetRequestId(request, request_id);
 
     if (Output == _CUPS_OUTPUT_PLIST)
     {
-      puts("<dict>");
-      puts("<key>Name</key>");
-      print_xml_string("string", name);
-      puts("<key>Operation</key>");
-      print_xml_string("string", ippOpString(op));
-      puts("<key>RequestAttributes</key>");
-      puts("<array>");
+      fputs("<dict>\n", outfile);
+      fputs("<key>Name</key>\n", outfile);
+      print_xml_string(outfile, "string", name);
+      if (file_id[0])
+      {
+       fputs("<key>FileId</key>\n", outfile);
+       print_xml_string(outfile, "string", file_id);
+      }
+      if (test_id[0])
+      {
+        fputs("<key>TestId</key>\n", outfile);
+        print_xml_string(outfile, "string", test_id);
+      }
+      fputs("<key>Version</key>\n", outfile);
+      fprintf(outfile, "<string>%d.%d</string>\n", version / 10, version % 10);
+      fputs("<key>Operation</key>\n", outfile);
+      print_xml_string(outfile, "string", ippOpString(op));
+      fputs("<key>RequestId</key>\n", outfile);
+      fprintf(outfile, "<integer>%d</integer>\n", request_id);
+      fputs("<key>RequestAttributes</key>\n", outfile);
+      fputs("<array>\n", outfile);
       if (request->attrs)
       {
-       puts("<dict>");
+       fputs("<dict>\n", outfile);
        for (attrptr = request->attrs,
                 group = attrptr ? attrptr->group_tag : IPP_TAG_ZERO;
             attrptr;
             attrptr = attrptr->next)
-         print_attr(attrptr, &group);
-       puts("</dict>");
+         print_attr(outfile, Output, attrptr, &group);
+       fputs("</dict>\n", outfile);
       }
-      puts("</array>");
+      fputs("</array>\n", outfile);
     }
-    else if (Output == _CUPS_OUTPUT_TEST)
+
+    if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
     {
       if (Verbosity)
       {
        printf("    %s:\n", ippOpString(op));
 
        for (attrptr = request->attrs; attrptr; attrptr = attrptr->next)
-         print_attr(attrptr, NULL);
+         print_attr(stdout, _CUPS_OUTPUT_TEST, attrptr, NULL);
       }
 
       printf("    %-68.68s [", name);
@@ -2256,19 +2542,23 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
 
       if (Output == _CUPS_OUTPUT_PLIST)
       {
-       puts("<key>Successful</key>");
-       puts("<true />");
-       puts("<key>StatusCode</key>");
-       print_xml_string("string", "skip");
-       puts("<key>ResponseAttributes</key>");
-       puts("<dict />");
+       fputs("<key>Successful</key>\n", outfile);
+       fputs("<true />\n", outfile);
+       fputs("<key>Skipped</key>\n", outfile);
+       fputs("<true />\n", outfile);
+       fputs("<key>StatusCode</key>\n", outfile);
+       print_xml_string(outfile, "string", "skip");
+       fputs("<key>ResponseAttributes</key>\n", outfile);
+       fputs("<dict />\n", outfile);
       }
-      else if (Output == _CUPS_OUTPUT_TEST)
+
+      if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
        puts("SKIP]");
 
       goto skip_error;
     }
 
+    PasswordTries   = 0;
     repeat_count    = 0;
     repeat_interval = 1;
     repeat_prev     = 1;
@@ -2277,7 +2567,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
     {
       repeat_count ++;
 
-      status = HTTP_OK;
+      status = HTTP_STATUS_OK;
 
       if (transfer == _CUPS_TRANSFER_CHUNKED ||
          (transfer == _CUPS_TRANSFER_AUTO && filename[0]))
@@ -2303,7 +2593,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          */
 
          while ((bytes = cupsFileRead(reqfile, buffer, sizeof(buffer))) > 0)
-           length += bytes;
+           length += (size_t)bytes;
 
          cupsFileClose(reqfile);
        }
@@ -2317,22 +2607,25 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
       repeat_test = 0;
       prev_pass   = 1;
 
-      if (status != HTTP_ERROR)
+      if (status != HTTP_STATUS_ERROR)
       {
        while (!response && !Cancel && prev_pass)
        {
          status = cupsSendRequest(http, request, resource, length);
 
-         if (!Cancel && status == HTTP_CONTINUE &&
+#ifdef HAVE_LIBZ
+         if (compression[0])
+           httpSetField(http, HTTP_FIELD_CONTENT_ENCODING, compression);
+#endif /* HAVE_LIBZ */
+
+         if (!Cancel && status == HTTP_STATUS_CONTINUE &&
              request->state == IPP_DATA && filename[0])
          {
            if ((reqfile = cupsFileOpen(filename, "r")) != NULL)
            {
              while (!Cancel &&
-                    (bytes = cupsFileRead(reqfile, buffer,
-                                          sizeof(buffer))) > 0)
-               if ((status = cupsWriteRequestData(http, buffer,
-                                                  bytes)) != HTTP_CONTINUE)
+                    (bytes = cupsFileRead(reqfile, buffer, sizeof(buffer))) > 0)
+               if ((status = cupsWriteRequestData(http, buffer, (size_t)bytes)) != HTTP_STATUS_CONTINUE)
                  break;
 
              cupsFileClose(reqfile);
@@ -2343,7 +2636,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
                       strerror(errno));
              _cupsSetError(IPP_INTERNAL_ERROR, buffer, 0);
 
-             status = HTTP_ERROR;
+             status = HTTP_STATUS_ERROR;
            }
          }
 
@@ -2351,13 +2644,13 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
          * Get the server's response...
          */
 
-         if (!Cancel && status != HTTP_ERROR)
+         if (!Cancel && status != HTTP_STATUS_ERROR)
          {
            response = cupsGetResponse(http, resource);
            status   = httpGetStatus(http);
          }
 
-         if (!Cancel && status == HTTP_ERROR && http->error != EINVAL &&
+         if (!Cancel && status == HTTP_STATUS_ERROR && http->error != EINVAL &&
 #ifdef WIN32
              http->error != WSAETIMEDOUT)
 #else
@@ -2367,20 +2660,24 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
            if (httpReconnect(http))
              prev_pass = 0;
          }
-         else if (status == HTTP_ERROR)
+         else if (status == HTTP_STATUS_ERROR || status == HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED)
          {
            prev_pass = 0;
            break;
          }
-         else if (status != HTTP_OK)
+         else if (status != HTTP_STATUS_OK)
          {
            httpFlush(http);
+
+           if (status == HTTP_STATUS_UNAUTHORIZED)
+             continue;
+
            break;
          }
        }
       }
 
-      if (!Cancel && status == HTTP_ERROR && http->error != EINVAL &&
+      if (!Cancel && status == HTTP_STATUS_ERROR && http->error != EINVAL &&
 #ifdef WIN32
          http->error != WSAETIMEDOUT)
 #else
@@ -2390,14 +2687,14 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
        if (httpReconnect(http))
          prev_pass = 0;
       }
-      else if (status == HTTP_ERROR)
+      else if (status == HTTP_STATUS_ERROR)
       {
         if (!Cancel)
           httpReconnect(http);
 
        prev_pass = 0;
       }
-      else if (status != HTTP_OK)
+      else if (status != HTTP_STATUS_OK)
       {
         httpFlush(http);
         prev_pass = 0;
@@ -2433,18 +2730,18 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
                                        IPP_TAG_INTEGER)) != NULL)
        {
          snprintf(temp, sizeof(temp), "%d", attrptr->values[0].integer);
-         set_variable(vars, "job-id", temp);
+         set_variable(outfile, vars, "job-id", temp);
        }
 
        if ((attrptr = ippFindAttribute(response, "job-uri",
                                        IPP_TAG_URI)) != NULL)
-         set_variable(vars, "job-uri", attrptr->values[0].string.text);
+         set_variable(outfile, vars, "job-uri", attrptr->values[0].string.text);
 
        if ((attrptr = ippFindAttribute(response, "notify-subscription-id",
                                        IPP_TAG_INTEGER)) != NULL)
        {
          snprintf(temp, sizeof(temp), "%d", attrptr->values[0].integer);
-         set_variable(vars, "notify-subscription-id", temp);
+         set_variable(outfile, vars, "notify-subscription-id", temp);
        }
 
        /*
@@ -2584,7 +2881,6 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
            int out_of_order = 0;       /* Are attribute groups out-of-order? */
            cupsArrayClear(a);
 
-
             switch (attrptr->group_tag)
             {
               case IPP_TAG_ZERO :
@@ -2627,7 +2923,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
              group = attrptr->group_tag;
          }
 
-         validate_attr(errors, attrptr);
+         validate_attr(outfile, errors, attrptr);
 
           if (attrptr->name)
           {
@@ -2663,7 +2959,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
              repeat_test = 1;
 
             if (statuses[i].define_match)
-              set_variable(vars, statuses[i].define_match, "1");
+              set_variable(outfile, vars, statuses[i].define_match, "1");
 
             break;
          }
@@ -2675,7 +2971,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
 
             if (statuses[i].define_no_match)
             {
-              set_variable(vars, statuses[i].define_no_match, "1");
+              set_variable(outfile, vars, statuses[i].define_no_match, "1");
               break;
             }
           }
@@ -2714,137 +3010,210 @@ do_tests(_cups_vars_t *vars,          /* I - Variables */
              get_variable(vars, expect->if_not_defined))
            continue;
 
-         found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO);
+          found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO);
 
-         if ((found && expect->not_expect) ||
-             (!found && !(expect->not_expect || expect->optional)) ||
-             (found && !expect_matches(expect, found->value_tag)) ||
-             (found && expect->in_group &&
-              found->group_tag != expect->in_group))
-         {
-           if (expect->define_no_match)
-             set_variable(vars, expect->define_no_match, "1");
-           else if (!expect->define_match && !expect->define_value)
+          do
+          {
+           if ((found && expect->not_expect) ||
+               (!found && !(expect->not_expect || expect->optional)) ||
+               (found && !expect_matches(expect, found->value_tag)) ||
+               (found && expect->in_group &&
+                found->group_tag != expect->in_group))
            {
-             if (found && expect->not_expect)
-               add_stringf(errors, "NOT EXPECTED: %s", expect->name);
-             else if (!found && !(expect->not_expect || expect->optional))
-               add_stringf(errors, "EXPECTED: %s", expect->name);
-             else if (found)
+             if (expect->define_no_match)
+               set_variable(outfile, vars, expect->define_no_match, "1");
+             else if (!expect->define_match && !expect->define_value)
              {
-               if (!expect_matches(expect, found->value_tag))
-                 add_stringf(errors, "EXPECTED: %s OF-TYPE %s (got %s)",
-                             expect->name, expect->of_type,
-                             ippTagString(found->value_tag));
-
-               if (expect->in_group && found->group_tag != expect->in_group)
-                 add_stringf(errors, "EXPECTED: %s IN-GROUP %s (got %s).",
-                             expect->name, ippTagString(expect->in_group),
-                             ippTagString(found->group_tag));
-              }
-            }
+               if (found && expect->not_expect)
+                 add_stringf(errors, "NOT EXPECTED: %s", expect->name);
+               else if (!found && !(expect->not_expect || expect->optional))
+                 add_stringf(errors, "EXPECTED: %s", expect->name);
+               else if (found)
+               {
+                 if (!expect_matches(expect, found->value_tag))
+                   add_stringf(errors, "EXPECTED: %s OF-TYPE %s (got %s)",
+                               expect->name, expect->of_type,
+                               ippTagString(found->value_tag));
+
+                 if (expect->in_group && found->group_tag != expect->in_group)
+                   add_stringf(errors, "EXPECTED: %s IN-GROUP %s (got %s).",
+                               expect->name, ippTagString(expect->in_group),
+                               ippTagString(found->group_tag));
+               }
+             }
 
-           if (expect->repeat_no_match &&
-               repeat_count < expect->repeat_limit)
-             repeat_test = 1;
+             if (expect->repeat_no_match &&
+                 repeat_count < expect->repeat_limit)
+               repeat_test = 1;
 
-           continue;
-         }
+             break;
+           }
 
-         if (found)
-           ippAttributeString(found, buffer, sizeof(buffer));
+           if (found)
+             ippAttributeString(found, buffer, sizeof(buffer));
 
-         if (found &&
-             !with_value(NULL, expect->with_value, expect->with_flags, found,
-                         buffer, sizeof(buffer)))
-         {
-           if (expect->define_no_match)
-             set_variable(vars, expect->define_no_match, "1");
-           else if (!expect->define_match && !expect->define_value &&
-                    !expect->repeat_match && !expect->repeat_no_match)
+            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->with_flags & _CUPS_WITH_REGEX)
-               add_stringf(errors, "EXPECTED: %s %s /%s/",
-                           expect->name,
-                           (expect->with_flags & _CUPS_WITH_ALL) ?
-                               "WITH-ALL-VALUES" : "WITH-VALUE",
-                           expect->with_value);
-             else
-               add_stringf(errors, "EXPECTED: %s %s \"%s\"",
-                           expect->name,
-                           (expect->with_flags & _CUPS_WITH_ALL) ?
-                               "WITH-ALL-VALUES" : "WITH-VALUE",
-                           expect->with_value);
-
-             with_value(errors, expect->with_value, expect->with_flags, found,
-                        buffer, sizeof(buffer));
-           }
+             if (expect->define_no_match)
+               set_variable(outfile, vars, expect->define_no_match, "1");
+             else if (!expect->define_match && !expect->define_value && !expect->repeat_match && !expect->repeat_no_match)
+             {
+               add_stringf(errors, "EXPECTED: %s WITH-VALUES-FROM %s", expect->name, expect->with_value_from);
 
-           if (expect->repeat_no_match &&
-               repeat_count < expect->repeat_limit)
-             repeat_test = 1;
+               with_value_from(errors, ippFindAttribute(response, expect->with_value_from, IPP_TAG_ZERO), found, buffer, sizeof(buffer));
+             }
 
-           continue;
-         }
+             if (expect->repeat_no_match && repeat_count < expect->repeat_limit)
+               repeat_test = 1;
 
-         if (found && expect->count > 0 &&
-             found->num_values != expect->count)
-         {
-           if (expect->define_no_match)
-             set_variable(vars, expect->define_no_match, "1");
-           else if (!expect->define_match && !expect->define_value)
-           {
-             add_stringf(errors, "EXPECTED: %s COUNT %d (got %d)", expect->name,
-                         expect->count, found->num_values);
+             break;
            }
+           else if (found && !with_value(outfile, NULL, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer)))
+           {
+             if (expect->define_no_match)
+               set_variable(outfile, vars, expect->define_no_match, "1");
+             else if (!expect->define_match && !expect->define_value &&
+                      !expect->repeat_match && !expect->repeat_no_match)
+             {
+               if (expect->with_flags & _CUPS_WITH_REGEX)
+                 add_stringf(errors, "EXPECTED: %s %s /%s/",
+                             expect->name,
+                             (expect->with_flags & _CUPS_WITH_ALL) ?
+                                 "WITH-ALL-VALUES" : "WITH-VALUE",
+                             expect->with_value);
+               else
+                 add_stringf(errors, "EXPECTED: %s %s \"%s\"",
+                             expect->name,
+                             (expect->with_flags & _CUPS_WITH_ALL) ?
+                                 "WITH-ALL-VALUES" : "WITH-VALUE",
+                             expect->with_value);
+
+               with_value(outfile, errors, expect->with_value, expect->with_flags, found,
+                          buffer, sizeof(buffer));
+             }
 
-           if (expect->repeat_no_match &&
-               repeat_count < expect->repeat_limit)
-             repeat_test = 1;
-
-           continue;
-         }
+             if (expect->repeat_no_match &&
+                 repeat_count < expect->repeat_limit)
+               repeat_test = 1;
 
-         if (found && expect->same_count_as)
-         {
-           attrptr = ippFindAttribute(response, expect->same_count_as,
-                                      IPP_TAG_ZERO);
+             break;
+           }
 
-           if (!attrptr || attrptr->num_values != found->num_values)
+           if (found && expect->count > 0 &&
+               found->num_values != expect->count)
            {
              if (expect->define_no_match)
-               set_variable(vars, expect->define_no_match, "1");
+               set_variable(outfile, vars, expect->define_no_match, "1");
              else if (!expect->define_match && !expect->define_value)
              {
-               if (!attrptr)
-                 add_stringf(errors,
-                             "EXPECTED: %s (%d values) SAME-COUNT-AS %s "
-                             "(not returned)", expect->name,
-                             found->num_values, expect->same_count_as);
-               else if (attrptr->num_values != found->num_values)
-                 add_stringf(errors,
-                             "EXPECTED: %s (%d values) SAME-COUNT-AS %s "
-                             "(%d values)", expect->name, found->num_values,
-                             expect->same_count_as, attrptr->num_values);
+               add_stringf(errors, "EXPECTED: %s COUNT %d (got %d)", expect->name,
+                           expect->count, found->num_values);
              }
 
              if (expect->repeat_no_match &&
-                 repeat_count < expect->repeat_limit)
+                 repeat_count < expect->repeat_limit)
                repeat_test = 1;
 
-             continue;
+             break;
            }
-         }
 
-         if (found && expect->define_match)
-           set_variable(vars, expect->define_match, "1");
+           if (found && expect->same_count_as)
+           {
+             attrptr = ippFindAttribute(response, expect->same_count_as,
+                                        IPP_TAG_ZERO);
 
-         if (found && expect->define_value)
-           set_variable(vars, expect->define_value, buffer);
+             if (!attrptr || attrptr->num_values != found->num_values)
+             {
+               if (expect->define_no_match)
+                 set_variable(outfile, vars, expect->define_no_match, "1");
+               else if (!expect->define_match && !expect->define_value)
+               {
+                 if (!attrptr)
+                   add_stringf(errors,
+                               "EXPECTED: %s (%d values) SAME-COUNT-AS %s "
+                               "(not returned)", expect->name,
+                               found->num_values, expect->same_count_as);
+                 else if (attrptr->num_values != found->num_values)
+                   add_stringf(errors,
+                               "EXPECTED: %s (%d values) SAME-COUNT-AS %s "
+                               "(%d values)", expect->name, found->num_values,
+                               expect->same_count_as, attrptr->num_values);
+               }
+
+               if (expect->repeat_no_match &&
+                   repeat_count < expect->repeat_limit)
+                 repeat_test = 1;
+
+               break;
+             }
+           }
+
+           if (found && expect->define_match)
+             set_variable(outfile, 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;
+               }
+             }
 
-         if (found && expect->repeat_match &&
-             repeat_count < expect->repeat_limit)
-           repeat_test = 1;
+             set_variable(outfile, 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);
        }
       }
 
@@ -2855,16 +3224,35 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
 
       if (repeat_test)
       {
-       if (Output == _CUPS_OUTPUT_TEST)
+       if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
         {
           printf("%04d]\n", repeat_count);
           fflush(stdout);
+
+         if (num_displayed > 0)
+         {
+           for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response))
+           {
+             const char *attrname = ippGetName(attrptr);
+             if (attrname)
+             {
+               for (i = 0; i < num_displayed; i ++)
+               {
+                 if (!strcmp(displayed[i], attrname))
+                 {
+                   print_attr(stdout, _CUPS_OUTPUT_TEST, attrptr, NULL);
+                   break;
+                 }
+               }
+             }
+           }
+         }
         }
 
-        sleep(repeat_interval);
+        sleep((unsigned)repeat_interval);
         repeat_interval = _cupsNextDelay(repeat_interval, &repeat_prev);
 
-       if (Output == _CUPS_OUTPUT_TEST)
+       if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
        {
          printf("    %-68.68s [", name);
          fflush(stdout);
@@ -2887,22 +3275,23 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
 
     if (Output == _CUPS_OUTPUT_PLIST)
     {
-      puts("<key>Successful</key>");
-      puts(prev_pass ? "<true />" : "<false />");
-      puts("<key>StatusCode</key>");
-      print_xml_string("string", ippErrorString(cupsLastError()));
-      puts("<key>ResponseAttributes</key>");
-      puts("<array>");
-      puts("<dict>");
+      fputs("<key>Successful</key>\n", outfile);
+      fputs(prev_pass ? "<true />\n" : "<false />\n", outfile);
+      fputs("<key>StatusCode</key>\n", outfile);
+      print_xml_string(outfile, "string", ippErrorString(cupsLastError()));
+      fputs("<key>ResponseAttributes</key>\n", outfile);
+      fputs("<array>\n", outfile);
+      fputs("<dict>\n", outfile);
       for (attrptr = response ? response->attrs : NULL,
                group = attrptr ? attrptr->group_tag : IPP_TAG_ZERO;
           attrptr;
           attrptr = attrptr->next)
-       print_attr(attrptr, &group);
-      puts("</dict>");
-      puts("</array>");
+       print_attr(outfile, Output, attrptr, &group);
+      fputs("</dict>\n", outfile);
+      fputs("</array>\n", outfile);
     }
-    else if (Output == _CUPS_OUTPUT_TEST)
+
+    if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
     {
       puts(prev_pass ? "PASS]" : "FAIL]");
 
@@ -2913,16 +3302,16 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
        printf("        status-code = %s (%s)\n", ippErrorString(cupsLastError()),
               cupsLastErrorString());
 
-        if (response)
+        if (Verbosity && response)
         {
          for (attrptr = response->attrs;
               attrptr != NULL;
               attrptr = attrptr->next)
-           print_attr(attrptr, NULL);
+           print_attr(stdout, _CUPS_OUTPUT_TEST, attrptr, NULL);
        }
       }
     }
-    else if (!prev_pass)
+    else if (!prev_pass && Output != _CUPS_OUTPUT_QUIET)
       fprintf(stderr, "%s\n", cupsLastErrorString());
 
     if (prev_pass && Output >= _CUPS_OUTPUT_LIST && !Verbosity &&
@@ -2946,9 +3335,9 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       }
 
       if (Output == _CUPS_OUTPUT_CSV)
-       print_csv(NULL, num_displayed, displayed, widths);
+       print_csv(outfile, NULL, num_displayed, displayed, widths);
       else
-       print_line(NULL, num_displayed, displayed, widths);
+       print_line(outfile, NULL, num_displayed, displayed, widths);
 
       attrptr = response->attrs;
 
@@ -2960,9 +3349,9 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
        if (attrptr)
        {
          if (Output == _CUPS_OUTPUT_CSV)
-           print_csv(attrptr, num_displayed, displayed, widths);
+           print_csv(outfile, attrptr, num_displayed, displayed, widths);
          else
-           print_line(attrptr, num_displayed, displayed, widths);
+           print_line(outfile, attrptr, num_displayed, displayed, widths);
 
          while (attrptr && attrptr->group_tag > IPP_TAG_OPERATION)
            attrptr = attrptr->next;
@@ -2973,17 +3362,18 @@ do_tests(_cups_vars_t *vars,            /* I - Variables */
     {
       if (Output == _CUPS_OUTPUT_PLIST)
       {
-       puts("<key>Errors</key>");
-       puts("<array>");
+       fputs("<key>Errors</key>\n", outfile);
+       fputs("<array>\n", outfile);
 
        for (error = (char *)cupsArrayFirst(errors);
             error;
             error = (char *)cupsArrayNext(errors))
-         print_xml_string("string", error);
+         print_xml_string(outfile, "string", error);
 
-       puts("</array>");
+       fputs("</array>\n", outfile);
       }
-      else
+
+      if (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout))
       {
        for (error = (char *)cupsArrayFirst(errors);
             error;
@@ -2992,8 +3382,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
       }
     }
 
-    if (num_displayed > 0 && !Verbosity && response &&
-        Output == _CUPS_OUTPUT_TEST)
+    if (num_displayed > 0 && !Verbosity && response && (Output == _CUPS_OUTPUT_TEST || (Output == _CUPS_OUTPUT_PLIST && outfile != stdout)))
     {
       for (attrptr = response->attrs;
           attrptr != NULL;
@@ -3005,7 +3394,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
          {
            if (!strcmp(displayed[i], attrptr->name))
            {
-             print_attr(attrptr, NULL);
+             print_attr(outfile, Output, attrptr, NULL);
              break;
            }
          }
@@ -3016,7 +3405,7 @@ do_tests(_cups_vars_t *vars,              /* I - Variables */
     skip_error:
 
     if (Output == _CUPS_OUTPUT_PLIST)
-      puts("</dict>");
+      fputs("</dict>\n", outfile);
 
     fflush(stdout);
 
@@ -3164,16 +3553,28 @@ expand_variables(_cups_vars_t *vars,    /* I - Variables */
        value = getenv(temp);
         src   += tempptr - temp + 5;
       }
-      else if (vars)
+      else
       {
-       strlcpy(temp, src + 1, sizeof(temp));
+        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;
+         for (tempptr = temp; *tempptr; tempptr ++)
+           if (!isalnum(*tempptr & 255) && *tempptr != '-' && *tempptr != '_')
+             break;
 
-        if (*tempptr)
-         *tempptr = '\0';
+         if (*tempptr)
+           *tempptr = '\0';
+        }
 
        if (!strcmp(temp, "uri"))
          value = vars->uri;
@@ -3199,15 +3600,10 @@ expand_variables(_cups_vars_t *vars,    /* I - Variables */
 
         src += tempptr - temp + 1;
       }
-      else
-      {
-        value = "$";
-       src ++;
-      }
 
       if (value)
       {
-        strlcpy(dstptr, value, dstend - dstptr + 1);
+        strlcpy(dstptr, value, (size_t)(dstend - dstptr + 1));
        dstptr += strlen(dstptr);
       }
     }
@@ -3287,7 +3683,8 @@ expect_matches(
  */
 
 static ipp_t *                         /* O  - Collection value */
-get_collection(_cups_vars_t *vars,     /* I  - Variables */
+get_collection(FILE         *outfile,  /* I  - Output file */
+               _cups_vars_t *vars,     /* I  - Variables */
                FILE         *fp,       /* I  - File to read from */
               int          *linenum)   /* IO - Line number */
 {
@@ -3309,43 +3706,11 @@ get_collection(_cups_vars_t *vars,      /* I  - Variables */
       * Another collection value
       */
 
-      ipp_t    *subcol = get_collection(vars, fp, linenum);
+      ipp_t    *subcol = get_collection(outfile, vars, fp, linenum);
                                        /* Collection value */
 
       if (subcol)
-      {
-       ipp_attribute_t *tempcol;       /* Pointer to new buffer */
-
-
-       /*
-       * Reallocate memory...
-       */
-
-       if ((tempcol = realloc(lastcol, sizeof(ipp_attribute_t) +
-                                       (lastcol->num_values + 1) *
-                                       sizeof(_ipp_value_t))) == NULL)
-       {
-         print_fatal_error("Unable to allocate memory on line %d.", *linenum);
-         goto col_error;
-       }
-
-       if (tempcol != lastcol)
-       {
-        /*
-         * Reset pointers in the list...
-         */
-
-         if (col->prev)
-           col->prev->next = tempcol;
-         else
-           col->attrs = tempcol;
-
-         lastcol = col->current = col->last = tempcol;
-       }
-
-       lastcol->values[lastcol->num_values].collection = subcol;
-       lastcol->num_values ++;
-      }
+        ippSetCollection(col, &lastcol, ippGetCount(lastcol), subcol);
       else
        goto col_error;
     }
@@ -3359,26 +3724,26 @@ get_collection(_cups_vars_t *vars,      /* I  - Variables */
 
       if (!get_token(fp, token, sizeof(token), linenum))
       {
-       print_fatal_error("Missing MEMBER value tag on line %d.", *linenum);
+       print_fatal_error(outfile, "Missing MEMBER value tag on line %d.", *linenum);
        goto col_error;
       }
 
       if ((value = ippTagValue(token)) == IPP_TAG_ZERO)
       {
-       print_fatal_error("Bad MEMBER value tag \"%s\" on line %d.", token,
+       print_fatal_error(outfile, "Bad MEMBER value tag \"%s\" on line %d.", token,
                          *linenum);
        goto col_error;
       }
 
       if (!get_token(fp, attr, sizeof(attr), linenum))
       {
-       print_fatal_error("Missing MEMBER name on line %d.", *linenum);
+       print_fatal_error(outfile, "Missing MEMBER name on line %d.", *linenum);
        goto col_error;
       }
 
       if (!get_token(fp, temp, sizeof(temp), linenum))
       {
-       print_fatal_error("Missing MEMBER value on line %d.", *linenum);
+       print_fatal_error(outfile, "Missing MEMBER value on line %d.", *linenum);
        goto col_error;
       }
 
@@ -3390,7 +3755,7 @@ get_collection(_cups_vars_t *vars,        /* I  - Variables */
            if (!_cups_strcasecmp(token, "true"))
              ippAddBoolean(col, IPP_TAG_ZERO, attr, 1);
            else
-             ippAddBoolean(col, IPP_TAG_ZERO, attr, atoi(token));
+             ippAddBoolean(col, IPP_TAG_ZERO, attr, (char)atoi(token));
            break;
 
        case IPP_TAG_INTEGER :
@@ -3410,21 +3775,18 @@ get_collection(_cups_vars_t *vars,      /* I  - Variables */
                   _cups_strcasecmp(units, "dpcm") &&
                   _cups_strcasecmp(units, "other")))
              {
-               print_fatal_error("Bad resolution value \"%s\" on line %d.",
+               print_fatal_error(outfile, "Bad resolution value \"%s\" on line %d.",
                                  token, *linenum);
                goto col_error;
              }
 
              if (!_cups_strcasecmp(units, "dpi"))
-               ippAddResolution(col, IPP_TAG_ZERO, attr, xres, yres,
-                                IPP_RES_PER_INCH);
+               ippAddResolution(col, IPP_TAG_ZERO, attr, IPP_RES_PER_INCH, xres, yres);
              else if (!_cups_strcasecmp(units, "dpc") ||
                       !_cups_strcasecmp(units, "dpcm"))
-               ippAddResolution(col, IPP_TAG_ZERO, attr, xres, yres,
-                                IPP_RES_PER_CM);
+               ippAddResolution(col, IPP_TAG_ZERO, attr, IPP_RES_PER_CM, xres, yres);
              else
-               ippAddResolution(col, IPP_TAG_ZERO, attr, xres, yres,
-                                (ipp_res_t)0);
+               ippAddResolution(col, IPP_TAG_ZERO, attr, (ipp_res_t)0, xres, yres);
            }
            break;
 
@@ -3443,7 +3805,7 @@ get_collection(_cups_vars_t *vars,        /* I  - Variables */
 
              if ((num_vals & 1) || num_vals == 0)
              {
-               print_fatal_error("Bad rangeOfInteger value \"%s\" on line %d.",
+               print_fatal_error(outfile, "Bad rangeOfInteger value \"%s\" on line %d.",
                                  token, *linenum);
                goto col_error;
              }
@@ -3456,7 +3818,7 @@ get_collection(_cups_vars_t *vars,        /* I  - Variables */
        case IPP_TAG_BEGIN_COLLECTION :
            if (!strcmp(token, "{"))
            {
-             ipp_t     *subcol = get_collection(vars, fp, linenum);
+             ipp_t     *subcol = get_collection(outfile, vars, fp, linenum);
                                      /* Collection value */
 
              if (subcol)
@@ -3469,10 +3831,13 @@ get_collection(_cups_vars_t *vars,      /* I  - Variables */
            }
            else
            {
-             print_fatal_error("Bad collection value on line %d.", *linenum);
+             print_fatal_error(outfile, "Bad collection value on line %d.", *linenum);
              goto col_error;
            }
            break;
+       case IPP_TAG_STRING :
+           ippAddOctetString(col, IPP_TAG_ZERO, attr, token, (int)strlen(token));
+           break;
 
        default :
            if (!strchr(token, ','))
@@ -3570,7 +3935,7 @@ get_filename(const char *testfile,        /* I - Current test file */
     else
       dstptr = dst; /* Should never happen */
 
-    strlcpy(dstptr, src, dstsize - (dstptr - dst));
+    strlcpy(dstptr, src, dstsize - (size_t)(dstptr - dst));
   }
 
   return (dst);
@@ -3578,6 +3943,84 @@ get_filename(const char *testfile,       /* I - Current test file */
 
 
 /*
+ * '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);
+}
+
+
+/*
  * 'get_token()' - Get a token from a file.
  */
 
@@ -3630,15 +4073,15 @@ get_token(FILE *fp,                     /* I  - File to read from */
          */
 
          if (bufptr < bufend)
-           *bufptr++ = ch;
+           *bufptr++ = (char)ch;
 
          if ((ch = getc(fp)) != EOF && bufptr < bufend)
-           *bufptr++ = ch;
+           *bufptr++ = (char)ch;
        }
        else if (ch == quote)
           break;
        else if (bufptr < bufend)
-          *bufptr++ = ch;
+          *bufptr++ = (char)ch;
       }
 
       *bufptr = '\0';
@@ -3657,6 +4100,13 @@ get_token(FILE *fp,                      /* I  - File to read from */
 
       (*linenum) ++;
     }
+    else if (ch == '{' || ch == '}' || ch == ',')
+    {
+      buf[0] = (char)ch;
+      buf[1] = '\0';
+
+      return (buf);
+    }
     else
     {
      /*
@@ -3672,7 +4122,7 @@ get_token(FILE *fp,                       /* I  - File to read from */
        if (isspace(ch) || ch == '#')
           break;
        else if (bufptr < bufend)
-          *bufptr++ = ch;
+          *bufptr++ = (char)ch;
 
       if (ch == '#')
         ungetc(ch, fp);
@@ -3739,7 +4189,117 @@ password_cb(const char *prompt)         /* I - Prompt (unused) */
 {
   (void)prompt;
 
-  return (Password);
+  if (PasswordTries < 3)
+  {
+    PasswordTries ++;
+
+    cupsSetUser(Username);
+
+    return (Password);
+  }
+  else
+    return (NULL);
+}
+
+
+/*
+ * '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...
+  */
+
+  printf("%s\n---- PRESS ANY KEY ----", message);
+  fflush(stdout);
+
+#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...
+  */
+
+  fputs("\r                       \r", stdout);
+  fflush(stdout);
 }
 
 
@@ -3748,21 +4308,23 @@ password_cb(const char *prompt)         /* I - Prompt (unused) */
  */
 
 static void
-print_attr(ipp_attribute_t *attr,      /* I  - Attribute to print */
+print_attr(FILE            *outfile,   /* I  - Output file */
+           int             format,     /* I  - Output format */
+           ipp_attribute_t *attr,      /* I  - Attribute to print */
            ipp_tag_t       *group)     /* IO - Current group */
 {
   int                  i;              /* Looping var */
   ipp_attribute_t      *colattr;       /* Collection attribute */
 
 
-  if (Output == _CUPS_OUTPUT_PLIST)
+  if (format == _CUPS_OUTPUT_PLIST)
   {
     if (!attr->name || (group && *group != attr->group_tag))
     {
       if (attr->group_tag != IPP_TAG_ZERO)
       {
-       puts("</dict>");
-       puts("<dict>");
+       fputs("</dict>\n", outfile);
+       fputs("<dict>\n", outfile);
       }
 
       if (group)
@@ -3772,100 +4334,56 @@ print_attr(ipp_attribute_t *attr,      /* I  - Attribute to print */
     if (!attr->name)
       return;
 
-    print_xml_string("key", attr->name);
+    print_xml_string(outfile, "key", attr->name);
     if (attr->num_values > 1)
-      puts("<array>");
+      fputs("<array>\n", outfile);
 
     switch (attr->value_tag)
     {
       case IPP_TAG_INTEGER :
       case IPP_TAG_ENUM :
          for (i = 0; i < attr->num_values; i ++)
-           if (Output == _CUPS_OUTPUT_PLIST)
-             printf("<integer>%d</integer>\n", attr->values[i].integer);
-           else
-             printf("%d ", attr->values[i].integer);
+           fprintf(outfile, "<integer>%d</integer>\n", attr->values[i].integer);
          break;
 
       case IPP_TAG_BOOLEAN :
          for (i = 0; i < attr->num_values; i ++)
-           if (Output == _CUPS_OUTPUT_PLIST)
-             puts(attr->values[i].boolean ? "<true />" : "<false />");
-           else if (attr->values[i].boolean)
-             fputs("true ", stdout);
-           else
-             fputs("false ", stdout);
+           fputs(attr->values[i].boolean ? "<true />\n" : "<false />\n", outfile);
          break;
 
       case IPP_TAG_RANGE :
          for (i = 0; i < attr->num_values; i ++)
-           if (Output == _CUPS_OUTPUT_PLIST)
-             printf("<dict><key>lower</key><integer>%d</integer>"
-                    "<key>upper</key><integer>%d</integer></dict>\n",
-                    attr->values[i].range.lower, attr->values[i].range.upper);
-           else
-             printf("%d-%d ", attr->values[i].range.lower,
-                    attr->values[i].range.upper);
+           fprintf(outfile, "<dict><key>lower</key><integer>%d</integer>"
+                            "<key>upper</key><integer>%d</integer></dict>\n",
+                   attr->values[i].range.lower, attr->values[i].range.upper);
          break;
 
       case IPP_TAG_RESOLUTION :
          for (i = 0; i < attr->num_values; i ++)
-           if (Output == _CUPS_OUTPUT_PLIST)
-             printf("<dict><key>xres</key><integer>%d</integer>"
-                    "<key>yres</key><integer>%d</integer>"
-                    "<key>units</key><string>%s</string></dict>\n",
-                    attr->values[i].resolution.xres,
-                    attr->values[i].resolution.yres,
-                    attr->values[i].resolution.units == IPP_RES_PER_INCH ?
-                        "dpi" : "dpcm");
-           else
-             printf("%dx%d%s ", attr->values[i].resolution.xres,
-                    attr->values[i].resolution.yres,
-                    attr->values[i].resolution.units == IPP_RES_PER_INCH ?
-                        "dpi" : "dpcm");
+           fprintf(outfile, "<dict><key>xres</key><integer>%d</integer>"
+                            "<key>yres</key><integer>%d</integer>"
+                            "<key>units</key><string>%s</string></dict>\n",
+                  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_DATE :
          for (i = 0; i < attr->num_values; i ++)
-           if (Output == _CUPS_OUTPUT_PLIST)
-             printf("<date>%s</date>\n", iso_date(attr->values[i].date));
-           else
-             printf("%s ", iso_date(attr->values[i].date));
+           fprintf(outfile, "<date>%s</date>\n", iso_date(attr->values[i].date));
          break;
 
       case IPP_TAG_STRING :
           for (i = 0; i < attr->num_values; i ++)
           {
-            if (Output == _CUPS_OUTPUT_PLIST)
-            {
-             char      buffer[IPP_MAX_LENGTH * 5 / 4 + 1];
+           char        buffer[IPP_MAX_LENGTH * 5 / 4 + 1];
                                        /* Output buffer */
 
-              printf("<data>%s</data>\n",
-                     httpEncode64_2(buffer, sizeof(buffer),
-                                    attr->values[i].unknown.data,
-                                    attr->values[i].unknown.length));
-            }
-            else
-            {
-              char     *ptr,           /* Pointer into data */
-                       *end;           /* End of data */
-
-              putchar('\"');
-              for (ptr = attr->values[i].unknown.data,
-                       end = ptr + attr->values[i].unknown.length;
-                   ptr < end;
-                   ptr ++)
-              {
-                if (*ptr == '\\' || *ptr == '\"')
-                  printf("\\%c", *ptr);
-                else if (!isprint(*ptr & 255))
-                  printf("\\%03o", *ptr & 255);
-                else
-                  putchar(*ptr);
-              }
-              putchar('\"');
-            }
+           fprintf(outfile, "<data>%s</data>\n",
+                   httpEncode64_2(buffer, sizeof(buffer),
+                                  attr->values[i].unknown.data,
+                                  attr->values[i].unknown.length));
           }
           break;
 
@@ -3877,178 +4395,69 @@ print_attr(ipp_attribute_t *attr,      /* I  - Attribute to print */
       case IPP_TAG_MIMETYPE :
       case IPP_TAG_LANGUAGE :
          for (i = 0; i < attr->num_values; i ++)
-           if (Output == _CUPS_OUTPUT_PLIST)
-             print_xml_string("string", attr->values[i].string.text);
-           else
-             printf("\"%s\" ", attr->values[i].string.text);
+           print_xml_string(outfile, "string", attr->values[i].string.text);
          break;
 
       case IPP_TAG_TEXTLANG :
       case IPP_TAG_NAMELANG :
          for (i = 0; i < attr->num_values; i ++)
-           if (Output == _CUPS_OUTPUT_PLIST)
-           {
-             fputs("<dict><key>language</key><string>", stdout);
-             print_xml_string(NULL, attr->values[i].string.language);
-             fputs("</string><key>string</key><string>", stdout);
-             print_xml_string(NULL, attr->values[i].string.text);
-             puts("</string></dict>");
-           }
-           else
-             printf("\"%s\"[%s] ", attr->values[i].string.text,
-                    attr->values[i].string.language);
+         {
+           fputs("<dict><key>language</key><string>", outfile);
+           print_xml_string(outfile, NULL, attr->values[i].string.language);
+           fputs("</string><key>string</key><string>", outfile);
+           print_xml_string(outfile, NULL, attr->values[i].string.text);
+           fputs("</string></dict>\n", outfile);
+         }
          break;
 
       case IPP_TAG_BEGIN_COLLECTION :
          for (i = 0; i < attr->num_values; i ++)
          {
-           if (Output == _CUPS_OUTPUT_PLIST)
-           {
-             puts("<dict>");
-             for (colattr = attr->values[i].collection->attrs;
-                  colattr;
-                  colattr = colattr->next)
-               print_attr(colattr, NULL);
-             puts("</dict>");
-           }
-           else
-           {
-             if (i)
-               putchar(' ');
-
-             print_col(attr->values[i].collection);
-           }
+           fputs("<dict>\n", outfile);
+           for (colattr = attr->values[i].collection->attrs;
+                colattr;
+                colattr = colattr->next)
+             print_attr(outfile, format, colattr, NULL);
+           fputs("</dict>\n", outfile);
          }
          break;
 
       default :
-         if (Output == _CUPS_OUTPUT_PLIST)
-           printf("<string>&lt;&lt;%s&gt;&gt;</string>\n",
-                  ippTagString(attr->value_tag));
-         else
-           fputs(ippTagString(attr->value_tag), stdout);
+         fprintf(outfile, "<string>&lt;&lt;%s&gt;&gt;</string>\n", ippTagString(attr->value_tag));
          break;
     }
 
     if (attr->num_values > 1)
-      puts("</array>");
+      fputs("</array>\n", outfile);
   }
   else
   {
     char       buffer[8192];           /* Value buffer */
 
-    if (Output == _CUPS_OUTPUT_TEST)
+    if (format == _CUPS_OUTPUT_TEST)
     {
       if (!attr->name)
       {
-        puts("        -- separator --");
+        fputs("        -- separator --\n", outfile);
         return;
       }
 
-      printf("        %s (%s%s) = ", attr->name,
-            attr->num_values > 1 ? "1setOf " : "",
-            ippTagString(attr->value_tag));
+      fprintf(outfile, "        %s (%s%s) = ", attr->name, attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag));
     }
 
     ippAttributeString(attr, buffer, sizeof(buffer));
-    puts(buffer);
+    fprintf(outfile, "%s\n", buffer);
   }
 }
 
 
 /*
- * 'print_col()' - Print a collection attribute on the screen.
- */
-
-static void
-print_col(ipp_t *col)                  /* I - Collection attribute to print */
-{
-  int                  i;              /* Looping var */
-  ipp_attribute_t      *attr;          /* Current attribute in collection */
-
-
-  fputs("{ ", stdout);
-  for (attr = col->attrs; attr; attr = attr->next)
-  {
-    printf("%s (%s%s) = ", attr->name, attr->num_values > 1 ? "1setOf " : "",
-          ippTagString(attr->value_tag));
-
-    switch (attr->value_tag)
-    {
-      case IPP_TAG_INTEGER :
-      case IPP_TAG_ENUM :
-         for (i = 0; i < attr->num_values; i ++)
-           printf("%d ", attr->values[i].integer);
-         break;
-
-      case IPP_TAG_BOOLEAN :
-         for (i = 0; i < attr->num_values; i ++)
-           if (attr->values[i].boolean)
-             printf("true ");
-           else
-             printf("false ");
-         break;
-
-      case IPP_TAG_NOVALUE :
-         printf("novalue");
-         break;
-
-      case IPP_TAG_RANGE :
-         for (i = 0; i < attr->num_values; i ++)
-           printf("%d-%d ", attr->values[i].range.lower,
-                  attr->values[i].range.upper);
-         break;
-
-      case IPP_TAG_RESOLUTION :
-         for (i = 0; i < attr->num_values; i ++)
-           printf("%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_STRING :
-      case IPP_TAG_TEXT :
-      case IPP_TAG_NAME :
-      case IPP_TAG_KEYWORD :
-      case IPP_TAG_CHARSET :
-      case IPP_TAG_URI :
-      case IPP_TAG_MIMETYPE :
-      case IPP_TAG_LANGUAGE :
-         for (i = 0; i < attr->num_values; i ++)
-           printf("\"%s\" ", attr->values[i].string.text);
-         break;
-
-      case IPP_TAG_TEXTLANG :
-      case IPP_TAG_NAMELANG :
-         for (i = 0; i < attr->num_values; i ++)
-           printf("\"%s\"[%s] ", attr->values[i].string.text,
-                  attr->values[i].string.language);
-         break;
-
-      case IPP_TAG_BEGIN_COLLECTION :
-         for (i = 0; i < attr->num_values; i ++)
-         {
-           print_col(attr->values[i].collection);
-           putchar(' ');
-         }
-         break;
-
-      default :
-         break; /* anti-compiler-warning-code */
-    }
-  }
-
-  putchar('}');
-}
-
-
-/*
  * 'print_csv()' - Print a line of CSV text.
  */
 
 static void
 print_csv(
+    FILE            *outfile,          /* I - Output file */
     ipp_attribute_t *attr,             /* I - First attribute for line */
     int             num_displayed,     /* I - Number of attributes to display */
     char            **displayed,       /* I - Attributes to display */
@@ -4083,7 +4492,7 @@ print_csv(
     for (i = 0; i < num_displayed; i ++)
     {
       if (i)
-        putchar(',');
+        fputc(',', outfile);
 
       buffer[0] = '\0';
 
@@ -4101,30 +4510,30 @@ print_csv(
       if (strchr(buffer, ',') != NULL || strchr(buffer, '\"') != NULL ||
          strchr(buffer, '\\') != NULL)
       {
-        putchar('\"');
+        putc('\"', outfile);
         for (bufptr = buffer; *bufptr; bufptr ++)
         {
           if (*bufptr == '\\' || *bufptr == '\"')
-            putchar('\\');
-          putchar(*bufptr);
+            putc('\\', outfile);
+          putc(*bufptr, outfile);
         }
-        putchar('\"');
+        putc('\"', outfile);
       }
       else
-        fputs(buffer, stdout);
+        fputs(buffer, outfile);
     }
-    putchar('\n');
+    putc('\n', outfile);
   }
   else
   {
     for (i = 0; i < num_displayed; i ++)
     {
       if (i)
-        putchar(',');
+        putc(',', outfile);
 
-      fputs(displayed[i], stdout);
+      fputs(displayed[i], outfile);
     }
-    putchar('\n');
+    putc('\n', outfile);
   }
 
   free(buffer);
@@ -4136,7 +4545,8 @@ print_csv(
  */
 
 static void
-print_fatal_error(const char *s,       /* I - Printf-style format string */
+print_fatal_error(FILE       *outfile, /* I - Output file */
+                 const char *s,        /* I - Printf-style format string */
                   ...)                 /* I - Additional arguments as needed */
 {
   char         buffer[10240];          /* Format buffer */
@@ -4157,11 +4567,11 @@ print_fatal_error(const char *s,        /* I - Printf-style format string */
 
   if (Output == _CUPS_OUTPUT_PLIST)
   {
-    print_xml_header();
-    print_xml_trailer(0, buffer);
+    print_xml_header(outfile);
+    print_xml_trailer(outfile, 0, buffer);
   }
-  else
-    _cupsLangPrintf(stderr, "ipptool: %s", buffer);
+
+  _cupsLangPrintf(stderr, "ipptool: %s", buffer);
 }
 
 
@@ -4171,6 +4581,7 @@ print_fatal_error(const char *s,  /* I - Printf-style format string */
 
 static void
 print_line(
+    FILE            *outfile,          /* I - Output file */
     ipp_attribute_t *attr,             /* I - First attribute for line */
     int             num_displayed,     /* I - Number of attributes to display */
     char            **displayed,       /* I - Attributes to display */
@@ -4204,7 +4615,7 @@ print_line(
     for (i = 0; i < num_displayed; i ++)
     {
       if (i)
-        putchar(' ');
+        putc(' ', outfile);
 
       buffer[0] = '\0';
 
@@ -4219,31 +4630,31 @@ print_line(
         }
       }
 
-      printf("%*s", (int)-widths[i], buffer);
+      fprintf(outfile, "%*s", (int)-widths[i], buffer);
     }
-    putchar('\n');
+    putc('\n', outfile);
   }
   else
   {
     for (i = 0; i < num_displayed; i ++)
     {
       if (i)
-        putchar(' ');
+        putc(' ', outfile);
 
-      printf("%*s", (int)-widths[i], displayed[i]);
+      fprintf(outfile, "%*s", (int)-widths[i], displayed[i]);
     }
-    putchar('\n');
+    putc('\n', outfile);
 
     for (i = 0; i < num_displayed; i ++)
     {
       if (i)
-       putchar(' ');
+       putc(' ', outfile);
 
       memset(buffer, '-', widths[i]);
       buffer[widths[i]] = '\0';
-      fputs(buffer, stdout);
+      fputs(buffer, outfile);
     }
-    putchar('\n');
+    putc('\n', outfile);
   }
 
   free(buffer);
@@ -4255,21 +4666,23 @@ print_line(
  */
 
 static void
-print_xml_header(void)
+print_xml_header(FILE *outfile)                /* I - Output file */
 {
   if (!XMLHeader)
   {
-    puts("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-    puts("<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" "
-         "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">");
-    puts("<plist version=\"1.0\">");
-    puts("<dict>");
-    puts("<key>Transfer</key>");
-    printf("<string>%s</string>\n",
-           Transfer == _CUPS_TRANSFER_AUTO ? "auto" :
-              Transfer == _CUPS_TRANSFER_CHUNKED ? "chunked" : "length");
-    puts("<key>Tests</key>");
-    puts("<array>");
+    fputs("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", outfile);
+    fputs("<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" "
+         "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n", outfile);
+    fputs("<plist version=\"1.0\">\n", outfile);
+    fputs("<dict>\n", outfile);
+    fputs("<key>ipptoolVersion</key>\n", outfile);
+    fputs("<string>" CUPS_SVERSION "</string>\n", outfile);
+    fputs("<key>Transfer</key>\n", outfile);
+    fprintf(outfile, "<string>%s</string>\n",
+           Transfer == _CUPS_TRANSFER_AUTO ? "auto" :
+               Transfer == _CUPS_TRANSFER_CHUNKED ? "chunked" : "length");
+    fputs("<key>Tests</key>\n", outfile);
+    fputs("<array>\n", outfile);
 
     XMLHeader = 1;
   }
@@ -4281,20 +4694,21 @@ print_xml_header(void)
  */
 
 static void
-print_xml_string(const char *element,  /* I - Element name or NULL */
+print_xml_string(FILE       *outfile,  /* I - Output file */
+                 const char *element,  /* I - Element name or NULL */
                 const char *s)         /* I - String to print */
 {
   if (element)
-    printf("<%s>", element);
+    fprintf(outfile, "<%s>", element);
 
   while (*s)
   {
     if (*s == '&')
-      fputs("&amp;", stdout);
+      fputs("&amp;", outfile);
     else if (*s == '<')
-      fputs("&lt;", stdout);
+      fputs("&lt;", outfile);
     else if (*s == '>')
-      fputs("&gt;", stdout);
+      fputs("&gt;", outfile);
     else if ((*s & 0xe0) == 0xc0)
     {
      /*
@@ -4303,13 +4717,13 @@ print_xml_string(const char *element,   /* I - Element name or NULL */
 
       if ((s[1] & 0xc0) != 0x80)
       {
-        putchar('?');
+        putc('?', outfile);
         s ++;
       }
       else
       {
-        putchar(*s++);
-        putchar(*s);
+        putc(*s++, outfile);
+        putc(*s, outfile);
       }
     }
     else if ((*s & 0xf0) == 0xe0)
@@ -4320,14 +4734,14 @@ print_xml_string(const char *element,   /* I - Element name or NULL */
 
       if ((s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80)
       {
-        putchar('?');
+        putc('?', outfile);
         s += 2;
       }
       else
       {
-        putchar(*s++);
-        putchar(*s++);
-        putchar(*s);
+        putc(*s++, outfile);
+        putc(*s++, outfile);
+        putc(*s, outfile);
       }
     }
     else if ((*s & 0xf8) == 0xf0)
@@ -4339,15 +4753,15 @@ print_xml_string(const char *element,   /* I - Element name or NULL */
       if ((s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80 ||
           (s[3] & 0xc0) != 0x80)
       {
-        putchar('?');
+        putc('?', outfile);
         s += 3;
       }
       else
       {
-        putchar(*s++);
-        putchar(*s++);
-        putchar(*s++);
-        putchar(*s);
+        putc(*s++, outfile);
+        putc(*s++, outfile);
+        putc(*s++, outfile);
+        putc(*s, outfile);
       }
     }
     else if ((*s & 0x80) || (*s < ' ' && !isspace(*s & 255)))
@@ -4356,16 +4770,16 @@ print_xml_string(const char *element,   /* I - Element name or NULL */
       * Invalid control character...
       */
 
-      putchar('?');
+      putc('?', outfile);
     }
     else
-      putchar(*s);
+      putc(*s, outfile);
 
     s ++;
   }
 
   if (element)
-    printf("</%s>\n", element);
+    fprintf(outfile, "</%s>\n", element);
 }
 
 
@@ -4374,21 +4788,22 @@ print_xml_string(const char *element,   /* I - Element name or NULL */
  */
 
 static void
-print_xml_trailer(int        success,  /* I - 1 on success, 0 on failure */
+print_xml_trailer(FILE       *outfile, /* I - Output file */
+                  int        success,  /* I - 1 on success, 0 on failure */
                   const char *message) /* I - Error message or NULL */
 {
   if (XMLHeader)
   {
-    puts("</array>");
-    puts("<key>Successful</key>");
-    puts(success ? "<true />" : "<false />");
+    fputs("</array>\n", outfile);
+    fputs("<key>Successful</key>\n", outfile);
+    fputs(success ? "<true />\n" : "<false />\n", outfile);
     if (message)
     {
-      puts("<key>ErrorMessage</key>");
-      print_xml_string("string", message);
+      fputs("<key>ErrorMessage</key>\n", outfile);
+      print_xml_string(outfile, "string", message);
     }
-    puts("</dict>");
-    puts("</plist>");
+    fputs("</dict>\n", outfile);
+    fputs("</plist>\n", outfile);
 
     XMLHeader = 0;
   }
@@ -4400,7 +4815,8 @@ print_xml_trailer(int        success,     /* I - 1 on success, 0 on failure */
  */
 
 static void
-set_variable(_cups_vars_t *vars,       /* I - Variables */
+set_variable(FILE         *outfile,    /* I - Output file */
+             _cups_vars_t *vars,       /* I - Variables */
              const char   *name,       /* I - Variable name */
              const char   *value)      /* I - Value string */
 {
@@ -4425,7 +4841,7 @@ set_variable(_cups_vars_t *vars,  /* I - Variables */
   }
   else if ((var = malloc(sizeof(_cups_var_t))) == NULL)
   {
-    print_fatal_error("Unable to allocate memory for variable \"%s\".", name);
+    print_fatal_error(outfile, "Unable to allocate memory for variable \"%s\".", name);
     exit(1);
   }
   else
@@ -4461,14 +4877,35 @@ sigterm_handler(int sig)                /* I - Signal number (unused) */
  */
 
 static int                             /* O - 1 to continue, 0 to cancel */
-timeout_cb(http_t *http,               /* I - Connection to server (unused) */
+timeout_cb(http_t *http,               /* I - Connection to server */
            void   *user_data)          /* I - User data (unused) */
 {
-  (void)http;
+  int          buffered = 0;           /* Bytes buffered but not yet sent */
+
+
   (void)user_data;
 
- /* Always cancel on timeout */
-  return (0);
+  /*
+  * 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                       /* OS X 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);
 }
 
 
@@ -4482,6 +4919,10 @@ usage(void)
   _cupsLangPuts(stderr, _("Usage: ipptool [options] URI filename [ ... "
                          "filenameN ]"));
   _cupsLangPuts(stderr, _("Options:"));
+  _cupsLangPuts(stderr, _("  --help                  Show help."));
+  _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 "
@@ -4491,6 +4932,7 @@ usage(void)
   _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 SSL "
                          "encryption."));
   _cupsLangPuts(stderr, _("  -T seconds              Set the receive/send "
@@ -4499,12 +4941,14 @@ usage(void)
                           "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, _("  -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."));
@@ -4520,7 +4964,8 @@ usage(void)
  */
 
 static int                             /* O - 1 if valid, 0 otherwise */
-validate_attr(cups_array_t    *errors, /* I - Errors array */
+validate_attr(FILE            *outfile,        /* I - Output file */
+              cups_array_t    *errors, /* I - Errors array */
               ipp_attribute_t *attr)   /* I - Attribute to validate */
 {
   int          i;                      /* Looping var */
@@ -4585,7 +5030,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
 
            add_stringf(errors,
                        "\"%s\": Bad boolen value %d "
-                       "(RFC 2911 section 4.1.10).", attr->name,
+                       "(RFC 2911 section 4.1.11).", attr->name,
                        attr->values[i].boolean);
          }
        }
@@ -4609,7 +5054,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
     case IPP_TAG_STRING :
         for (i = 0; i < attr->num_values; i ++)
        {
-         if (attr->values[i].unknown.length > 1023)
+         if (attr->values[i].unknown.length > IPP_MAX_OCTETSTRING)
          {
            valid = 0;
 
@@ -4632,7 +5077,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
 
            add_stringf(errors,
                        "\"%s\": Bad dateTime month %u "
-                       "(RFC 2911 section 4.1.13).", attr->name, date[2]);
+                       "(RFC 2911 section 4.1.14).", attr->name, date[2]);
          }
 
           if (date[3] < 1 || date[3] > 31)
@@ -4641,7 +5086,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
 
            add_stringf(errors,
                        "\"%s\": Bad dateTime day %u "
-                       "(RFC 2911 section 4.1.13).", attr->name, date[3]);
+                       "(RFC 2911 section 4.1.14).", attr->name, date[3]);
          }
 
           if (date[4] > 23)
@@ -4650,7 +5095,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
 
            add_stringf(errors,
                        "\"%s\": Bad dateTime hours %u "
-                       "(RFC 2911 section 4.1.13).", attr->name, date[4]);
+                       "(RFC 2911 section 4.1.14).", attr->name, date[4]);
          }
 
           if (date[5] > 59)
@@ -4659,7 +5104,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
 
            add_stringf(errors,
                        "\"%s\": Bad dateTime minutes %u "
-                       "(RFC 2911 section 4.1.13).", attr->name, date[5]);
+                       "(RFC 2911 section 4.1.14).", attr->name, date[5]);
          }
 
           if (date[6] > 60)
@@ -4668,7 +5113,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
 
            add_stringf(errors,
                        "\"%s\": Bad dateTime seconds %u "
-                       "(RFC 2911 section 4.1.13).", attr->name, date[6]);
+                       "(RFC 2911 section 4.1.14).", attr->name, date[6]);
          }
 
           if (date[7] > 9)
@@ -4677,7 +5122,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
 
            add_stringf(errors,
                        "\"%s\": Bad dateTime deciseconds %u "
-                       "(RFC 2911 section 4.1.13).", attr->name, date[7]);
+                       "(RFC 2911 section 4.1.14).", attr->name, date[7]);
          }
 
           if (date[8] != '-' && date[8] != '+')
@@ -4686,7 +5131,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
 
            add_stringf(errors,
                        "\"%s\": Bad dateTime UTC sign '%c' "
-                       "(RFC 2911 section 4.1.13).", attr->name, date[8]);
+                       "(RFC 2911 section 4.1.14).", attr->name, date[8]);
          }
 
           if (date[9] > 11)
@@ -4695,7 +5140,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
 
            add_stringf(errors,
                        "\"%s\": Bad dateTime UTC hours %u "
-                       "(RFC 2911 section 4.1.13).", attr->name, date[9]);
+                       "(RFC 2911 section 4.1.14).", attr->name, date[9]);
          }
 
           if (date[10] > 59)
@@ -4704,7 +5149,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
 
            add_stringf(errors,
                        "\"%s\": Bad dateTime UTC minutes %u "
-                       "(RFC 2911 section 4.1.13).", attr->name, date[10]);
+                       "(RFC 2911 section 4.1.14).", attr->name, date[10]);
          }
        }
         break;
@@ -4719,7 +5164,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
            add_stringf(errors,
                        "\"%s\": Bad resolution value %dx%d%s - cross "
                        "feed resolution must be positive "
-                       "(RFC 2911 section 4.1.13).", attr->name,
+                       "(RFC 2911 section 4.1.15).", attr->name,
                        attr->values[i].resolution.xres,
                        attr->values[i].resolution.yres,
                        attr->values[i].resolution.units ==
@@ -4735,7 +5180,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
            add_stringf(errors,
                        "\"%s\": Bad resolution value %dx%d%s - feed "
                        "resolution must be positive "
-                       "(RFC 2911 section 4.1.13).", attr->name,
+                       "(RFC 2911 section 4.1.15).", attr->name,
                        attr->values[i].resolution.xres,
                        attr->values[i].resolution.yres,
                        attr->values[i].resolution.units ==
@@ -4751,7 +5196,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
 
            add_stringf(errors,
                        "\"%s\": Bad resolution value %dx%d%s - bad "
-                       "units value (RFC 2911 section 4.1.13).",
+                       "units value (RFC 2911 section 4.1.15).",
                        attr->name, attr->values[i].resolution.xres,
                        attr->values[i].resolution.yres,
                        attr->values[i].resolution.units ==
@@ -4785,7 +5230,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
               colattr;
               colattr = colattr->next)
          {
-           if (!validate_attr(NULL, colattr))
+           if (!validate_attr(outfile, NULL, colattr))
            {
              valid = 0;
              break;
@@ -4798,7 +5243,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
 
            while (colattr)
            {
-             validate_attr(errors, colattr);
+             validate_attr(outfile, errors, colattr);
              colattr = colattr->next;
            }
          }
@@ -4852,7 +5297,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
                        attr->values[i].string.text);
          }
 
-         if ((ptr - attr->values[i].string.text) > 1023)
+         if ((ptr - attr->values[i].string.text) > (IPP_MAX_TEXT - 1))
          {
            valid = 0;
 
@@ -4912,7 +5357,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
                        attr->values[i].string.text);
          }
 
-         if ((ptr - attr->values[i].string.text) > 1023)
+         if ((ptr - attr->values[i].string.text) > (IPP_MAX_NAME - 1))
          {
            valid = 0;
 
@@ -4943,7 +5388,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
                        attr->name, attr->values[i].string.text);
          }
 
-         if ((ptr - attr->values[i].string.text) > 255)
+         if ((ptr - attr->values[i].string.text) > (IPP_MAX_KEYWORD - 1))
          {
            valid = 0;
 
@@ -4974,11 +5419,10 @@ validate_attr(cups_array_t    *errors,  /* I - Errors array */
                        "\"%s\": Bad URI value \"%s\" - %s "
                        "(RFC 2911 section 4.1.5).", attr->name,
                        attr->values[i].string.text,
-                       URIStatusStrings[uri_status -
-                                        HTTP_URI_OVERFLOW]);
+                       httpURIStatusString(uri_status));
          }
 
-         if (strlen(attr->values[i].string.text) > 1023)
+         if (strlen(attr->values[i].string.text) > (IPP_MAX_URI - 1))
          {
            valid = 0;
 
@@ -5013,7 +5457,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
                        attr->name, attr->values[i].string.text);
          }
 
-         if ((ptr - attr->values[i].string.text) > 63)
+         if ((ptr - attr->values[i].string.text) > (IPP_MAX_URISCHEME - 1))
          {
            valid = 0;
 
@@ -5044,7 +5488,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
                        attr->name, attr->values[i].string.text);
          }
 
-         if ((ptr - attr->values[i].string.text) > 40)
+         if ((ptr - attr->values[i].string.text) > (IPP_MAX_CHARSET - 1))
          {
            valid = 0;
 
@@ -5083,7 +5527,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
           char temp[256];              /* Temporary error string */
 
           regerror(i, &re, temp, sizeof(temp));
-         print_fatal_error("Unable to compile naturalLanguage regular "
+         print_fatal_error(outfile, "Unable to compile naturalLanguage regular "
                            "expression: %s.", temp);
          break;
         }
@@ -5100,7 +5544,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
                        attr->name, attr->values[i].string.text);
          }
 
-         if (strlen(attr->values[i].string.text) > 63)
+         if (strlen(attr->values[i].string.text) > (IPP_MAX_LANGUAGE - 1))
          {
            valid = 0;
 
@@ -5136,7 +5580,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
           char temp[256];              /* Temporary error string */
 
           regerror(i, &re, temp, sizeof(temp));
-         print_fatal_error("Unable to compile mimeMediaType regular "
+         print_fatal_error(outfile, "Unable to compile mimeMediaType regular "
                            "expression: %s.", temp);
          break;
         }
@@ -5153,7 +5597,7 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
                        attr->name, attr->values[i].string.text);
          }
 
-         if (strlen(attr->values[i].string.text) > 255)
+         if (strlen(attr->values[i].string.text) > (IPP_MAX_MIMETYPE - 1))
          {
            valid = 0;
 
@@ -5181,7 +5625,8 @@ validate_attr(cups_array_t    *errors,    /* I - Errors array */
  */
 
 static int                             /* O - 1 on match, 0 on non-match */
-with_value(cups_array_t    *errors,    /* I - Errors array */
+with_value(FILE            *outfile,   /* I - Output file */
+           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 */
@@ -5190,7 +5635,8 @@ with_value(cups_array_t    *errors,       /* I - Errors array */
 {
   int  i,                              /* Looping var */
        match;                          /* Match? */
-  char *valptr;                        /* Pointer into value */
+  char temp[1024],                     /* Temporary value string */
+       *valptr;                        /* Pointer into value */
 
 
   *matchbuf = '\0';
@@ -5235,7 +5681,7 @@ with_value(cups_array_t    *errors,       /* I - Errors array */
             if (!*valptr)
              break;
 
-           intvalue = strtol(valptr, &nextptr, 0);
+           intvalue = (int)strtol(valptr, &nextptr, 0);
            if (nextptr == valptr)
              break;
            valptr = nextptr;
@@ -5245,8 +5691,7 @@ with_value(cups_array_t    *errors,       /* I - Errors array */
                 (op == '>' && attr->values[i].integer > intvalue))
            {
              if (!matchbuf[0])
-               snprintf(matchbuf, matchlen, "%d",
-                        attr->values[i].integer);
+               snprintf(matchbuf, matchlen, "%d", attr->values[i].integer);
 
              valmatch = 1;
              break;
@@ -5301,7 +5746,7 @@ with_value(cups_array_t    *errors,       /* I - Errors array */
             if (!*valptr)
              break;
 
-           intvalue = strtol(valptr, &nextptr, 0);
+           intvalue = (int)strtol(valptr, &nextptr, 0);
            if (nextptr == valptr)
              break;
            valptr = nextptr;
@@ -5374,6 +5819,63 @@ with_value(cups_array_t    *errors,      /* I - Errors array */
        }
        break;
 
+    case IPP_TAG_RESOLUTION :
+       for (i = 0; i < attr->num_values; i ++)
+       {
+         if (attr->values[i].resolution.xres ==
+                 attr->values[i].resolution.yres)
+           snprintf(temp, sizeof(temp), "%d%s",
+                    attr->values[i].resolution.xres,
+                    attr->values[i].resolution.units == IPP_RES_PER_INCH ?
+                        "dpi" : "dpcm");
+         else
+           snprintf(temp, sizeof(temp), "%dx%d%s",
+                    attr->values[i].resolution.xres,
+                    attr->values[i].resolution.yres,
+                    attr->values[i].resolution.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 < attr->num_values; i ++)
+         {
+           if (attr->values[i].resolution.xres ==
+                   attr->values[i].resolution.yres)
+             snprintf(temp, sizeof(temp), "%d%s",
+                      attr->values[i].resolution.xres,
+                      attr->values[i].resolution.units == IPP_RES_PER_INCH ?
+                          "dpi" : "dpcm");
+           else
+             snprintf(temp, sizeof(temp), "%dx%d%s",
+                      attr->values[i].resolution.xres,
+                      attr->values[i].resolution.yres,
+                      attr->values[i].resolution.units == IPP_RES_PER_INCH ?
+                          "dpi" : "dpcm");
+
+            if (strcmp(value, temp))
+             add_stringf(errors, "GOT: %s=%s", attr->name, temp);
+         }
+       }
+       break;
+
     case IPP_TAG_NOVALUE :
     case IPP_TAG_UNKNOWN :
        return (1);
@@ -5398,11 +5900,9 @@ with_value(cups_array_t    *errors,      /* I - Errors array */
 
           if ((i = regcomp(&re, value, REG_EXTENDED | REG_NOSUB)) != 0)
          {
-           char temp[256];             /* Temporary string */
-
             regerror(i, &re, temp, sizeof(temp));
 
-           print_fatal_error("Unable to compile WITH-VALUE regular expression "
+           print_fatal_error(outfile, "Unable to compile WITH-VALUE regular expression "
                              "\"%s\" - %s", value, temp);
            return (0);
          }
@@ -5413,10 +5913,13 @@ with_value(cups_array_t    *errors,     /* I - Errors array */
 
          for (i = 0; i < attr->num_values; i ++)
          {
-           if (!regexec(&re, attr->values[i].string.text, 0, NULL, 0))
+           if (!regexec(&re, get_string(attr, i, flags, temp, sizeof(temp)),
+                        0, NULL, 0))
            {
              if (!matchbuf[0])
-               strlcpy(matchbuf, attr->values[i].string.text, matchlen);
+               strlcpy(matchbuf,
+                       get_string(attr, i, flags, temp, sizeof(temp)),
+                       matchlen);
 
              if (!(flags & _CUPS_WITH_ALL))
              {
@@ -5433,6 +5936,55 @@ with_value(cups_array_t    *errors,      /* I - Errors array */
 
          regfree(&re);
        }
+       else if (ippGetValueTag(attr) == IPP_TAG_URI)
+       {
+          if (!strncmp(value, "ipp://", 6) || !strncmp(value, "http://", 7) || !strncmp(value, "ipps://", 7) || !strncmp(value, "https://", 8))
+          {
+           char        scheme[256],    /* URI scheme */
+                       userpass[256],  /* username:password, if any */
+                       hostname[256],  /* hostname */
+                       *hostptr,       /* Pointer into hostname */
+                       resource[1024]; /* Resource path */
+           int         port;           /* Port number */
+
+            if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) >= HTTP_URI_STATUS_OK && (hostptr = hostname + strlen(hostname) - 1) > hostname && *hostptr == '.')
+            {
+             /*
+              * Strip trailing "." in hostname of URI...
+              */
+
+              *hostptr = '\0';
+              httpAssembleURI(HTTP_URI_CODING_ALL, temp, sizeof(temp), scheme, userpass, hostname, port, resource);
+              value = temp;
+            }
+          }
+
+        /*
+         * Value is a literal URI string, see if the value(s) match...
+         */
+
+         for (i = 0; i < attr->num_values; i ++)
+         {
+           if (!strcmp(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
        {
         /*
@@ -5441,10 +5993,12 @@ with_value(cups_array_t    *errors,     /* I - Errors array */
 
          for (i = 0; i < attr->num_values; i ++)
          {
-           if (!strcmp(value, attr->values[i].string.text))
+           if (!strcmp(value, get_string(attr, i, flags, temp, sizeof(temp))))
            {
              if (!matchbuf[0])
-               strlcpy(matchbuf, attr->values[i].string.text, matchlen);
+               strlcpy(matchbuf,
+                       get_string(attr, i, flags, temp, sizeof(temp)),
+                       matchlen);
 
              if (!(flags & _CUPS_WITH_ALL))
              {
@@ -5464,7 +6018,7 @@ with_value(cups_array_t    *errors,       /* I - Errors array */
         {
          for (i = 0; i < attr->num_values; i ++)
            add_stringf(errors, "GOT: %s=\"%s\"", attr->name,
-                            attr->values[i].string.text);
+                       attr->values[i].string.text);
         }
        break;
 
@@ -5477,5 +6031,165 @@ with_value(cups_array_t    *errors,     /* I - Errors array */
 
 
 /*
- * End of "$Id: ipptool.c 11173 2013-07-23 12:31:34Z msweet $".
+ * '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_URI :
+    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;
+
+    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);
+}
+
+
+/*
+ * End of "$Id: ipptool.c 12952 2015-10-28 17:22:39Z msweet $".
  */
diff --git a/test/make-ippeverywhere-print-tests.sh b/test/make-ippeverywhere-print-tests.sh
new file mode 100755 (executable)
index 0000000..7d897ff
--- /dev/null
@@ -0,0 +1,84 @@
+#!/bin/sh
+#
+# Script that builds the print-job tests for all IPP Everywhere PWG Raster
+# documents.
+#
+
+for file in color.jpg-4x6 document-a4 document-letter gray.jpg-4x6 onepage-a4 onepage-letter; do
+    for res in 150dpi 180dpi 300dpi 360dpi 600dpi 720dpi; do
+       HAVE_RES="`echo HAVE_$res | awk '{print toupper($1);}'`"
+        for type in black-1 cmyk-8 sgray-8 srgb-8 srgb-16; do
+            if test -f pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg; then
+                   HAVE_TYPE="`echo HAVE_$type | awk '{print toupper($1);}' | tr '-' '_'`"
+                   cat <<EOF
+{
+       NAME "Print $file @ $res, $type"
+       SKIP-IF-MISSING pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg
+       SKIP-IF-NOT-DEFINED $HAVE_RES
+       SKIP-IF-NOT-DEFINED $HAVE_TYPE
+
+       OPERATION Print-Job
+       GROUP operation-attributes-tag
+       ATTR charset attributes-charset utf-8
+       ATTR 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 "$file"
+       FILE pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg
+
+       STATUS successful-ok
+       STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+       NAME "Print $file @ $res, $type, deflate"
+       SKIP-IF-MISSING pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg
+       SKIP-IF-NOT-DEFINED $HAVE_RES
+       SKIP-IF-NOT-DEFINED $HAVE_TYPE
+       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 "$file"
+       COMPRESSION deflate
+       FILE pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg
+
+       STATUS successful-ok
+       STATUS server-error-busy REPEAT-MATCH
+}
+
+{
+       NAME "Print $file @ $res, $type, gzip"
+       SKIP-IF-MISSING pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg
+       SKIP-IF-NOT-DEFINED $HAVE_RES
+       SKIP-IF-NOT-DEFINED $HAVE_TYPE
+       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 "$file"
+       COMPRESSION gzip
+       FILE pwg-raster-samples-$res-20111130/$type/$file-$type-$res.pwg
+
+       STATUS successful-ok
+       STATUS server-error-busy REPEAT-MATCH
+}
+
+EOF
+           fi
+       done
+    done
+done
diff --git a/test/onepage-a4-300-black-1.pwg.gz b/test/onepage-a4-300-black-1.pwg.gz
new file mode 100644 (file)
index 0000000..0a559fc
Binary files /dev/null and b/test/onepage-a4-300-black-1.pwg.gz differ
diff --git a/test/onepage-letter-300-black-1.pwg.gz b/test/onepage-letter-300-black-1.pwg.gz
new file mode 100644 (file)
index 0000000..8fd7386
Binary files /dev/null and b/test/onepage-letter-300-black-1.pwg.gz differ
diff --git a/test/print-job-and-wait.test b/test/print-job-and-wait.test
new file mode 100644 (file)
index 0000000..f6accca
--- /dev/null
@@ -0,0 +1,45 @@
+# 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
+}
diff --git a/test/print-job-deflate.test b/test/print-job-deflate.test
new file mode 100644 (file)
index 0000000..e54028d
--- /dev/null
@@ -0,0 +1,31 @@
+# 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
+}
diff --git a/test/print-job-gzip.test b/test/print-job-gzip.test
new file mode 100644 (file)
index 0000000..2b8209c
--- /dev/null
@@ -0,0 +1,31 @@
+# Print a test page using print-job and compression=gzip
+{
+       # The name of the test...
+       NAME "Print file using Print-Job and compression=gzip"
+
+       # 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 gzip
+
+       GROUP job-attributes-tag
+       ATTR integer copies 1
+
+       COMPRESSION gzip
+       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
+}
diff --git a/test/print-job-password.test b/test/print-job-password.test
new file mode 100644 (file)
index 0000000..36e6a0a
--- /dev/null
@@ -0,0 +1,31 @@
+# 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
+       ATTR octetString job-password 1234
+       ATTR keyword job-password-encryption none
+
+       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
+}
index 595854a..44d8054 100644 (file)
Binary files a/test/printer.opacity and b/test/printer.opacity differ
index 18c05db..08430fc 100644 (file)
Binary files a/test/printer.png and b/test/printer.png differ
index 48756c8..1a76104 100755 (executable)
@@ -1,18 +1,18 @@
 #!/bin/sh
 #
-# "$Id: run-stp-tests.sh 9034 2010-03-09 07:03:06Z mike $"
+# "$Id: run-stp-tests.sh 12853 2015-08-28 13:38:46Z msweet $"
 #
-#   Perform the complete set of IPP compliance tests specified in the
-#   CUPS Software Test Plan.
+# Perform the complete set of IPP compliance tests specified in the
+# CUPS Software Test Plan.
 #
-#   Copyright 2007-2012 by Apple Inc.
-#   Copyright 1997-2007 by Easy Software Products, all rights reserved.
+# Copyright 2007-2015 by Apple Inc.
+# Copyright 1997-2007 by Easy Software Products, all rights reserved.
 #
-#   These coded instructions, statements, and computer programs are the
-#   property of Apple Inc. and are protected by Federal copyright
-#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-#   which should have been included with this file.  If this file is
-#   file is missing or damaged, see the license at "http://www.cups.org/".
+# These coded instructions, statements, and computer programs are the
+# property of Apple Inc. and are protected by Federal copyright
+# law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+# which should have been included with this file.  If this file is
+# file is missing or damaged, see the license at "http://www.cups.org/".
 #
 
 argcount=$#
@@ -100,6 +100,7 @@ case "$testtype" in
                nprinters2=0
                pjobs=0
                pprinters=0
+               loglevel="debug2"
                ;;
        2)
                echo "Running the medium tests (2)"
@@ -107,6 +108,7 @@ case "$testtype" in
                nprinters2=20
                pjobs=20
                pprinters=10
+               loglevel="debug"
                ;;
        3)
                echo "Running the extreme tests (3)"
@@ -114,6 +116,7 @@ case "$testtype" in
                nprinters2=1000
                pjobs=100
                pprinters=50
+               loglevel="debug"
                ;;
        4)
                echo "Running the torture tests (4)"
@@ -121,6 +124,7 @@ case "$testtype" in
                nprinters2=20000
                pjobs=200
                pprinters=100
+               loglevel="debug"
                ;;
        *)
                echo "Running the timid tests (1)"
@@ -128,6 +132,8 @@ case "$testtype" in
                nprinters2=0
                pjobs=10
                pprinters=0
+               loglevel="debug2"
+               testtype="1"
                ;;
 esac
 
@@ -184,9 +190,20 @@ if test -z "$user"; then
        fi
 fi
 
-port=8631
+port="${CUPS_TESTPORT:=8631}"
 cwd=`pwd`
 root=`dirname $cwd`
+CUPS_TESTROOT="$root"; export CUPS_TESTROOT
+
+BASE="${CUPS_TESTBASE:=}"
+if test -z "$BASE"; then
+       if test -d /private/tmp; then
+               BASE=/private/tmp/cups-$user
+       else
+               BASE=/tmp/cups-$user
+       fi
+fi
+export BASE
 
 #
 # Make sure that the LPDEST and PRINTER environment variables are
@@ -218,12 +235,12 @@ echo ""
 
 case "$usevalgrind" in
        Y* | y*)
-               VALGRIND="valgrind --tool=memcheck --log-file=/tmp/cups-$user/log/valgrind.%p --error-limit=no --leak-check=yes --trace-children=yes --read-var-info=yes"
+               VALGRIND="valgrind --tool=memcheck --log-file=$BASE/log/valgrind.%p --error-limit=no --leak-check=yes --trace-children=yes"
                if test `uname` = Darwin; then
                        VALGRIND="$VALGRIND --dsymutil=yes"
                fi
                export VALGRIND
-               echo "Using Valgrind; log files can be found in /tmp/cups-$user/log..."
+               echo "Using Valgrind; log files can be found in $BASE/log..."
                ;;
 
        *)
@@ -252,16 +269,16 @@ echo ""
 
 case "$usedebugprintfs" in
        Y* | y*)
-               echo "Enabling debug printfs; log files can be found in /tmp/cups-$user/log..."
-               CUPS_DEBUG_LOG="/tmp/cups-$user/log/debug_printfs.%d"; export CUPS_DEBUG_LOG
+               echo "Enabling debug printfs (level 5); log files can be found in $BASE/log..."
+               CUPS_DEBUG_LOG="$BASE/log/debug_printfs.%d"; export CUPS_DEBUG_LOG
                CUPS_DEBUG_LEVEL=5; export CUPS_DEBUG_LEVEL
                CUPS_DEBUG_FILTER='^(http|_http|ipp|_ipp|cups.*Request|cupsGetResponse|cupsSend).*$'; export CUPS_DEBUG_FILTER
                ;;
 
        0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)
-               echo "Enabling debug printfs; log files can be found in /tmp/cups-$user/log..."
-               CUPS_DEBUG_LOG="/tmp/cups-$user/log/debug_printfs.%d"; export CUPS_DEBUG_LOG
-               CUPS_DEBUG_LEVEL=$usedebugprintf; export CUPS_DEBUG_LEVEL
+               echo "Enabling debug printfs (level $usedebugprintfs); log files can be found in $BASE/log..."
+               CUPS_DEBUG_LOG="$BASE/log/debug_printfs.%d"; export CUPS_DEBUG_LOG
+               CUPS_DEBUG_LEVEL="$usedebugprintfs"; export CUPS_DEBUG_LEVEL
                CUPS_DEBUG_FILTER='^(http|_http|ipp|_ipp|cups.*Request|cupsGetResponse|cupsSend).*$'; export CUPS_DEBUG_FILTER
                ;;
 
@@ -275,104 +292,185 @@ esac
 
 echo "Creating directories for test..."
 
-rm -rf /tmp/cups-$user
-mkdir /tmp/cups-$user
-mkdir /tmp/cups-$user/bin
-mkdir /tmp/cups-$user/bin/backend
-mkdir /tmp/cups-$user/bin/driver
-mkdir /tmp/cups-$user/bin/filter
-mkdir /tmp/cups-$user/certs
-mkdir /tmp/cups-$user/share
-mkdir /tmp/cups-$user/share/banners
-mkdir /tmp/cups-$user/share/drv
-mkdir /tmp/cups-$user/share/locale
+rm -rf $BASE
+mkdir $BASE
+mkdir $BASE/bin
+mkdir $BASE/bin/backend
+mkdir $BASE/bin/driver
+mkdir $BASE/bin/filter
+mkdir $BASE/certs
+mkdir $BASE/share
+mkdir $BASE/share/banners
+mkdir $BASE/share/drv
+mkdir $BASE/share/locale
 for file in ../locale/cups_*.po; do
        loc=`basename $file .po | cut -c 6-`
-       mkdir /tmp/cups-$user/share/locale/$loc
-       ln -s $root/locale/cups_$loc.po /tmp/cups-$user/share/locale/$loc
-       ln -s $root/locale/ppdc_$loc.po /tmp/cups-$user/share/locale/$loc
+       mkdir $BASE/share/locale/$loc
+       ln -s $root/locale/cups_$loc.po $BASE/share/locale/$loc
+       ln -s $root/locale/ppdc_$loc.po $BASE/share/locale/$loc
 done
-mkdir /tmp/cups-$user/share/mime
-mkdir /tmp/cups-$user/share/model
-mkdir /tmp/cups-$user/share/ppdc
-mkdir /tmp/cups-$user/interfaces
-mkdir /tmp/cups-$user/log
-mkdir /tmp/cups-$user/ppd
-mkdir /tmp/cups-$user/spool
-mkdir /tmp/cups-$user/spool/temp
-mkdir /tmp/cups-$user/ssl
-
-ln -s $root/backend/dnssd /tmp/cups-$user/bin/backend
-ln -s $root/backend/http /tmp/cups-$user/bin/backend
-ln -s $root/backend/ipp /tmp/cups-$user/bin/backend
-ln -s $root/backend/lpd /tmp/cups-$user/bin/backend
-ln -s $root/backend/mdns /tmp/cups-$user/bin/backend
-ln -s $root/backend/pseudo /tmp/cups-$user/bin/backend
-ln -s $root/backend/snmp /tmp/cups-$user/bin/backend
-ln -s $root/backend/socket /tmp/cups-$user/bin/backend
-ln -s $root/backend/usb /tmp/cups-$user/bin/backend
-ln -s $root/cgi-bin /tmp/cups-$user/bin
-ln -s $root/monitor /tmp/cups-$user/bin
-ln -s $root/notifier /tmp/cups-$user/bin
-ln -s $root/scheduler /tmp/cups-$user/bin/daemon
-ln -s $root/filter/commandtops /tmp/cups-$user/bin/filter
-ln -s $root/filter/gziptoany /tmp/cups-$user/bin/filter
-ln -s $root/filter/pstops /tmp/cups-$user/bin/filter
-ln -s $root/filter/rastertoepson /tmp/cups-$user/bin/filter
-ln -s $root/filter/rastertohp /tmp/cups-$user/bin/filter
-ln -s $root/filter/rastertolabel /tmp/cups-$user/bin/filter
-ln -s $root/filter/rastertopwg /tmp/cups-$user/bin/filter
-
-ln -s $root/data/classified /tmp/cups-$user/share/banners
-ln -s $root/data/confidential /tmp/cups-$user/share/banners
-ln -s $root/data/secret /tmp/cups-$user/share/banners
-ln -s $root/data/standard /tmp/cups-$user/share/banners
-ln -s $root/data/topsecret /tmp/cups-$user/share/banners
-ln -s $root/data/unclassified /tmp/cups-$user/share/banners
-ln -s $root/data /tmp/cups-$user/share
-ln -s $root/ppdc/sample.drv /tmp/cups-$user/share/drv
-ln -s $root/conf/mime.types /tmp/cups-$user/share/mime
-ln -s $root/conf/mime.convs /tmp/cups-$user/share/mime
-ln -s $root/data/*.h /tmp/cups-$user/share/ppdc
-ln -s $root/data/*.defs /tmp/cups-$user/share/ppdc
-ln -s $root/templates /tmp/cups-$user/share
+mkdir $BASE/share/mime
+mkdir $BASE/share/model
+mkdir $BASE/share/ppdc
+mkdir $BASE/interfaces
+mkdir $BASE/log
+mkdir $BASE/ppd
+mkdir $BASE/spool
+mkdir $BASE/spool/temp
+mkdir $BASE/ssl
+
+ln -s $root/backend/dnssd $BASE/bin/backend
+ln -s $root/backend/http $BASE/bin/backend
+ln -s $root/backend/ipp $BASE/bin/backend
+ln -s $root/backend/lpd $BASE/bin/backend
+ln -s $root/backend/mdns $BASE/bin/backend
+ln -s $root/backend/pseudo $BASE/bin/backend
+ln -s $root/backend/snmp $BASE/bin/backend
+ln -s $root/backend/socket $BASE/bin/backend
+ln -s $root/backend/usb $BASE/bin/backend
+ln -s $root/cgi-bin $BASE/bin
+ln -s $root/monitor $BASE/bin
+ln -s $root/notifier $BASE/bin
+ln -s $root/scheduler $BASE/bin/daemon
+ln -s $root/filter/commandtops $BASE/bin/filter
+ln -s $root/filter/gziptoany $BASE/bin/filter
+ln -s $root/filter/pstops $BASE/bin/filter
+ln -s $root/filter/rastertoepson $BASE/bin/filter
+ln -s $root/filter/rastertohp $BASE/bin/filter
+ln -s $root/filter/rastertolabel $BASE/bin/filter
+ln -s $root/filter/rastertopwg $BASE/bin/filter
+cat >$BASE/share/banners/standard <<EOF
+           ==== Cover Page ====
+
+
+      Job: {?printer-name}-{?job-id}
+    Owner: {?job-originating-user-name}
+     Name: {?job-name}
+    Pages: {?job-impressions}
+
+
+           ==== Cover Page ====
+EOF
+cat >$BASE/share/banners/classified <<EOF
+           ==== Classified - Do Not Disclose ====
+
+
+      Job: {?printer-name}-{?job-id}
+    Owner: {?job-originating-user-name}
+     Name: {?job-name}
+    Pages: {?job-impressions}
+
+
+           ==== Classified - Do Not Disclose ====
+EOF
+ln -s $root/data $BASE/share
+ln -s $root/ppdc/sample.drv $BASE/share/drv
+ln -s $root/conf/mime.types $BASE/share/mime
+ln -s $root/conf/mime.convs $BASE/share/mime
+ln -s $root/data/*.h $BASE/share/ppdc
+ln -s $root/data/*.defs $BASE/share/ppdc
+ln -s $root/templates $BASE/share
 
 #
 # Local filters and configuration files...
 #
 
+instfilter() {
+       # instfilter src dst format
+       #
+       # See if the filter exists in a standard location; if so, make a
+       # symlink, otherwise create a dummy script for the specified format.
+       #
+       src="$1"
+       dst="$2"
+       format="$3"
+
+       for dir in /usr/local/libexec/cups/filter /usr/libexec/cups/filter /usr/lib/cups/filter; do
+               if test -x "$dir/$src"; then
+                       ln -s "$dir/$src" "$BASE/bin/filter/$dst"
+                       return
+               fi
+       done
+
+       # Source filter not present, create a dummy filter
+       case $format in
+               passthru)
+                       ln -s gziptoany "$BASE/bin/filter/$dst"
+                       ;;
+               pdf)
+                       cat >"$BASE/bin/filter/$dst" <<EOF
+#!/bin/sh
+trap "" TERM
+trap "" PIPE
+gziptoany "$1" "$2" "$3" "$4" "$5" \$6 >/dev/null
+case "\$5" in
+       *media=a4* | *media=iso_a4* | *PageSize=A4*)
+               gziptoany "$1" "$2" "$3" "$4" "$5" "$root/test/onepage-a4.pdf"
+               ;;
+       *)
+               gziptoany "$1" "$2" "$3" "$4" "$5" "$root/test/onepage-letter.pdf"
+               ;;
+esac
+EOF
+                       chmod +x "$BASE/bin/filter/$dst"
+                       ;;
+               ps)
+                       cat >"$BASE/bin/filter/$dst" <<EOF
+#!/bin/sh
+trap "" TERM
+trap "" PIPE
+gziptoany "$1" "$2" "$3" "$4" "$5" \$6 >/dev/null
+case "\$5" in
+       *media=a4* | *media=iso_a4* | *PageSize=A4*)
+               gziptoany "$1" "$2" "$3" "$4" "$5" "$root/test/onepage-a4.ps"
+               ;;
+       *)
+               gziptoany "$1" "$2" "$3" "$4" "$5" "$root/test/onepage-letter.ps"
+               ;;
+esac
+EOF
+                       chmod +x "$BASE/bin/filter/$dst"
+                       ;;
+               raster)
+                       cat >"$BASE/bin/filter/$dst" <<EOF
+#!/bin/sh
+trap "" TERM
+trap "" PIPE
+gziptoany "$1" "$2" "$3" "$4" "$5" \$6 >/dev/null
+case "\$5" in
+       *media=a4* | *media=iso_a4* | *PageSize=A4*)
+               gziptoany "$1" "$2" "$3" "$4" "$5" "$root/test/onepage-a4-300-black-1.pwg.gz"
+               ;;
+       *)
+               gziptoany "$1" "$2" "$3" "$4" "$5" "$root/test/onepage-letter-300-black-1.pwg.gz"
+               ;;
+esac
+EOF
+                       chmod +x "$BASE/bin/filter/$dst"
+                       ;;
+       esac
+}
+
+ln -s $root/test/test.convs $BASE/share/mime
+
 if test `uname` = Darwin; then
-       ln -s /usr/libexec/cups/filter/cgpdfto* /tmp/cups-$user/bin/filter
-       ln -s /usr/libexec/cups/filter/cgbannertopdf /tmp/cups-$user/bin/filter
-       ln -s /usr/libexec/cups/filter/cgimagetopdf /tmp/cups-$user/bin/filter
-       ln -s /usr/libexec/cups/filter/cgtexttopdf /tmp/cups-$user/bin/filter
-       ln -s /usr/libexec/cups/filter/nsimagetopdf /tmp/cups-$user/bin/filter
-       ln -s /usr/libexec/cups/filter/nstexttopdf /tmp/cups-$user/bin/filter
-       ln -s /usr/libexec/cups/filter/pictwpstops /tmp/cups-$user/bin/filter
-       ln -s /usr/libexec/cups/filter/pstoappleps /tmp/cups-$user/bin/filter
-       ln -s /usr/libexec/cups/filter/pstocupsraster /tmp/cups-$user/bin/filter
-       ln -s /usr/libexec/cups/filter/pstopdffilter /tmp/cups-$user/bin/filter
-       ln -s /usr/libexec/cups/filter/rastertourf /tmp/cups-$user/bin/filter
-       ln -s /usr/libexec/cups/filter/xhtmltopdf /tmp/cups-$user/bin/filter
-
-       if test -f /private/etc/cups/apple.types; then
-               ln -s /private/etc/cups/apple.* /tmp/cups-$user/share/mime
-       elif test -f /usr/share/cups/mime/apple.types; then
-               ln -s /usr/share/cups/mime/apple.* /tmp/cups-$user/share/mime
-       fi
+       instfilter cgimagetopdf imagetopdf pdf
+       instfilter cgpdftopdf pdftopdf passthru
+       instfilter cgpdftops pdftops ps
+       instfilter cgpdftoraster pdftoraster raster
+       instfilter cgtexttopdf texttopdf pdf
+       instfilter pstocupsraster pstoraster raster
 else
-       ln -s /usr/lib/cups/filter/bannertops /tmp/cups-$user/bin/filter
-       ln -s /usr/lib/cups/filter/imagetops /tmp/cups-$user/bin/filter
-       ln -s /usr/lib/cups/filter/imagetoraster /tmp/cups-$user/bin/filter
-       ln -s /usr/lib/cups/filter/pdftops /tmp/cups-$user/bin/filter
-       ln -s /usr/lib/cups/filter/texttops /tmp/cups-$user/bin/filter
-
-       ln -s /usr/share/cups/mime/legacy.convs /tmp/cups-$user/share/mime
-       ln -s /usr/share/cups/charsets /tmp/cups-$user/share
-       if test -f $root/data/psglyphs; then
-               ln -s /usr/share/cups/data/psglyphs $root/data
+       instfilter imagetopdf imagetopdf pdf
+       instfilter pdftopdf pdftopdf passthru
+       instfilter pdftops pdftops ps
+       instfilter pdftoraster pdftoraster raster
+       instfilter pstoraster pstoraster raster
+       instfilter texttopdf texttopdf pdf
+
+       if test -d /usr/share/cups/charsets; then
+               ln -s /usr/share/cups/charsets $BASE/share
        fi
-       ln -s /usr/share/cups/fonts /tmp/cups-$user/share
 fi
 
 #
@@ -387,18 +485,20 @@ else
        encryption=""
 fi
 
-cat >/tmp/cups-$user/cupsd.conf <<EOF
+cat >$BASE/cupsd.conf <<EOF
 StrictConformance Yes
 Browsing Off
 Listen localhost:$port
+Listen $BASE/sock
 PassEnv LOCALEDIR
 PassEnv DYLD_INSERT_LIBRARIES
 MaxSubscriptions 3
 MaxLogSize 0
 AccessLogLevel actions
-LogLevel debug2
+LogLevel $loglevel
 LogTimeFormat usecs
 PreserveJobHistory Yes
+PreserveJobFiles 5m
 <Policy default>
 <Limit All>
 Order Allow,Deny
@@ -407,24 +507,32 @@ $encryption
 </Policy>
 EOF
 
-cat >/tmp/cups-$user/cups-files.conf <<EOF
+if test $testtype = 0; then
+       echo WebInterface yes >>$BASE/cupsd.conf
+fi
+
+cat >$BASE/cups-files.conf <<EOF
 FileDevice yes
 Printcap
 User $user
-ServerRoot /tmp/cups-$user
-StateDir /tmp/cups-$user
-ServerBin /tmp/cups-$user/bin
-CacheDir /tmp/cups-$user/share
-DataDir /tmp/cups-$user/share
-FontPath /tmp/cups-$user/share/fonts
+ServerRoot $BASE
+StateDir $BASE
+ServerBin $BASE/bin
+CacheDir $BASE/share
+DataDir $BASE/share
+FontPath $BASE/share/fonts
 DocumentRoot $root/doc
-RequestRoot /tmp/cups-$user/spool
-TempDir /tmp/cups-$user/spool/temp
-AccessLog /tmp/cups-$user/log/access_log
-ErrorLog /tmp/cups-$user/log/error_log
-PageLog /tmp/cups-$user/log/page_log
+RequestRoot $BASE/spool
+TempDir $BASE/spool/temp
+AccessLog $BASE/log/access_log
+ErrorLog $BASE/log/error_log
+PageLog $BASE/log/page_log
 EOF
 
+if test $ssltype != 0 -a `uname` = Darwin; then
+       echo "ServerKeychain $HOME/Library/Keychains/login.keychain" >> $BASE/cups-files.conf
+fi
+
 #
 # Setup lots of test queues - half with PPD files, half without...
 #
@@ -433,7 +541,7 @@ echo "Creating printers.conf for test..."
 
 i=1
 while test $i -le $nprinters1; do
-       cat >>/tmp/cups-$user/printers.conf <<EOF
+       cat >>$BASE/printers.conf <<EOF
 <Printer test-$i>
 Accepting Yes
 DeviceURI file:/dev/null
@@ -445,13 +553,13 @@ StateMessage Printer $1 is idle.
 </Printer>
 EOF
 
-       cp testps.ppd /tmp/cups-$user/ppd/test-$i.ppd
+       cp testps.ppd $BASE/ppd/test-$i.ppd
 
        i=`expr $i + 1`
 done
 
 while test $i -le $nprinters2; do
-       cat >>/tmp/cups-$user/printers.conf <<EOF
+       cat >>$BASE/printers.conf <<EOF
 <Printer test-$i>
 Accepting Yes
 DeviceURI file:/dev/null
@@ -466,10 +574,10 @@ EOF
        i=`expr $i + 1`
 done
 
-if test -f /tmp/cups-$user/printers.conf; then
-       cp /tmp/cups-$user/printers.conf /tmp/cups-$user/printers.conf.orig
+if test -f $BASE/printers.conf; then
+       cp $BASE/printers.conf $BASE/printers.conf.orig
 else
-       touch /tmp/cups-$user/printers.conf.orig
+       touch $BASE/printers.conf.orig
 fi
 
 #
@@ -509,17 +617,17 @@ fi
 export SHLIB_PATH
 
 CUPS_DISABLE_APPLE_DEFAULT=yes; export CUPS_DISABLE_APPLE_DEFAULT
-CUPS_SERVER=localhost:8631; export CUPS_SERVER
-CUPS_SERVERROOT=/tmp/cups-$user; export CUPS_SERVERROOT
-CUPS_STATEDIR=/tmp/cups-$user; export CUPS_STATEDIR
-CUPS_DATADIR=/tmp/cups-$user/share; export CUPS_DATADIR
-LOCALEDIR=/tmp/cups-$user/share/locale; export LOCALEDIR
+CUPS_SERVER=localhost:$port; export CUPS_SERVER
+CUPS_SERVERROOT=$BASE; export CUPS_SERVERROOT
+CUPS_STATEDIR=$BASE; export CUPS_STATEDIR
+CUPS_DATADIR=$BASE/share; export CUPS_DATADIR
+LOCALEDIR=$BASE/share/locale; export LOCALEDIR
 
 #
 # Set a new home directory to avoid getting user options mixed in...
 #
 
-HOME=/tmp/cups-$user
+HOME=$BASE
 export HOME
 
 #
@@ -537,25 +645,24 @@ export LC_MESSAGES
 #
 
 echo "Starting scheduler:"
-echo "    $VALGRIND ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 &"
+echo "    $VALGRIND ../scheduler/cupsd -c $BASE/cupsd.conf -f >$BASE/log/debug_log 2>&1 &"
 echo ""
 
 if test `uname` = Darwin -a "x$VALGRIND" = x; then
-       DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib
-       ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 &
+       DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib MallocStackLogging=1 ../scheduler/cupsd -c $BASE/cupsd.conf -f >$BASE/log/debug_log 2>&1 &
 else
-       $VALGRIND ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 &
+       $VALGRIND ../scheduler/cupsd -c $BASE/cupsd.conf -f >$BASE/log/debug_log 2>&1 &
 fi
 
 cupsd=$!
 
 if test "x$testtype" = x0; then
        # Not running tests...
-       echo "Scheduler is PID $cupsd and is listening on port 8631."
+       echo "Scheduler is PID $cupsd and is listening on port $port."
        echo ""
 
        # Create a helper script to run programs with...
-       runcups="/tmp/cups-$user/runcups"
+       runcups="$BASE/runcups"
 
        echo "#!/bin/sh" >$runcups
        echo "# Helper script for running CUPS test instance." >>$runcups
@@ -570,6 +677,11 @@ if test "x$testtype" = x0; then
        echo "LD_PRELOAD=\"$LD_PRELOAD\"; export LD_PRELOAD" >>$runcups
        echo "LOCALEDIR=\"$LOCALEDIR\"; export LOCALEDIR" >>$runcups
        echo "SHLIB_PATH=\"$SHLIB_PATH\"; export SHLIB_PATH" >>$runcups
+       if test "x$CUPS_DEBUG_LEVEL" != x; then
+               echo "CUPS_DEBUG_FILTER='$CUPS_DEBUG_FILTER'; export CUPS_DEBUG_FILTER" >>$runcups
+               echo "CUPS_DEBUG_LEVEL=$CUPS_DEBUG_LEVEL; export CUPS_DEBUG_LEVEL" >>$runcups
+               echo "CUPS_DEBUG_LOG='$CUPS_DEBUG_LOG'; export CUPS_DEBUG_LOG" >>$runcups
+       fi
        echo "" >>$runcups
        echo "# Run command..." >>$runcups
        echo "exec \"\$@\"" >>$runcups
@@ -608,7 +720,13 @@ done
 #
 
 date=`date "+%Y-%m-%d"`
-strfile=/tmp/cups-$user/cups-str-1.6-$date-$user.html
+
+if test -d $root/.svn; then
+       rev=`svn info . | grep Revision: | awk '{print $2}'`
+       strfile=$BASE/cups-str-2.1-r$rev-$user.html
+else
+       strfile=$BASE/cups-str-2.1-$date-$user.html
+fi
 
 rm -f $strfile
 cat str-header.html >$strfile
@@ -620,7 +738,7 @@ cat str-header.html >$strfile
 echo ""
 echo "Running IPP compliance tests..."
 
-echo "<H1>1 - IPP Compliance Tests</H1>" >>$strfile
+echo "<H1><A NAME='IPP'>1 - IPP Compliance Tests</A></H1>" >>$strfile
 echo "<P>This section provides the results to the IPP compliance tests" >>$strfile
 echo "outlined in the CUPS Software Test Plan. These tests were run on" >>$strfile
 echo `date "+%Y-%m-%d"` by $user on `hostname`. >>$strfile
@@ -658,7 +776,7 @@ echo "</PRE>" >>$strfile
 echo ""
 echo "Running command tests..."
 
-echo "<H1>2 - Command Tests</H1>" >>$strfile
+echo "<H1><A NAME='COMMAND'>2 - Command Tests</A></H1>" >>$strfile
 echo "<P>This section provides the results to the command tests" >>$strfile
 echo "outlined in the CUPS Software Test Plan. These tests were run on" >>$strfile
 echo $date by $user on `hostname`. >>$strfile
@@ -680,19 +798,51 @@ for file in 5*.sh; do
        fi
 done
 
-echo "</PRE>" >>$strfile
+#
+# Log all allocations made by the scheduler...
+#
+if test `uname` = Darwin -a "x$VALGRIND" = x; then
+       malloc_history $cupsd -callTree -showContent >$BASE/log/malloc_log 2>&1
+fi
 
 #
-# Stop the server...
+# Restart the server...
 #
 
-kill $cupsd
+echo $ac_n "Performing restart test: $ac_c"
+echo "" >>$strfile
+echo "\"5.10-restart\":" >>$strfile
+
+kill -HUP $cupsd
+
+while true; do
+       sleep 10
+
+       running=`../systemv/lpstat -r 2>/dev/null`
+       if test "x$running" = "xscheduler is running"; then
+               break
+       fi
+done
+
+description="`../systemv/lpstat -l -p Test1 | grep Description | sed -e '1,$s/^[^:]*: //g'`"
+if test "x$description" != "xTest Printer 1"; then
+       echo "Failed, printer-info for Test1 is '$description', expected 'Test Printer 1'." >>$strfile
+       echo "FAIL (got '$description', expected 'Test Printer 1')"
+       fail=`expr $fail + 1`
+else
+       echo "Passed." >>$strfile
+       echo PASS
+fi
+
+echo "</PRE>" >>$strfile
 
 #
-# Append the log files for post-mortim...
+# Stop the server...
 #
 
-echo "<H1>3 - Log Files</H1>" >>$strfile
+kill $cupsd
+wait $cupsd
+cupsdstatus=$?
 
 #
 # Verify counts...
@@ -700,10 +850,19 @@ echo "<H1>3 - Log Files</H1>" >>$strfile
 
 echo "Test Summary"
 echo ""
-echo "<H2>Summary</H2>" >>$strfile
+echo "<H1><A NAME='SUMMARY'>3 - Test Summary</A></H1>" >>$strfile
+
+if test $cupsdstatus != 0; then
+       echo "FAIL: cupsd failed with exit status $cupsdstatus."
+       echo "<p>FAIL: cupsd failed with exit status $cupsdstatus.</p>" >>$strfile
+       fail=`expr $fail + 1`
+else
+       echo "PASS: cupsd exited with no errors."
+       echo "<p>PASS: cupsd exited with no errors.</p>" >>$strfile
+fi
 
 # Job control files
-count=`ls -1 /tmp/cups-$user/spool | wc -l`
+count=`ls -1 $BASE/spool | wc -l`
 count=`expr $count - 1`
 if test $count != 0; then
        echo "FAIL: $count job control files were not purged."
@@ -715,7 +874,7 @@ else
 fi
 
 # Pages printed on Test1 (within 1 page for timing-dependent cancel issues)
-count=`$GREP '^Test1 ' /tmp/cups-$user/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
+count=`$GREP '^Test1 ' $BASE/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
 expected=`expr $pjobs \* 2 + 34`
 expected2=`expr $expected + 2`
 if test $count -lt $expected -a $count -gt $expected2; then
@@ -728,7 +887,7 @@ else
 fi
 
 # Paged printed on Test2
-count=`$GREP '^Test2 ' /tmp/cups-$user/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
+count=`$GREP '^Test2 ' $BASE/log/page_log | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
 expected=`expr $pjobs \* 2 + 3`
 if test $count != $expected; then
        echo "FAIL: Printer 'Test2' produced $count page(s), expected $expected."
@@ -740,7 +899,7 @@ else
 fi
 
 # Paged printed on Test3
-count=`$GREP '^Test3 ' /tmp/cups-$user/log/page_log | grep -v total | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
+count=`$GREP '^Test3 ' $BASE/log/page_log | grep -v total | awk 'BEGIN{count=0}{count=count+$7}END{print count}'`
 expected=2
 if test $count != $expected; then
        echo "FAIL: Printer 'Test3' produced $count page(s), expected $expected."
@@ -752,8 +911,8 @@ else
 fi
 
 # Requests logged
-count=`wc -l /tmp/cups-$user/log/access_log | awk '{print $1}'`
-expected=`expr 37 + 18 + 28 + $pjobs \* 8 + $pprinters \* $pjobs \* 4`
+count=`wc -l $BASE/log/access_log | awk '{print $1}'`
+expected=`expr 37 + 18 + 30 + $pjobs \* 8 + $pprinters \* $pjobs \* 4`
 if test $count != $expected; then
        echo "FAIL: $count requests logged, expected $expected."
        echo "<P>FAIL: $count requests logged, expected $expected.</P>" >>$strfile
@@ -764,11 +923,11 @@ else
 fi
 
 # Did CUPS-Get-Default get logged?
-if $GREP -q CUPS-Get-Default /tmp/cups-$user/log/access_log; then
+if $GREP -q CUPS-Get-Default $BASE/log/access_log; then
        echo "FAIL: CUPS-Get-Default logged with 'AccessLogLevel actions'"
        echo "<P>FAIL: CUPS-Get-Default logged with 'AccessLogLevel actions'</P>" >>$strfile
        echo "<PRE>" >>$strfile
-       $GREP CUPS-Get-Default /tmp/cups-$user/log/access_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+       $GREP CUPS-Get-Default $BASE/log/access_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
        echo "</PRE>" >>$strfile
        fail=`expr $fail + 1`
 else
@@ -777,13 +936,13 @@ else
 fi
 
 # Emergency log messages
-count=`$GREP '^X ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^X ' $BASE/log/error_log | wc -l | awk '{print $1}'`
 if test $count != 0; then
        echo "FAIL: $count emergency messages, expected 0."
-       $GREP '^X ' /tmp/cups-$user/log/error_log
+       $GREP '^X ' $BASE/log/error_log
        echo "<P>FAIL: $count emergency messages, expected 0.</P>" >>$strfile
        echo "<PRE>" >>$strfile
-       $GREP '^X ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+       $GREP '^X ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
        echo "</PRE>" >>$strfile
        fail=`expr $fail + 1`
 else
@@ -792,13 +951,13 @@ else
 fi
 
 # Alert log messages
-count=`$GREP '^A ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^A ' $BASE/log/error_log | wc -l | awk '{print $1}'`
 if test $count != 0; then
        echo "FAIL: $count alert messages, expected 0."
-       $GREP '^A ' /tmp/cups-$user/log/error_log
+       $GREP '^A ' $BASE/log/error_log
        echo "<P>FAIL: $count alert messages, expected 0.</P>" >>$strfile
        echo "<PRE>" >>$strfile
-       $GREP '^A ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+       $GREP '^A ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
        echo "</PRE>" >>$strfile
        fail=`expr $fail + 1`
 else
@@ -807,13 +966,13 @@ else
 fi
 
 # Critical log messages
-count=`$GREP '^C ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^C ' $BASE/log/error_log | wc -l | awk '{print $1}'`
 if test $count != 0; then
        echo "FAIL: $count critical messages, expected 0."
-       $GREP '^C ' /tmp/cups-$user/log/error_log
+       $GREP '^C ' $BASE/log/error_log
        echo "<P>FAIL: $count critical messages, expected 0.</P>" >>$strfile
        echo "<PRE>" >>$strfile
-       $GREP '^C ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+       $GREP '^C ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
        echo "</PRE>" >>$strfile
        fail=`expr $fail + 1`
 else
@@ -822,13 +981,13 @@ else
 fi
 
 # Error log messages
-count=`$GREP '^E ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^E ' $BASE/log/error_log | wc -l | awk '{print $1}'`
 if test $count != 33; then
        echo "FAIL: $count error messages, expected 33."
-       $GREP '^E ' /tmp/cups-$user/log/error_log
+       $GREP '^E ' $BASE/log/error_log
        echo "<P>FAIL: $count error messages, expected 33.</P>" >>$strfile
        echo "<PRE>" >>$strfile
-       $GREP '^E ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+       $GREP '^E ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
        echo "</PRE>" >>$strfile
        fail=`expr $fail + 1`
 else
@@ -837,13 +996,13 @@ else
 fi
 
 # Warning log messages
-count=`$GREP '^W ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
-if test $count != 9; then
-       echo "FAIL: $count warning messages, expected 9."
-       $GREP '^W ' /tmp/cups-$user/log/error_log
-       echo "<P>FAIL: $count warning messages, expected 9.</P>" >>$strfile
+count=`$GREP '^W ' $BASE/log/error_log | $GREP -v CreateProfile | wc -l | awk '{print $1}'`
+if test $count != 8; then
+       echo "FAIL: $count warning messages, expected 8."
+       $GREP '^W ' $BASE/log/error_log
+       echo "<P>FAIL: $count warning messages, expected 8.</P>" >>$strfile
        echo "<PRE>" >>$strfile
-       $GREP '^W ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+       $GREP '^W ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
        echo "</PRE>" >>$strfile
        fail=`expr $fail + 1`
 else
@@ -852,13 +1011,13 @@ else
 fi
 
 # Notice log messages
-count=`$GREP '^N ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^N ' $BASE/log/error_log | wc -l | awk '{print $1}'`
 if test $count != 0; then
        echo "FAIL: $count notice messages, expected 0."
-       $GREP '^N ' /tmp/cups-$user/log/error_log
+       $GREP '^N ' $BASE/log/error_log
        echo "<P>FAIL: $count notice messages, expected 0.</P>" >>$strfile
        echo "<PRE>" >>$strfile
-       $GREP '^N ' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+       $GREP '^N ' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
        echo "</PRE>" >>$strfile
        fail=`expr $fail + 1`
 else
@@ -867,7 +1026,7 @@ else
 fi
 
 # Info log messages
-count=`$GREP '^I ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^I ' $BASE/log/error_log | wc -l | awk '{print $1}'`
 if test $count = 0; then
        echo "FAIL: $count info messages, expected more than 0."
        echo "<P>FAIL: $count info messages, expected more than 0.</P>" >>$strfile
@@ -878,7 +1037,7 @@ else
 fi
 
 # Debug log messages
-count=`$GREP '^D ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^D ' $BASE/log/error_log | wc -l | awk '{print $1}'`
 if test $count = 0; then
        echo "FAIL: $count debug messages, expected more than 0."
        echo "<P>FAIL: $count debug messages, expected more than 0.</P>" >>$strfile
@@ -889,7 +1048,7 @@ else
 fi
 
 # Debug2 log messages
-count=`$GREP '^d ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'`
+count=`$GREP '^d ' $BASE/log/error_log | wc -l | awk '{print $1}'`
 if test $count = 0; then
        echo "FAIL: $count debug2 messages, expected more than 0."
        echo "<P>FAIL: $count debug2 messages, expected more than 0.</P>" >>$strfile
@@ -899,20 +1058,25 @@ else
        echo "<P>PASS: $count debug2 messages.</P>" >>$strfile
 fi
 
+#
 # Log files...
-echo "<H2>access_log</H2>" >>$strfile
+#
+
+echo "<H1><A NAME='LOGS'>4 - Log Files</A></H1>" >>$strfile
+
+echo "<H2><A NAME='access_log'>access_log</A></H2>" >>$strfile
 echo "<PRE>" >>$strfile
-sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' /tmp/cups-$user/log/access_log >>$strfile
+sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' $BASE/log/access_log >>$strfile
 echo "</PRE>" >>$strfile
 
-echo "<H2>error_log</H2>" >>$strfile
+echo "<H2><A NAME='error_log'>error_log</A></H2>" >>$strfile
 echo "<PRE>" >>$strfile
-$GREP -v '^d' /tmp/cups-$user/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
+$GREP -v '^d' $BASE/log/error_log | sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' >>$strfile
 echo "</PRE>" >>$strfile
 
-echo "<H2>page_log</H2>" >>$strfile
+echo "<H2><A NAME='page_log'>page_log</A></H2>" >>$strfile
 echo "<PRE>" >>$strfile
-sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' /tmp/cups-$user/log/page_log >>$strfile
+sed -e '1,$s/&/&amp;/g' -e '1,$s/</&lt;/g' $BASE/log/page_log >>$strfile
 echo "</PRE>" >>$strfile
 
 #
@@ -925,13 +1089,19 @@ echo ""
 
 if test $fail != 0; then
        echo "$fail tests failed."
-       cp /tmp/cups-$user/log/error_log error_log-$date-$user
+
+       if test -d $root/.svn; then
+               cp $BASE/log/error_log error_log-r$rev-$user
+       else
+               cp $BASE/log/error_log error_log-$date-$user
+       fi
+
        cp $strfile .
 else
        echo "All tests were successful."
 fi
 
-echo "Log files can be found in /tmp/cups-$user/log."
+echo "Log files can be found in $BASE/log."
 echo "A HTML report was created in $strfile."
 echo ""
 
@@ -944,5 +1114,5 @@ if test $fail != 0; then
 fi
 
 #
-# End of "$Id: run-stp-tests.sh 9034 2010-03-09 07:03:06Z mike $"
+# End of "$Id: run-stp-tests.sh 12853 2015-08-28 13:38:46Z msweet $"
 #
index 64a3425..d13205a 100644 (file)
@@ -1,10 +1,10 @@
 <HTML>
 <HEAD>
        <META NAME="Description" CONTENT="CUPS Test Report">
-       <META NAME="COPYRIGHT" CONTENT="Copyright 2007-2012, All Rights Reserved">
-       <META NAME="DOCNUMBER" CONTENT="CUPS-STR-1.6">
+       <META NAME="COPYRIGHT" CONTENT="Copyright 2007-2015, All Rights Reserved">
+       <META NAME="DOCNUMBER" CONTENT="CUPS-STR-2.1">
        <META NAME="Author" CONTENT="Apple Inc.">
-       <TITLE>CUPS 1.6 Software Test Report</TITLE>
+       <TITLE>CUPS 2.1 Software Test Report</TITLE>
        <STYLE TYPE="text/css"><!--
        PRE {
          font-size: 80%;
 </HEAD>
 <BODY>
 
-<H1>CUPS 1.6 Software Test Report</H1>
+<H1>CUPS 2.1 Software Test Report</H1>
 
 <P>This software test report provides detailed test results that
-are used to evaluate the stability and compliance of CUPS Version 1.6.
+are used to evaluate the stability and compliance of CUPS Version 2.1.
 
 <H2>Document Overview</H2>
 
 <P>This software test plan is organized into the following sections:
 
 <UL>
-       <LI>1 - IPP Compliance Tests</LI>
-       <LI>2 - Command Tests</LI>
-       <LI>3 - Log Files</LI>
+       <LI><A HREF="#IPP">1 - IPP Compliance Tests</A></LI>
+       <LI><A HREF="#COMMAND">2 - Command Tests</A></LI>
+       <LI><A HREF="#SUMMARY">3 - Test Summary</A></LI>
+       <LI><A HREF="#LOGS">4 - Log Files</A><UL>
+               <LI><A HREF="#access_log">access_log</A></LI>
+               <LI><A HREF="#error_log">error_log</A></LI>
+               <LI><A HREF="#page_log">page_log</A></LI>
+       </UL></LI>
 </UL>
diff --git a/test/test.convs b/test/test.convs
new file mode 100644 (file)
index 0000000..57540aa
--- /dev/null
@@ -0,0 +1,8 @@
+# Test file listing potential filters for conversions
+application/pdf application/vnd.cups-pdf 100 pdftopdf
+application/pdf application/postscript 100 pdftops
+application/pdf application/vnd.cups-raster 100 pdftoraster
+application/postscript application/vnd.cups-raster 100 pstoraster
+image/jpeg application/pdf 100 imagetopdf
+text/plain application/pdf 100 texttopdf
+
index 6200c7a..a71994e 100644 (file)
@@ -1,32 +1,32 @@
 *PPD-Adobe: "4.3"
 *%
-*% "$Id: testhp.ppd 6649 2007-07-11 21:46:42Z mike $"
+*% "$Id: testhp.ppd 11398 2013-11-06 20:11:11Z msweet $"
 *%
-*%   Test HP PPD file for CUPS.
+*% Test HP PPD file for CUPS.
 *%
-*%   Copyright 2007-2011 by Apple Inc.
-*%   Copyright 1997-2005 by Easy Software Products.
+*% Copyright 2007-2013 by Apple Inc.
+*% Copyright 1997-2005 by Easy Software Products.
 *%
-*%   These coded instructions, statements, and computer programs are the
-*%   property of Apple Inc. and are protected by Federal copyright
-*%   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
-*%   which should have been included with this file.  If this file is
-*%   file is missing or damaged, see the license at "http://www.cups.org/".
+*% These coded instructions, statements, and computer programs are the
+*% property of Apple Inc. and are protected by Federal copyright
+*% law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+*% which should have been included with this file.  If this file is
+*% file is missing or damaged, see the license at "http://www.cups.org/".
 *%
 *FormatVersion:        "4.3"
-*FileVersion:  "1.1"
+*FileVersion:  "1.7"
 *LanguageVersion: English
 *LanguageEncoding: ISOLatin1
 *PCFileName:   "TESTHP.PPD"
 *Manufacturer: "ESP"
 *Product:      "(CUPS v1.5)"
-*cupsVersion:  1.1
+*cupsVersion:  1.7
 *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 v1.1"
+*NickName:      "Test HP Printer CUPS v1.7"
 *PSVersion:    "(3010.000) 550"
 *LanguageLevel:        "3"
 *ColorDevice:  True
 
 *OpenUI *Resolution/Output Resolution: PickOne
 *OrderDependency: 20 AnySetup *Resolution
-*DefaultResolution: 100dpi
-*Resolution 75dpi/75 DPI: "<</HWResolution[75 75]>>setpagedevice"
-*Resolution 100dpi/100 DPI: "<</HWResolution[100 100]>>setpagedevice"
+*DefaultResolution: 300dpi
+*Resolution 150dpi/150 DPI: "<</HWResolution[150 150]>>setpagedevice"
+*Resolution 300dpi/300 DPI: "<</HWResolution[300 300]>>setpagedevice"
+*Resolution 600dpi/600 DPI: "<</HWResolution[600 600]>>setpagedevice"
 *CloseUI: *Resolution
 
 *OpenUI *ColorModel/Output Mode: PickOne
 *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
 *Font ZapfDingbats: Special "(001.004S)" Standard ROM
 *%
-*% End of "$Id: testhp.ppd 6649 2007-07-11 21:46:42Z mike $".
+*% End of "$Id: testhp.ppd 11398 2013-11-06 20:11:11Z msweet $".
 *%
index 10b4a37..6251d06 100644 (file)
@@ -1,6 +1,6 @@
 *PPD-Adobe: "4.3"
 *%
-*% "$Id: testps.ppd 6649 2007-07-11 21:46:42Z mike $"
+*% "$Id: testps.ppd 11398 2013-11-06 20:11:11Z msweet $"
 *%
 *%   Test PS PPD file for CUPS.
 *%
 *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
 *Font ZapfDingbats: Special "(001.004S)" Standard ROM
 *%
-*% End of "$Id: testps.ppd 6649 2007-07-11 21:46:42Z mike $".
+*% End of "$Id: testps.ppd 11398 2013-11-06 20:11:11Z msweet $".
 *%
diff --git a/test/validate-job.test b/test/validate-job.test
new file mode 100644 (file)
index 0000000..c4140ea
--- /dev/null
@@ -0,0 +1,23 @@
+# Validate a test page using Validate-Job
+{
+       # The name of the test...
+       NAME "Validate file/ticket using Validate-Job"
+
+       # The operation to use
+       OPERATION Validate-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
+
+       # What statuses are OK?
+       STATUS successful-ok
+       STATUS successful-ok-ignored-or-substituted-attributes
+}
index fdb9f93..143f241 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: xmltotest.c 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: xmltotest.c 3643 2012-02-13 16:35:48Z msweet $"
  *
  *   IANA XML registration to test file generator for CUPS.
  *
@@ -525,5 +525,5 @@ main(void)
 
 
 /*
- * End of "$Id: xmltotest.c 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: xmltotest.c 3643 2012-02-13 16:35:48Z msweet $".
  */
diff --git a/vc2005/cups.sln b/vc2005/cups.sln
deleted file mode 100644 (file)
index e510e16..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 9.00\r
-# Visual Studio 2005\r
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcups2", "libcups2.vcproj", "{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"\r
-EndProject\r
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcupsimage2", "libcupsimage2.vcproj", "{CB4AA6F2-3E84-45BE-B505-95CD375E1234}"\r
-       ProjectSection(ProjectDependencies) = postProject\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}\r
-       EndProjectSection\r
-EndProject\r
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testfile", "testfile.vcproj", "{CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}"\r
-       ProjectSection(ProjectDependencies) = postProject\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}\r
-       EndProjectSection\r
-EndProject\r
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testhttp", "testhttp.vcproj", "{90B0058C-8393-411F-BD3B-E2C831D4E883}"\r
-       ProjectSection(ProjectDependencies) = postProject\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}\r
-       EndProjectSection\r
-EndProject\r
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cupstestppd", "cupstestppd.vcproj", "{6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}"\r
-       ProjectSection(ProjectDependencies) = postProject\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E1234} = {CB4AA6F2-3E84-45BE-B505-95CD375E1234}\r
-       EndProjectSection\r
-EndProject\r
-Global\r
-       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
-               Debug|Win32 = Debug|Win32\r
-               Debug|x64 = Debug|x64\r
-               Release|Win32 = Release|Win32\r
-               Release|x64 = Release|x64\r
-       EndGlobalSection\r
-       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|Win32.ActiveCfg = Debug|Win32\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|Win32.Build.0 = Debug|Win32\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|x64.ActiveCfg = Debug|x64\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|x64.Build.0 = Debug|x64\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|Win32.ActiveCfg = Debug|Win32\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|Win32.Build.0 = Debug|Win32\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.ActiveCfg = Debug|x64\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.Build.0 = Debug|x64\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|Win32.ActiveCfg = Debug|Win32\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|Win32.Build.0 = Debug|Win32\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|x64.ActiveCfg = Debug|x64\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|x64.Build.0 = Debug|x64\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|Win32.ActiveCfg = Release|Win32\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|Win32.Build.0 = Release|Win32\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|x64.ActiveCfg = Release|x64\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|x64.Build.0 = Release|x64\r
-               {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|Win32.ActiveCfg = Debug|Win32\r
-               {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|Win32.Build.0 = Debug|Win32\r
-               {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|x64.ActiveCfg = Debug|x64\r
-               {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|x64.Build.0 = Debug|x64\r
-               {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|Win32.ActiveCfg = Debug|Win32\r
-               {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|Win32.Build.0 = Debug|Win32\r
-               {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|x64.ActiveCfg = Debug|x64\r
-               {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|x64.Build.0 = Debug|x64\r
-               {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|Win32.ActiveCfg = Debug|Win32\r
-               {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|Win32.Build.0 = Debug|Win32\r
-               {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|x64.ActiveCfg = Debug|x64\r
-               {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|x64.Build.0 = Debug|x64\r
-               {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|Win32.ActiveCfg = Debug|Win32\r
-               {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|Win32.Build.0 = Debug|Win32\r
-               {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|x64.ActiveCfg = Debug|x64\r
-               {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|x64.Build.0 = Debug|x64\r
-               {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|Win32.ActiveCfg = Debug|Win32\r
-               {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|Win32.Build.0 = Debug|Win32\r
-               {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|x64.ActiveCfg = Debug|x64\r
-               {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|x64.Build.0 = Debug|x64\r
-               {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|Win32.ActiveCfg = Release|Win32\r
-               {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|Win32.Build.0 = Release|Win32\r
-               {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|x64.ActiveCfg = Release|x64\r
-               {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|x64.Build.0 = Release|x64\r
-       EndGlobalSection\r
-       GlobalSection(SolutionProperties) = preSolution\r
-               HideSolutionNode = FALSE\r
-       EndGlobalSection\r
-EndGlobal\r
diff --git a/vc2005/ipptool.vcproj b/vc2005/ipptool.vcproj
deleted file mode 100644 (file)
index 271187b..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>\r
-<VisualStudioProject\r
-       ProjectType="Visual C++"\r
-       Version="8.00"\r
-       Name="cupstestppd"\r
-       ProjectGUID="{B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}"\r
-       RootNamespace="ipptool"\r
-       Keyword="Win32Proj"\r
-       >\r
-       <Platforms>\r
-               <Platform\r
-                       Name="Win32"\r
-               />\r
-       </Platforms>\r
-       <ToolFiles>\r
-       </ToolFiles>\r
-       <Configurations>\r
-               <Configuration\r
-                       Name="Debug|Win32"\r
-                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"\r
-                       IntermediateDirectory="$(ConfigurationName)"\r
-                       ConfigurationType="1"\r
-                       CharacterSet="1"\r
-                       >\r
-                       <Tool\r
-                               Name="VCPreBuildEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCustomBuildTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXMLDataGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebServiceProxyGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCMIDLTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCLCompilerTool"\r
-                               Optimization="0"\r
-                               AdditionalIncludeDirectories="..\vcnet;.."\r
-                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
-                               MinimalRebuild="true"\r
-                               BasicRuntimeChecks="3"\r
-                               RuntimeLibrary="3"\r
-                               UsePrecompiledHeader="0"\r
-                               WarningLevel="1"\r
-                               Detect64BitPortabilityProblems="true"\r
-                               DebugInformationFormat="4"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManagedResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPreLinkEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCLinkerTool"\r
-                               LinkIncremental="2"\r
-                               GenerateDebugInformation="true"\r
-                               SubSystem="1"\r
-                               TargetMachine="1"\r
-                       />\r
-                       <Tool\r
-                               Name="VCALinkTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManifestTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXDCMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCBscMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCFxCopTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCAppVerifierTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPostBuildEventTool"\r
-                       />\r
-               </Configuration>\r
-               <Configuration\r
-                       Name="Release|Win32"\r
-                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"\r
-                       IntermediateDirectory="$(ConfigurationName)"\r
-                       ConfigurationType="1"\r
-                       CharacterSet="1"\r
-                       WholeProgramOptimization="1"\r
-                       >\r
-                       <Tool\r
-                               Name="VCPreBuildEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCustomBuildTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXMLDataGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebServiceProxyGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCMIDLTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCLCompilerTool"\r
-                               AdditionalIncludeDirectories="..\vcnet;.."\r
-                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
-                               RuntimeLibrary="2"\r
-                               UsePrecompiledHeader="0"\r
-                               WarningLevel="1"\r
-                               Detect64BitPortabilityProblems="true"\r
-                               DebugInformationFormat="3"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManagedResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPreLinkEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCLinkerTool"\r
-                               LinkIncremental="1"\r
-                               GenerateDebugInformation="true"\r
-                               SubSystem="1"\r
-                               OptimizeReferences="2"\r
-                               EnableCOMDATFolding="2"\r
-                               TargetMachine="1"\r
-                       />\r
-                       <Tool\r
-                               Name="VCALinkTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManifestTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXDCMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCBscMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCFxCopTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCAppVerifierTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPostBuildEventTool"\r
-                       />\r
-               </Configuration>\r
-       </Configurations>\r
-       <References>\r
-       </References>\r
-       <Files>\r
-               <Filter\r
-                       Name="Source Files"\r
-                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
-                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
-                       >\r
-                       <File\r
-                               RelativePath="..\test\ipptool.c"\r
-                               >\r
-                       </File>\r
-               </Filter>\r
-               <Filter\r
-                       Name="Header Files"\r
-                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
-                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
-                       >\r
-               </Filter>\r
-               <Filter\r
-                       Name="Resource Files"\r
-                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
-                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
-                       >\r
-               </Filter>\r
-       </Files>\r
-       <Globals>\r
-       </Globals>\r
-</VisualStudioProject>\r
diff --git a/vc2005/libcups2.vcproj b/vc2005/libcups2.vcproj
deleted file mode 100644 (file)
index 0498185..0000000
+++ /dev/null
@@ -1,1611 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>\r
-<VisualStudioProject\r
-       ProjectType="Visual C++"\r
-       Version="8.00"\r
-       Name="libcups2"\r
-       ProjectGUID="{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"\r
-       Keyword="Win32Proj"\r
-       >\r
-       <Platforms>\r
-               <Platform\r
-                       Name="Win32"\r
-               />\r
-               <Platform\r
-                       Name="x64"\r
-               />\r
-       </Platforms>\r
-       <ToolFiles>\r
-       </ToolFiles>\r
-       <Configurations>\r
-               <Configuration\r
-                       Name="Debug|Win32"\r
-                       OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
-                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
-                       ConfigurationType="2"\r
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
-                       CharacterSet="2"\r
-                       >\r
-                       <Tool\r
-                               Name="VCPreBuildEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCustomBuildTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXMLDataGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebServiceProxyGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCMIDLTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCLCompilerTool"\r
-                               Optimization="0"\r
-                               AdditionalIncludeDirectories="..\vcnet,.."\r
-                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
-                               MinimalRebuild="true"\r
-                               BasicRuntimeChecks="3"\r
-                               RuntimeLibrary="3"\r
-                               BufferSecurityCheck="true"\r
-                               UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
-                               Detect64BitPortabilityProblems="false"\r
-                               DebugInformationFormat="4"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManagedResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPreLinkEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCLinkerTool"\r
-                               AdditionalDependencies="ws2_32.lib advapi32.lib"\r
-                               OutputFile="$(OutDir)\libcups2.dll"\r
-                               LinkIncremental="2"\r
-                               ModuleDefinitionFile="..\cups\libcups2.def"\r
-                               GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\libcups2.pdb"\r
-                               SubSystem="2"\r
-                               ImportLibrary="$(OutDir)\libcups2.lib"\r
-                               TargetMachine="1"\r
-                       />\r
-                       <Tool\r
-                               Name="VCALinkTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManifestTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXDCMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCBscMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCFxCopTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCAppVerifierTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPostBuildEventTool"\r
-                       />\r
-               </Configuration>\r
-               <Configuration\r
-                       Name="Debug|x64"\r
-                       OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
-                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
-                       ConfigurationType="2"\r
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
-                       CharacterSet="2"\r
-                       >\r
-                       <Tool\r
-                               Name="VCPreBuildEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCustomBuildTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXMLDataGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebServiceProxyGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCMIDLTool"\r
-                               TargetEnvironment="3"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCLCompilerTool"\r
-                               Optimization="0"\r
-                               AdditionalIncludeDirectories="..\vcnet,.."\r
-                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
-                               MinimalRebuild="true"\r
-                               BasicRuntimeChecks="3"\r
-                               RuntimeLibrary="3"\r
-                               BufferSecurityCheck="true"\r
-                               UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
-                               Detect64BitPortabilityProblems="false"\r
-                               DebugInformationFormat="3"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManagedResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPreLinkEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCLinkerTool"\r
-                               AdditionalDependencies="ws2_32.lib advapi32.lib"\r
-                               OutputFile="$(OutDir)\libcups2.dll"\r
-                               LinkIncremental="2"\r
-                               ModuleDefinitionFile="..\cups\libcups2.def"\r
-                               GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\libcups2.pdb"\r
-                               SubSystem="2"\r
-                               ImportLibrary="$(OutDir)\libcups2.lib"\r
-                               TargetMachine="17"\r
-                       />\r
-                       <Tool\r
-                               Name="VCALinkTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManifestTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXDCMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCBscMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCFxCopTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCAppVerifierTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPostBuildEventTool"\r
-                       />\r
-               </Configuration>\r
-               <Configuration\r
-                       Name="Release|Win32"\r
-                       OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
-                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
-                       ConfigurationType="2"\r
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
-                       CharacterSet="2"\r
-                       >\r
-                       <Tool\r
-                               Name="VCPreBuildEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCustomBuildTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXMLDataGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebServiceProxyGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCMIDLTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCLCompilerTool"\r
-                               Optimization="1"\r
-                               AdditionalIncludeDirectories="..\vcnet,.."\r
-                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
-                               RuntimeLibrary="2"\r
-                               UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
-                               Detect64BitPortabilityProblems="false"\r
-                               DebugInformationFormat="3"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManagedResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPreLinkEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCLinkerTool"\r
-                               AdditionalDependencies="ws2_32.lib advapi32.lib"\r
-                               OutputFile="$(OutDir)\libcups2.dll"\r
-                               LinkIncremental="1"\r
-                               ModuleDefinitionFile="..\cups\libcups2.def"\r
-                               GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile="libcups2.pdb"\r
-                               SubSystem="2"\r
-                               OptimizeReferences="2"\r
-                               EnableCOMDATFolding="2"\r
-                               ImportLibrary="$(OutDir)\libcups2.lib"\r
-                               TargetMachine="1"\r
-                       />\r
-                       <Tool\r
-                               Name="VCALinkTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManifestTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXDCMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCBscMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCFxCopTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCAppVerifierTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPostBuildEventTool"\r
-                               CommandLine="if not &quot;%RC_XBS%&quot; == &quot;YES&quot; goto END&#x0D;&#x0A;if not exist &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;   mkdir &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;xcopy /I/Y &quot;$(TargetPath)&quot;                                                                  &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;:END&#x0D;&#x0A;"\r
-                       />\r
-               </Configuration>\r
-               <Configuration\r
-                       Name="Release|x64"\r
-                       OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
-                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
-                       ConfigurationType="2"\r
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
-                       CharacterSet="2"\r
-                       >\r
-                       <Tool\r
-                               Name="VCPreBuildEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCustomBuildTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXMLDataGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebServiceProxyGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCMIDLTool"\r
-                               TargetEnvironment="3"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCLCompilerTool"\r
-                               Optimization="1"\r
-                               AdditionalIncludeDirectories="..\vcnet,.."\r
-                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
-                               RuntimeLibrary="2"\r
-                               UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
-                               Detect64BitPortabilityProblems="false"\r
-                               DebugInformationFormat="3"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManagedResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPreLinkEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCLinkerTool"\r
-                               AdditionalDependencies="ws2_32.lib advapi32.lib"\r
-                               OutputFile="$(OutDir)\libcups2.dll"\r
-                               LinkIncremental="1"\r
-                               ModuleDefinitionFile="..\cups\libcups2.def"\r
-                               GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile="libcups2.pdb"\r
-                               SubSystem="2"\r
-                               OptimizeReferences="2"\r
-                               EnableCOMDATFolding="2"\r
-                               ImportLibrary="$(OutDir)\libcups2.lib"\r
-                               TargetMachine="17"\r
-                       />\r
-                       <Tool\r
-                               Name="VCALinkTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManifestTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXDCMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCBscMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCFxCopTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCAppVerifierTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPostBuildEventTool"\r
-                               CommandLine="if not &quot;%RC_XBS%&quot; == &quot;YES&quot; goto END&#x0D;&#x0A;if not exist &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;   mkdir &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;xcopy /I/Y &quot;$(TargetPath)&quot;                                                                  &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;:END&#x0D;&#x0A;"\r
-                       />\r
-               </Configuration>\r
-       </Configurations>\r
-       <References>\r
-       </References>\r
-       <Files>\r
-               <Filter\r
-                       Name="Source Files"\r
-                       Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
-                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
-                       >\r
-                       <File\r
-                               RelativePath="..\cups\adminutil.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\array.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\attr.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\auth.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\backend.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\conflicts.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\custom.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\dest.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\dir.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\emit.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\encode.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\file.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\getdevices.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\getputfile.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\globals.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\http-addr.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\http-addrlist.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\http-support.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\http.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\ipp-support.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\ipp.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\langprintf.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\language.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\localize.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\mark.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\md5.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\md5passwd.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\notify.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\options.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\page.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\ppd.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\pwg-file.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\pwg-media.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\pwg-ppd.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\request.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\snmp.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\snprintf.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\sspi.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\string.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\tempfile.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\thread.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\transcode.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\usersys.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\util.c"\r
-                               >\r
-                               <FileConfiguration\r
-                                       Name="Debug|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Debug|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|Win32"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                               <FileConfiguration\r
-                                       Name="Release|x64"\r
-                                       >\r
-                                       <Tool\r
-                                               Name="VCCLCompilerTool"\r
-                                               PreprocessorDefinitions="WIN32"\r
-                                       />\r
-                               </FileConfiguration>\r
-                       </File>\r
-               </Filter>\r
-               <Filter\r
-                       Name="Header Files"\r
-                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
-                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
-                       >\r
-                       <File\r
-                               RelativePath="..\cups\adminutil.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\array.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\backend.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\cups-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\cups.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\debug-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\dir.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\file-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\file.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\http-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\http.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\ipp-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\ipp.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\language-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\language.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\md5-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\ppd-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\ppd.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\pwg-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\sspi-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\string-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\thread-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\transcode.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\cups\versioning.h"\r
-                               >\r
-                       </File>\r
-               </Filter>\r
-               <Filter\r
-                       Name="Resource Files"\r
-                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"\r
-                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
-                       >\r
-               </Filter>\r
-       </Files>\r
-       <Globals>\r
-       </Globals>\r
-</VisualStudioProject>\r
diff --git a/vc2005/testfile.vcproj b/vc2005/testfile.vcproj
deleted file mode 100644 (file)
index edebe63..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>\r
-<VisualStudioProject\r
-       ProjectType="Visual C++"\r
-       Version="8.00"\r
-       Name="testfile"\r
-       ProjectGUID="{CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}"\r
-       Keyword="Win32Proj"\r
-       >\r
-       <Platforms>\r
-               <Platform\r
-                       Name="Win32"\r
-               />\r
-       </Platforms>\r
-       <ToolFiles>\r
-       </ToolFiles>\r
-       <Configurations>\r
-               <Configuration\r
-                       Name="Debug|Win32"\r
-                       OutputDirectory="Debug"\r
-                       IntermediateDirectory="Debug"\r
-                       ConfigurationType="1"\r
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
-                       CharacterSet="2"\r
-                       >\r
-                       <Tool\r
-                               Name="VCPreBuildEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCustomBuildTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXMLDataGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebServiceProxyGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCMIDLTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCLCompilerTool"\r
-                               Optimization="0"\r
-                               AdditionalIncludeDirectories="..\vcnet;.."\r
-                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
-                               MinimalRebuild="true"\r
-                               BasicRuntimeChecks="3"\r
-                               RuntimeLibrary="1"\r
-                               UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
-                               Detect64BitPortabilityProblems="true"\r
-                               DebugInformationFormat="4"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManagedResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPreLinkEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCLinkerTool"\r
-                               OutputFile="Debug\testfile.exe"\r
-                               LinkIncremental="2"\r
-                               GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile="$(OutDir)/testfile.pdb"\r
-                               SubSystem="1"\r
-                               TargetMachine="1"\r
-                       />\r
-                       <Tool\r
-                               Name="VCALinkTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManifestTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXDCMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCBscMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCFxCopTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCAppVerifierTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPostBuildEventTool"\r
-                       />\r
-               </Configuration>\r
-               <Configuration\r
-                       Name="Release|Win32"\r
-                       OutputDirectory="Release"\r
-                       IntermediateDirectory="Release"\r
-                       ConfigurationType="1"\r
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
-                       CharacterSet="2"\r
-                       >\r
-                       <Tool\r
-                               Name="VCPreBuildEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCustomBuildTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXMLDataGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebServiceProxyGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCMIDLTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCLCompilerTool"\r
-                               AdditionalIncludeDirectories="..\vcnet;.."\r
-                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
-                               RuntimeLibrary="0"\r
-                               UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
-                               Detect64BitPortabilityProblems="true"\r
-                               DebugInformationFormat="0"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManagedResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPreLinkEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCLinkerTool"\r
-                               OutputFile="testfile.exe"\r
-                               LinkIncremental="1"\r
-                               GenerateDebugInformation="true"\r
-                               SubSystem="1"\r
-                               OptimizeReferences="2"\r
-                               EnableCOMDATFolding="2"\r
-                               TargetMachine="1"\r
-                       />\r
-                       <Tool\r
-                               Name="VCALinkTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManifestTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXDCMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCBscMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCFxCopTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCAppVerifierTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPostBuildEventTool"\r
-                       />\r
-               </Configuration>\r
-       </Configurations>\r
-       <References>\r
-       </References>\r
-       <Files>\r
-               <Filter\r
-                       Name="Source Files"\r
-                       Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
-                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
-                       >\r
-                       <File\r
-                               RelativePath="..\cups\testfile.c"\r
-                               >\r
-                       </File>\r
-               </Filter>\r
-               <Filter\r
-                       Name="Header Files"\r
-                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
-                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
-                       >\r
-               </Filter>\r
-               <Filter\r
-                       Name="Resource Files"\r
-                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"\r
-                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
-                       >\r
-               </Filter>\r
-       </Files>\r
-       <Globals>\r
-       </Globals>\r
-</VisualStudioProject>\r
diff --git a/vc2005/testhttp.vcproj b/vc2005/testhttp.vcproj
deleted file mode 100644 (file)
index 77501a2..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>\r
-<VisualStudioProject\r
-       ProjectType="Visual C++"\r
-       Version="8.00"\r
-       Name="testhttp"\r
-       ProjectGUID="{90B0058C-8393-411F-BD3B-E2C831D4E883}"\r
-       Keyword="Win32Proj"\r
-       >\r
-       <Platforms>\r
-               <Platform\r
-                       Name="Win32"\r
-               />\r
-       </Platforms>\r
-       <ToolFiles>\r
-       </ToolFiles>\r
-       <Configurations>\r
-               <Configuration\r
-                       Name="Debug|Win32"\r
-                       OutputDirectory="Debug"\r
-                       IntermediateDirectory="Debug"\r
-                       ConfigurationType="1"\r
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
-                       CharacterSet="2"\r
-                       >\r
-                       <Tool\r
-                               Name="VCPreBuildEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCustomBuildTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXMLDataGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebServiceProxyGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCMIDLTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCLCompilerTool"\r
-                               Optimization="0"\r
-                               AdditionalIncludeDirectories="..\vcnet;.."\r
-                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
-                               MinimalRebuild="true"\r
-                               BasicRuntimeChecks="3"\r
-                               RuntimeLibrary="1"\r
-                               UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
-                               Detect64BitPortabilityProblems="true"\r
-                               DebugInformationFormat="4"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManagedResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPreLinkEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCLinkerTool"\r
-                               OutputFile="Debug\testhttp.exe"\r
-                               LinkIncremental="2"\r
-                               GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile="$(OutDir)/testhttp.pdb"\r
-                               SubSystem="1"\r
-                               TargetMachine="1"\r
-                       />\r
-                       <Tool\r
-                               Name="VCALinkTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManifestTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXDCMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCBscMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCFxCopTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCAppVerifierTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPostBuildEventTool"\r
-                       />\r
-               </Configuration>\r
-               <Configuration\r
-                       Name="Release|Win32"\r
-                       OutputDirectory="Release"\r
-                       IntermediateDirectory="Release"\r
-                       ConfigurationType="1"\r
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
-                       CharacterSet="2"\r
-                       >\r
-                       <Tool\r
-                               Name="VCPreBuildEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCustomBuildTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXMLDataGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebServiceProxyGeneratorTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCMIDLTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCCLCompilerTool"\r
-                               AdditionalIncludeDirectories="..\vcnet;.."\r
-                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
-                               RuntimeLibrary="0"\r
-                               UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
-                               Detect64BitPortabilityProblems="true"\r
-                               DebugInformationFormat="0"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManagedResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCResourceCompilerTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPreLinkEventTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCLinkerTool"\r
-                               OutputFile="testhttp.exe"\r
-                               LinkIncremental="1"\r
-                               GenerateDebugInformation="true"\r
-                               SubSystem="1"\r
-                               OptimizeReferences="2"\r
-                               EnableCOMDATFolding="2"\r
-                               TargetMachine="1"\r
-                       />\r
-                       <Tool\r
-                               Name="VCALinkTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCManifestTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCXDCMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCBscMakeTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCFxCopTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCAppVerifierTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
-                               Name="VCPostBuildEventTool"\r
-                       />\r
-               </Configuration>\r
-       </Configurations>\r
-       <References>\r
-       </References>\r
-       <Files>\r
-               <Filter\r
-                       Name="Source Files"\r
-                       Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
-                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
-                       >\r
-                       <File\r
-                               RelativePath="..\cups\testhttp.c"\r
-                               >\r
-                       </File>\r
-               </Filter>\r
-               <Filter\r
-                       Name="Header Files"\r
-                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
-                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
-                       >\r
-               </Filter>\r
-               <Filter\r
-                       Name="Resource Files"\r
-                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"\r
-                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
-                       >\r
-               </Filter>\r
-       </Files>\r
-       <Globals>\r
-       </Globals>\r
-</VisualStudioProject>\r
diff --git a/vcnet/README.txt b/vcnet/README.txt
new file mode 100644 (file)
index 0000000..4637da3
--- /dev/null
@@ -0,0 +1,27 @@
+README - CUPS v1.7b1 - 2013-04-18
+---------------------------------
+
+INTRODUCTION
+
+    This package includes the cupstestppd and ipptool utilities, CUPS API
+    libraries libcups2.dll and libcupsimage2.dll, and the import libraries and
+    headers needed to develop Windows applications that use the CUPS API to
+    communicate with CUPS and other IPP services.
+
+    See the file "IPPTOOL.txt" for instructions on using the ipptool utility.
+
+
+LEGAL STUFF
+
+    CUPS is Copyright 2007-2013 by Apple Inc.  CUPS and the CUPS logo are
+    trademarks of Apple Inc.
+
+    The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
+
+    This software is based in part on the work of the Independent JPEG Group.
+
+    CUPS is provided under the terms of version 2 of the GNU General Public
+    License and GNU Library General Public License. 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 "doc/help/license.html" or "LICENSE.txt" files for more information.
index 82c039f..345c6d8 100644 (file)
@@ -1,16 +1,16 @@
 /*
- * "$Id: config.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: config.h 12998 2015-12-02 15:09:04Z msweet $"
  *
- *   Configuration file for CUPS on Windows.
+ * Configuration file for CUPS on Windows.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 #ifndef _CUPS_CONFIG_H_
 
 
 /*
+ * Map the POSIX strcasecmp() and strncasecmp() functions to the Win32 stricmp()
+ * and strnicmp() functions...
+ */
+
+#define strcasecmp     stricmp
+#define strncasecmp    strnicmp
+
+
+/*
  * Map the POSIX sleep() and usleep() functions to the Win32 Sleep() function...
  */
 
+typedef unsigned long useconds_t;
 #define sleep(X)       Sleep(1000 * (X))
 #define usleep(X)      Sleep((X)/1000)
 
@@ -70,7 +80,7 @@
 #  define R_OK         04
 #  define O_RDONLY     _O_RDONLY
 #  define O_WRONLY     _O_WRONLY
-#  define O_CREATE     _O_CREAT
+#  define O_CREAT      _O_CREAT
 #  define O_TRUNC      _O_TRUNC
 
 
@@ -86,8 +96,8 @@
  * Version of software...
  */
 
-#define CUPS_SVERSION "CUPS v1.6.3"
-#define CUPS_MINIMAL "CUPS/1.6.3"
+#define CUPS_SVERSION "CUPS v2.1.2"
+#define CUPS_MINIMAL "CUPS/2.1.2"
 
 
 /*
  * Default file permissions...
  */
 
-#define CUPS_DEFAULT_CONFIG_FILE_PERM 0644
+#define CUPS_DEFAULT_CONFIG_FILE_PERM 0640
 #define CUPS_DEFAULT_LOG_FILE_PERM 0644
 
 
  */
 
 #define CUPS_DEFAULT_BROWSING 1
-#define CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS "CUPS dnssd"
-#define CUPS_DEFAULT_BROWSE_REMOTE_PROTOCOLS ""
-#define CUPS_DEFAULT_BROWSE_SHORT_NAMES 1
+#define CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS ""
 #define CUPS_DEFAULT_DEFAULT_SHARED 1
-#define CUPS_DEFAULT_IMPLICIT_CLASSES 1
-#define CUPS_DEFAULT_USE_NETWORK_DEFAULT 0
 
 
 /*
 
 
 /*
- * Do we have domain socket support?
+ * 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
 
 
 /*
- * Do we have various image libraries?
+ * Do we have posix_spawn?
  */
 
-/* #undef HAVE_LIBPNG */
-/* #undef HAVE_LIBZ */
-/* #undef HAVE_LIBJPEG */
-/* #undef HAVE_LIBTIFF */
+/* #undef HAVE_POSIX_SPAWN */
+
+
+/*
+ * Do we have ZLIB?
+ */
+
+#define HAVE_LIBZ 1
+#define HAVE_INFLATECOPY 1
 
 
 /*
  * Do we have PAM stuff?
  */
 
-#ifndef HAVE_LIBPAM
 #define HAVE_LIBPAM 0
-#endif /* !HAVE_LIBPAM */
-
 /* #undef HAVE_PAM_PAM_APPL_H */
 /* #undef HAVE_PAM_SET_ITEM */
 /* #undef HAVE_PAM_SETCRED */
 
 
 /*
- * Do we have <scsi/sg.h>?
+ * Use <stdint.h>?
  */
 
-/* #undef HAVE_SCSI_SG_H */
+/* #undef HAVE_STDINT_H */
 
 
 /*
 
 /* #undef HAVE_CDSASSL */
 /* #undef HAVE_GNUTLS */
-/* #undef HAVE_LIBSSL */
 #define HAVE_SSPISSL
 #define HAVE_SSL
 
 
 /*
- * What Security framework headers do we have?
+ * Do we have the gnutls_transport_set_pull_timeout_function function?
  */
 
-/* #undef HAVE_AUTHORIZATION_H */
-/* #undef HAVE_SECPOLICY_H */
-/* #undef HAVE_SECPOLICYPRIV_H */
-/* #undef HAVE_SECBASEPRIV_H */
-/* #undef HAVE_SECIDENTITYSEARCHPRIV_H */
-
-
-/*
- * Do we have the SecIdentitySearchCreateWithPolicy function?
- */
-
-/* #undef HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY */
+/* #undef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION */
 
 
 /*
- * Do we have the SecPolicyCreateSSL function?
+ * Do we have the gnutls_priority_set_direct function?
  */
 
-/* #undef HAVE_SECPOLICYCREATESSL */
+/* #undef HAVE_GNUTLS_PRIORITY_SET_DIRECT */
 
 
 /*
- * Do we have the SecPolicyCreateSSL function?
+ * What Security framework headers do we have?
  */
 
-/* #undef HAVE_SECPOLICYCREATESSL */
+/* #undef HAVE_AUTHORIZATION_H */
+/* #undef HAVE_SECBASEPRIV_H */
+/* #undef HAVE_SECCERTIFICATE_H */
+/* #undef HAVE_SECIDENTITYSEARCHPRIV_H */
+/* #undef HAVE_SECITEM_H */
+/* #undef HAVE_SECITEMPRIV_H */
+/* #undef HAVE_SECPOLICY_H */
+/* #undef HAVE_SECPOLICYPRIV_H */
+/* #undef HAVE_SECURETRANSPORTPRIV_H */
 
 
 /*
 
 
 /*
- * Do we have the SLP library?
+ * Do we have the SecGenerateSelfSignedCertificate function?
  */
 
-/* #undef HAVE_LIBSLP */
+/* #undef HAVE_SECGENERATESELFSIGNEDCERTIFICATE */
 
 
 /*
- * Do we have an LDAP library?
+ * Do we have the SecKeychainOpen function?
  */
 
-/* #undef HAVE_LDAP */
-/* #undef HAVE_OPENLDAP */
-/* #undef HAVE_MOZILLA_LDAP */
-/* #undef HAVE_LDAP_SSL_H */
-/* #undef HAVE_LDAP_SSL */
-/* #undef HAVE_LDAP_REBIND_PROC */
+/* #undef HAVE_SECKEYCHAINOPEN */
 
 
 /*
 
 
 /*
- * Do we have DNS Service Discovery (aka Bonjour)?
+ * Do we have mDNSResponder for DNS Service Discovery (aka Bonjour)?
  */
 
 #define HAVE_DNSSD 1
 
 
 /*
- * Does the "stat" structure contain the "st_gen" member?
+ * Do we have Avahi for DNS Service Discovery (aka Bonjour)?
  */
 
-/* #undef HAVE_ST_GEN */
+#undef HAVE_AVAHI
 
 
 /*
  * Do we have <sys/ioctl.h>?
  */
 
-/* #undef HAVE_SYS_IOCTL_H */
+#undef HAVE_SYS_IOCTL_H
+
+
+/*
+ * Does the "stat" structure contain the "st_gen" member?
+ */
+
+/* #undef HAVE_ST_GEN */
 
 
 /*
 
 
 /*
- * Do we have the AIX usersec.h header file?
- */
-
-/* #undef HAVE_USERSEC_H */
-
-
-/*
  * Do we have pthread support?
  */
 
 
 
 /*
+ * Do we have systemd support?
+ */
+
+/* #undef HAVE_SYSTEMD */
+
+
+/*
  * Various scripting languages...
  */
 
  */
 
 /* #undef HAVE_PDFTOPS */
+/* #undef HAVE_PDFTOPS_WITH_ORIGPAGESIZES */
 #define CUPS_PDFTOPS ""
 
 
 
 
 /*
- * Do we have Darwin's CoreFoundation and SystemConfiguration frameworks?
- */
-
-/* #undef HAVE_COREFOUNDATION */
-/* #undef HAVE_SYSTEMCONFIGURATION */
-
-
-/*
  * Do we have CoreFoundation public and private headers?
  */
 
 
 
 /*
- * Do we have Darwin's IOKit private headers?
- */
-
-/* #undef HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */
-
-
-/*
  * Do we have DBUS?
  */
 
 /* #undef HAVE_DBUS */
 /* #undef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND */
+/* #undef HAVE_DBUS_THREADS_INIT */
 
 
 /*
 /* #undef HAVE_GSS_GSSAPI_H */
 /* #undef HAVE_GSS_GSSAPI_SPI_H */
 /* #undef HAVE_GSSAPI */
-/* #undef HAVE_GSSAPI_GENERIC_H */
 /* #undef HAVE_GSSAPI_GSSAPI_H */
 /* #undef HAVE_GSSAPI_H */
-/* #undef HAVE_GSSAPI_KRB5_H */
-/* #undef HAVE_KRB5_H */
 
 
 /*
  * Do we have libusb?
  */
 
-/* #undef HAVE_USB_H */
+/* #undef HAVE_LIBUSB */
 
 
 /*
 
 
 /*
- * Do we have the ColorSyncRegisterDevice function?
+ * Do we have XPC?
  */
 
-/* #undef HAVE_COLORSYNCREGISTERDEVICE */
+/* #undef HAVE_XPC */
+/* #undef HAVE_XPC_PRIVATE_H */
 
 
 /*
- * Do we have XPC?
+ * Do we have Mini-XML?
  */
 
-/* #undef HAVE_XPC */
+/* #undef HAVE_MXML_H */
+
+
+/*
+ * 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_ */
 
 /*
- * End of "$Id: config.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: config.h 12998 2015-12-02 15:09:04Z msweet $".
  */
index 5fede83..277d762 100644 (file)
@@ -33,10 +33,29 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ipptool", "ipptool.vcproj",
        EndProjectSection\r
 EndProject\r
 Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "ipptool-installer", "ipptool-installer.vdproj", "{6AEA263B-92C0-426F-B5FF-F7F5917B704A}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {B484DA0C-62C8-4C32-83B6-CCEB58968B85} = {B484DA0C-62C8-4C32-83B6-CCEB58968B85}\r
+       EndProjectSection\r
 EndProject\r
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regex", "regex.vcproj", "{18950A1B-D37A-40C7-B2DF-C12986C0526E}"\r
 EndProject\r
-Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "ipptool-installer", "libcups2-installer.vdproj", "{03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}"\r
+Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "libcups2-installer", "libcups2-installer.vdproj", "{03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {B484DA0C-62C8-4C32-83B6-CCEB58968B85} = {B484DA0C-62C8-4C32-83B6-CCEB58968B85}\r
+       EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ippfind", "ippfind.vcproj", "{B484DA0C-62C8-4C32-83B6-CCEB58968B85}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {18950A1B-D37A-40C7-B2DF-C12986C0526E} = {18950A1B-D37A-40C7-B2DF-C12986C0526E}\r
+               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}\r
+       EndProjectSection\r
+EndProject\r
+Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "sw-ippeveselfcert10", "sw-ippeveselfcert10.vdproj", "{7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ippserver", "ippserver.vcproj", "{82A03BC7-0746-4B85-8908-3C7A3FAA58A9}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}\r
+       EndProjectSection\r
 EndProject\r
 Global\r
        GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
@@ -52,8 +71,8 @@ Global
                {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|x64.Build.0 = Debug|x64\r
                {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|Win32.ActiveCfg = Release|Win32\r
                {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|Win32.Build.0 = Release|Win32\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.ActiveCfg = Debug|x64\r
-               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.Build.0 = Debug|x64\r
+               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.ActiveCfg = Release|x64\r
+               {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.Build.0 = Release|x64\r
                {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|Win32.Build.0 = Debug|Win32\r
                {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|x64.ActiveCfg = Debug|x64\r
@@ -104,10 +123,11 @@ Global
                {6AEA263B-92C0-426F-B5FF-F7F5917B704A}.Release|x64.Build.0 = Release\r
                {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Debug|Win32.ActiveCfg = Debug|Win32\r
                {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Debug|Win32.Build.0 = Debug|Win32\r
-               {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Debug|x64.ActiveCfg = Debug|Win32\r
+               {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Debug|x64.ActiveCfg = Debug|x64\r
+               {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Debug|x64.Build.0 = Debug|x64\r
                {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Release|Win32.ActiveCfg = Release|Win32\r
                {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Release|Win32.Build.0 = Release|Win32\r
-               {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Release|x64.ActiveCfg = Release|Win32\r
+               {18950A1B-D37A-40C7-B2DF-C12986C0526E}.Release|x64.ActiveCfg = Release|x64\r
                {03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}.Debug|Win32.ActiveCfg = Debug\r
                {03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}.Debug|Win32.Build.0 = Debug\r
                {03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}.Debug|x64.ActiveCfg = Debug\r
@@ -116,6 +136,30 @@ Global
                {03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}.Release|Win32.Build.0 = Release\r
                {03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}.Release|x64.ActiveCfg = Release\r
                {03CF67C2-3FF5-44EA-B3AF-FB62D3BED961}.Release|x64.Build.0 = Release\r
+               {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Debug|Win32.Build.0 = Debug|Win32\r
+               {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Debug|x64.ActiveCfg = Debug|x64\r
+               {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Debug|x64.Build.0 = Debug|x64\r
+               {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Release|Win32.ActiveCfg = Release|Win32\r
+               {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Release|Win32.Build.0 = Release|Win32\r
+               {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Release|x64.ActiveCfg = Release|x64\r
+               {B484DA0C-62C8-4C32-83B6-CCEB58968B85}.Release|x64.Build.0 = Release|x64\r
+               {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Debug|Win32.ActiveCfg = Debug\r
+               {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Debug|Win32.Build.0 = Debug\r
+               {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Debug|x64.ActiveCfg = Debug\r
+               {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Debug|x64.Build.0 = Debug\r
+               {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Release|Win32.ActiveCfg = Release\r
+               {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Release|Win32.Build.0 = Release\r
+               {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Release|x64.ActiveCfg = Release\r
+               {7F6DD7F5-7DCC-4C7A-8647-E253E4E00A37}.Release|x64.Build.0 = Release\r
+               {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Debug|Win32.Build.0 = Debug|Win32\r
+               {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Debug|x64.ActiveCfg = Debug|x64\r
+               {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Debug|x64.Build.0 = Debug|x64\r
+               {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Release|Win32.ActiveCfg = Release|Win32\r
+               {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Release|Win32.Build.0 = Release|Win32\r
+               {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Release|x64.ActiveCfg = Release|x64\r
+               {82A03BC7-0746-4B85-8908-3C7A3FAA58A9}.Release|x64.Build.0 = Release|x64\r
        EndGlobalSection\r
        GlobalSection(SolutionProperties) = preSolution\r
                HideSolutionNode = FALSE\r
similarity index 74%
rename from vc2005/cupstestppd.vcproj
rename to vcnet/ippfind.vcproj
index 479afcc..59a7f2b 100644 (file)
@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="Windows-1252"?>\r
 <VisualStudioProject\r
        ProjectType="Visual C++"\r
-       Version="8.00"\r
-       Name="cupstestppd"\r
-       ProjectGUID="{6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}"\r
-       RootNamespace="cupstestppd"\r
+       Version="9.00"\r
+       Name="ippfind"\r
+       ProjectGUID="{B484DA0C-62C8-4C32-83B6-CCEB58968B85}"\r
+       RootNamespace="ippfind"\r
        Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
        >\r
        <Platforms>\r
                <Platform\r
@@ -20,8 +21,8 @@
        <Configurations>\r
                <Configuration\r
                        Name="Debug|Win32"\r
-                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"\r
-                       IntermediateDirectory="$(ConfigurationName)"\r
+                       OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
                        ConfigurationType="1"\r
                        CharacterSet="1"\r
                        >\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="..;..\vcnet"\r
+                               AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"\r
                                PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
                                MinimalRebuild="true"\r
                                BasicRuntimeChecks="3"\r
                                RuntimeLibrary="3"\r
                                UsePrecompiledHeader="0"\r
                                WarningLevel="1"\r
-                               Detect64BitPortabilityProblems="true"\r
+                               Detect64BitPortabilityProblems="false"\r
                                DebugInformationFormat="4"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
+                               AdditionalDependencies="dnssd.lib ws2_32.lib"\r
                                LinkIncremental="2"\r
                                GenerateDebugInformation="true"\r
                                SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
                                TargetMachine="1"\r
                        />\r
                        <Tool\r
                                Name="VCAppVerifierTool"\r
                        />\r
                        <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
                                Name="VCPostBuildEventTool"\r
                        />\r
                </Configuration>\r
                <Configuration\r
-                       Name="Release|Win32"\r
-                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"\r
-                       IntermediateDirectory="$(ConfigurationName)"\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
                        ConfigurationType="1"\r
                        CharacterSet="1"\r
-                       WholeProgramOptimization="1"\r
                        >\r
                        <Tool\r
                                Name="VCPreBuildEventTool"\r
                        />\r
                        <Tool\r
                                Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
-                               AdditionalIncludeDirectories="..;..\vcnet"\r
-                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
-                               RuntimeLibrary="2"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
                                UsePrecompiledHeader="0"\r
                                WarningLevel="1"\r
-                               Detect64BitPortabilityProblems="true"\r
+                               Detect64BitPortabilityProblems="false"\r
                                DebugInformationFormat="3"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
-                               LinkIncremental="1"\r
+                               AdditionalDependencies="dnssd.lib ws2_32.lib"\r
+                               LinkIncremental="2"\r
                                GenerateDebugInformation="true"\r
                                SubSystem="1"\r
-                               OptimizeReferences="2"\r
-                               EnableCOMDATFolding="2"\r
-                               TargetMachine="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="17"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                                Name="VCAppVerifierTool"\r
                        />\r
                        <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
                                Name="VCPostBuildEventTool"\r
                        />\r
                </Configuration>\r
                <Configuration\r
-                       Name="Debug|x64"\r
-                       OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"\r
+                       Name="Release|Win32"\r
+                       OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
                        IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
                        ConfigurationType="1"\r
                        CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
                        >\r
                        <Tool\r
                                Name="VCPreBuildEventTool"\r
                        />\r
                        <Tool\r
                                Name="VCMIDLTool"\r
-                               TargetEnvironment="3"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
-                               Optimization="0"\r
-                               AdditionalIncludeDirectories="..;..\vcnet"\r
-                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
-                               MinimalRebuild="true"\r
-                               BasicRuntimeChecks="3"\r
-                               RuntimeLibrary="3"\r
+                               AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
+                               RuntimeLibrary="2"\r
                                UsePrecompiledHeader="0"\r
                                WarningLevel="1"\r
-                               Detect64BitPortabilityProblems="true"\r
+                               Detect64BitPortabilityProblems="false"\r
                                DebugInformationFormat="3"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
-                               LinkIncremental="2"\r
+                               AdditionalDependencies="dnssd.lib ws2_32.lib"\r
+                               LinkIncremental="1"\r
                                GenerateDebugInformation="true"\r
                                SubSystem="1"\r
-                               TargetMachine="17"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
+                               TargetMachine="1"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                                Name="VCAppVerifierTool"\r
                        />\r
                        <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
                                Name="VCPostBuildEventTool"\r
                        />\r
                </Configuration>\r
                <Configuration\r
                        Name="Release|x64"\r
-                       OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"\r
+                       OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
                        IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
                        ConfigurationType="1"\r
                        CharacterSet="1"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
-                               AdditionalIncludeDirectories="..;..\vcnet"\r
+                               AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"\r
                                PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
                                RuntimeLibrary="2"\r
                                UsePrecompiledHeader="0"\r
                                WarningLevel="1"\r
-                               Detect64BitPortabilityProblems="true"\r
+                               Detect64BitPortabilityProblems="false"\r
                                DebugInformationFormat="3"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
+                               AdditionalDependencies="dnssd.lib ws2_32.lib"\r
                                LinkIncremental="1"\r
                                GenerateDebugInformation="true"\r
                                SubSystem="1"\r
                                OptimizeReferences="2"\r
                                EnableCOMDATFolding="2"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
                                TargetMachine="17"\r
                        />\r
                        <Tool\r
                                Name="VCAppVerifierTool"\r
                        />\r
                        <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
                                Name="VCPostBuildEventTool"\r
                        />\r
                </Configuration>\r
                <Filter\r
                        Name="Source Files"\r
                        Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
-                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"\r
+                       UniqueIdentifier="{8C1A7322-AFBD-4611-A001-CF18E3B0F00C}"\r
                        >\r
                        <File\r
-                               RelativePath="..\systemv\cupstestppd.c"\r
+                               RelativePath="..\test\ippfind.c"\r
                                >\r
                        </File>\r
                </Filter>\r
                <Filter\r
                        Name="Header Files"\r
                        Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
-                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"\r
+                       UniqueIdentifier="{5807291C-0541-4D9C-9290-628F88CF9119}"\r
                        >\r
                </Filter>\r
                <Filter\r
                        Name="Resource Files"\r
                        Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
-                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"\r
+                       UniqueIdentifier="{7767CEF5-1BED-4C4C-82A7-37DF77126FE3}"\r
                        >\r
                </Filter>\r
        </Files>\r
similarity index 55%
rename from vc2005/libcupsimage2.vcproj
rename to vcnet/ippserver.vcproj
index bb1f9ef..fe5aaad 100644 (file)
@@ -1,10 +1,12 @@
 <?xml version="1.0" encoding="Windows-1252"?>\r
 <VisualStudioProject\r
        ProjectType="Visual C++"\r
-       Version="8.00"\r
-       Name="libcupsimage2"\r
-       ProjectGUID="{CB4AA6F2-3E84-45BE-B505-95CD375E1234}"\r
+       Version="9.00"\r
+       Name="ippserver"\r
+       ProjectGUID="{82A03BC7-0746-4B85-8908-3C7A3FAA58A9}"\r
+       RootNamespace="ippserver"\r
        Keyword="Win32Proj"\r
+       TargetFrameworkVersion="131072"\r
        >\r
        <Platforms>\r
                <Platform\r
@@ -21,9 +23,8 @@
                        Name="Debug|Win32"\r
                        OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
                        IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
-                       ConfigurationType="2"\r
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
-                       CharacterSet="2"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
                        >\r
                        <Tool\r
                                Name="VCPreBuildEventTool"\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="..\vcnet,.."\r
-                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
+                               AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
                                MinimalRebuild="true"\r
                                BasicRuntimeChecks="3"\r
                                RuntimeLibrary="3"\r
-                               BufferSecurityCheck="true"\r
                                UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
+                               WarningLevel="1"\r
                                Detect64BitPortabilityProblems="false"\r
                                DebugInformationFormat="4"\r
                        />\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
-                               AdditionalDependencies="ws2_32.lib"\r
-                               OutputFile="$(OutDir)\libcupsimage2.dll"\r
+                               AdditionalDependencies="dnssd.lib ws2_32.lib"\r
                                LinkIncremental="2"\r
-                               ModuleDefinitionFile="..\filter\libcupsimage2.def"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\libcupsimage2.pdb"\r
-                               SubSystem="2"\r
-                               ImportLibrary="$(OutDir)\libcupsimage2.lib"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
                                TargetMachine="1"\r
                        />\r
                        <Tool\r
@@ -94,9 +92,6 @@
                                Name="VCAppVerifierTool"\r
                        />\r
                        <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
                                Name="VCPostBuildEventTool"\r
                        />\r
                </Configuration>\r
                        Name="Debug|x64"\r
                        OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
                        IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
-                       ConfigurationType="2"\r
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
-                       CharacterSet="2"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
                        >\r
                        <Tool\r
                                Name="VCPreBuildEventTool"\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="..\vcnet,.."\r
-                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
+                               AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"\r
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
                                MinimalRebuild="true"\r
                                BasicRuntimeChecks="3"\r
                                RuntimeLibrary="3"\r
-                               BufferSecurityCheck="true"\r
                                UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
+                               WarningLevel="1"\r
                                Detect64BitPortabilityProblems="false"\r
                                DebugInformationFormat="3"\r
                        />\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
-                               AdditionalDependencies="ws2_32.lib"\r
-                               OutputFile="$(OutDir)\libcupsimage2.dll"\r
+                               AdditionalDependencies="dnssd.lib ws2_32.lib"\r
                                LinkIncremental="2"\r
-                               ModuleDefinitionFile="..\filter\libcupsimage2.def"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile="$(PlatformName)\$(ConfigurationName)\libcupsimage2.pdb"\r
-                               SubSystem="2"\r
-                               ImportLibrary="$(OutDir)\libcupsimage2.lib"\r
+                               SubSystem="1"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
                                TargetMachine="17"\r
                        />\r
                        <Tool\r
                                Name="VCAppVerifierTool"\r
                        />\r
                        <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
                                Name="VCPostBuildEventTool"\r
                        />\r
                </Configuration>\r
                        Name="Release|Win32"\r
                        OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
                        IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
-                       ConfigurationType="2"\r
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
-                       CharacterSet="2"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
                        >\r
                        <Tool\r
                                Name="VCPreBuildEventTool"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
-                               Optimization="1"\r
-                               AdditionalIncludeDirectories="..\vcnet,.."\r
-                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
+                               AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
                                RuntimeLibrary="2"\r
                                UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
+                               WarningLevel="1"\r
                                Detect64BitPortabilityProblems="false"\r
                                DebugInformationFormat="3"\r
                        />\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
-                               AdditionalDependencies="ws2_32.lib"\r
-                               OutputFile="$(OutDir)\libcupsimage2.dll"\r
+                               AdditionalDependencies="dnssd.lib ws2_32.lib"\r
                                LinkIncremental="1"\r
-                               ModuleDefinitionFile="..\filter\libcupsimage2.def"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile="libcupsimage2.pdb"\r
-                               SubSystem="2"\r
+                               SubSystem="1"\r
                                OptimizeReferences="2"\r
                                EnableCOMDATFolding="2"\r
-                               ImportLibrary="$(OutDir)\libcupsimage2.lib"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
                                TargetMachine="1"\r
                        />\r
                        <Tool\r
                                Name="VCAppVerifierTool"\r
                        />\r
                        <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
                                Name="VCPostBuildEventTool"\r
-                               CommandLine="if not &quot;%RC_XBS%&quot; == &quot;YES&quot; goto END&#x0D;&#x0A;if not exist &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;   mkdir &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;xcopy /I/Y &quot;$(TargetPath)&quot;                                                                  &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;:END&#x0D;&#x0A;"\r
                        />\r
                </Configuration>\r
                <Configuration\r
                        Name="Release|x64"\r
                        OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
                        IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
-                       ConfigurationType="2"\r
-                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
-                       CharacterSet="2"\r
+                       ConfigurationType="1"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
                        >\r
                        <Tool\r
                                Name="VCPreBuildEventTool"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
-                               Optimization="1"\r
-                               AdditionalIncludeDirectories="..\vcnet,.."\r
-                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
+                               AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"\r
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"\r
                                RuntimeLibrary="2"\r
                                UsePrecompiledHeader="0"\r
-                               WarningLevel="3"\r
+                               WarningLevel="1"\r
                                Detect64BitPortabilityProblems="false"\r
                                DebugInformationFormat="3"\r
                        />\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
-                               AdditionalDependencies="ws2_32.lib"\r
-                               OutputFile="$(OutDir)\libcupsimage2.dll"\r
+                               AdditionalDependencies="dnssd.lib ws2_32.lib"\r
                                LinkIncremental="1"\r
-                               ModuleDefinitionFile="..\filter\libcupsimage2.def"\r
                                GenerateDebugInformation="true"\r
-                               ProgramDatabaseFile="libcupsimage2.pdb"\r
-                               SubSystem="2"\r
+                               SubSystem="1"\r
                                OptimizeReferences="2"\r
                                EnableCOMDATFolding="2"\r
-                               ImportLibrary="$(OutDir)\libcupsimage2.lib"\r
+                               RandomizedBaseAddress="1"\r
+                               DataExecutionPrevention="0"\r
                                TargetMachine="17"\r
                        />\r
                        <Tool\r
                                Name="VCAppVerifierTool"\r
                        />\r
                        <Tool\r
-                               Name="VCWebDeploymentTool"\r
-                       />\r
-                       <Tool\r
                                Name="VCPostBuildEventTool"\r
-                               CommandLine="if not &quot;%RC_XBS%&quot; == &quot;YES&quot; goto END&#x0D;&#x0A;if not exist &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;   mkdir &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;xcopy /I/Y &quot;$(TargetPath)&quot;                                                                  &quot;$(DSTROOT)\Program Files\Bonjour\$(PlatformName)&quot;&#x0D;&#x0A;:END&#x0D;&#x0A;"\r
                        />\r
                </Configuration>\r
        </Configurations>\r
        <Files>\r
                <Filter\r
                        Name="Source Files"\r
-                       Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
-                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D7521234}"\r
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
+                       UniqueIdentifier="{5129820B-88C2-40AE-BE81-C7957F76540D}"\r
                        >\r
                        <File\r
-                               RelativePath="..\filter\error.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\filter\interpret.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
-                               RelativePath="..\filter\raster.c"\r
+                               RelativePath="..\test\ippserver.c"\r
                                >\r
                        </File>\r
                </Filter>\r
                <Filter\r
                        Name="Header Files"\r
                        Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
-                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE521234}"\r
+                       UniqueIdentifier="{CAF4FFBF-7D66-4368-A03A-3FD0971B59A0}"\r
                        >\r
-                       <File\r
-                               RelativePath="..\cups\raster.h"\r
-                               >\r
-                       </File>\r
                </Filter>\r
                <Filter\r
                        Name="Resource Files"\r
-                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"\r
-                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121A1234}"\r
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"\r
+                       UniqueIdentifier="{17D3B9CD-53D2-47AF-9D2A-4516D777D695}"\r
                        >\r
                </Filter>\r
        </Files>\r
index 948299e..555cd2e 100644 (file)
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_1DBDCFABB8DF28E5F75E41EDAE4BF6BE"\r
+        "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_1E4B2A9BD6A44926B719E0D7E8FC0952"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_65CBD149C9DA448FBACE2B02766A6537"\r
+        "MsmKey" = "8:_4273A45FE6E54897AC9A4F66D9AA59EC"\r
+        "OwnerKey" = "8:_8A6033CAC27E4C1185B4FDF7D2BF8D2E"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_4454D1BB58774F95972FB94388DC5E6A"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_6F893B2A3B7048CBA39359FC368BCA27"\r
+        "MsmKey" = "8:_46AB64FF360D4F309866FF5F49C65D88"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_7AFD2BBA568D45F5B1E871E2B93892BC"\r
-        "OwnerKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"\r
+        "MsmKey" = "8:_531A281ACDC6420D918E2A9FE97A2D42"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_7AFD2BBA568D45F5B1E871E2B93892BC"\r
-        "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "MsmKey" = "8:_58DC0E72F0944BEFB927AED718CD1660"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_7AFD2BBA568D45F5B1E871E2B93892BC"\r
-        "OwnerKey" = "8:_E97571D3FBE048DABDC59B37762D800F"\r
+        "MsmKey" = "8:_592FC984DBFD494D9FB7DFFEA35AD7A5"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_65CBD149C9DA448FBACE2B02766A6537"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_6F893B2A3B7048CBA39359FC368BCA27"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_8A6033CAC27E4C1185B4FDF7D2BF8D2E"\r
+        "OwnerKey" = "8:_58DC0E72F0944BEFB927AED718CD1660"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_8A6033CAC27E4C1185B4FDF7D2BF8D2E"\r
+        "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_8A6033CAC27E4C1185B4FDF7D2BF8D2E"\r
+        "OwnerKey" = "8:_E97571D3FBE048DABDC59B37762D800F"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_8A6033CAC27E4C1185B4FDF7D2BF8D2E"\r
+        "OwnerKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_8AC6B9D7EF6B4C7A8C7B5AD85AA397C3"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_9314DE98517C42E9AF190B67472408DF"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_9967519E7058965D4C7DEF47EB39CC50"\r
         "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_A63C5C4108AB4B588878482B26876DC5"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_AF057921D20E4520A3C6420F0729A744"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_B85BD013DC024B9E82862535191B405B"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_B9E79062FEF64745915546DDD5BF8D85"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_F0AA062C769A4867B5C302491CA4F2D3"\r
-        "OwnerKey" = "8:_7AFD2BBA568D45F5B1E871E2B93892BC"\r
-        "MsmSig" = "8:_UNDEFINED"\r
-        }\r
-        "Entry"\r
-        {\r
         "MsmKey" = "8:_F16FA7F9826E461E955A95B2EEABA975"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1DBDCFABB8DF28E5F75E41EDAE4BF6BE"\r
+            {\r
+            "SourcePath" = "8:zlibwapi.dll"\r
+            "TargetName" = "8:zlibwapi.dll"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:TRUE"\r
+            "IsolateTo" = "8:"\r
+            }\r
             "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1E4B2A9BD6A44926B719E0D7E8FC0952"\r
             {\r
             "SourcePath" = "8:..\\test\\get-printer-attributes.test"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4454D1BB58774F95972FB94388DC5E6A"\r
+            {\r
+            "SourcePath" = "8:..\\test\\print-job-deflate.test"\r
+            "TargetName" = "8:print-job-deflate.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_46AB64FF360D4F309866FF5F49C65D88"\r
+            {\r
+            "SourcePath" = "8:..\\test\\ipp-everywhere.test"\r
+            "TargetName" = "8:ipp-everywhere.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_531A281ACDC6420D918E2A9FE97A2D42"\r
+            {\r
+            "SourcePath" = "8:..\\test\\get-notifications.test"\r
+            "TargetName" = "8:get-notifications.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_592FC984DBFD494D9FB7DFFEA35AD7A5"\r
+            {\r
+            "SourcePath" = "8:..\\doc\\help\\man-ippfind.html"\r
+            "TargetName" = "8:man-ippfind.html"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
             "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_65CBD149C9DA448FBACE2B02766A6537"\r
             {\r
             "SourcePath" = "8:..\\test\\testfile.ps"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9314DE98517C42E9AF190B67472408DF"\r
+            {\r
+            "SourcePath" = "8:..\\test\\get-subscriptions.test"\r
+            "TargetName" = "8:get-subscriptions.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
             "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9967519E7058965D4C7DEF47EB39CC50"\r
             {\r
             "SourcePath" = "8:CRYPT32.dll"\r
             "SharedLegacy" = "11:FALSE"\r
             "PackageAs" = "3:1"\r
             "Register" = "3:1"\r
-            "Exclude" = "11:TRUE"\r
+            "Exclude" = "11:FALSE"\r
             "IsDependency" = "11:TRUE"\r
             "IsolateTo" = "8:"\r
             }\r
             "SharedLegacy" = "11:FALSE"\r
             "PackageAs" = "3:1"\r
             "Register" = "3:1"\r
-            "Exclude" = "11:TRUE"\r
+            "Exclude" = "11:FALSE"\r
             "IsDependency" = "11:TRUE"\r
             "IsolateTo" = "8:"\r
             }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A63C5C4108AB4B588878482B26876DC5"\r
+            {\r
+            "SourcePath" = "8:..\\test\\validate-job.test"\r
+            "TargetName" = "8:validate-job.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
             "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_AF057921D20E4520A3C6420F0729A744"\r
             {\r
             "SourcePath" = "8:..\\IPPTOOL.txt"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B85BD013DC024B9E82862535191B405B"\r
+            {\r
+            "SourcePath" = "8:..\\test\\print-job-gzip.test"\r
+            "TargetName" = "8:print-job-gzip.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
             "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B9E79062FEF64745915546DDD5BF8D85"\r
             {\r
             "SourcePath" = "8:..\\CHANGES-IPPTOOL.txt"\r
             "Property" = "8:ProgramMenuFolder"\r
                 "Folders"\r
                 {\r
+                    "{9EF0B969-E518-4E46-987F-47570745A589}:_E379D4EDBAD0460BB876711E9062ADB4"\r
+                    {\r
+                    "Name" = "8:ipptool"\r
+                    "AlwaysCreate" = "11:FALSE"\r
+                    "Condition" = "8:"\r
+                    "Transitive" = "11:FALSE"\r
+                    "Property" = "8:_D115D2F4F12143B09D5FDA447A6A7D04"\r
+                        "Folders"\r
+                        {\r
+                        }\r
+                    }\r
                 }\r
             }\r
             "{1525181F-901A-416C-8A58-119130FE478E}:_D02CDADE99F344CF92CA1A8D0278861F"\r
         {\r
         "Name" = "8:Microsoft Visual Studio"\r
         "ProductName" = "8:ipptool for Windows"\r
-        "ProductCode" = "8:{8220ED6C-8FAC-4E28-8589-867295E2A23D}"\r
-        "PackageCode" = "8:{B78F9AC6-92F9-48FF-AA11-ECD929442B4A}"\r
+        "ProductCode" = "8:{5B0420A3-BD82-4698-B8A1-9D9EC51A7836}"\r
+        "PackageCode" = "8:{ECECE842-1E95-48BD-962D-A4E62FBB5F89}"\r
         "UpgradeCode" = "8:{BAB6EBBB-515D-4155-9FEF-D98DA76814CA}"\r
         "RestartWWWService" = "11:FALSE"\r
         "RemovePreviousVersions" = "11:TRUE"\r
         "DetectNewerInstalledVersion" = "11:TRUE"\r
         "InstallAllUsers" = "11:TRUE"\r
-        "ProductVersion" = "8:12.02.0600"\r
+        "ProductVersion" = "8:13.07.3100"\r
         "Manufacturer" = "8:Apple Inc."\r
         "ARPHELPTELEPHONE" = "8:"\r
         "ARPHELPLINK" = "8:http://www.cups.org/str.php"\r
         }\r
         "Shortcut"\r
         {\r
+            "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_63715171338D40FFBC5B47A1418B4814"\r
+            {\r
+            "Name" = "8:README"\r
+            "Arguments" = "8:"\r
+            "Description" = "8:"\r
+            "ShowCmd" = "3:1"\r
+            "IconIndex" = "3:0"\r
+            "Transitive" = "11:FALSE"\r
+            "Target" = "8:_AF057921D20E4520A3C6420F0729A744"\r
+            "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"\r
+            "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Icon" = "8:"\r
+            "Feature" = "8:"\r
+            }\r
+            "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_70CF74DB997A408DBBFD48AB10F92321"\r
+            {\r
+            "Name" = "8:ipptool Documentation"\r
+            "Arguments" = "8:"\r
+            "Description" = "8:"\r
+            "ShowCmd" = "3:1"\r
+            "IconIndex" = "3:0"\r
+            "Transitive" = "11:FALSE"\r
+            "Target" = "8:_D5CD9D9AB1644688A1D54B1589BDF724"\r
+            "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"\r
+            "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Icon" = "8:"\r
+            "Feature" = "8:"\r
+            }\r
+            "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_BD2A7DF74D844FF5919EE8340EE36ECD"\r
+            {\r
+            "Name" = "8:Test File Documentation"\r
+            "Arguments" = "8:"\r
+            "Description" = "8:"\r
+            "ShowCmd" = "3:1"\r
+            "IconIndex" = "3:0"\r
+            "Transitive" = "11:FALSE"\r
+            "Target" = "8:_1A1324305D78463BBFC62269C56DCF0B"\r
+            "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"\r
+            "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Icon" = "8:"\r
+            "Feature" = "8:"\r
+            }\r
         }\r
         "UserInterface"\r
         {\r
         }\r
         "MergeModule"\r
         {\r
-            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_7AFD2BBA568D45F5B1E871E2B93892BC"\r
+            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_4273A45FE6E54897AC9A4F66D9AA59EC"\r
             {\r
             "UseDynamicProperties" = "11:TRUE"\r
             "IsDependency" = "11:TRUE"\r
-            "SourcePath" = "8:policy_9_0_Microsoft_VC90_DebugCRT_x86.msm"\r
+            "SourcePath" = "8:microsoft_vc90_debugcrt_x86.msm"\r
                 "Properties"\r
                 {\r
                 }\r
             "Feature" = "8:"\r
             "IsolateTo" = "8:"\r
             }\r
-            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_F0AA062C769A4867B5C302491CA4F2D3"\r
+            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_8A6033CAC27E4C1185B4FDF7D2BF8D2E"\r
             {\r
             "UseDynamicProperties" = "11:TRUE"\r
             "IsDependency" = "11:TRUE"\r
-            "SourcePath" = "8:microsoft_vc90_debugcrt_x86.msm"\r
+            "SourcePath" = "8:policy_9_0_Microsoft_VC90_DebugCRT_x86.msm"\r
                 "Properties"\r
                 {\r
                 }\r
         }\r
         "ProjectOutput"\r
         {\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_58DC0E72F0944BEFB927AED718CD1660"\r
+            {\r
+            "SourcePath" = "8:Win32\\Release\\ippfind.exe"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{B484DA0C-62C8-4C32-83B6-CCEB58968B85}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
             "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_D02EB13951314EFD9C539150EF8E53B8"\r
             {\r
-            "SourcePath" = "8:Win32\\Debug\\regex.dll"\r
+            "SourcePath" = "8:Win32\\Release\\regex.dll"\r
             "TargetName" = "8:"\r
             "Tag" = "8:"\r
             "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
             }\r
             "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E97571D3FBE048DABDC59B37762D800F"\r
             {\r
-            "SourcePath" = "8:Win32\\Debug\\ipptool.exe"\r
+            "SourcePath" = "8:Win32\\Release\\ipptool.exe"\r
             "TargetName" = "8:"\r
             "Tag" = "8:"\r
             "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
             }\r
             "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_EA282F32A10B4ED1A81AA6133B997C6A"\r
             {\r
-            "SourcePath" = "8:Win32\\Debug\\libcups2.dll"\r
+            "SourcePath" = "8:Win32\\Release\\libcups2.dll"\r
             "TargetName" = "8:"\r
             "Tag" = "8:"\r
             "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
index 75d6dd8..74b2216 100644 (file)
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_1AF767BD52F94DC08C2CBE11DA41E95A"\r
+        "MsmKey" = "8:_16CCCC95D1BE41A981EAA4CDAD772F32"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_1859B81745C54E228CDCA94F130C8150"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_1DFD9AECD1AD4B2291DD52028E866569"\r
-        "OwnerKey" = "8:_62CA00B1E5E4460CA93EE7E2B8FE878B"\r
+        "MsmKey" = "8:_1AF767BD52F94DC08C2CBE11DA41E95A"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_232E0EB837A04A5B90312D947F1A7905"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_24E7DBA1F5964574A8251258BCDC935D"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_253C714B01974C9BB1A698DD449F588D"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_260594D75E4B4764BBAFE25C15E4F273"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_35AE0E84A609BB191E4085A2681730D1"\r
+        "OwnerKey" = "8:_E9925AF9A2D343D6BFE5BDAE33481292"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_35AE0E84A609BB191E4085A2681730D1"\r
+        "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_364DCCAFF25145BCBE75FFEEDCC75B3A"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_3CBB55F3EBEA4645BE6CEC8A0F251B80"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_3CFC5A9B09ED4916A350B88FEF4662CC"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_3CFD2A1A9D824E2491CC2BAC1334BA13"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_3F5E38826D0C441897F43747FFA7491A"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_4879AF80C19D4ED9A3758DCC412190FB"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_574EE5A852D3434987B58E3B8118C1C2"\r
+        "MsmKey" = "8:_4A46F690254944ECBF1539E2C2F86A59"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_5ED87BAE980C4992A4C74AEAEC4A57CF"\r
+        "MsmKey" = "8:_51381771E03E40DEA842E785C9B7A31B"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_62CA00B1E5E4460CA93EE7E2B8FE878B"\r
-        "OwnerKey" = "8:_0299839A2CCC4F908C5D3A8F465F3FFE"\r
+        "MsmKey" = "8:_52B5F2EDEDEC48B5A1188F780C67DE9B"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_62CA00B1E5E4460CA93EE7E2B8FE878B"\r
-        "OwnerKey" = "8:_B20638175CCB42398417E0683A12469C"\r
+        "MsmKey" = "8:_574EE5A852D3434987B58E3B8118C1C2"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_62CA00B1E5E4460CA93EE7E2B8FE878B"\r
-        "OwnerKey" = "8:_364DCCAFF25145BCBE75FFEEDCC75B3A"\r
+        "MsmKey" = "8:_5914C46E15794A9093C5BF50A983D502"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_62CA00B1E5E4460CA93EE7E2B8FE878B"\r
-        "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "MsmKey" = "8:_5B2FBC1C3AD5490689A61629854C80AF"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_62CA00B1E5E4460CA93EE7E2B8FE878B"\r
-        "OwnerKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"\r
+        "MsmKey" = "8:_5BBA58EFC5A9495BBEF1752E15F4A077"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_5ED87BAE980C4992A4C74AEAEC4A57CF"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_666BC59DB1514D61AE06860A2894BE4C"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_6BD69E32EE9A4D2B9ECC40558A68FCD8"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_7A478A9B37C44B22BD4F926913C9A5B7"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_7FC58520B0F44E3E95A207905CABFED4"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_9967519E7058965D4C7DEF47EB39CC50"\r
-        "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "MsmKey" = "8:_933D37C7FEBF4B8AAF9E6CE01A605039"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_9FBF78D7B89EEA843380D5F10E1954D7"\r
+        "MsmKey" = "8:_A271CCE042C14DDF8F0F1A1B16584F17"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_A513FBE6CC6247C19AF06829E5470D01"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_A833908023464B61A160E0323C8E9606"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_B15F5898006758C3483850D50CA2C7F0"\r
+        "OwnerKey" = "8:_E9925AF9A2D343D6BFE5BDAE33481292"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_B15F5898006758C3483850D50CA2C7F0"\r
         "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_A271CCE042C14DDF8F0F1A1B16584F17"\r
+        "MsmKey" = "8:_B20638175CCB42398417E0683A12469C"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_A513FBE6CC6247C19AF06829E5470D01"\r
+        "MsmKey" = "8:_B38E399C93724A9BB5F429DABBA6301F"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_A833908023464B61A160E0323C8E9606"\r
+        "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"\r
+        "OwnerKey" = "8:_0299839A2CCC4F908C5D3A8F465F3FFE"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"\r
+        "OwnerKey" = "8:_5B2FBC1C3AD5490689A61629854C80AF"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"\r
+        "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"\r
+        "OwnerKey" = "8:_E9925AF9A2D343D6BFE5BDAE33481292"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"\r
+        "OwnerKey" = "8:_D3197C67CBAC46DE854CF283CDBC677E"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"\r
+        "OwnerKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"\r
+        "OwnerKey" = "8:_B20638175CCB42398417E0683A12469C"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"\r
+        "OwnerKey" = "8:_364DCCAFF25145BCBE75FFEEDCC75B3A"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_BAEADCCB6AD74F36AE08401229354D79"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
-        "MsmKey" = "8:_B20638175CCB42398417E0683A12469C"\r
+        "MsmKey" = "8:_C17DC336766E4B1BBC8DD24D686C440A"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_CAF8F7B63E0E9F92F4B3B83FA9CC5424"\r
+        "OwnerKey" = "8:_E9925AF9A2D343D6BFE5BDAE33481292"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_CAF8F7B63E0E9F92F4B3B83FA9CC5424"\r
+        "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_CD0CFE42ED2D4416A01253E12A0082A8"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_CE2A836CE5AF4404B8672B100A9FC9ED"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_D3197C67CBAC46DE854CF283CDBC677E"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_D3B3B266E0FC45DD9B7EEBCC3AC52965"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_E9925AF9A2D343D6BFE5BDAE33481292"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_F39E4E6E6DCB48E08E9E51E724E77DCF"\r
+        "OwnerKey" = "8:_B7023A0B2ADF4B4D822FAEE062F9BD87"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_F77CB9E0AE78446481BD8BFD680F548E"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
         }\r
         "Entry"\r
         {\r
+        "MsmKey" = "8:_F7FBD6E1C73B45EA813FB1D5E6050650"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
         "MsmKey" = "8:_FA604C5C4FDD4D7B8110AFC6B603FBAF"\r
         "OwnerKey" = "8:_UNDEFINED"\r
         "MsmSig" = "8:_UNDEFINED"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1859B81745C54E228CDCA94F130C8150"\r
+            {\r
+            "SourcePath" = "8:..\\test\\get-notifications.test"\r
+            "TargetName" = "8:get-notifications.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_9DFBB4777E594B0F8884792467931241"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
             "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1AF767BD52F94DC08C2CBE11DA41E95A"\r
             {\r
             "SourcePath" = "8:..\\doc\\images\\raster.png"\r
             "SourcePath" = "8:..\\cups\\adminutil.h"\r
             "TargetName" = "8:adminutil.h"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_232E0EB837A04A5B90312D947F1A7905"\r
+            {\r
+            "SourcePath" = "8:..\\doc\\help\\man-ipptool.html"\r
+            "TargetName" = "8:man-ipptool.html"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_24DE31CE70694FD2977B5FB38F24D77F"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "SourcePath" = "8:..\\cups\\http.h"\r
             "TargetName" = "8:http.h"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_253C714B01974C9BB1A698DD449F588D"\r
+            {\r
+            "SourcePath" = "8:..\\test\\validate-job.test"\r
+            "TargetName" = "8:validate-job.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_9DFBB4777E594B0F8884792467931241"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "SourcePath" = "8:..\\cups\\ipp.h"\r
             "TargetName" = "8:ipp.h"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_35AE0E84A609BB191E4085A2681730D1"\r
+            {\r
+            "SourcePath" = "8:CRYPT32.dll"\r
+            "TargetName" = "8:CRYPT32.dll"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_C8D931ADC425446B916E9711B929659F"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:TRUE"\r
+            "IsolateTo" = "8:"\r
+            }\r
             "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3697A58F04D14955AA428E89771E7BA3"\r
             {\r
             "SourcePath" = "8:..\\test\\ipp-2.0.test"\r
             "SourcePath" = "8:Win32\\Release\\libcups2.lib"\r
             "TargetName" = "8:libcups2.lib"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_2927DAE23F604CF9B8B4D1EC01A6F158"\r
+            "Folder" = "8:_BC1E27FED70845D1BA482FB1D96972F5"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "SourcePath" = "8:..\\cups\\transcode.h"\r
             "TargetName" = "8:transcode.h"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
-            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4879AF80C19D4ED9A3758DCC412190FB"\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3CFD2A1A9D824E2491CC2BAC1334BA13"\r
             {\r
-            "SourcePath" = "8:..\\cups\\raster.h"\r
-            "TargetName" = "8:raster.h"\r
+            "SourcePath" = "8:..\\test\\get-subscriptions.test"\r
+            "TargetName" = "8:get-subscriptions.test"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"\r
+            "Folder" = "8:_9DFBB4777E594B0F8884792467931241"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
-            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_574EE5A852D3434987B58E3B8118C1C2"\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4879AF80C19D4ED9A3758DCC412190FB"\r
             {\r
-            "SourcePath" = "8:..\\cups\\array.h"\r
-            "TargetName" = "8:array.h"\r
+            "SourcePath" = "8:..\\cups\\raster.h"\r
+            "TargetName" = "8:raster.h"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
-            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5ED87BAE980C4992A4C74AEAEC4A57CF"\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4A46F690254944ECBF1539E2C2F86A59"\r
             {\r
-            "SourcePath" = "8:..\\cups\\ppd.h"\r
-            "TargetName" = "8:ppd.h"\r
+            "SourcePath" = "8:..\\doc\\help\\man-ipptoolfile.html"\r
+            "TargetName" = "8:man-ipptoolfile.html"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"\r
+            "Folder" = "8:_24DE31CE70694FD2977B5FB38F24D77F"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
-            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_65560B58BEBF468C9D06493456A17DEC"\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_51381771E03E40DEA842E785C9B7A31B"\r
             {\r
-            "SourcePath" = "8:..\\cups\\language.h"\r
+            "SourcePath" = "8:..\\test\\print-job-gzip.test"\r
+            "TargetName" = "8:print-job-gzip.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_9DFBB4777E594B0F8884792467931241"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_574EE5A852D3434987B58E3B8118C1C2"\r
+            {\r
+            "SourcePath" = "8:..\\cups\\array.h"\r
+            "TargetName" = "8:array.h"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5914C46E15794A9093C5BF50A983D502"\r
+            {\r
+            "SourcePath" = "8:..\\doc\\help\\man-ippfind.html"\r
+            "TargetName" = "8:man-ippfind.html"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5BBA58EFC5A9495BBEF1752E15F4A077"\r
+            {\r
+            "SourcePath" = "8:README.txt"\r
+            "TargetName" = "8:README.txt"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5ED87BAE980C4992A4C74AEAEC4A57CF"\r
+            {\r
+            "SourcePath" = "8:..\\cups\\ppd.h"\r
+            "TargetName" = "8:ppd.h"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_65560B58BEBF468C9D06493456A17DEC"\r
+            {\r
+            "SourcePath" = "8:..\\cups\\language.h"\r
             "TargetName" = "8:language.h"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_666BC59DB1514D61AE06860A2894BE4C"\r
+            {\r
+            "SourcePath" = "8:..\\doc\\help\\man-cupstestppd.html"\r
+            "TargetName" = "8:man-cupstestppd.html"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_24DE31CE70694FD2977B5FB38F24D77F"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "SourcePath" = "8:Win32\\Release\\libcupsimage2.lib"\r
             "TargetName" = "8:libcupsimage2.lib"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_2927DAE23F604CF9B8B4D1EC01A6F158"\r
+            "Folder" = "8:_BC1E27FED70845D1BA482FB1D96972F5"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "SourcePath" = "8:..\\cups\\versioning.h"\r
             "TargetName" = "8:versioning.h"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "SourcePath" = "8:..\\cups\\dir.h"\r
             "TargetName" = "8:dir.h"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_7A478A9B37C44B22BD4F926913C9A5B7"\r
+            {\r
+            "SourcePath" = "8:..\\test\\get-jobs.test"\r
+            "TargetName" = "8:get-jobs.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_9DFBB4777E594B0F8884792467931241"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
-            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9967519E7058965D4C7DEF47EB39CC50"\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_933D37C7FEBF4B8AAF9E6CE01A605039"\r
             {\r
-            "SourcePath" = "8:CRYPT32.dll"\r
-            "TargetName" = "8:CRYPT32.dll"\r
+            "SourcePath" = "8:..\\test\\ipp-everywhere.test"\r
+            "TargetName" = "8:ipp-everywhere.test"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Folder" = "8:_9DFBB4777E594B0F8884792467931241"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "SharedLegacy" = "11:FALSE"\r
             "PackageAs" = "3:1"\r
             "Register" = "3:1"\r
-            "Exclude" = "11:TRUE"\r
-            "IsDependency" = "11:TRUE"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
             "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9D69B0FC2413407BA24D88B73EF456AA"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
-            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9FBF78D7B89EEA843380D5F10E1954D7"\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A271CCE042C14DDF8F0F1A1B16584F17"\r
             {\r
-            "SourcePath" = "8:Secur32.dll"\r
-            "TargetName" = "8:Secur32.dll"\r
+            "SourcePath" = "8:..\\doc\\help\\api-filedir.html"\r
+            "TargetName" = "8:api-filedir.html"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Folder" = "8:_24DE31CE70694FD2977B5FB38F24D77F"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "SharedLegacy" = "11:FALSE"\r
             "PackageAs" = "3:1"\r
             "Register" = "3:1"\r
-            "Exclude" = "11:TRUE"\r
-            "IsDependency" = "11:TRUE"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
-            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A271CCE042C14DDF8F0F1A1B16584F17"\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A513FBE6CC6247C19AF06829E5470D01"\r
             {\r
-            "SourcePath" = "8:..\\doc\\help\\api-filedir.html"\r
-            "TargetName" = "8:api-filedir.html"\r
+            "SourcePath" = "8:..\\test\\document-a4.pdf"\r
+            "TargetName" = "8:document-a4.pdf"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_24DE31CE70694FD2977B5FB38F24D77F"\r
+            "Folder" = "8:_9DFBB4777E594B0F8884792467931241"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
-            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A513FBE6CC6247C19AF06829E5470D01"\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A833908023464B61A160E0323C8E9606"\r
             {\r
-            "SourcePath" = "8:..\\test\\document-a4.pdf"\r
-            "TargetName" = "8:document-a4.pdf"\r
+            "SourcePath" = "8:..\\test\\document-letter.pdf"\r
+            "TargetName" = "8:document-letter.pdf"\r
             "Tag" = "8:"\r
             "Folder" = "8:_9DFBB4777E594B0F8884792467931241"\r
             "Condition" = "8:"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
-            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A833908023464B61A160E0323C8E9606"\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B15F5898006758C3483850D50CA2C7F0"\r
             {\r
-            "SourcePath" = "8:..\\test\\document-letter.pdf"\r
-            "TargetName" = "8:document-letter.pdf"\r
+            "SourcePath" = "8:Secur32.dll"\r
+            "TargetName" = "8:Secur32.dll"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_C8D931ADC425446B916E9711B929659F"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:TRUE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B38E399C93724A9BB5F429DABBA6301F"\r
+            {\r
+            "SourcePath" = "8:..\\test\\print-job-deflate.test"\r
+            "TargetName" = "8:print-job-deflate.test"\r
             "Tag" = "8:"\r
             "Folder" = "8:_9DFBB4777E594B0F8884792467931241"\r
             "Condition" = "8:"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_CAF8F7B63E0E9F92F4B3B83FA9CC5424"\r
+            {\r
+            "SourcePath" = "8:zlibwapi.dll"\r
+            "TargetName" = "8:zlibwapi.dll"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:TRUE"\r
+            "IsolateTo" = "8:"\r
+            }\r
             "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_CD0CFE42ED2D4416A01253E12A0082A8"\r
             {\r
             "SourcePath" = "8:..\\test\\testfile.pdf"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_CE2A836CE5AF4404B8672B100A9FC9ED"\r
+            {\r
+            "SourcePath" = "8:..\\IPPTOOL.txt"\r
+            "TargetName" = "8:IPPTOOL.txt"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
             "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D3B3B266E0FC45DD9B7EEBCC3AC52965"\r
             {\r
             "SourcePath" = "8:..\\test\\get-printer-attributes.test"\r
             "SourcePath" = "8:..\\cups\\cups.h"\r
             "TargetName" = "8:cups.h"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "SourcePath" = "8:..\\cups\\file.h"\r
             "TargetName" = "8:file.h"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_121A70CA434045EDB010E7480AFCEF18"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
             "IsDependency" = "11:FALSE"\r
             "IsolateTo" = "8:"\r
             }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F7FBD6E1C73B45EA813FB1D5E6050650"\r
+            {\r
+            "SourcePath" = "8:..\\cups\\pwg.h"\r
+            "TargetName" = "8:pwg.h"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
             "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_FA604C5C4FDD4D7B8110AFC6B603FBAF"\r
             {\r
             "SourcePath" = "8:..\\test\\onepage-letter.ps"\r
                     "Property" = "8:_23D8BBBA9DEE4C8E88C9D1624DEAFB81"\r
                         "Folders"\r
                         {\r
+                            "{9EF0B969-E518-4E46-987F-47570745A589}:_8EF6B1AA25034DB9BCC44F5A3CCFF9F0"\r
+                            {\r
+                            "Name" = "8:cups"\r
+                            "AlwaysCreate" = "11:FALSE"\r
+                            "Condition" = "8:"\r
+                            "Transitive" = "11:FALSE"\r
+                            "Property" = "8:_61254DF68D8F4039997C263F7B45ABB8"\r
+                                "Folders"\r
+                                {\r
+                                }\r
+                            }\r
                         }\r
                     }\r
                     "{9EF0B969-E518-4E46-987F-47570745A589}:_24DE31CE70694FD2977B5FB38F24D77F"\r
                     "Property" = "8:_927C9760A02446EBB2AEDE6BCCFDE29F"\r
                         "Folders"\r
                         {\r
+                            "{9EF0B969-E518-4E46-987F-47570745A589}:_ABA133175ABB48058F633A1599B418BC"\r
+                            {\r
+                            "Name" = "8:ReleaseX64"\r
+                            "AlwaysCreate" = "11:FALSE"\r
+                            "Condition" = "8:"\r
+                            "Transitive" = "11:FALSE"\r
+                            "Property" = "8:_B4A5B4451AA146D4AA06FDF59FF36FCD"\r
+                                "Folders"\r
+                                {\r
+                                }\r
+                            }\r
+                            "{9EF0B969-E518-4E46-987F-47570745A589}:_BC1E27FED70845D1BA482FB1D96972F5"\r
+                            {\r
+                            "Name" = "8:ReleaseWin32"\r
+                            "AlwaysCreate" = "11:FALSE"\r
+                            "Condition" = "8:"\r
+                            "Transitive" = "11:FALSE"\r
+                            "Property" = "8:_83BECF9B63434282B61BAA7043D96AB1"\r
+                                "Folders"\r
+                                {\r
+                                }\r
+                            }\r
+                            "{9EF0B969-E518-4E46-987F-47570745A589}:_E6A941208712461FAD0B4FB291EDDD56"\r
+                            {\r
+                            "Name" = "8:DebugWin32"\r
+                            "AlwaysCreate" = "11:FALSE"\r
+                            "Condition" = "8:"\r
+                            "Transitive" = "11:FALSE"\r
+                            "Property" = "8:_808CB654DBF7446FB4C3706759D6326C"\r
+                                "Folders"\r
+                                {\r
+                                }\r
+                            }\r
+                            "{9EF0B969-E518-4E46-987F-47570745A589}:_EB4E176E122E4686A21902DD986EC361"\r
+                            {\r
+                            "Name" = "8:DebugX64"\r
+                            "AlwaysCreate" = "11:FALSE"\r
+                            "Condition" = "8:"\r
+                            "Transitive" = "11:FALSE"\r
+                            "Property" = "8:_704A12AF60B74B92A12505146FD2CA2E"\r
+                                "Folders"\r
+                                {\r
+                                }\r
+                            }\r
                         }\r
                     }\r
                     "{9EF0B969-E518-4E46-987F-47570745A589}:_9DFBB4777E594B0F8884792467931241"\r
         {\r
         "Name" = "8:Microsoft Visual Studio"\r
         "ProductName" = "8:CUPS SDK for Windows"\r
-        "ProductCode" = "8:{4E0D1662-B032-4CAD-8DBD-5302ADCE1C6F}"\r
-        "PackageCode" = "8:{00298F12-01DD-4785-9402-7A1E694F9577}"\r
+        "ProductCode" = "8:{FE657BEF-0C7A-4175-9EAE-D482789E7AD5}"\r
+        "PackageCode" = "8:{2AE9BB2F-C4FC-4BB7-9A4D-77F83E55EA55}"\r
         "UpgradeCode" = "8:{BAB6EBBB-515D-4155-9FEF-D98DA76814CA}"\r
         "RestartWWWService" = "11:FALSE"\r
         "RemovePreviousVersions" = "11:TRUE"\r
         "DetectNewerInstalledVersion" = "11:TRUE"\r
         "InstallAllUsers" = "11:TRUE"\r
-        "ProductVersion" = "8:12.03.2600"\r
+        "ProductVersion" = "8:13.04.1800"\r
         "Manufacturer" = "8:Apple Inc."\r
         "ARPHELPTELEPHONE" = "8:"\r
         "ARPHELPLINK" = "8:http://www.cups.org/str.php"\r
         }\r
         "MergeModule"\r
         {\r
-            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_1DFD9AECD1AD4B2291DD52028E866569"\r
+            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_B7023A0B2ADF4B4D822FAEE062F9BD87"\r
             {\r
             "UseDynamicProperties" = "11:TRUE"\r
             "IsDependency" = "11:TRUE"\r
-            "SourcePath" = "8:microsoft_vc90_crt_x86.msm"\r
+            "SourcePath" = "8:policy_9_0_Microsoft_VC90_DebugCRT_x86.msm"\r
                 "Properties"\r
                 {\r
                 }\r
             "Feature" = "8:"\r
             "IsolateTo" = "8:"\r
             }\r
-            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_62CA00B1E5E4460CA93EE7E2B8FE878B"\r
+            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_F39E4E6E6DCB48E08E9E51E724E77DCF"\r
             {\r
             "UseDynamicProperties" = "11:TRUE"\r
             "IsDependency" = "11:TRUE"\r
-            "SourcePath" = "8:policy_9_0_Microsoft_VC90_CRT_x86.msm"\r
+            "SourcePath" = "8:microsoft_vc90_debugcrt_x86.msm"\r
                 "Properties"\r
                 {\r
                 }\r
         {\r
             "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_0299839A2CCC4F908C5D3A8F465F3FFE"\r
             {\r
-            "SourcePath" = "8:Win32\\Release\\libcupsimage2.dll"\r
+            "SourcePath" = "8:Win32\\Debug\\libcupsimage2.dll"\r
             "TargetName" = "8:"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_C8D931ADC425446B916E9711B929659F"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
                 {\r
                 }\r
             }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_16CCCC95D1BE41A981EAA4CDAD772F32"\r
+            {\r
+            "SourcePath" = "8:x64\\Debug\\regex.dll"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB4E176E122E4686A21902DD986EC361"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:Debug|x64"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{18950A1B-D37A-40C7-B2DF-C12986C0526E}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
             "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_364DCCAFF25145BCBE75FFEEDCC75B3A"\r
             {\r
-            "SourcePath" = "8:Win32\\Release\\cupstestppd.exe"\r
+            "SourcePath" = "8:Win32\\Debug\\cupstestppd.exe"\r
             "TargetName" = "8:"\r
             "Tag" = "8:"\r
             "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
                 {\r
                 }\r
             }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_3CBB55F3EBEA4645BE6CEC8A0F251B80"\r
+            {\r
+            "SourcePath" = "8:x64\\Release\\libcups2.dll"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_ABA133175ABB48058F633A1599B418BC"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:Release|x64"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_3F5E38826D0C441897F43747FFA7491A"\r
+            {\r
+            "SourcePath" = "8:x64\\Debug\\libcups2.dll"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB4E176E122E4686A21902DD986EC361"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:Debug|x64"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_52B5F2EDEDEC48B5A1188F780C67DE9B"\r
+            {\r
+            "SourcePath" = "8:Win32\\Release\\regex.dll"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_BC1E27FED70845D1BA482FB1D96972F5"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:Release|Win32"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{18950A1B-D37A-40C7-B2DF-C12986C0526E}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_5B2FBC1C3AD5490689A61629854C80AF"\r
+            {\r
+            "SourcePath" = "8:Win32\\Debug\\ippfind.exe"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{B484DA0C-62C8-4C32-83B6-CCEB58968B85}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
             "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_B20638175CCB42398417E0683A12469C"\r
             {\r
-            "SourcePath" = "8:Win32\\Release\\ipptool.exe"\r
+            "SourcePath" = "8:Win32\\Debug\\ipptool.exe"\r
             "TargetName" = "8:"\r
             "Tag" = "8:"\r
             "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
                 {\r
                 }\r
             }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_BAEADCCB6AD74F36AE08401229354D79"\r
+            {\r
+            "SourcePath" = "8:Win32\\Release\\libcups2.dll"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_BC1E27FED70845D1BA482FB1D96972F5"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:Release|Win32"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_C17DC336766E4B1BBC8DD24D686C440A"\r
+            {\r
+            "SourcePath" = "8:x64\\Release\\regex.dll"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_ABA133175ABB48058F633A1599B418BC"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:Release|x64"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{18950A1B-D37A-40C7-B2DF-C12986C0526E}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
             "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_D02EB13951314EFD9C539150EF8E53B8"\r
             {\r
-            "SourcePath" = "8:Win32\\Release\\regex.dll"\r
+            "SourcePath" = "8:Win32\\Debug\\regex.dll"\r
             "TargetName" = "8:"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_C8D931ADC425446B916E9711B929659F"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
                 {\r
                 }\r
             }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_D3197C67CBAC46DE854CF283CDBC677E"\r
+            {\r
+            "SourcePath" = "8:Win32\\Debug\\regex.dll"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_E6A941208712461FAD0B4FB291EDDD56"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:Debug|Win32"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{18950A1B-D37A-40C7-B2DF-C12986C0526E}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E9925AF9A2D343D6BFE5BDAE33481292"\r
+            {\r
+            "SourcePath" = "8:Win32\\Debug\\libcups2.dll"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_E6A941208712461FAD0B4FB291EDDD56"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:Debug|Win32"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
             "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_EA282F32A10B4ED1A81AA6133B997C6A"\r
             {\r
-            "SourcePath" = "8:Win32\\Release\\libcups2.dll"\r
+            "SourcePath" = "8:Win32\\Debug\\libcups2.dll"\r
             "TargetName" = "8:"\r
             "Tag" = "8:"\r
-            "Folder" = "8:_C8D931ADC425446B916E9711B929659F"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
             "Condition" = "8:"\r
             "Transitive" = "11:FALSE"\r
             "Vital" = "11:TRUE"\r
index 6e12bda..d22a863 100644 (file)
@@ -4,6 +4,7 @@
        Version="9.00"\r
        Name="libcups2"\r
        ProjectGUID="{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"\r
+       RootNamespace="libcups2"\r
        Keyword="Win32Proj"\r
        TargetFrameworkVersion="131072"\r
        >\r
@@ -44,8 +45,8 @@
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"\r
-                               PreprocessorDefinitions="WIN32;DEBUG;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
+                               AdditionalIncludeDirectories="..\vcnet,..,..\vcnet\regex"\r
+                               PreprocessorDefinitions="ZLIB_WINAPI;WIN32;DEBUG;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
                                MinimalRebuild="true"\r
                                BasicRuntimeChecks="3"\r
                                RuntimeLibrary="3"\r
@@ -67,7 +68,7 @@
                        <Tool\r
                                Name="VCLinkerTool"\r
                                AdditionalOptions="/NODEFAULTLIB:libcmt"\r
-                               AdditionalDependencies="ws2_32.lib advapi32.lib"\r
+                               AdditionalDependencies="ws2_32.lib advapi32.lib zlibwapi.lib"\r
                                OutputFile="$(OutDir)\libcups2.dll"\r
                                LinkIncremental="2"\r
                                ModuleDefinitionFile="..\cups\libcups2.def"\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="..\vcnet,.."\r
-                               PreprocessorDefinitions="WIN32;DEBUG;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
+                               AdditionalIncludeDirectories="..\vcnet,..,..\vcnet\regex"\r
+                               PreprocessorDefinitions="ZLIB_WINAPI;WIN32;DEBUG;_DEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
                                MinimalRebuild="true"\r
                                BasicRuntimeChecks="3"\r
                                RuntimeLibrary="3"\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
-                               AdditionalDependencies="ws2_32.lib advapi32.lib"\r
+                               AdditionalDependencies="ws2_32.lib advapi32.lib zlibwapi.lib"\r
                                OutputFile="$(OutDir)\libcups2.dll"\r
                                LinkIncremental="2"\r
                                ModuleDefinitionFile="..\cups\libcups2.def"\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="1"\r
-                               AdditionalIncludeDirectories="..\vcnet;..;..\vcnet\regex"\r
-                               PreprocessorDefinitions="WIN32;DEBUG;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
+                               AdditionalIncludeDirectories="..\vcnet,..,..\vcnet\regex"\r
+                               PreprocessorDefinitions="ZLIB_WINAPI;WIN32;DEBUG;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
                                RuntimeLibrary="2"\r
                                UsePrecompiledHeader="0"\r
                                WarningLevel="3"\r
                        <Tool\r
                                Name="VCLinkerTool"\r
                                AdditionalOptions="/NODEFAULTLIB:libcmt"\r
-                               AdditionalDependencies="ws2_32.lib advapi32.lib"\r
+                               AdditionalDependencies="ws2_32.lib advapi32.lib zlibwapi.lib"\r
                                OutputFile="$(OutDir)\libcups2.dll"\r
                                LinkIncremental="1"\r
                                ModuleDefinitionFile="..\cups\libcups2.def"\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="1"\r
-                               AdditionalIncludeDirectories="..\vcnet,.."\r
-                               PreprocessorDefinitions="WIN32;DEBUG;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
+                               AdditionalIncludeDirectories="..\vcnet,..,..\vcnet\regex"\r
+                               PreprocessorDefinitions="ZLIB_WINAPI;WIN32;DEBUG;NDEBUG;_WINDOWS;_USRDLL;LIBCUPS2_EXPORTS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS"\r
                                RuntimeLibrary="2"\r
                                UsePrecompiledHeader="0"\r
                                WarningLevel="3"\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
-                               AdditionalDependencies="ws2_32.lib advapi32.lib"\r
+                               AdditionalDependencies="ws2_32.lib advapi32.lib zlibwapi.lib"\r
                                OutputFile="$(OutDir)\libcups2.dll"\r
                                LinkIncremental="1"\r
                                ModuleDefinitionFile="..\cups\libcups2.def"\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\cups\dest-job.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\cups\dest-localization.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\cups\dest-options.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\cups\dest.c"\r
                                >\r
                                <FileConfiguration\r
                                </FileConfiguration>\r
                        </File>\r
                        <File\r
+                               RelativePath="..\cups\libcups2.def"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\cups\localize.c"\r
                                >\r
                        </File>\r
                                </FileConfiguration>\r
                        </File>\r
                        <File\r
-                               RelativePath="..\cups\sspi.c"\r
-                               >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\cups\string.c"\r
                                >\r
                                <FileConfiguration\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\cups\tls.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\cups\transcode.c"\r
                                >\r
                                <FileConfiguration\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath="..\cups\cups-private.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\cups\cups.h"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\cups\sspi-private.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\cups\string-private.h"\r
                                >\r
                        </File>\r
index 8b13f6f..fbc9fdf 100644 (file)
@@ -12,6 +12,9 @@
                <Platform\r
                        Name="Win32"\r
                />\r
+               <Platform\r
+                       Name="x64"\r
+               />\r
        </Platforms>\r
        <ToolFiles>\r
        </ToolFiles>\r
                                Name="VCPostBuildEventTool"\r
                        />\r
                </Configuration>\r
+               <Configuration\r
+                       Name="Debug|x64"\r
+                       OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="regex"\r
+                               PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;REGEX_EXPORTS"\r
+                               MinimalRebuild="true"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               LinkIncremental="2"\r
+                               ModuleDefinitionFile="regex/regex.def"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|x64"\r
+                       OutputDirectory="$(PlatformName)\$(ConfigurationName)"\r
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"\r
+                       ConfigurationType="2"\r
+                       CharacterSet="1"\r
+                       WholeProgramOptimization="1"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               EnableIntrinsicFunctions="true"\r
+                               AdditionalIncludeDirectories="regex"\r
+                               PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;REGEX_EXPORTS"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               UsePrecompiledHeader="0"\r
+                               WarningLevel="3"\r
+                               DebugInformationFormat="3"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLinkerTool"\r
+                               LinkIncremental="1"\r
+                               ModuleDefinitionFile="regex/regex.def"\r
+                               GenerateDebugInformation="true"\r
+                               SubSystem="2"\r
+                               OptimizeReferences="2"\r
+                               EnableCOMDATFolding="2"\r
+                               TargetMachine="17"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManifestTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCAppVerifierTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
        </Configurations>\r
        <References>\r
        </References>\r
index 5df5d53..22e7433 100644 (file)
@@ -1345,7 +1345,7 @@ sopno finish;                     /* to this less one */
                return(ret);
        enlarge(p, p->ssize + len);     /* this many unexpected additions */
        assert(p->ssize >= p->slen + len);
-       (void) memcpy((char *)(p->strip + p->slen),
+       (void) memmove((char *)(p->strip + p->slen),
                (char *)(p->strip + start), (size_t)len*sizeof(sop));
        p->slen += len;
        return(ret);
diff --git a/vcnet/sw-ippeveselfcert10.vdproj b/vcnet/sw-ippeveselfcert10.vdproj
new file mode 100644 (file)
index 0000000..2895a46
--- /dev/null
@@ -0,0 +1,1581 @@
+"DeployProject"\r
+{\r
+"VSVersion" = "3:800"\r
+"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"\r
+"IsWebType" = "8:FALSE"\r
+"ProjectName" = "8:sw-ippeveselfcert10"\r
+"LanguageId" = "3:1033"\r
+"CodePage" = "3:1252"\r
+"UILanguageId" = "3:1033"\r
+"SccProjectName" = "8:"\r
+"SccLocalPath" = "8:"\r
+"SccAuxPath" = "8:"\r
+"SccProvider" = "8:"\r
+    "Hierarchy"\r
+    {\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_156E3B06B7D14775B28242360FB7D1A0"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_1A1324305D78463BBFC62269C56DCF0B"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_1BCBABF5693841AE92515645BB7765F4"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_1DBDCFABB8DF28E5F75E41EDAE4BF6BE"\r
+        "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_27AB74FFFBC7436B9EBC6AE23968CFCC"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_299D5816FF7142F3B2791685551AD1DC"\r
+        "OwnerKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_43D276E6E3054544A6A9828BE66519CD"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_466C1CF41795452A8B76425F8D05D8B8"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_58DC0E72F0944BEFB927AED718CD1660"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_592FC984DBFD494D9FB7DFFEA35AD7A5"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_842C04D73EBC4F5DBC2FD58D5B98D5D1"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_965005559A264140806149D54E2243BB"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_9967519E7058965D4C7DEF47EB39CC50"\r
+        "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_9CB71023ADF84278A4A5EBC398F6C9F3"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_9FBF78D7B89EEA843380D5F10E1954D7"\r
+        "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A"\r
+        "OwnerKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A"\r
+        "OwnerKey" = "8:_58DC0E72F0944BEFB927AED718CD1660"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A"\r
+        "OwnerKey" = "8:_466C1CF41795452A8B76425F8D05D8B8"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A"\r
+        "OwnerKey" = "8:_E97571D3FBE048DABDC59B37762D800F"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_A1CB27EFF4094C39B58D0BE5A272DF1A"\r
+        "OwnerKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_A9EA3BF89F284AB4853F0682CE277275"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_B7D835B019744E61A7CC37B57B38694E"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_BD5B70C103EF41D9A30CF249D2B93CEB"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_C430646D6E7C4CBDA84F951AE95EB76F"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_D02EB13951314EFD9C539150EF8E53B8"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_D219587BACAC4D5FB4C8010900A781AD"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_D5CD9D9AB1644688A1D54B1589BDF724"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_E3C6C5A7FDD94965B68960844461D5EA"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_E5E464C7DD97439B929E1EA1844F1FF0"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_E97571D3FBE048DABDC59B37762D800F"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+        "Entry"\r
+        {\r
+        "MsmKey" = "8:_F22F5380A6E14A43A15A452C7C6F6C07"\r
+        "OwnerKey" = "8:_UNDEFINED"\r
+        "MsmSig" = "8:_UNDEFINED"\r
+        }\r
+    }\r
+    "Configurations"\r
+    {\r
+        "Debug"\r
+        {\r
+        "DisplayName" = "8:Debug"\r
+        "IsDebugOnly" = "11:TRUE"\r
+        "IsReleaseOnly" = "11:FALSE"\r
+        "OutputFilename" = "8:sw-ippeveselfcert10-windows.msi"\r
+        "PackageFilesAs" = "3:2"\r
+        "PackageFileSize" = "3:-2147483648"\r
+        "CabType" = "3:1"\r
+        "Compression" = "3:3"\r
+        "SignOutput" = "11:FALSE"\r
+        "CertificateFile" = "8:"\r
+        "PrivateKeyFile" = "8:"\r
+        "TimeStampServer" = "8:"\r
+        "InstallerBootstrapper" = "3:2"\r
+            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"\r
+            {\r
+            "Enabled" = "11:TRUE"\r
+            "PromptEnabled" = "11:TRUE"\r
+            "PrerequisitesLocation" = "2:1"\r
+            "Url" = "8:"\r
+            "ComponentsUrl" = "8:"\r
+                "Items"\r
+                {\r
+                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5.SP1"\r
+                    {\r
+                    "Name" = "8:.NET Framework 3.5 SP1"\r
+                    "ProductCode" = "8:Microsoft.Net.Framework.3.5.SP1"\r
+                    }\r
+                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1"\r
+                    {\r
+                    "Name" = "8:Windows Installer 3.1"\r
+                    "ProductCode" = "8:Microsoft.Windows.Installer.3.1"\r
+                    }\r
+                }\r
+            }\r
+        }\r
+        "Release"\r
+        {\r
+        "DisplayName" = "8:Release"\r
+        "IsDebugOnly" = "11:FALSE"\r
+        "IsReleaseOnly" = "11:TRUE"\r
+        "OutputFilename" = "8:ipptool-windows.msi"\r
+        "PackageFilesAs" = "3:2"\r
+        "PackageFileSize" = "3:-2147483648"\r
+        "CabType" = "3:1"\r
+        "Compression" = "3:3"\r
+        "SignOutput" = "11:FALSE"\r
+        "CertificateFile" = "8:"\r
+        "PrivateKeyFile" = "8:"\r
+        "TimeStampServer" = "8:"\r
+        "InstallerBootstrapper" = "3:2"\r
+            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"\r
+            {\r
+            "Enabled" = "11:TRUE"\r
+            "PromptEnabled" = "11:TRUE"\r
+            "PrerequisitesLocation" = "2:1"\r
+            "Url" = "8:"\r
+            "ComponentsUrl" = "8:"\r
+                "Items"\r
+                {\r
+                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5.SP1"\r
+                    {\r
+                    "Name" = "8:.NET Framework 3.5 SP1"\r
+                    "ProductCode" = "8:Microsoft.Net.Framework.3.5.SP1"\r
+                    }\r
+                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1"\r
+                    {\r
+                    "Name" = "8:Windows Installer 3.1"\r
+                    "ProductCode" = "8:Microsoft.Windows.Installer.3.1"\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+    "Deployable"\r
+    {\r
+        "CustomAction"\r
+        {\r
+        }\r
+        "DefaultFeature"\r
+        {\r
+        "Name" = "8:DefaultFeature"\r
+        "Title" = "8:"\r
+        "Description" = "8:"\r
+        }\r
+        "ExternalPersistence"\r
+        {\r
+            "LaunchCondition"\r
+            {\r
+            }\r
+        }\r
+        "File"\r
+        {\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_156E3B06B7D14775B28242360FB7D1A0"\r
+            {\r
+            "SourcePath" = "8:..\\everywhere\\document-tests.bat"\r
+            "TargetName" = "8:document-tests.bat"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1A1324305D78463BBFC62269C56DCF0B"\r
+            {\r
+            "SourcePath" = "8:..\\doc\\help\\man-ipptoolfile.html"\r
+            "TargetName" = "8:man-ipptoolfile.html"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_26743E387598422398CF503F7478F9E1"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1BCBABF5693841AE92515645BB7765F4"\r
+            {\r
+            "SourcePath" = "8:..\\everywhere\\man-ippserver.html"\r
+            "TargetName" = "8:man-ippserver.html"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_26743E387598422398CF503F7478F9E1"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1DBDCFABB8DF28E5F75E41EDAE4BF6BE"\r
+            {\r
+            "SourcePath" = "8:zlibwapi.dll"\r
+            "TargetName" = "8:zlibwapi.dll"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:TRUE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_27AB74FFFBC7436B9EBC6AE23968CFCC"\r
+            {\r
+            "SourcePath" = "8:..\\everywhere\\README.txt"\r
+            "TargetName" = "8:README.txt"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_43D276E6E3054544A6A9828BE66519CD"\r
+            {\r
+            "SourcePath" = "8:..\\test\\printer.png"\r
+            "TargetName" = "8:printer.png"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_592FC984DBFD494D9FB7DFFEA35AD7A5"\r
+            {\r
+            "SourcePath" = "8:..\\doc\\help\\man-ippfind.html"\r
+            "TargetName" = "8:man-ippfind.html"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_26743E387598422398CF503F7478F9E1"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_842C04D73EBC4F5DBC2FD58D5B98D5D1"\r
+            {\r
+            "SourcePath" = "8:..\\test\\document-a4.pdf"\r
+            "TargetName" = "8:document-a4.pdf"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_965005559A264140806149D54E2243BB"\r
+            {\r
+            "SourcePath" = "8:..\\everywhere\\bonjour-access-tests.test"\r
+            "TargetName" = "8:bonjour-access-tests.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9967519E7058965D4C7DEF47EB39CC50"\r
+            {\r
+            "SourcePath" = "8:CRYPT32.dll"\r
+            "TargetName" = "8:CRYPT32.dll"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:TRUE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9CB71023ADF84278A4A5EBC398F6C9F3"\r
+            {\r
+            "SourcePath" = "8:..\\everywhere\\bonjour-tests.bat"\r
+            "TargetName" = "8:bonjour-tests.bat"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9FBF78D7B89EEA843380D5F10E1954D7"\r
+            {\r
+            "SourcePath" = "8:Secur32.dll"\r
+            "TargetName" = "8:Secur32.dll"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:TRUE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A9EA3BF89F284AB4853F0682CE277275"\r
+            {\r
+            "SourcePath" = "8:..\\everywhere\\bonjour-value-tests.test"\r
+            "TargetName" = "8:bonjour-value-tests.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B7D835B019744E61A7CC37B57B38694E"\r
+            {\r
+            "SourcePath" = "8:..\\everywhere\\document-tests.test"\r
+            "TargetName" = "8:document-tests.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_BD5B70C103EF41D9A30CF249D2B93CEB"\r
+            {\r
+            "SourcePath" = "8:setdebug.bat"\r
+            "TargetName" = "8:setdebug.bat"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C430646D6E7C4CBDA84F951AE95EB76F"\r
+            {\r
+            "SourcePath" = "8:..\\test\\color.jpg"\r
+            "TargetName" = "8:color.jpg"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D219587BACAC4D5FB4C8010900A781AD"\r
+            {\r
+            "SourcePath" = "8:..\\everywhere\\ipp-tests.test"\r
+            "TargetName" = "8:ipp-tests.test"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D5CD9D9AB1644688A1D54B1589BDF724"\r
+            {\r
+            "SourcePath" = "8:..\\doc\\help\\man-ipptool.html"\r
+            "TargetName" = "8:man-ipptool.html"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_26743E387598422398CF503F7478F9E1"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E3C6C5A7FDD94965B68960844461D5EA"\r
+            {\r
+            "SourcePath" = "8:..\\LICENSE.txt"\r
+            "TargetName" = "8:LICENSE.txt"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E5E464C7DD97439B929E1EA1844F1FF0"\r
+            {\r
+            "SourcePath" = "8:..\\everywhere\\ipp-tests.bat"\r
+            "TargetName" = "8:ipp-tests.bat"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F22F5380A6E14A43A15A452C7C6F6C07"\r
+            {\r
+            "SourcePath" = "8:..\\test\\document-letter.pdf"\r
+            "TargetName" = "8:document-letter.pdf"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_EB00D0298C7E441EBD0257AC04FB3560"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            }\r
+        }\r
+        "FileType"\r
+        {\r
+        }\r
+        "Folder"\r
+        {\r
+            "{1525181F-901A-416C-8A58-119130FE478E}:_BEC0EAE20C954C78B294B83E6696156E"\r
+            {\r
+            "Name" = "8:#1919"\r
+            "AlwaysCreate" = "11:FALSE"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Property" = "8:ProgramMenuFolder"\r
+                "Folders"\r
+                {\r
+                    "{9EF0B969-E518-4E46-987F-47570745A589}:_E379D4EDBAD0460BB876711E9062ADB4"\r
+                    {\r
+                    "Name" = "8:IPP Everywhere Printer Self-Certification Tools"\r
+                    "AlwaysCreate" = "11:FALSE"\r
+                    "Condition" = "8:"\r
+                    "Transitive" = "11:FALSE"\r
+                    "Property" = "8:_D115D2F4F12143B09D5FDA447A6A7D04"\r
+                        "Folders"\r
+                        {\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+            "{1525181F-901A-416C-8A58-119130FE478E}:_D02CDADE99F344CF92CA1A8D0278861F"\r
+            {\r
+            "Name" = "8:#1916"\r
+            "AlwaysCreate" = "11:FALSE"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Property" = "8:DesktopFolder"\r
+                "Folders"\r
+                {\r
+                }\r
+            }\r
+            "{3C67513D-01DD-4637-8A68-80971EB9504F}:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            {\r
+            "DefaultLocation" = "8:[ProgramFilesFolder]\\sw-ippeveselfcert10"\r
+            "Name" = "8:#1925"\r
+            "AlwaysCreate" = "11:FALSE"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Property" = "8:TARGETDIR"\r
+                "Folders"\r
+                {\r
+                    "{9EF0B969-E518-4E46-987F-47570745A589}:_26743E387598422398CF503F7478F9E1"\r
+                    {\r
+                    "Name" = "8:doc"\r
+                    "AlwaysCreate" = "11:FALSE"\r
+                    "Condition" = "8:"\r
+                    "Transitive" = "11:FALSE"\r
+                    "Property" = "8:_5CD53B90FF754768B11ECBEB671A1749"\r
+                        "Folders"\r
+                        {\r
+                        }\r
+                    }\r
+                    "{9EF0B969-E518-4E46-987F-47570745A589}:_EB00D0298C7E441EBD0257AC04FB3560"\r
+                    {\r
+                    "Name" = "8:ipptool"\r
+                    "AlwaysCreate" = "11:FALSE"\r
+                    "Condition" = "8:"\r
+                    "Transitive" = "11:FALSE"\r
+                    "Property" = "8:_6F223FB51798428A9F2D64A5A7F2B49C"\r
+                        "Folders"\r
+                        {\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+        "LaunchCondition"\r
+        {\r
+        }\r
+        "Locator"\r
+        {\r
+        }\r
+        "MsiBootstrapper"\r
+        {\r
+        "LangId" = "3:1033"\r
+        "RequiresElevation" = "11:FALSE"\r
+        }\r
+        "Product"\r
+        {\r
+        "Name" = "8:Microsoft Visual Studio"\r
+        "ProductName" = "8:IPP Everywhere Printer Self-Certification Tools"\r
+        "ProductCode" = "8:{C08E3AC5-4FBF-40DD-BD19-9BE69A609DAF}"\r
+        "PackageCode" = "8:{25FF31C9-52A0-4838-8F1D-02FB5D5296F4}"\r
+        "UpgradeCode" = "8:{BAB6EBBB-515D-4155-9FEF-D98DA76814CA}"\r
+        "RestartWWWService" = "11:FALSE"\r
+        "RemovePreviousVersions" = "11:TRUE"\r
+        "DetectNewerInstalledVersion" = "11:TRUE"\r
+        "InstallAllUsers" = "11:TRUE"\r
+        "ProductVersion" = "8:14.08.2600"\r
+        "Manufacturer" = "8:Apple Inc."\r
+        "ARPHELPTELEPHONE" = "8:"\r
+        "ARPHELPLINK" = "8:http://www.cups.org/str.php"\r
+        "Title" = "8:sw-ippeveselfcert10"\r
+        "Subject" = "8:"\r
+        "ARPCONTACT" = "8:Apple Inc."\r
+        "Keywords" = "8:IPP, Internet Printing Protocol"\r
+        "ARPCOMMENTS" = "8:IPP Everywhere Printer Self-Certification Tools"\r
+        "ARPURLINFOABOUT" = "8:http://www.cups.org/"\r
+        "ARPPRODUCTICON" = "8:"\r
+        "ARPIconIndex" = "3:0"\r
+        "SearchPath" = "8:"\r
+        "UseSystemSearchPath" = "11:TRUE"\r
+        "TargetPlatform" = "3:0"\r
+        "PreBuildEvent" = "8:"\r
+        "PostBuildEvent" = "8:"\r
+        "RunPostBuildEvent" = "3:0"\r
+        }\r
+        "Registry"\r
+        {\r
+            "HKLM"\r
+            {\r
+                "Keys"\r
+                {\r
+                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BC4E66686BCA4F9A8B24B6CF2728DACD"\r
+                    {\r
+                    "Name" = "8:Software"\r
+                    "Condition" = "8:"\r
+                    "AlwaysCreate" = "11:FALSE"\r
+                    "DeleteAtUninstall" = "11:FALSE"\r
+                    "Transitive" = "11:FALSE"\r
+                        "Keys"\r
+                        {\r
+                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F9AB9B310C7545D993D690F529048AA2"\r
+                            {\r
+                            "Name" = "8:cups.org"\r
+                            "Condition" = "8:"\r
+                            "AlwaysCreate" = "11:FALSE"\r
+                            "DeleteAtUninstall" = "11:FALSE"\r
+                            "Transitive" = "11:FALSE"\r
+                                "Keys"\r
+                                {\r
+                                }\r
+                                "Values"\r
+                                {\r
+                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4E5BAC705A1D44E78C90C6D2A4A7BE20"\r
+                                    {\r
+                                    "Name" = "8:installdir"\r
+                                    "Condition" = "8:"\r
+                                    "Transitive" = "11:FALSE"\r
+                                    "ValueTypes" = "3:2"\r
+                                    "Value" = "8:[TARGETDIR]"\r
+                                    }\r
+                                }\r
+                            }\r
+                        }\r
+                        "Values"\r
+                        {\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+            "HKCU"\r
+            {\r
+                "Keys"\r
+                {\r
+                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_A4C9879F42874B6B92960A55F2D98922"\r
+                    {\r
+                    "Name" = "8:Software"\r
+                    "Condition" = "8:"\r
+                    "AlwaysCreate" = "11:FALSE"\r
+                    "DeleteAtUninstall" = "11:FALSE"\r
+                    "Transitive" = "11:FALSE"\r
+                        "Keys"\r
+                        {\r
+                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1ACB03C307FB4B85BB27C9913FB58B09"\r
+                            {\r
+                            "Name" = "8:[Manufacturer]"\r
+                            "Condition" = "8:"\r
+                            "AlwaysCreate" = "11:FALSE"\r
+                            "DeleteAtUninstall" = "11:FALSE"\r
+                            "Transitive" = "11:FALSE"\r
+                                "Keys"\r
+                                {\r
+                                }\r
+                                "Values"\r
+                                {\r
+                                }\r
+                            }\r
+                        }\r
+                        "Values"\r
+                        {\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+            "HKCR"\r
+            {\r
+                "Keys"\r
+                {\r
+                }\r
+            }\r
+            "HKU"\r
+            {\r
+                "Keys"\r
+                {\r
+                }\r
+            }\r
+            "HKPU"\r
+            {\r
+                "Keys"\r
+                {\r
+                }\r
+            }\r
+        }\r
+        "Sequences"\r
+        {\r
+        }\r
+        "Shortcut"\r
+        {\r
+            "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_57BCED85BA5944009F56A11D5A9FBBEE"\r
+            {\r
+            "Name" = "8:ippfind Documentation"\r
+            "Arguments" = "8:"\r
+            "Description" = "8:"\r
+            "ShowCmd" = "3:1"\r
+            "IconIndex" = "3:0"\r
+            "Transitive" = "11:FALSE"\r
+            "Target" = "8:_592FC984DBFD494D9FB7DFFEA35AD7A5"\r
+            "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"\r
+            "WorkingFolder" = "8:_26743E387598422398CF503F7478F9E1"\r
+            "Icon" = "8:"\r
+            "Feature" = "8:"\r
+            }\r
+            "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_63715171338D40FFBC5B47A1418B4814"\r
+            {\r
+            "Name" = "8:README"\r
+            "Arguments" = "8:"\r
+            "Description" = "8:"\r
+            "ShowCmd" = "3:1"\r
+            "IconIndex" = "3:0"\r
+            "Transitive" = "11:FALSE"\r
+            "Target" = "8:_27AB74FFFBC7436B9EBC6AE23968CFCC"\r
+            "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"\r
+            "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Icon" = "8:"\r
+            "Feature" = "8:"\r
+            }\r
+            "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_70CF74DB997A408DBBFD48AB10F92321"\r
+            {\r
+            "Name" = "8:ipptool Documentation"\r
+            "Arguments" = "8:"\r
+            "Description" = "8:"\r
+            "ShowCmd" = "3:1"\r
+            "IconIndex" = "3:0"\r
+            "Transitive" = "11:FALSE"\r
+            "Target" = "8:_D5CD9D9AB1644688A1D54B1589BDF724"\r
+            "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"\r
+            "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Icon" = "8:"\r
+            "Feature" = "8:"\r
+            }\r
+            "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_962004B0D5CA479A91EFA7F7BF7814C8"\r
+            {\r
+            "Name" = "8:ippserver Documentation"\r
+            "Arguments" = "8:"\r
+            "Description" = "8:"\r
+            "ShowCmd" = "3:1"\r
+            "IconIndex" = "3:0"\r
+            "Transitive" = "11:FALSE"\r
+            "Target" = "8:_1BCBABF5693841AE92515645BB7765F4"\r
+            "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"\r
+            "WorkingFolder" = "8:_26743E387598422398CF503F7478F9E1"\r
+            "Icon" = "8:"\r
+            "Feature" = "8:"\r
+            }\r
+            "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_BD2A7DF74D844FF5919EE8340EE36ECD"\r
+            {\r
+            "Name" = "8:Test File Documentation"\r
+            "Arguments" = "8:"\r
+            "Description" = "8:"\r
+            "ShowCmd" = "3:1"\r
+            "IconIndex" = "3:0"\r
+            "Transitive" = "11:FALSE"\r
+            "Target" = "8:_1A1324305D78463BBFC62269C56DCF0B"\r
+            "Folder" = "8:_E379D4EDBAD0460BB876711E9062ADB4"\r
+            "WorkingFolder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Icon" = "8:"\r
+            "Feature" = "8:"\r
+            }\r
+        }\r
+        "UserInterface"\r
+        {\r
+            "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_045DF90B1FF941A9BA7A742CFC0A6C00"\r
+            {\r
+            "UseDynamicProperties" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"\r
+            }\r
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_345BD86390E841A98B74ED3E07945F8C"\r
+            {\r
+            "Name" = "8:#1900"\r
+            "Sequence" = "3:2"\r
+            "Attributes" = "3:1"\r
+                "Dialogs"\r
+                {\r
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_067C143A8731427180B1568AF8C07375"\r
+                    {\r
+                    "Sequence" = "3:200"\r
+                    "DisplayName" = "8:Installation Folder"\r
+                    "UseDynamicProperties" = "11:TRUE"\r
+                    "IsDependency" = "11:FALSE"\r
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"\r
+                        "Properties"\r
+                        {\r
+                            "BannerBitmap"\r
+                            {\r
+                            "Name" = "8:BannerBitmap"\r
+                            "DisplayName" = "8:#1001"\r
+                            "Description" = "8:#1101"\r
+                            "Type" = "3:8"\r
+                            "ContextData" = "8:Bitmap"\r
+                            "Attributes" = "3:4"\r
+                            "Setting" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                        }\r
+                    }\r
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A2F2CC6EB9D7453599E7598D4D0629A5"\r
+                    {\r
+                    "Sequence" = "3:300"\r
+                    "DisplayName" = "8:Confirm Installation"\r
+                    "UseDynamicProperties" = "11:TRUE"\r
+                    "IsDependency" = "11:FALSE"\r
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"\r
+                        "Properties"\r
+                        {\r
+                            "BannerBitmap"\r
+                            {\r
+                            "Name" = "8:BannerBitmap"\r
+                            "DisplayName" = "8:#1001"\r
+                            "Description" = "8:#1101"\r
+                            "Type" = "3:8"\r
+                            "ContextData" = "8:Bitmap"\r
+                            "Attributes" = "3:4"\r
+                            "Setting" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                        }\r
+                    }\r
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C2B41369B7334F419318792EBA031412"\r
+                    {\r
+                    "Sequence" = "3:100"\r
+                    "DisplayName" = "8:Welcome"\r
+                    "UseDynamicProperties" = "11:TRUE"\r
+                    "IsDependency" = "11:FALSE"\r
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"\r
+                        "Properties"\r
+                        {\r
+                            "BannerBitmap"\r
+                            {\r
+                            "Name" = "8:BannerBitmap"\r
+                            "DisplayName" = "8:#1001"\r
+                            "Description" = "8:#1101"\r
+                            "Type" = "3:8"\r
+                            "ContextData" = "8:Bitmap"\r
+                            "Attributes" = "3:4"\r
+                            "Setting" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                            "CopyrightWarning"\r
+                            {\r
+                            "Name" = "8:CopyrightWarning"\r
+                            "DisplayName" = "8:#1002"\r
+                            "Description" = "8:#1102"\r
+                            "Type" = "3:3"\r
+                            "ContextData" = "8:"\r
+                            "Attributes" = "3:0"\r
+                            "Setting" = "3:2"\r
+                            "Value" = "8:This computer program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2."\r
+                            "DefaultValue" = "8:#1202"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                            "Welcome"\r
+                            {\r
+                            "Name" = "8:Welcome"\r
+                            "DisplayName" = "8:#1003"\r
+                            "Description" = "8:#1103"\r
+                            "Type" = "3:3"\r
+                            "ContextData" = "8:"\r
+                            "Attributes" = "3:0"\r
+                            "Setting" = "3:1"\r
+                            "Value" = "8:#1203"\r
+                            "DefaultValue" = "8:#1203"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_6B654A06090344BA9AA443E0D0296737"\r
+            {\r
+            "Name" = "8:#1902"\r
+            "Sequence" = "3:1"\r
+            "Attributes" = "3:3"\r
+                "Dialogs"\r
+                {\r
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FB4E7BBC3DA242309FFB58F9A6194A93"\r
+                    {\r
+                    "Sequence" = "3:100"\r
+                    "DisplayName" = "8:Finished"\r
+                    "UseDynamicProperties" = "11:TRUE"\r
+                    "IsDependency" = "11:FALSE"\r
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"\r
+                        "Properties"\r
+                        {\r
+                            "BannerBitmap"\r
+                            {\r
+                            "Name" = "8:BannerBitmap"\r
+                            "DisplayName" = "8:#1001"\r
+                            "Description" = "8:#1101"\r
+                            "Type" = "3:8"\r
+                            "ContextData" = "8:Bitmap"\r
+                            "Attributes" = "3:4"\r
+                            "Setting" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                            "UpdateText"\r
+                            {\r
+                            "Name" = "8:UpdateText"\r
+                            "DisplayName" = "8:#1058"\r
+                            "Description" = "8:#1158"\r
+                            "Type" = "3:15"\r
+                            "ContextData" = "8:"\r
+                            "Attributes" = "3:0"\r
+                            "Setting" = "3:1"\r
+                            "Value" = "8:#1258"\r
+                            "DefaultValue" = "8:#1258"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_712819C7C4F042ABB708949BD4426628"\r
+            {\r
+            "Name" = "8:#1900"\r
+            "Sequence" = "3:1"\r
+            "Attributes" = "3:1"\r
+                "Dialogs"\r
+                {\r
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2F49D4FACB954AF2B786D2AD9206D053"\r
+                    {\r
+                    "Sequence" = "3:100"\r
+                    "DisplayName" = "8:Welcome"\r
+                    "UseDynamicProperties" = "11:TRUE"\r
+                    "IsDependency" = "11:FALSE"\r
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"\r
+                        "Properties"\r
+                        {\r
+                            "BannerBitmap"\r
+                            {\r
+                            "Name" = "8:BannerBitmap"\r
+                            "DisplayName" = "8:#1001"\r
+                            "Description" = "8:#1101"\r
+                            "Type" = "3:8"\r
+                            "ContextData" = "8:Bitmap"\r
+                            "Attributes" = "3:4"\r
+                            "Setting" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                            "CopyrightWarning"\r
+                            {\r
+                            "Name" = "8:CopyrightWarning"\r
+                            "DisplayName" = "8:#1002"\r
+                            "Description" = "8:#1102"\r
+                            "Type" = "3:3"\r
+                            "ContextData" = "8:"\r
+                            "Attributes" = "3:0"\r
+                            "Setting" = "3:2"\r
+                            "Value" = "8:This computer program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2."\r
+                            "DefaultValue" = "8:#1202"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                            "Welcome"\r
+                            {\r
+                            "Name" = "8:Welcome"\r
+                            "DisplayName" = "8:#1003"\r
+                            "Description" = "8:#1103"\r
+                            "Type" = "3:3"\r
+                            "ContextData" = "8:"\r
+                            "Attributes" = "3:0"\r
+                            "Setting" = "3:1"\r
+                            "Value" = "8:#1203"\r
+                            "DefaultValue" = "8:#1203"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                        }\r
+                    }\r
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_770E25BC453A464EA8CD51381FDDDD9F"\r
+                    {\r
+                    "Sequence" = "3:300"\r
+                    "DisplayName" = "8:Confirm Installation"\r
+                    "UseDynamicProperties" = "11:TRUE"\r
+                    "IsDependency" = "11:FALSE"\r
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"\r
+                        "Properties"\r
+                        {\r
+                            "BannerBitmap"\r
+                            {\r
+                            "Name" = "8:BannerBitmap"\r
+                            "DisplayName" = "8:#1001"\r
+                            "Description" = "8:#1101"\r
+                            "Type" = "3:8"\r
+                            "ContextData" = "8:Bitmap"\r
+                            "Attributes" = "3:4"\r
+                            "Setting" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                        }\r
+                    }\r
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9534A64B629F4F868D6D7A384C76DCB2"\r
+                    {\r
+                    "Sequence" = "3:200"\r
+                    "DisplayName" = "8:Installation Folder"\r
+                    "UseDynamicProperties" = "11:TRUE"\r
+                    "IsDependency" = "11:FALSE"\r
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"\r
+                        "Properties"\r
+                        {\r
+                            "BannerBitmap"\r
+                            {\r
+                            "Name" = "8:BannerBitmap"\r
+                            "DisplayName" = "8:#1001"\r
+                            "Description" = "8:#1101"\r
+                            "Type" = "3:8"\r
+                            "ContextData" = "8:Bitmap"\r
+                            "Attributes" = "3:4"\r
+                            "Setting" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                            "InstallAllUsersVisible"\r
+                            {\r
+                            "Name" = "8:InstallAllUsersVisible"\r
+                            "DisplayName" = "8:#1059"\r
+                            "Description" = "8:#1159"\r
+                            "Type" = "3:5"\r
+                            "ContextData" = "8:1;True=1;False=0"\r
+                            "Attributes" = "3:0"\r
+                            "Setting" = "3:0"\r
+                            "Value" = "3:1"\r
+                            "DefaultValue" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_770CCEFF81BD46A182A6E816A41A0E81"\r
+            {\r
+            "Name" = "8:#1901"\r
+            "Sequence" = "3:2"\r
+            "Attributes" = "3:2"\r
+                "Dialogs"\r
+                {\r
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_75E0C1FD245D493DA0D7E3E0BC0C365F"\r
+                    {\r
+                    "Sequence" = "3:100"\r
+                    "DisplayName" = "8:Progress"\r
+                    "UseDynamicProperties" = "11:TRUE"\r
+                    "IsDependency" = "11:FALSE"\r
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"\r
+                        "Properties"\r
+                        {\r
+                            "BannerBitmap"\r
+                            {\r
+                            "Name" = "8:BannerBitmap"\r
+                            "DisplayName" = "8:#1001"\r
+                            "Description" = "8:#1101"\r
+                            "Type" = "3:8"\r
+                            "ContextData" = "8:Bitmap"\r
+                            "Attributes" = "3:4"\r
+                            "Setting" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                            "ShowProgress"\r
+                            {\r
+                            "Name" = "8:ShowProgress"\r
+                            "DisplayName" = "8:#1009"\r
+                            "Description" = "8:#1109"\r
+                            "Type" = "3:5"\r
+                            "ContextData" = "8:1;True=1;False=0"\r
+                            "Attributes" = "3:0"\r
+                            "Setting" = "3:0"\r
+                            "Value" = "3:1"\r
+                            "DefaultValue" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+            "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_933B15E9A383418F8ADF3B13F68458F3"\r
+            {\r
+            "UseDynamicProperties" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"\r
+            }\r
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E310DA8CED734E00950A3C5D630CE987"\r
+            {\r
+            "Name" = "8:#1902"\r
+            "Sequence" = "3:2"\r
+            "Attributes" = "3:3"\r
+                "Dialogs"\r
+                {\r
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_CB172E69F9C74901BE1040336CFD4F72"\r
+                    {\r
+                    "Sequence" = "3:100"\r
+                    "DisplayName" = "8:Finished"\r
+                    "UseDynamicProperties" = "11:TRUE"\r
+                    "IsDependency" = "11:FALSE"\r
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"\r
+                        "Properties"\r
+                        {\r
+                            "BannerBitmap"\r
+                            {\r
+                            "Name" = "8:BannerBitmap"\r
+                            "DisplayName" = "8:#1001"\r
+                            "Description" = "8:#1101"\r
+                            "Type" = "3:8"\r
+                            "ContextData" = "8:Bitmap"\r
+                            "Attributes" = "3:4"\r
+                            "Setting" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F44F9BE9B54940848289669635E4A5A2"\r
+            {\r
+            "Name" = "8:#1901"\r
+            "Sequence" = "3:1"\r
+            "Attributes" = "3:2"\r
+                "Dialogs"\r
+                {\r
+                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_14751F327A634B989283C8F28CFB6DFC"\r
+                    {\r
+                    "Sequence" = "3:100"\r
+                    "DisplayName" = "8:Progress"\r
+                    "UseDynamicProperties" = "11:TRUE"\r
+                    "IsDependency" = "11:FALSE"\r
+                    "SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"\r
+                        "Properties"\r
+                        {\r
+                            "BannerBitmap"\r
+                            {\r
+                            "Name" = "8:BannerBitmap"\r
+                            "DisplayName" = "8:#1001"\r
+                            "Description" = "8:#1101"\r
+                            "Type" = "3:8"\r
+                            "ContextData" = "8:Bitmap"\r
+                            "Attributes" = "3:4"\r
+                            "Setting" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                            "ShowProgress"\r
+                            {\r
+                            "Name" = "8:ShowProgress"\r
+                            "DisplayName" = "8:#1009"\r
+                            "Description" = "8:#1109"\r
+                            "Type" = "3:5"\r
+                            "ContextData" = "8:1;True=1;False=0"\r
+                            "Attributes" = "3:0"\r
+                            "Setting" = "3:0"\r
+                            "Value" = "3:1"\r
+                            "DefaultValue" = "3:1"\r
+                            "UsePlugInResources" = "11:TRUE"\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+        "MergeModule"\r
+        {\r
+            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_299D5816FF7142F3B2791685551AD1DC"\r
+            {\r
+            "UseDynamicProperties" = "11:TRUE"\r
+            "IsDependency" = "11:TRUE"\r
+            "SourcePath" = "8:microsoft_vc90_debugcrt_x86.msm"\r
+                "Properties"\r
+                {\r
+                }\r
+            "LanguageId" = "3:0"\r
+            "Exclude" = "11:FALSE"\r
+            "Folder" = "8:"\r
+            "Feature" = "8:"\r
+            "IsolateTo" = "8:"\r
+            }\r
+            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_A1CB27EFF4094C39B58D0BE5A272DF1A"\r
+            {\r
+            "UseDynamicProperties" = "11:TRUE"\r
+            "IsDependency" = "11:TRUE"\r
+            "SourcePath" = "8:policy_9_0_Microsoft_VC90_DebugCRT_x86.msm"\r
+                "Properties"\r
+                {\r
+                }\r
+            "LanguageId" = "3:0"\r
+            "Exclude" = "11:FALSE"\r
+            "Folder" = "8:"\r
+            "Feature" = "8:"\r
+            "IsolateTo" = "8:"\r
+            }\r
+        }\r
+        "ProjectOutput"\r
+        {\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_466C1CF41795452A8B76425F8D05D8B8"\r
+            {\r
+            "SourcePath" = "8:Win32\\Debug\\ippserver.exe"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{82A03BC7-0746-4B85-8908-3C7A3FAA58A9}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_58DC0E72F0944BEFB927AED718CD1660"\r
+            {\r
+            "SourcePath" = "8:Win32\\Debug\\ippfind.exe"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{B484DA0C-62C8-4C32-83B6-CCEB58968B85}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_D02EB13951314EFD9C539150EF8E53B8"\r
+            {\r
+            "SourcePath" = "8:Win32\\Debug\\regex.dll"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{18950A1B-D37A-40C7-B2DF-C12986C0526E}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E97571D3FBE048DABDC59B37762D800F"\r
+            {\r
+            "SourcePath" = "8:Win32\\Debug\\ipptool.exe"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
+            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_EA282F32A10B4ED1A81AA6133B997C6A"\r
+            {\r
+            "SourcePath" = "8:Win32\\Debug\\libcups2.dll"\r
+            "TargetName" = "8:"\r
+            "Tag" = "8:"\r
+            "Folder" = "8:_FFAEDEA1D38D4088A03FDD6F17E2CA5D"\r
+            "Condition" = "8:"\r
+            "Transitive" = "11:FALSE"\r
+            "Vital" = "11:TRUE"\r
+            "ReadOnly" = "11:FALSE"\r
+            "Hidden" = "11:FALSE"\r
+            "System" = "11:FALSE"\r
+            "Permanent" = "11:FALSE"\r
+            "SharedLegacy" = "11:FALSE"\r
+            "PackageAs" = "3:1"\r
+            "Register" = "3:1"\r
+            "Exclude" = "11:FALSE"\r
+            "IsDependency" = "11:FALSE"\r
+            "IsolateTo" = "8:"\r
+            "ProjectOutputGroupRegister" = "3:1"\r
+            "OutputConfiguration" = "8:"\r
+            "OutputGroupCanonicalName" = "8:Built"\r
+            "OutputProjectGuid" = "8:{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}"\r
+            "ShowKeyOutput" = "11:TRUE"\r
+                "ExcludeFilters"\r
+                {\r
+                }\r
+            }\r
+        }\r
+    }\r
+}\r
index 23a2067..6f85ea9 100644 (file)
                        buildPhases = (
                        );
                        dependencies = (
+                               274EE2861A03EEEE003213D1 /* PBXTargetDependency */,
+                               274EE2881A03EEEE003213D1 /* PBXTargetDependency */,
                                726AD704135E8AA1002C930D /* PBXTargetDependency */,
+                               2767FC5419267469000F61D3 /* PBXTargetDependency */,
                                273BF6DE1333B6370022CAAB /* PBXTargetDependency */,
+                               2767FC5619267469000F61D3 /* PBXTargetDependency */,
                                278C58D6136B641D00836530 /* PBXTargetDependency */,
                                270CCDB2135E3CDE00007BE2 /* PBXTargetDependency */,
                        );
                        buildPhases = (
                        );
                        dependencies = (
+                               27A034871A8BDC6900650675 /* PBXTargetDependency */,
+                               274EE2821A03EEE0003213D1 /* PBXTargetDependency */,
+                               274EE2841A03EEE0003213D1 /* PBXTargetDependency */,
                                274FF5E313332D4300317ECB /* PBXTargetDependency */,
+                               72BEA8D819AFA8BB0085F0F3 /* PBXTargetDependency */,
                                72F75A711336FACD004BB496 /* PBXTargetDependency */,
                                274FF5E513332D4300317ECB /* PBXTargetDependency */,
                                274FF622133331D300317ECB /* PBXTargetDependency */,
@@ -42,6 +50,8 @@
                                274FF65E13333A3400317ECB /* PBXTargetDependency */,
                                724379531333FECE009631B9 /* PBXTargetDependency */,
                                724379111333E4EA009631B9 /* PBXTargetDependency */,
+                               72BEA8D619AFA8A00085F0F3 /* PBXTargetDependency */,
+                               72BEA8D419AFA89C0085F0F3 /* PBXTargetDependency */,
                                276683FF1337F7C5000D33D0 /* PBXTargetDependency */,
                                7243792B1333E962009631B9 /* PBXTargetDependency */,
                                276683D71337B24A000D33D0 /* PBXTargetDependency */,
                270CCDBA135E3D0900007BE2 /* libcupsmime.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220FAC13330B2200FCA411 /* libcupsmime.dylib */; };
                270CCDBC135E3D3E00007BE2 /* testmime.c in Sources */ = {isa = PBXBuildFile; fileRef = 270CCDBB135E3D3E00007BE2 /* testmime.c */; };
                273BF6C71333B5370022CAAB /* testcups.c in Sources */ = {isa = PBXBuildFile; fileRef = 273BF6C61333B5370022CAAB /* testcups.c */; };
+               274EE2611A03EDCA003213D1 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+               274EE2621A03EDCA003213D1 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; };
+               274EE2631A03EDCA003213D1 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; };
+               274EE2641A03EDCA003213D1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; };
+               274EE2651A03EDCA003213D1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; };
+               274EE2661A03EDCA003213D1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; };
+               274EE2721A03EDCB003213D1 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+               274EE2731A03EDCB003213D1 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC591926750C000F61D3 /* CoreFoundation.framework */; };
+               274EE2741A03EDCB003213D1 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5B1926750C000F61D3 /* libresolv.dylib */; };
+               274EE2751A03EDCB003213D1 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5C1926750C000F61D3 /* libz.dylib */; };
+               274EE2761A03EDCB003213D1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5D1926750C000F61D3 /* Security.framework */; };
+               274EE2771A03EDCB003213D1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2767FC5E1926750C000F61D3 /* SystemConfiguration.framework */; };
+               274EE27E1A03EE0B003213D1 /* ippinfra.c in Sources */ = {isa = PBXBuildFile; fileRef = 274EE27D1A03EE0B003213D1 /* ippinfra.c */; };
+               274EE2801A03EE41003213D1 /* ippproxy.c in Sources */ = {isa = PBXBuildFile; fileRef = 274EE27F1A03EE41003213D1 /* ippproxy.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 */; };
                276683FD1337F7B8000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
                2766840F1337FA38000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
                276684111337FA7C000D33D0 /* cupsaddsmb.c in Sources */ = {isa = PBXBuildFile; fileRef = 276684101337FA7C000D33D0 /* cupsaddsmb.c */; };
+               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 */; };
+               2767FC6519267538000F61D3 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72A4332F155844CF002E172D /* libcups_static.a */; };
+               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 */; };
+               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 */; };
                7258EAF513459B6D009286F1 /* libcupsimage.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A611336F9A3004BB496 /* libcupsimage.dylib */; };
                726AD702135E8A90002C930D /* ippserver.c in Sources */ = {isa = PBXBuildFile; fileRef = 726AD701135E8A90002C930D /* ippserver.c */; };
                7271883D1374AB14001A2036 /* mime-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7271883C1374AB14001A2036 /* mime-private.h */; };
-               728FB7E8153600FA005426E1 /* tls.c in Sources */ = {isa = PBXBuildFile; fileRef = 728FB7E3153600FA005426E1 /* tls.c */; };
+               727AD5B719100A58009F6862 /* tls.c in Sources */ = {isa = PBXBuildFile; fileRef = 727AD5B619100A58009F6862 /* tls.c */; };
+               727AD5B819100A58009F6862 /* tls.c in Sources */ = {isa = PBXBuildFile; fileRef = 727AD5B619100A58009F6862 /* tls.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 */; };
                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 */; };
+               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 */; };
                        remoteGlobalIDString = 273BF6BC1333B5000022CAAB;
                        remoteInfo = testcups;
                };
+               274EE25D1A03EDCA003213D1 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 274FF6891333B1C400317ECB;
+                       remoteInfo = libcups_static;
+               };
+               274EE26E1A03EDCB003213D1 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 274FF6891333B1C400317ECB;
+                       remoteInfo = libcups_static;
+               };
+               274EE2811A03EEE0003213D1 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 274EE25B1A03EDCA003213D1;
+                       remoteInfo = ippinfra;
+               };
+               274EE2831A03EEE0003213D1 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 274EE26C1A03EDCB003213D1;
+                       remoteInfo = ippproxy;
+               };
+               274EE2851A03EEEE003213D1 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 274EE25B1A03EDCA003213D1;
+                       remoteInfo = ippinfra;
+               };
+               274EE2871A03EEEE003213D1 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 274EE26C1A03EDCB003213D1;
+                       remoteInfo = ippproxy;
+               };
                274FF5DB13332CF900317ECB /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
                        remoteGlobalIDString = 276684031337FA1D000D33D0;
                        remoteInfo = cupsaddsmb;
                };
+               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 */;
                        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 */;
                        remoteGlobalIDString = 274FF6891333B1C400317ECB;
                        remoteInfo = libcups_static;
                };
+               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 */;
                        );
                        runOnlyForDeploymentPostprocessing = 1;
                };
+               274EE2671A03EDCA003213D1 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 2147483647;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 1;
+               };
+               274EE2781A03EDCB003213D1 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 2147483647;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 1;
+               };
                274FF5CA13332B1F00317ECB /* CopyFiles */ = {
                        isa = PBXCopyFilesBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 1;
                };
+               2767FC4C19266A0D000F61D3 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 2147483647;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 1;
+               };
                278C58C9136B640300836530 /* CopyFiles */ = {
                        isa = PBXCopyFilesBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 1;
                };
+               27A034791A8BDB1200650675 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 2147483647;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 1;
+               };
                720DD6C01358FD5F0064AA82 /* CopyFiles */ = {
                        isa = PBXCopyFilesBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 1;
                };
+               72CF95ED18A19134000FCAE4 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 2147483647;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 1;
+               };
                72F75A501336F950004BB496 /* CopyFiles */ = {
                        isa = PBXCopyFilesBuildPhase;
                        buildActionMask = 2147483647;
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
+               270B267D17F5C06700C8A3A9 /* tls-darwin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tls-darwin.c"; path = "../cups/tls-darwin.c"; sourceTree = "<group>"; };
+               270B267E17F5C06700C8A3A9 /* tls-gnutls.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tls-gnutls.c"; path = "../cups/tls-gnutls.c"; sourceTree = "<group>"; };
+               270B268117F5C5D600C8A3A9 /* tls-sspi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tls-sspi.c"; path = "../cups/tls-sspi.c"; sourceTree = "<group>"; };
                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 = "<group>"; };
                2732E089137A3F5200FAFEF6 /* cancel.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cancel.c; path = ../systemv/cancel.c; sourceTree = "<group>"; };
                2732E08E137A3F5200FAFEF6 /* lpinfo.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpinfo.c; path = ../systemv/lpinfo.c; sourceTree = "<group>"; };
                2732E08F137A3F5200FAFEF6 /* lpmove.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpmove.c; path = ../systemv/lpmove.c; sourceTree = "<group>"; };
                2732E090137A3F5200FAFEF6 /* lpoptions.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpoptions.c; path = ../systemv/lpoptions.c; sourceTree = "<group>"; };
-               2732E091137A3F5200FAFEF6 /* lppasswd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lppasswd.c; path = ../systemv/lppasswd.c; sourceTree = "<group>"; };
                2732E092137A3F5200FAFEF6 /* lpstat.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpstat.c; path = ../systemv/lpstat.c; sourceTree = "<group>"; };
                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 = "<group>"; };
+               274EE26B1A03EDCA003213D1 /* ippserver copy */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "ippserver copy"; sourceTree = BUILT_PRODUCTS_DIR; };
+               274EE27C1A03EDCB003213D1 /* ippserver copy copy */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "ippserver copy copy"; sourceTree = BUILT_PRODUCTS_DIR; };
+               274EE27D1A03EE0B003213D1 /* ippinfra.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ippinfra.c; path = ../test/ippinfra.c; sourceTree = "<group>"; };
+               274EE27F1A03EE41003213D1 /* ippproxy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ippproxy.c; path = ../test/ippproxy.c; sourceTree = "<group>"; };
                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 = "<group>"; };
                274FF5D713332CC700317ECB /* util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = util.c; path = ../scheduler/util.c; sourceTree = "<group>"; };
                276683F91337F7A9000D33D0 /* ipptool.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipptool.c; path = ../test/ipptool.c; sourceTree = "<group>"; };
                276684041337FA1D000D33D0 /* cupsaddsmb */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupsaddsmb; sourceTree = BUILT_PRODUCTS_DIR; };
                276684101337FA7C000D33D0 /* cupsaddsmb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cupsaddsmb.c; path = ../systemv/cupsaddsmb.c; sourceTree = "<group>"; };
+               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 = "<group>"; };
+               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 = "<group>"; };
+               2767FC76192696A0000F61D3 /* raster-private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "raster-private.h"; path = "../cups/raster-private.h"; sourceTree = "<group>"; };
                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 = "<group>"; };
                278C58E5136B64AF00836530 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
                278C58E6136B64B000836530 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = /System/Library/Frameworks/Kerberos.framework; sourceTree = "<absolute>"; };
                278C58E7136B64B000836530 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = "<absolute>"; };
                278C58E8136B64B000836530 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = /System/Library/Frameworks/SystemConfiguration.framework; sourceTree = "<absolute>"; };
-               27D3037C134148CB00F022B1 /* libcups_s.exp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.exports; name = libcups_s.exp; path = ../cups/libcups_s.exp; sourceTree = "<group>"; };
+               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 = "<group>"; };
+               27F89DA21B3AC43B00E5A4B7 /* testraster.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testraster.c; path = ../filter/testraster.c; sourceTree = "<group>"; };
                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 = "<group>"; };
                72220EAE1333047D00FCA411 /* libcups.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcups.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
                72220EE0133305BB00FCA411 /* http-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "http-private.h"; path = "../cups/http-private.h"; sourceTree = "<group>"; };
                72220EE1133305BB00FCA411 /* http-support.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "http-support.c"; path = "../cups/http-support.c"; sourceTree = "<group>"; };
                72220EE2133305BB00FCA411 /* http.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = http.c; path = ../cups/http.c; sourceTree = "<group>"; };
-               72220EE3133305BB00FCA411 /* http.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = http.h; path = ../cups/http.h; sourceTree = "<group>"; };
+               72220EE3133305BB00FCA411 /* http.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = http.h; path = ../cups/http.h; sourceTree = "<group>"; wrapsLines = 1; };
                72220EE4133305BB00FCA411 /* ipp-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "ipp-private.h"; path = "../cups/ipp-private.h"; sourceTree = "<group>"; };
                72220EE5133305BB00FCA411 /* ipp-support.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ipp-support.c"; path = "../cups/ipp-support.c"; sourceTree = "<group>"; };
                72220EE6133305BB00FCA411 /* ipp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipp.c; path = ../cups/ipp.c; sourceTree = "<group>"; };
                72220FB313330BCE00FCA411 /* mime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mime.c; path = ../scheduler/mime.c; sourceTree = "<group>"; };
                72220FB413330BCE00FCA411 /* mime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mime.h; path = ../scheduler/mime.h; sourceTree = "<group>"; };
                72220FB513330BCE00FCA411 /* type.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = type.c; path = ../scheduler/type.c; sourceTree = "<group>"; };
+               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 = "<group>"; };
                7234F41F1378A16F00D3E9C9 /* array-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "array-private.h"; path = "../cups/array-private.h"; sourceTree = "<group>"; };
                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 = "<group>"; };
                724379C41333FFC7009631B9 /* usb-darwin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "usb-darwin.c"; path = "../backend/usb-darwin.c"; sourceTree = "<group>"; };
                724379C51333FFC7009631B9 /* usb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = usb.c; path = ../backend/usb.c; sourceTree = "<group>"; };
                724379CA1334000E009631B9 /* ieee1284.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ieee1284.c; path = ../backend/ieee1284.c; sourceTree = "<group>"; };
+               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; };
                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 = "<group>"; };
                726AD6F7135E88F0002C930D /* ippserver */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ippserver; sourceTree = BUILT_PRODUCTS_DIR; };
                7271882213746EA8001A2036 /* rastertohp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertohp.c; path = ../filter/rastertohp.c; sourceTree = "<group>"; };
                7271882313746EA8001A2036 /* rastertolabel.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertolabel.c; path = ../filter/rastertolabel.c; sourceTree = "<group>"; };
                7271883C1374AB14001A2036 /* mime-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "mime-private.h"; path = "../scheduler/mime-private.h"; sourceTree = "<group>"; };
-               728FB7E0153600FA005426E1 /* tls-darwin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tls-darwin.c"; path = "../scheduler/tls-darwin.c"; sourceTree = "<group>"; };
-               728FB7E1153600FA005426E1 /* tls-gnutls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tls-gnutls.c"; path = "../scheduler/tls-gnutls.c"; sourceTree = "<group>"; };
-               728FB7E2153600FA005426E1 /* tls-openssl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tls-openssl.c"; path = "../scheduler/tls-openssl.c"; sourceTree = "<group>"; };
-               728FB7E3153600FA005426E1 /* tls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tls.c; path = ../scheduler/tls.c; sourceTree = "<group>"; };
-               728FB7EC1536161C005426E1 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = ../../../../../usr/lib/libz.dylib; sourceTree = "<group>"; };
-               728FB7EF1536167A005426E1 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = ../../../../../usr/lib/libiconv.dylib; sourceTree = "<group>"; };
-               728FB7F01536167A005426E1 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = ../../../../../usr/lib/libresolv.dylib; sourceTree = "<group>"; };
+               727AD5B619100A58009F6862 /* tls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tls.c; path = ../cups/tls.c; sourceTree = "<group>"; };
+               727EF02F192E3498001EF690 /* admin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = admin.c; path = "../cgi-bin/admin.c"; sourceTree = "<group>"; wrapsLines = 1; };
+               727EF030192E3498001EF690 /* cgi-private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "cgi-private.h"; path = "../cgi-bin/cgi-private.h"; sourceTree = "<group>"; };
+               727EF031192E3498001EF690 /* cgi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cgi.h; path = "../cgi-bin/cgi.h"; sourceTree = "<group>"; };
+               727EF032192E3498001EF690 /* classes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = classes.c; path = "../cgi-bin/classes.c"; sourceTree = "<group>"; };
+               727EF033192E3498001EF690 /* help-index.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "help-index.c"; path = "../cgi-bin/help-index.c"; sourceTree = "<group>"; };
+               727EF034192E3498001EF690 /* help-index.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "help-index.h"; path = "../cgi-bin/help-index.h"; sourceTree = "<group>"; };
+               727EF035192E3498001EF690 /* help.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = help.c; path = "../cgi-bin/help.c"; sourceTree = "<group>"; };
+               727EF036192E3498001EF690 /* html.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = html.c; path = "../cgi-bin/html.c"; sourceTree = "<group>"; };
+               727EF037192E3498001EF690 /* ipp-var.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "ipp-var.c"; path = "../cgi-bin/ipp-var.c"; sourceTree = "<group>"; };
+               727EF038192E3498001EF690 /* jobs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jobs.c; path = "../cgi-bin/jobs.c"; sourceTree = "<group>"; };
+               727EF039192E3498001EF690 /* makedocset.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = makedocset.c; path = "../cgi-bin/makedocset.c"; sourceTree = "<group>"; };
+               727EF03A192E3498001EF690 /* printers.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = printers.c; path = "../cgi-bin/printers.c"; sourceTree = "<group>"; };
+               727EF03B192E3498001EF690 /* search.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = search.c; path = "../cgi-bin/search.c"; sourceTree = "<group>"; };
+               727EF03C192E3498001EF690 /* template.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = template.c; path = "../cgi-bin/template.c"; sourceTree = "<group>"; };
+               727EF03D192E3498001EF690 /* testcgi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testcgi.c; path = "../cgi-bin/testcgi.c"; sourceTree = "<group>"; };
+               727EF03E192E3498001EF690 /* testhi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testhi.c; path = "../cgi-bin/testhi.c"; sourceTree = "<group>"; };
+               727EF03F192E3498001EF690 /* testtemplate.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testtemplate.c; path = "../cgi-bin/testtemplate.c"; sourceTree = "<group>"; };
+               727EF040192E3498001EF690 /* var.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = var.c; path = "../cgi-bin/var.c"; sourceTree = "<group>"; };
+               727EF041192E3544001EF690 /* testadmin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testadmin.c; path = ../cups/testadmin.c; sourceTree = "<group>"; };
+               727EF042192E3544001EF690 /* testarray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testarray.c; path = ../cups/testarray.c; sourceTree = "<group>"; };
+               727EF043192E3544001EF690 /* testcache.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testcache.c; path = ../cups/testcache.c; sourceTree = "<group>"; };
+               727EF044192E3544001EF690 /* testconflicts.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testconflicts.c; path = ../cups/testconflicts.c; sourceTree = "<group>"; };
+               727EF045192E3544001EF690 /* testfile.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testfile.c; path = ../cups/testfile.c; sourceTree = "<group>"; };
+               727EF046192E3544001EF690 /* testi18n.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testi18n.c; path = ../cups/testi18n.c; sourceTree = "<group>"; };
+               727EF047192E3544001EF690 /* testipp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testipp.c; path = ../cups/testipp.c; sourceTree = "<group>"; };
+               727EF048192E3544001EF690 /* testlang.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testlang.c; path = ../cups/testlang.c; sourceTree = "<group>"; };
+               727EF049192E3544001EF690 /* testoptions.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testoptions.c; path = ../cups/testoptions.c; sourceTree = "<group>"; };
+               727EF04A192E3544001EF690 /* testppd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testppd.c; path = ../cups/testppd.c; sourceTree = "<group>"; };
+               727EF04B192E3544001EF690 /* testpwg.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testpwg.c; path = ../cups/testpwg.c; sourceTree = "<group>"; };
+               727EF04C192E3544001EF690 /* testsnmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testsnmp.c; path = ../cups/testsnmp.c; sourceTree = "<group>"; };
+               727EF04D192E3602001EF690 /* testlpd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testlpd.c; path = ../scheduler/testlpd.c; sourceTree = "<group>"; };
+               727EF04E192E3602001EF690 /* testspeed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testspeed.c; path = ../scheduler/testspeed.c; sourceTree = "<group>"; };
+               727EF04F192E3602001EF690 /* testsub.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testsub.c; path = ../scheduler/testsub.c; sourceTree = "<group>"; };
+               728FB7EC1536161C005426E1 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = "<absolute>"; };
+               728FB7EF1536167A005426E1 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = /usr/lib/libiconv.dylib; sourceTree = "<absolute>"; };
+               728FB7F01536167A005426E1 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = /usr/lib/libresolv.dylib; sourceTree = "<absolute>"; };
+               729D4B561A2CB48700692B21 /* CHANGES-2.0.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = "CHANGES-2.0.txt"; path = "../CHANGES-2.0.txt"; sourceTree = "<group>"; };
+               729D4B571A2CB48700692B21 /* CHANGES-IPPTOOL.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = "CHANGES-IPPTOOL.txt"; path = "../CHANGES-IPPTOOL.txt"; sourceTree = "<group>"; };
                72A4332F155844CF002E172D /* libcups_static.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcups_static.a; sourceTree = BUILT_PRODUCTS_DIR; };
                72C16CB8137B195D007E4BF4 /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = file.c; path = ../scheduler/file.c; sourceTree = SOURCE_ROOT; };
-               72D53A2915B49110003F877F /* GSS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GSS.framework; path = ../../../../../System/Library/Frameworks/GSS.framework; sourceTree = "<group>"; };
-               72D53A2C15B4913D003F877F /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = ../../../../../System/Library/Frameworks/IOKit.framework; sourceTree = "<group>"; };
-               72D53A3315B4925B003F877F /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = ../../../../../System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<group>"; };
+               72CF95E018A13543000FCAE4 /* dest-job.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dest-job.c"; path = "../cups/dest-job.c"; sourceTree = "<group>"; };
+               72CF95E118A13543000FCAE4 /* dest-localization.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dest-localization.c"; path = "../cups/dest-localization.c"; sourceTree = "<group>"; };
+               72CF95E218A13543000FCAE4 /* dest-options.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "dest-options.c"; path = "../cups/dest-options.c"; sourceTree = "<group>"; };
+               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 = ../test/ippfind.c; sourceTree = "<group>"; };
+               72D53A2915B49110003F877F /* GSS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GSS.framework; path = /System/Library/Frameworks/GSS.framework; sourceTree = "<absolute>"; };
+               72D53A2C15B4913D003F877F /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
+               72D53A3315B4925B003F877F /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<absolute>"; };
                72D53A3615B4929D003F877F /* colorman.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colorman.c; path = ../scheduler/colorman.c; sourceTree = "<group>"; };
                72D53A3715B4929D003F877F /* colorman.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = colorman.h; path = ../scheduler/colorman.h; sourceTree = "<group>"; };
-               72D53A3915B492FA003F877F /* libpam.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpam.dylib; path = ../../../../../usr/lib/libpam.dylib; sourceTree = "<group>"; };
+               72D53A3915B492FA003F877F /* libpam.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpam.dylib; path = /usr/lib/libpam.dylib; sourceTree = "<absolute>"; };
+               72E65BA318DC797E00097E89 /* configure.ac */ = {isa = PBXFileReference; lastKnownFileType = text; name = configure.ac; path = ../configure.ac; sourceTree = "<group>"; };
+               72E65BA418DC799B00097E89 /* cups-common.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-common.m4"; path = "../config-scripts/cups-common.m4"; sourceTree = "<group>"; };
+               72E65BA518DC799B00097E89 /* cups-compiler.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-compiler.m4"; path = "../config-scripts/cups-compiler.m4"; sourceTree = "<group>"; };
+               72E65BA618DC799B00097E89 /* cups-defaults.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-defaults.m4"; path = "../config-scripts/cups-defaults.m4"; sourceTree = "<group>"; };
+               72E65BA718DC799B00097E89 /* cups-directories.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-directories.m4"; path = "../config-scripts/cups-directories.m4"; sourceTree = "<group>"; };
+               72E65BA818DC799B00097E89 /* cups-dnssd.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-dnssd.m4"; path = "../config-scripts/cups-dnssd.m4"; sourceTree = "<group>"; };
+               72E65BA918DC799B00097E89 /* cups-gssapi.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-gssapi.m4"; path = "../config-scripts/cups-gssapi.m4"; sourceTree = "<group>"; };
+               72E65BAA18DC799B00097E89 /* cups-largefile.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-largefile.m4"; path = "../config-scripts/cups-largefile.m4"; sourceTree = "<group>"; };
+               72E65BAB18DC799B00097E89 /* cups-startup.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-startup.m4"; path = "../config-scripts/cups-startup.m4"; sourceTree = "<group>"; };
+               72E65BAC18DC799B00097E89 /* cups-libtool.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-libtool.m4"; path = "../config-scripts/cups-libtool.m4"; sourceTree = "<group>"; };
+               72E65BAD18DC799B00097E89 /* cups-manpages.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-manpages.m4"; path = "../config-scripts/cups-manpages.m4"; sourceTree = "<group>"; };
+               72E65BAE18DC799B00097E89 /* cups-network.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-network.m4"; path = "../config-scripts/cups-network.m4"; sourceTree = "<group>"; };
+               72E65BAF18DC799B00097E89 /* cups-opsys.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-opsys.m4"; path = "../config-scripts/cups-opsys.m4"; sourceTree = "<group>"; };
+               72E65BB018DC799B00097E89 /* cups-pam.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-pam.m4"; path = "../config-scripts/cups-pam.m4"; sourceTree = "<group>"; };
+               72E65BB118DC799B00097E89 /* cups-poll.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-poll.m4"; path = "../config-scripts/cups-poll.m4"; sourceTree = "<group>"; };
+               72E65BB218DC799B00097E89 /* cups-scripting.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-scripting.m4"; path = "../config-scripts/cups-scripting.m4"; sourceTree = "<group>"; };
+               72E65BB318DC799B00097E89 /* cups-sharedlibs.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-sharedlibs.m4"; path = "../config-scripts/cups-sharedlibs.m4"; sourceTree = "<group>"; };
+               72E65BB418DC799B00097E89 /* cups-ssl.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-ssl.m4"; path = "../config-scripts/cups-ssl.m4"; sourceTree = "<group>"; };
+               72E65BB518DC799B00097E89 /* cups-threads.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-threads.m4"; path = "../config-scripts/cups-threads.m4"; sourceTree = "<group>"; };
+               72E65BB618DC79CC00097E89 /* cups-config.in */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = "cups-config.in"; path = "../cups-config.in"; sourceTree = "<group>"; };
+               72E65BB718DC79CC00097E89 /* Makedefs.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = Makedefs.in; path = ../Makedefs.in; sourceTree = "<group>"; };
+               72E65BB918DC7A3600097E89 /* doc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = doc; path = ../doc; sourceTree = "<group>"; };
+               72E65BBA18DC7A3600097E89 /* man */ = {isa = PBXFileReference; lastKnownFileType = folder; name = man; path = ../man; sourceTree = "<group>"; };
+               72E65BBB18DC7A6B00097E89 /* api-array.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-array.header"; path = "../cups/api-array.header"; sourceTree = "<group>"; };
+               72E65BBC18DC7A6B00097E89 /* api-array.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-array.shtml"; path = "../cups/api-array.shtml"; sourceTree = "<group>"; };
+               72E65BBD18DC7A6B00097E89 /* api-cups.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-cups.header"; path = "../cups/api-cups.header"; sourceTree = "<group>"; };
+               72E65BBE18DC7A6B00097E89 /* api-cups.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-cups.shtml"; path = "../cups/api-cups.shtml"; sourceTree = "<group>"; };
+               72E65BBF18DC7A6B00097E89 /* api-filedir.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-filedir.header"; path = "../cups/api-filedir.header"; sourceTree = "<group>"; };
+               72E65BC018DC7A6B00097E89 /* api-filedir.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-filedir.shtml"; path = "../cups/api-filedir.shtml"; sourceTree = "<group>"; };
+               72E65BC118DC7A6B00097E89 /* api-filter.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-filter.header"; path = "../cups/api-filter.header"; sourceTree = "<group>"; };
+               72E65BC218DC7A6B00097E89 /* api-filter.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-filter.shtml"; path = "../cups/api-filter.shtml"; sourceTree = "<group>"; };
+               72E65BC318DC7A6B00097E89 /* api-httpipp.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-httpipp.header"; path = "../cups/api-httpipp.header"; sourceTree = "<group>"; };
+               72E65BC418DC7A6B00097E89 /* api-httpipp.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-httpipp.shtml"; path = "../cups/api-httpipp.shtml"; sourceTree = "<group>"; };
+               72E65BC518DC7A6B00097E89 /* api-overview.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-overview.header"; path = "../cups/api-overview.header"; sourceTree = "<group>"; };
+               72E65BC618DC7A6B00097E89 /* api-overview.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-overview.shtml"; path = "../cups/api-overview.shtml"; sourceTree = "<group>"; };
+               72E65BC718DC7A6B00097E89 /* api-ppd.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-ppd.header"; path = "../cups/api-ppd.header"; sourceTree = "<group>"; };
+               72E65BC818DC7A6B00097E89 /* api-ppd.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-ppd.shtml"; path = "../cups/api-ppd.shtml"; sourceTree = "<group>"; };
+               72E65BC918DC7A7E00097E89 /* api-ppdc.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-ppdc.header"; path = "../ppdc/api-ppdc.header"; sourceTree = "<group>"; };
+               72E65BCA18DC7A7E00097E89 /* api-ppdc.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-ppdc.shtml"; path = "../ppdc/api-ppdc.shtml"; sourceTree = "<group>"; };
+               72E65BCB18DC7A9800097E89 /* api-raster.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-raster.header"; path = "../filter/api-raster.header"; sourceTree = "<group>"; };
+               72E65BCC18DC7A9800097E89 /* api-raster.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-raster.shtml"; path = "../filter/api-raster.shtml"; sourceTree = "<group>"; };
+               72E65BCD18DC7A9800097E89 /* postscript-driver.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "postscript-driver.header"; path = "../filter/postscript-driver.header"; sourceTree = "<group>"; };
+               72E65BCE18DC7A9800097E89 /* postscript-driver.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "postscript-driver.shtml"; path = "../filter/postscript-driver.shtml"; sourceTree = "<group>"; };
+               72E65BCF18DC7A9800097E89 /* ppd-compiler.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "ppd-compiler.header"; path = "../filter/ppd-compiler.header"; sourceTree = "<group>"; };
+               72E65BD018DC7A9800097E89 /* ppd-compiler.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "ppd-compiler.shtml"; path = "../filter/ppd-compiler.shtml"; sourceTree = "<group>"; };
+               72E65BD118DC7A9800097E89 /* raster-driver.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "raster-driver.header"; path = "../filter/raster-driver.header"; sourceTree = "<group>"; };
+               72E65BD218DC7A9800097E89 /* raster-driver.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "raster-driver.shtml"; path = "../filter/raster-driver.shtml"; sourceTree = "<group>"; };
+               72E65BD318DC7A9800097E89 /* spec-ppd.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "spec-ppd.header"; path = "../filter/spec-ppd.header"; sourceTree = "<group>"; };
+               72E65BD418DC7A9800097E89 /* spec-ppd.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "spec-ppd.shtml"; path = "../filter/spec-ppd.shtml"; sourceTree = "<group>"; };
+               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 = "<group>"; };
+               72E65BDA18DC852700097E89 /* api-mime.header */ = {isa = PBXFileReference; lastKnownFileType = text; name = "api-mime.header"; path = "../scheduler/api-mime.header"; sourceTree = SOURCE_ROOT; };
+               72E65BDB18DC852700097E89 /* api-mime.shtml */ = {isa = PBXFileReference; lastKnownFileType = text.html.other; name = "api-mime.shtml"; path = "../scheduler/api-mime.shtml"; sourceTree = SOURCE_ROOT; };
+               72E65BDC18DC852700097E89 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; name = Makefile; path = ../scheduler/Makefile; sourceTree = SOURCE_ROOT; };
+               72E65BDD18DCA35700097E89 /* CHANGES-1.7.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = "CHANGES-1.7.txt"; path = "../CHANGES-1.7.txt"; sourceTree = "<group>"; };
+               72E65BDE18DCA35700097E89 /* CHANGES.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = CHANGES.txt; path = ../CHANGES.txt; sourceTree = "<group>"; };
+               72E65BDF18DCA35700097E89 /* CREDITS.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = CREDITS.txt; path = ../CREDITS.txt; sourceTree = "<group>"; };
+               72E65BE018DCA35700097E89 /* INSTALL.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = INSTALL.txt; path = ../INSTALL.txt; sourceTree = "<group>"; };
+               72E65BE118DCA35700097E89 /* IPPTOOL.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = IPPTOOL.txt; path = ../IPPTOOL.txt; sourceTree = "<group>"; };
+               72E65BE218DCA35700097E89 /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = LICENSE.txt; path = ../LICENSE.txt; sourceTree = "<group>"; };
+               72E65BE318DCA35700097E89 /* README.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = README.txt; path = ../README.txt; sourceTree = "<group>"; };
                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 = "<group>"; };
                72F75A611336F9A3004BB496 /* libcupsimage.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupsimage.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
                72F75A691336FA8A004BB496 /* error.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = error.c; path = ../filter/error.c; sourceTree = "<group>"; };
                72F75A6A1336FA8A004BB496 /* interpret.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = interpret.c; path = ../filter/interpret.c; sourceTree = "<group>"; };
                72F75A6B1336FA8A004BB496 /* raster.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = raster.c; path = ../filter/raster.c; sourceTree = "<group>"; };
+               72F7F1D719D1C0CC00870B09 /* org.cups.usb-quirks */ = {isa = PBXFileReference; lastKnownFileType = text; name = "org.cups.usb-quirks"; path = "../backend/org.cups.usb-quirks"; sourceTree = "<group>"; };
+               72FC29CF1A37A1CA00BDF935 /* usb-libusb.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "usb-libusb.c"; path = "../backend/usb-libusb.c"; sourceTree = "<group>"; };
+               72FC29D01A37A1CA00BDF935 /* usb-unix.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "usb-unix.c"; path = "../backend/usb-unix.c"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               2767FC57192674C4000F61D3 /* libcups_static.a in Frameworks */,
                                278C58E9136B64B000836530 /* CoreFoundation.framework in Frameworks */,
                                278C58EA136B64B000836530 /* Kerberos.framework in Frameworks */,
                                278C58EB136B64B000836530 /* Security.framework in 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;
+               };
+               274EE2601A03EDCA003213D1 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               274EE2611A03EDCA003213D1 /* libcups_static.a in Frameworks */,
+                               274EE2621A03EDCA003213D1 /* CoreFoundation.framework in Frameworks */,
+                               274EE2631A03EDCA003213D1 /* libresolv.dylib in Frameworks */,
+                               274EE2641A03EDCA003213D1 /* libz.dylib in Frameworks */,
+                               274EE2651A03EDCA003213D1 /* Security.framework in Frameworks */,
+                               274EE2661A03EDCA003213D1 /* SystemConfiguration.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               274EE2711A03EDCB003213D1 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               274EE2721A03EDCB003213D1 /* libcups_static.a in Frameworks */,
+                               274EE2731A03EDCB003213D1 /* CoreFoundation.framework in Frameworks */,
+                               274EE2741A03EDCB003213D1 /* libresolv.dylib in Frameworks */,
+                               274EE2751A03EDCB003213D1 /* libz.dylib in Frameworks */,
+                               274EE2761A03EDCB003213D1 /* Security.framework in Frameworks */,
+                               274EE2771A03EDCB003213D1 /* SystemConfiguration.framework in Frameworks */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               7200511218F492F200E7B81B /* CoreFoundation.framework in Frameworks */,
                                274FF6231333321400317ECB /* libcups.dylib in Frameworks */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               72CEF95618A966E000FA9B81 /* libcups.dylib in Frameworks */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        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;
                };
                        );
                        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;
                };
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               2767FC6519267538000F61D3 /* libcups_static.a 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;
+               };
+               72CF95EB18A19134000FCAE4 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               72CF95EC18A19134000FCAE4 /* libcups.dylib in Frameworks */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                273BF6B81333B4A90022CAAB /* tests */ = {
                        isa = PBXGroup;
                        children = (
+                               727EF041192E3544001EF690 /* testadmin.c */,
+                               727EF042192E3544001EF690 /* testarray.c */,
+                               727EF043192E3544001EF690 /* testcache.c */,
+                               727EF044192E3544001EF690 /* testconflicts.c */,
                                273BF6C61333B5370022CAAB /* testcups.c */,
+                               2767FC5119266A36000F61D3 /* testdest.c */,
+                               727EF045192E3544001EF690 /* testfile.c */,
                                278C58E2136B647200836530 /* testhttp.c */,
+                               727EF046192E3544001EF690 /* testi18n.c */,
+                               727EF047192E3544001EF690 /* testipp.c */,
+                               727EF048192E3544001EF690 /* testlang.c */,
+                               727EF04D192E3602001EF690 /* testlpd.c */,
                                270CCDBB135E3D3E00007BE2 /* testmime.c */,
+                               727EF049192E3544001EF690 /* testoptions.c */,
+                               727EF04A192E3544001EF690 /* testppd.c */,
+                               727EF04B192E3544001EF690 /* testpwg.c */,
+                               27F89DA21B3AC43B00E5A4B7 /* testraster.c */,
+                               727EF04C192E3544001EF690 /* testsnmp.c */,
+                               727EF04E192E3602001EF690 /* testspeed.c */,
+                               727EF04F192E3602001EF690 /* testsub.c */,
                        );
                        name = tests;
                        sourceTree = "<group>";
+                       wrapsLines = 1;
                };
                274FF5D513332C2C00317ECB /* daemon */ = {
                        isa = PBXGroup;
                        );
                        name = daemon;
                        sourceTree = "<group>";
+                       wrapsLines = 1;
                };
                274FF5F41333310400317ECB /* libcupsppdc */ = {
                        isa = PBXGroup;
                        );
                        name = libcupsppdc;
                        sourceTree = "<group>";
+                       wrapsLines = 1;
                };
                274FF67313333B0A00317ECB /* commands */ = {
                        isa = PBXGroup;
                                274FF68713333B6E00317ECB /* cupsfilter.c */,
                                2732E08B137A3F5200FAFEF6 /* cupstestdsc.c */,
                                72F75A5B1336F988004BB496 /* cupstestppd.c */,
+                               72CF95F218A19165000FCAE4 /* ippfind.c */,
+                               274EE27D1A03EE0B003213D1 /* ippinfra.c */,
+                               274EE27F1A03EE41003213D1 /* ippproxy.c */,
                                726AD701135E8A90002C930D /* ippserver.c */,
                                276683F91337F7A9000D33D0 /* ipptool.c */,
                                2732E08C137A3F5200FAFEF6 /* lp.c */,
                                2732E08E137A3F5200FAFEF6 /* lpinfo.c */,
                                2732E08F137A3F5200FAFEF6 /* lpmove.c */,
                                2732E090137A3F5200FAFEF6 /* lpoptions.c */,
-                               2732E091137A3F5200FAFEF6 /* lppasswd.c */,
                                2732E092137A3F5200FAFEF6 /* lpstat.c */,
                        );
                        name = commands;
                        sourceTree = "<group>";
+                       wrapsLines = 1;
                };
                276683CB1337B1CC000D33D0 /* ppdc tools */ = {
                        isa = PBXGroup;
                        );
                        name = "ppdc tools";
                        sourceTree = "<group>";
+                       wrapsLines = 1;
                };
                72220EAF1333047D00FCA411 /* Products */ = {
                        isa = PBXGroup;
                                726AD6F7135E88F0002C930D /* ippserver */,
                                278C58CB136B640300836530 /* testhttp */,
                                72A4332F155844CF002E172D /* libcups_static.a */,
+                               72CF95F118A19134000FCAE4 /* ipptool copy */,
+                               2767FC5019266A0D000F61D3 /* testdest */,
+                               274EE26B1A03EDCA003213D1 /* ippserver copy */,
+                               274EE27C1A03EDCB003213D1 /* ippserver copy copy */,
+                               27A0347B1A8BDB1300650675 /* lpadmin */,
                        );
                        name = Products;
                        sourceTree = "<group>";
                        isa = PBXGroup;
                        children = (
                                276683561337A8C5000D33D0 /* cups.strings */,
-                               27D3037C134148CB00F022B1 /* libcups_s.exp */,
                                27D3037D134148CB00F022B1 /* libcups2.def */,
                                72220EB51333052D00FCA411 /* adminutil.c */,
                                72220EB81333056300FCA411 /* array.c */,
                                72220EC21333056300FCA411 /* custom.c */,
                                72220ED1133305BB00FCA411 /* debug.c */,
                                72220ED2133305BB00FCA411 /* dest.c */,
+                               72CF95E018A13543000FCAE4 /* dest-job.c */,
+                               72CF95E118A13543000FCAE4 /* dest-localization.c */,
+                               72CF95E218A13543000FCAE4 /* dest-options.c */,
                                72220ED3133305BB00FCA411 /* dir.c */,
                                72220ED4133305BB00FCA411 /* dir.h */,
                                72220ED5133305BB00FCA411 /* emit.c */,
                                72220EDB133305BB00FCA411 /* getifaddrs.c */,
                                72220EDC133305BB00FCA411 /* getputfile.c */,
                                72220EDD133305BB00FCA411 /* globals.c */,
+                               72220EE2133305BB00FCA411 /* http.c */,
                                72220EDE133305BB00FCA411 /* http-addr.c */,
                                72220EDF133305BB00FCA411 /* http-addrlist.c */,
                                72220EE1133305BB00FCA411 /* http-support.c */,
-                               72220EE2133305BB00FCA411 /* http.c */,
-                               72220EE5133305BB00FCA411 /* ipp-support.c */,
                                72220EE6133305BB00FCA411 /* ipp.c */,
+                               72220EE5133305BB00FCA411 /* ipp-support.c */,
                                72220EE8133305BB00FCA411 /* langprintf.c */,
                                72220EEA133305BB00FCA411 /* language.c */,
                                72220EEC133305BB00FCA411 /* localize.c */,
                                72220F02133305BB00FCA411 /* string.c */,
                                72220F03133305BB00FCA411 /* tempfile.c */,
                                72220F05133305BB00FCA411 /* thread.c */,
+                               727AD5B619100A58009F6862 /* tls.c */,
+                               270B267D17F5C06700C8A3A9 /* tls-darwin.c */,
+                               270B267E17F5C06700C8A3A9 /* tls-gnutls.c */,
+                               270B268117F5C5D600C8A3A9 /* tls-sspi.c */,
                                72220F06133305BB00FCA411 /* transcode.c */,
                                72220F08133305BB00FCA411 /* usersys.c */,
                                72220F09133305BB00FCA411 /* util.c */,
                        );
                        name = libcups;
                        sourceTree = "<group>";
+                       wrapsLines = 1;
                };
                72220F45133305D000FCA411 /* Public Headers */ = {
                        isa = PBXGroup;
                                72220FB413330BCE00FCA411 /* mime.h */,
                                72220EF7133305BB00FCA411 /* ppd.h */,
                                274FF6091333315100317ECB /* ppdc.h */,
+                               2767FC7519269687000F61D3 /* pwg.h */,
                                72220EFA133305BB00FCA411 /* raster.h */,
                                72220EFD133305BB00FCA411 /* sidechannel.h */,
                                72220F07133305BB00FCA411 /* transcode.h */,
                        );
                        name = "Public Headers";
                        sourceTree = "<group>";
+                       wrapsLines = 1;
                };
                72220F461333060C00FCA411 /* Private Headers */ = {
                        isa = PBXGroup;
                                7271883C1374AB14001A2036 /* mime-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 = "<group>";
+                       wrapsLines = 1;
                };
                72220F5D13330A5A00FCA411 /* cupsd */ = {
                        isa = PBXGroup;
                        children = (
-                               72D53A3615B4929D003F877F /* colorman.c */,
-                               72D53A3715B4929D003F877F /* colorman.h */,
+                               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 */,
                                72220F7013330B0C00FCA411 /* classes.h */,
                                72220F7113330B0C00FCA411 /* client.c */,
                                72220F7213330B0C00FCA411 /* client.h */,
+                               72D53A3615B4929D003F877F /* colorman.c */,
+                               72D53A3715B4929D003F877F /* colorman.h */,
                                72220F7313330B0C00FCA411 /* conf.c */,
                                72220F7413330B0C00FCA411 /* conf.h */,
                                72220F7513330B0C00FCA411 /* cupsd.h */,
                                72220F8D13330B0C00FCA411 /* subscriptions.h */,
                                72220F8E13330B0C00FCA411 /* sysman.c */,
                                72220F8F13330B0C00FCA411 /* sysman.h */,
-                               728FB7E3153600FA005426E1 /* tls.c */,
-                               728FB7E0153600FA005426E1 /* tls-darwin.c */,
-                               728FB7E1153600FA005426E1 /* tls-gnutls.c */,
-                               728FB7E2153600FA005426E1 /* tls-openssl.c */,
                        );
                        name = cupsd;
                        path = .;
                        sourceTree = "<group>";
+                       wrapsLines = 1;
                };
                72220FB013330B3400FCA411 /* libcupsmime */ = {
                        isa = PBXGroup;
                        );
                        name = libcupsmime;
                        sourceTree = "<group>";
+                       wrapsLines = 1;
                };
                72220FB113330B4A00FCA411 /* Frameworks */ = {
                        isa = PBXGroup;
                        children = (
+                               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 */,
                                724379281333E952009631B9 /* lpd.c */,
                                7243790B1333E4E3009631B9 /* network.c */,
                                724379121333E516009631B9 /* runloop.c */,
-                               720DD6D21358FDDE0064AA82 /* snmp.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 = "<group>";
+                       wrapsLines = 1;
                };
                7258EADC134594A8009286F1 /* filters */ = {
                        isa = PBXGroup;
                        );
                        name = filters;
                        sourceTree = "<group>";
+                       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 */,
+                               727EF03D192E3498001EF690 /* testcgi.c */,
+                               727EF03E192E3498001EF690 /* testhi.c */,
+                               727EF03F192E3498001EF690 /* testtemplate.c */,
+                               727EF040192E3498001EF690 /* var.c */,
+                       );
+                       name = "cgi-bin";
+                       sourceTree = "<group>";
                };
                72BF96351333042100B1EAD7 = {
                        isa = PBXGroup;
                        children = (
-                               72D53A3915B492FA003F877F /* libpam.dylib */,
-                               72D53A3315B4925B003F877F /* ApplicationServices.framework */,
-                               72D53A2C15B4913D003F877F /* IOKit.framework */,
-                               72D53A2915B49110003F877F /* GSS.framework */,
-                               728FB7EF1536167A005426E1 /* libiconv.dylib */,
-                               728FB7F01536167A005426E1 /* libresolv.dylib */,
-                               728FB7EC1536161C005426E1 /* libz.dylib */,
-                               72220FB113330B4A00FCA411 /* Frameworks */,
+                               72E65BA218DC796500097E89 /* Autoconf Files */,
+                               72E65BB818DC79F800097E89 /* Documentation */,
                                72220F45133305D000FCA411 /* Public Headers */,
                                72220F461333060C00FCA411 /* Private Headers */,
                                72220EB41333050100FCA411 /* libcups */,
                                72220FB013330B3400FCA411 /* libcupsmime */,
                                274FF5F41333310400317ECB /* libcupsppdc */,
                                724378F71333E3CE009631B9 /* backends */,
+                               727EF02E192E3461001EF690 /* cgi-bin */,
                                274FF67313333B0A00317ECB /* commands */,
                                72220F5D13330A5A00FCA411 /* cupsd */,
                                274FF5D513332C2C00317ECB /* daemon */,
                                7258EADC134594A8009286F1 /* filters */,
                                276683CB1337B1CC000D33D0 /* ppdc tools */,
                                273BF6B81333B4A90022CAAB /* tests */,
+                               72220FB113330B4A00FCA411 /* Frameworks */,
                                72220EAF1333047D00FCA411 /* Products */,
                        );
                        indentWidth = 2;
                        sourceTree = "<group>";
                        tabWidth = 8;
-                       wrapsLines = 0;
+                       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 */,
+                               72E65BB218DC799B00097E89 /* cups-scripting.m4 */,
+                               72E65BB318DC799B00097E89 /* cups-sharedlibs.m4 */,
+                               72E65BB418DC799B00097E89 /* cups-ssl.m4 */,
+                               72E65BB518DC799B00097E89 /* cups-threads.m4 */,
+                       );
+                       name = "Autoconf Files";
+                       sourceTree = "<group>";
+               };
+               72E65BB818DC79F800097E89 /* Documentation */ = {
+                       isa = PBXGroup;
+                       children = (
+                               72E65BBB18DC7A6B00097E89 /* api-array.header */,
+                               72E65BBC18DC7A6B00097E89 /* api-array.shtml */,
+                               72E65BBD18DC7A6B00097E89 /* api-cups.header */,
+                               72E65BBE18DC7A6B00097E89 /* api-cups.shtml */,
+                               72E65BBF18DC7A6B00097E89 /* api-filedir.header */,
+                               72E65BC018DC7A6B00097E89 /* api-filedir.shtml */,
+                               72E65BC118DC7A6B00097E89 /* api-filter.header */,
+                               72E65BC218DC7A6B00097E89 /* api-filter.shtml */,
+                               72E65BC318DC7A6B00097E89 /* api-httpipp.header */,
+                               72E65BC418DC7A6B00097E89 /* api-httpipp.shtml */,
+                               72E65BDA18DC852700097E89 /* api-mime.header */,
+                               72E65BDB18DC852700097E89 /* api-mime.shtml */,
+                               72E65BC518DC7A6B00097E89 /* api-overview.header */,
+                               72E65BC618DC7A6B00097E89 /* api-overview.shtml */,
+                               72E65BC718DC7A6B00097E89 /* api-ppd.header */,
+                               72E65BC818DC7A6B00097E89 /* api-ppd.shtml */,
+                               72E65BC918DC7A7E00097E89 /* api-ppdc.header */,
+                               72E65BCA18DC7A7E00097E89 /* api-ppdc.shtml */,
+                               72E65BCB18DC7A9800097E89 /* api-raster.header */,
+                               72E65BCC18DC7A9800097E89 /* api-raster.shtml */,
+                               72E65BDD18DCA35700097E89 /* CHANGES-1.7.txt */,
+                               729D4B561A2CB48700692B21 /* CHANGES-2.0.txt */,
+                               729D4B571A2CB48700692B21 /* CHANGES-IPPTOOL.txt */,
+                               72E65BDE18DCA35700097E89 /* CHANGES.txt */,
+                               72E65BDF18DCA35700097E89 /* CREDITS.txt */,
+                               72E65BB918DC7A3600097E89 /* doc */,
+                               72E65BE018DCA35700097E89 /* INSTALL.txt */,
+                               72E65BE118DCA35700097E89 /* IPPTOOL.txt */,
+                               72E65BE218DCA35700097E89 /* LICENSE.txt */,
+                               72E65BBA18DC7A3600097E89 /* man */,
+                               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.txt */,
+                               72E65BD318DC7A9800097E89 /* spec-ppd.header */,
+                               72E65BD418DC7A9800097E89 /* spec-ppd.shtml */,
+                       );
+                       name = Documentation;
+                       sourceTree = "<group>";
                };
                72F75A681336FA42004BB496 /* libcupsimage */ = {
                        isa = PBXGroup;
                        );
                        name = libcupsimage;
                        sourceTree = "<group>";
+                       wrapsLines = 1;
                };
 /* End PBXGroup section */
 
                        productReference = 273BF6BD1333B5000022CAAB /* testcups */;
                        productType = "com.apple.product-type.tool";
                };
+               274EE25B1A03EDCA003213D1 /* ippinfra */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 274EE2681A03EDCA003213D1 /* Build configuration list for PBXNativeTarget "ippinfra" */;
+                       buildPhases = (
+                               274EE25E1A03EDCA003213D1 /* Sources */,
+                               274EE2601A03EDCA003213D1 /* Frameworks */,
+                               274EE2671A03EDCA003213D1 /* CopyFiles */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               274EE25C1A03EDCA003213D1 /* PBXTargetDependency */,
+                       );
+                       name = ippinfra;
+                       productName = ippserver;
+                       productReference = 274EE26B1A03EDCA003213D1 /* ippserver copy */;
+                       productType = "com.apple.product-type.tool";
+               };
+               274EE26C1A03EDCB003213D1 /* ippproxy */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 274EE2791A03EDCB003213D1 /* Build configuration list for PBXNativeTarget "ippproxy" */;
+                       buildPhases = (
+                               274EE26F1A03EDCB003213D1 /* Sources */,
+                               274EE2711A03EDCB003213D1 /* Frameworks */,
+                               274EE2781A03EDCB003213D1 /* CopyFiles */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               274EE26D1A03EDCB003213D1 /* PBXTargetDependency */,
+                       );
+                       name = ippproxy;
+                       productName = ippserver;
+                       productReference = 274EE27C1A03EDCB003213D1 /* ippserver copy copy */;
+                       productType = "com.apple.product-type.tool";
+               };
                274FF5CB13332B1F00317ECB /* cups-driverd */ = {
                        isa = PBXNativeTarget;
                        buildConfigurationList = 274FF5D213332B1F00317ECB /* Build configuration list for PBXNativeTarget "cups-driverd" */;
                        productReference = 276684041337FA1D000D33D0 /* cupsaddsmb */;
                        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" */;
                        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" */;
                        productReference = 726AD6F7135E88F0002C930D /* ippserver */;
                        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" */;
                72BF96371333042100B1EAD7 /* Project object */ = {
                        isa = PBXProject;
                        attributes = {
-                               LastUpgradeCheck = 0440;
+                               LastUpgradeCheck = 0600;
                                ORGANIZATIONNAME = "Apple Inc.";
+                               TargetAttributes = {
+                                       27A0347A1A8BDB1200650675 = {
+                                               CreatedOnToolsVersion = 6.1.1;
+                                       };
+                               };
                        };
                        buildConfigurationList = 72BF963A1333042100B1EAD7 /* Build configuration list for PBXProject "CUPS" */;
                        compatibilityVersion = "Xcode 3.2";
                                72F75A511336F950004BB496 /* cupstestppd */,
                                724379461333FEA9009631B9 /* dnssd */,
                                724378FC1333E43E009631B9 /* ipp */,
+                               72CF95E618A19134000FCAE4 /* ippfind */,
+                               274EE25B1A03EDCA003213D1 /* ippinfra */,
+                               274EE26C1A03EDCB003213D1 /* ippproxy */,
                                726AD6F6135E88F0002C930D /* ippserver */,
                                276683EF1337F78E000D33D0 /* ipptool */,
+                               27A0347A1A8BDB1200650675 /* lpadmin */,
                                724379171333E532009631B9 /* lpd */,
                                2766836F1337AC79000D33D0 /* ppdc */,
                                2766837C1337AC8C000D33D0 /* ppdhtml */,
                                720DD6C11358FD5F0064AA82 /* snmp */,
                                7243792F1333FB85009631B9 /* socket */,
                                273BF6BC1333B5000022CAAB /* testcups */,
+                               2767FC4619266A0D000F61D3 /* testdest */,
                                278C58CA136B640300836530 /* testhttp */,
                                270CCDA6135E3C9E00007BE2 /* testmime */,
                                7243795A1333FF1D009631B9 /* usb */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               274EE25E1A03EDCA003213D1 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               274EE27E1A03EE0B003213D1 /* ippinfra.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               274EE26F1A03EDCB003213D1 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               274EE2801A03EE41003213D1 /* ippproxy.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                274FF5C813332B1F00317ECB /* Sources */ = {
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                                274FF69E1333B1C400317ECB /* http-addrlist.c in Sources */,
                                274FF69F1333B1C400317ECB /* http-support.c in Sources */,
                                274FF6A01333B1C400317ECB /* http.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 */,
                                274FF6A81333B1C400317ECB /* md5passwd.c in Sources */,
                                274FF6A91333B1C400317ECB /* notify.c in Sources */,
                                274FF6AA1333B1C400317ECB /* options.c in Sources */,
+                               727AD5B819100A58009F6862 /* tls.c in Sources */,
                                274FF6AB1333B1C400317ECB /* page.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 */,
                                274FF6AF1333B1C400317ECB /* request.c in Sources */,
                                274FF6B01333B1C400317ECB /* sidechannel.c in Sources */,
                                274FF6B11333B1C400317ECB /* snmp.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;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               27A034771A8BDB1200650675 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               27A034821A8BDC3A00650675 /* lpadmin.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                720DD6BE1358FD5F0064AA82 /* Sources */ = {
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                                72220EB61333052D00FCA411 /* adminutil.c in Sources */,
                                72220EC51333056300FCA411 /* array.c in Sources */,
                                72220EC71333056300FCA411 /* attr.c in Sources */,
+                               727AD5B719100A58009F6862 /* tls.c in Sources */,
                                72220EC81333056300FCA411 /* auth.c in Sources */,
                                72220EC91333056300FCA411 /* backchannel.c in Sources */,
                                72220ECA1333056300FCA411 /* backend.c in Sources */,
                                72220F19133305BB00FCA411 /* http-addrlist.c in Sources */,
                                72220F1B133305BB00FCA411 /* http-support.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 */,
                                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;
                };
                                72220FA613330B0C00FCA411 /* subscriptions.c in Sources */,
                                72220FA713330B0C00FCA411 /* sysman.c in Sources */,
                                72C16CB9137B195D007E4BF4 /* file.c in Sources */,
-                               728FB7E8153600FA005426E1 /* tls.c in Sources */,
                                72D53A3815B4929D003F877F /* colorman.c in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               72CF95E918A19134000FCAE4 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               72CF95F318A19165000FCAE4 /* ippfind.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                72F75A4E1336F950004BB496 /* Sources */ = {
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        target = 273BF6BC1333B5000022CAAB /* testcups */;
                        targetProxy = 273BF6DD1333B6370022CAAB /* PBXContainerItemProxy */;
                };
+               274EE25C1A03EDCA003213D1 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 274FF6891333B1C400317ECB /* libcups_static */;
+                       targetProxy = 274EE25D1A03EDCA003213D1 /* PBXContainerItemProxy */;
+               };
+               274EE26D1A03EDCB003213D1 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 274FF6891333B1C400317ECB /* libcups_static */;
+                       targetProxy = 274EE26E1A03EDCB003213D1 /* PBXContainerItemProxy */;
+               };
+               274EE2821A03EEE0003213D1 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 274EE25B1A03EDCA003213D1 /* ippinfra */;
+                       targetProxy = 274EE2811A03EEE0003213D1 /* PBXContainerItemProxy */;
+               };
+               274EE2841A03EEE0003213D1 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 274EE26C1A03EDCB003213D1 /* ippproxy */;
+                       targetProxy = 274EE2831A03EEE0003213D1 /* PBXContainerItemProxy */;
+               };
+               274EE2861A03EEEE003213D1 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 274EE25B1A03EDCA003213D1 /* ippinfra */;
+                       targetProxy = 274EE2851A03EEEE003213D1 /* PBXContainerItemProxy */;
+               };
+               274EE2881A03EEEE003213D1 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 274EE26C1A03EDCB003213D1 /* ippproxy */;
+                       targetProxy = 274EE2871A03EEEE003213D1 /* PBXContainerItemProxy */;
+               };
                274FF5DC13332CF900317ECB /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = 72220EAD1333047D00FCA411 /* libcups */;
                        target = 276684031337FA1D000D33D0 /* cupsaddsmb */;
                        targetProxy = 276684121337FA8D000D33D0 /* 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 */;
                        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 */;
                        target = 274FF6891333B1C400317ECB /* libcups_static */;
                        targetProxy = 726AD705135E8AC5002C930D /* PBXContainerItemProxy */;
                };
+               72BEA8D419AFA89C0085F0F3 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 726AD6F6135E88F0002C930D /* ippserver */;
+                       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 */;
                        };
                        name = Release;
                };
+               274EE2691A03EDCA003213D1 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               PRODUCT_NAME = "ippserver copy";
+                       };
+                       name = Debug;
+               };
+               274EE26A1A03EDCA003213D1 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               PRODUCT_NAME = "ippserver copy";
+                       };
+                       name = Release;
+               };
+               274EE27A1A03EDCB003213D1 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               PRODUCT_NAME = "ippserver copy copy";
+                       };
+                       name = Debug;
+               };
+               274EE27B1A03EDCB003213D1 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               PRODUCT_NAME = "ippserver copy copy";
+                       };
+                       name = Release;
+               };
                274FF5D313332B1F00317ECB /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
                                PRODUCT_NAME = "$(TARGET_NAME)";
+                               SDKROOT = macosx;
                        };
                        name = Debug;
                };
                        isa = XCBuildConfiguration;
                        buildSettings = {
                                PRODUCT_NAME = "$(TARGET_NAME)";
+                               SDKROOT = macosx;
                        };
                        name = Release;
                };
                274FF5F0133330C800317ECB /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
                                EXECUTABLE_PREFIX = "";
                                INSTALL_PATH = /usr/lib;
                                PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups;
                274FF5F1133330C800317ECB /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
                                EXECUTABLE_PREFIX = "";
                                INSTALL_PATH = /usr/lib;
                                PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups;
                274FF6DE1333B1C400317ECB /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
                                EXECUTABLE_EXTENSION = a;
                                EXECUTABLE_PREFIX = "";
                                INSTALL_PATH = /usr/local/lib;
                274FF6DF1333B1C400317ECB /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
                                EXECUTABLE_EXTENSION = a;
                                EXECUTABLE_PREFIX = "";
                                INSTALL_PATH = /usr/local/lib;
                        };
                        name = Release;
                };
+               2767FC4E19266A0D000F61D3 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               PRODUCT_NAME = testdest;
+                       };
+                       name = Debug;
+               };
+               2767FC4F19266A0D000F61D3 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               PRODUCT_NAME = testdest;
+                       };
+                       name = Release;
+               };
                278C58D1136B640300836530 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
                        };
                        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_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;
+                               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_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;
+                               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 = {
                72220EB01333047D00FCA411 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
                                EXECUTABLE_PREFIX = "";
                                INSTALL_PATH = /usr/lib;
                                PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups;
                72220EB11333047D00FCA411 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
                                EXECUTABLE_PREFIX = "";
                                INSTALL_PATH = /usr/lib;
                                PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups;
                72220FAE13330B2300FCA411 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
                                EXECUTABLE_PREFIX = "";
                                INSTALL_PATH = /usr/lib;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                72220FAF13330B2300FCA411 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
                                EXECUTABLE_PREFIX = "";
                                INSTALL_PATH = /usr/lib;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                72BF963C1333042100B1EAD7 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               ARCHS = "$(NATIVE_ARCH_ACTUAL)";
+                               CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
+                               CLANG_WARN_ENUM_CONVERSION = YES;
+                               CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
+                               CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
                                DEBUG_INFORMATION_FORMAT = dwarf;
                                GCC_PREPROCESSOR_DEFINITIONS = DEBUG;
+                               GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
+                               GCC_TREAT_WARNINGS_AS_ERRORS = YES;
                                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_UNINITIALIZED_AUTOS = YES;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_LABEL = YES;
                                        .,
                                        ..,
                                );
+                               ONLY_ACTIVE_ARCH = YES;
                                OTHER_CFLAGS = (
                                        "-D_CUPS_SOURCE",
                                        "-Wno-shorten-64-to-32",
                72BF963D1333042100B1EAD7 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
-                               ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+                               CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
+                               CLANG_WARN_ENUM_CONVERSION = YES;
+                               CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
+                               CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
                                DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
+                               GCC_TREAT_WARNINGS_AS_ERRORS = YES;
                                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_UNINITIALIZED_AUTOS = YES;
                                GCC_WARN_UNUSED_FUNCTION = YES;
                                GCC_WARN_UNUSED_LABEL = YES;
                        };
                        name = Release;
                };
+               72CF95EF18A19134000FCAE4 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               INSTALL_PATH = /usr/bin;
+                               PRODUCT_NAME = "ipptool copy";
+                       };
+                       name = Debug;
+               };
+               72CF95F018A19134000FCAE4 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               INSTALL_PATH = /usr/bin;
+                               PRODUCT_NAME = "ipptool copy";
+                       };
+                       name = Release;
+               };
                72F75A591336F951004BB496 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
                72F75A631336F9A3004BB496 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
                                EXECUTABLE_PREFIX = "";
                                INSTALL_PATH = /usr/lib;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                72F75A641336F9A3004BB496 /* Release */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
+                               COMBINE_HIDPI_IMAGES = YES;
                                EXECUTABLE_PREFIX = "";
                                INSTALL_PATH = /usr/lib;
                                PRODUCT_NAME = "$(TARGET_NAME)";
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
+               274EE2681A03EDCA003213D1 /* Build configuration list for PBXNativeTarget "ippinfra" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               274EE2691A03EDCA003213D1 /* Debug */,
+                               274EE26A1A03EDCA003213D1 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               274EE2791A03EDCB003213D1 /* Build configuration list for PBXNativeTarget "ippproxy" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               274EE27A1A03EDCB003213D1 /* Debug */,
+                               274EE27B1A03EDCB003213D1 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
                274FF5D213332B1F00317ECB /* Build configuration list for PBXNativeTarget "cups-driverd" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (
                        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 = (
                        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 = (
                        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 = (
index 6b010a9..5baa667 100644 (file)
@@ -1,28 +1,29 @@
-/* config.h.  Generated from config.h.in by configure.  */
 /*
- * "$Id: config.h 11173 2013-07-23 12:31:34Z msweet $"
+ * "$Id: config.h 12998 2015-12-02 15:09:04Z msweet $"
  *
- *   Configuration file for CUPS.
+ * Configuration file for CUPS and Xcode.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2007 by Easy Software Products.
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products.
  *
- *   These coded instructions, statements, and computer programs are the
- *   property of Apple Inc. and are protected by Federal copyright
- *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- *   which should have been included with this file.  If this file is
- *   file is missing or damaged, see the license at "http://www.cups.org/".
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file.  If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
  */
 
 #ifndef _CUPS_CONFIG_H_
 #define _CUPS_CONFIG_H_
 
+#include <AvailabilityMacros.h>
+
 /*
  * Version of software...
  */
 
-#define CUPS_SVERSION "CUPS v1.6.3"
-#define CUPS_MINIMAL "CUPS/1.6.3"
+#define CUPS_SVERSION "CUPS v2.1.2"
+#define CUPS_MINIMAL "CUPS/2.1.2"
 
 
 /*
@@ -33,6 +34,7 @@
 #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"
 
 
 /*
 
 
 /*
- * Do we have various image libraries?
+ * Do we have posix_spawn?
+ */
+
+#define HAVE_POSIX_SPAWN 1
+
+
+/*
+ * Do we have ZLIB?
  */
 
-/* #undef HAVE_LIBPNG */
 #define HAVE_LIBZ 1
-/* #undef HAVE_LIBJPEG */
-/* #undef HAVE_LIBTIFF */
+#define HAVE_INFLATECOPY 1
 
 
 /*
 
 
 /*
- * Do we have <scsi/sg.h>?
+ * Use <stdint.h>?
  */
 
-/* #undef HAVE_SCSI_SG_H */
+#define HAVE_STDINT_H 1
 
 
 /*
 
 
 /*
+ * Do we have the ASL functions?
+ */
+
+#define HAVE_ASL_H
+
+
+/*
+ * Do we have the systemd journal functions?
+ */
+
+/*#undef HAVE_SYSTEMD_SD_JOURNAL_H*/
+
+
+/*
  * Do we have the (v)snprintf() functions?
  */
 
 
 #define HAVE_CDSASSL 1
 /* #undef HAVE_GNUTLS */
-/* #undef HAVE_LIBSSL */
 #define HAVE_SSL 1
 
 
 /*
- * Do we have the SSL_set_tlsext_host_name function?
+ * Do we have the gnutls_transport_set_pull_timeout_function function?
  */
 
-/* #undef HAVE_SSL_SET_TLSEXT_HOST_NAME */
+/* #undef HAVE_GNUTLS_TRANSPORT_SET_PULL_TIMEOUT_FUNCTION */
 
 
 /*
- * What Security framework headers do we have?
+ * Do we have the gnutls_priority_set_direct function?
  */
 
-#define HAVE_AUTHORIZATION_H 1
-#define HAVE_SECBASEPRIV_H 1
-#define HAVE_SECCERTIFICATE_H 1
-#define HAVE_SECIDENTITYSEARCHPRIV_H 1
-#define HAVE_SECITEM_H 1
-#define HAVE_SECITEMPRIV_H 1
-#define HAVE_SECPOLICY_H 1
-#define HAVE_SECPOLICYPRIV_H 1
-#define HAVE_SECURETRANSPORTPRIV_H 1
+/* #undef HAVE_GNUTLS_PRIORITY_SET_DIRECT */
 
 
 /*
- * Do we have the SecCertificateCopyData function?
+ * What Security framework headers do we have?
  */
 
-#define HAVE_SECCERTIFICATECOPYDATA 1
+#define HAVE_AUTHORIZATION_H 1
+/* #undef HAVE_SECBASEPRIV_H */
+#define HAVE_SECCERTIFICATE_H 1
+/* #undef HAVE_SECIDENTITYSEARCHPRIV_H */
+#define HAVE_SECITEM_H 1
+/* #undef HAVE_SECITEMPRIV_H */
+#define HAVE_SECPOLICY_H 1
+/* #undef HAVE_SECPOLICYPRIV_H */
+/* #undef HAVE_SECURETRANSPORTPRIV_H */
 
 
 /*
- * Do we have the SecIdentitySearchCreateWithPolicy function?
+ * Do we have the cssmErrorString function?
  */
 
-#define HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY 1
+#define HAVE_CSSMERRORSTRING 1
 
 
 /*
- * Do we have the SecPolicyCreateSSL function?
+ * Do we have the SecGenerateSelfSignedCertificate function?
  */
 
-#define HAVE_SECPOLICYCREATESSL 1
+/* #undef HAVE_SECGENERATESELFSIGNEDCERTIFICATE */
 
 
 /*
- * Do we have the SecPolicyCreateSSL function?
+ * Do we have the SecKeychainOpen function?
  */
 
-#define HAVE_SECPOLICYCREATESSL 1
+#define HAVE_SECKEYCHAINOPEN 1
 
 
 /*
- * Do we have the cssmErrorString function?
+ * Do we have (a working) SSLSetEnabledCiphers function?
  */
 
-#define HAVE_CSSMERRORSTRING 1
+#ifdef AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER
+#  define HAVE_SSLSETENABLEDCIPHERS 1
+#endif /* AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER */
 
 
 /*
 
 
 /*
- * Do we have the AIX usersec.h header file?
- */
-
-/* #undef HAVE_USERSEC_H */
-
-
-/*
  * Do we have pthread support?
  */
 
 
 #define HAVE_LAUNCH_H 1
 #define HAVE_LAUNCHD 1
+#define HAVE_LAUNCH_ACTIVATE_SOCKET 1
 
 
 /*
  */
 
 #define HAVE_COREFOUNDATION_H 1
-#define HAVE_CFPRIV_H 1
-#define HAVE_CFBUNDLEPRIV_H 1
+/* #undef HAVE_CFPRIV_H */
+/* #undef HAVE_CFBUNDLEPRIV_H */
 
 
 /*
  */
 
 #define HAVE_MEMBERSHIP_H 1
-#define HAVE_MEMBERSHIPPRIV_H 1
+/* #undef HAVE_MEMBERSHIPPRIV_H */
 #define HAVE_MBR_UID_TO_UUID 1
 
 
 
 
 /*
- * Do we have Darwin's IOKit private headers?
- */
-
-#define HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H 1
-
-
-/*
  * Do we have DBUS?
  */
 
 #define HAVE_GSS_ACQUIRE_CRED_EX_F 1
 #define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1
 #define HAVE_GSS_GSSAPI_H 1
-#define HAVE_GSS_GSSAPI_SPI_H 1
+/* #undef HAVE_GSS_GSSAPI_SPI_H */
 #define HAVE_GSSAPI 1
-/* #undef HAVE_GSSAPI_GENERIC_H */
 /* #undef HAVE_GSSAPI_GSSAPI_H */
 /* #undef HAVE_GSSAPI_H */
-#define HAVE_GSSAPI_KRB5_H 1
-#define HAVE_KRB5_H 1
 
 
 /*
 
 
 /*
- * Do we have vproc_transaction_begin/end?
- */
-
-#define HAVE_VPROC_TRANSACTION_BEGIN 1
-
-
-/*
  * Do we have libusb?
  */
 
  */
 
 #define HAVE_XPC 1
-#define HAVE_XPC_PRIVATE_H 1
+/* #undef HAVE_XPC_PRIVATE_H */
 
 
 /*
@@ -739,5 +738,5 @@ static __inline int _cups_abs(int i) { return (i < 0 ? -i : i); }
 #endif /* !_CUPS_CONFIG_H_ */
 
 /*
- * End of "$Id: config.h 11173 2013-07-23 12:31:34Z msweet $".
+ * End of "$Id: config.h 12998 2015-12-02 15:09:04Z msweet $".
  */